服务和话题
特点 | Topic | Service |
---|---|---|
通信方式 | 异步通信 | 同步通信 |
通信模型 | Publish-Subscribe | Request-Reply |
多对多 | 多对一 | |
接收者接到数据会回调 | 远程过程调用(RPC)服务器端的服务 | |
应用场景 | 连续,高频的数据发布 | 偶尔调用的功能 |
举例 | 激光雷达 | 开关传感器,拍照,逆解计算 |
rosservice call
rosservice call addTwoNum 3 4
: 调用服务,addTwoNum
是服务名称, 名称不加引号,3和4是服务中的req变量的值,注意必须按服务文件中的顺序赋值。
但上面是简单情况,srv文件稍微有点复杂时,就会怎么填也不对,个人认为这是ROS Service很失败的一个地方。
例如srv文件的请求部分是这样的:1
2string request_string
string album
我试了很多种组合,都不正确。其实这种情况也好办,在call srvname
之后直接Tab,会给出一个模板:1
2rosservice call service_name "request_string: ''
album: ''"
我们要做的就是把内容填到单引号里面,不要再自己修改模板,否则容易出错。
call
执行成功时,终端不会有任何结果。但是经常出现这样的错误: ERROR: service [/control_cam] responded with an error: ,但程序执行没有问题。原因是 程序中对srv文件中的应答没有处理
其他常用命令:
- rosservice list: 显示当前所有活动的服务
- rosservice info addTwoNum: 显示服务的信息
- rosservice type addTwoNum: 显示服务的变量类型
其实服务的相关命令和话题的很类似
ROS的服务类型
启动乌龟节点时,有一个服务叫clear
,类型:1
2
3rosservice type clear
std_srvs/Empty
看源码可知,服务的类型为空,这表明调用这个服务不需要参数(比如,请求不需要发送数据,响应也没有数据).调用后,服务清除了turtlesim_node的背景上的轨迹,没有响应.
std_srvs
包还有两个服务:std_srvs/Trigger
和std_srvs/SetBool
,但是很不常用