挑战一周学会ROS(第五天)
接下来登场的是服务通讯基于请求响应模式是一种应答机制也即一个节点A向另一个节点B发送请求B接收处理请求并产生响应结果返回给A比如机器人巡逻过程中控制系统分析传感器数据发现可疑物体或人此时需要拍摄照片并保存一个节点需要向相机节点发送拍照请求相机节点处理请求并返回处理结果服务通讯更适用于对实时性有要求具有一定逻辑处理的应用场景概念以请求响应的方式实现不同节点之间数据交互的通讯模式作用用于偶然的、对实时性有要求、有一定逻辑处理需求的数据传输场景角色1、master----管理者114平台2、server-----服务端服务公司3、client------客户端我流程master会根据话题实现server和client的连接注意1、不同于话题通讯服务通讯中服务端必须先启动2、客户端和服务端都可以存在多个服务通讯自定义srv:文件内的可用数据类型与msg文件一致且自定义srv实现流程与自定义msg实现流程类似都是基于标准数据类型srv流程1、按照固定格式创建srv文件2、编辑配置文件3、编译生成中间文件在我的不懈努力下代码如下成功下面为你拆析argc argv的底层原理int main(int argc, char *argv[])这两个参数不是你程序内部生成的是操作系统shell启动程序时自动解析命令行字符串传给main函数的argcargument count参数计数器类型int含义整个命令行总参数的个数规则永远大于1包含自身文件名argvargument vector参数字符串数组类型char*argv[],等价于char**argv字符串指针数组含义存放每一段命令行分割后的字符串argv[0]固定是程序本身的路径/名称argv[1]argcv[2]手动输入的外部参数没话说简直牛逼#include ros/ros.h #include plumbing_server_client/AddInts.h /* 客户端提交两个整数并处理响应的结果 1包含头文件 2初始化ROS节点 3创建节点句柄 4创建一个客户端对象 5提交请求并处理响应 实现参数的动态提交 1格式:rosrun xxxxx xxxxx 12 34 2节点执行时需要获取命令中的参数并组织进行 request */ int main(int argc, char *argv[]) { //优化实现获取命令中的参数 setlocale(LC_ALL,); if(argc ! 3) { ROS_INFO(提交时的参数个数不对); return 1; } // 2初始化ROS节点 ros::init(argc,argv,daBao); // 3创建节点句柄 ros::NodeHandle nh; // 4创建一个客户端对象 ros::ServiceClient client nh.serviceClientplumbing_server_client::AddInts(addInts); // 5提交请求并处理响应 plumbing_server_client::AddInts ai; //5.1 组织请求 ai.request.num1atoi(argv[1]); ai.request.num2atoi(argv[2]); //5.2 处理响应 bool flag client.call(ai); if(flag){ ROS_INFO(响应成功); //获取结果 ROS_INFO(响应结果 %d,ai.response.sum); } else{ ROS_INFO(处理失败); } return 0; }#include ros/ros.h #include plumbing_server_client/AddInts.h /* 服务端实现解析客户端提交的数据并运算再产生响应 1包含头文件 2初始化ROS节点 3创建节点句柄 4创建服务对象 5处理请求并产生响应 6spin() */ bool doNums(plumbing_server_client::AddInts::Request request, plumbing_server_client::AddInts::Response response){ //1,处理请求 int num1 request.num1; int num2 request.num2; ROS_INFO(收到的数据是:num1%d,num2%d,num1,num2); int sumnum1num2; response.sumsum; ROS_INFO(求和结果 sum %d,sum); return true; } int main(int argc, char *argv[]) { setlocale(LC_ALL,); //2初始化ROS节点 ros::init(argc,argv,heiShui); //节点名称保证唯一 //3创建节点句柄 ros::NodeHandle nh; //4创建服务对象 ros::ServiceServer server nh.advertiseService(addInts,doNums); ROS_INFO(服务器端启动); //5处理请求并产生响应 //6spin() ros::spin(); return 0; }等待执行python版本的应该如何操作1、编写服务端实现2、编写客户端实现3、为python文件添加可执行权限4、编辑配置文件5、编译并执行拿下拿下终于出来了接下来登场的是参数服务器参数服务器在ROS中主要用于不同节点之间的数据共享参数服务器相当于是独立于所有节点的一个公共容器被不同的节点调用当然不同的节点也可往其中存储数据比如导航实现时会进行路径规划全局路径规划设计一个从出发点到目标的大致路径。本地路径规划会根据路况生成时时的行进路径路径规划时需要参考小车的尺寸我们可以把这些尺寸信息存储到参数服务器全局路径规划节点与本地路径规划节点可以从参数服务器中调用这些参数参数服务器适用于存放数据共享的一些应用场景理论模型ROS Master(管理者)Talker(参数设置者)Listener(参数调用者)ROS Master作为一个公共容器保存参数Talker可以向容器中设置参数Listener可以获取参数参数服务器不是为了高性能而设计的最好用于存储静态的非二进制的简单数据参数服务器原来如此简单修改获取遍历现在进入常用命令的学习这些命令和之前的文件操作相比较文件操作命令是静态的操作的是磁盘上的文件而上述命令是动态的在ROS程序启动之后可以动态的获取运行中的节点或参数的相关信息rosnode 用于获取节点的信息rosnode ping 测试到节点的连接状态rosnode list 列出活动节点rosnode info 打印节点信息rosnode machine 列出指定设备上节点rosnode kill 杀死某个节点rosnode cleanup 清除不可连接的节点rostopic用于显示有关ROS主题的调试信息包括发布者、订阅者、发布频率和ROS消息rostopic bw 显示主题使用的带宽rostopic delay 显示带有 header 的主题延迟rostopic echo 打印消息到屏幕rostopic find 根据类型查找主题rostopic hz 显示主题的发布频率rostopic info 显示主题相关信息rostopic list 显示所有活动状态下的主题rostopic pub 将数据发布到主题rostopic type 打印主题类型rosservice........