使用ROS Service(一) 服务和话题的区别,基本命令

服务和话题

特点 Topic Service
通信方式 异步通信 同步通信
通信模型 Publish-Subscribe Request-Reply
多对多 多对一
接收者接到数据会回调 远程过程调用(RPC)服务器端的服务
应用场景 连续,高频的数据发布 偶尔调用的功能
举例 激光雷达 开关传感器,拍照,逆解计算
由于是同步通信,service 的回调不能写复杂的、耗时长的业务

rosservice call

rosservice call addTwoNum 3 4: 调用服务,addTwoNum是服务名称, 名称不加引号,3和4是服务中的req变量的值,注意必须按服务文件中的顺序赋值。

但上面是简单情况,srv文件稍微有点复杂时,就会怎么填也不对,个人认为这是ROS Service很失败的一个地方。
例如srv文件的请求部分是这样的:

1
2
string request_string
string album

我试了很多种组合,都不正确。其实这种情况也好办,在call srvname之后直接Tab,会给出一个模板:
1
2
rosservice 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
3
rosservice type clear

std_srvs/Empty

看源码可知,服务的类型为空,这表明调用这个服务不需要参数(比如,请求不需要发送数据,响应也没有数据).调用后,服务清除了turtlesim_node的背景上的轨迹,没有响应.

std_srvs包还有两个服务:std_srvs/Triggerstd_srvs/SetBool,但是很不常用