ROS 通信机制详解:Service 与 Parameter Server 的工作原理与应用场景

Service(服务)
Talker 向 ROS Master 注册
Listener 向 ROS Master 注册
ROS Master 进行信息匹配
Listener 与 Talker 建立网络连接,发送服务的请求数据
Talker 接收请求参数,执行服务功能,执行完后,发送应答数据
总结:前三步的通信协议都是 RPC,最后两步传输数据才用 TCP
为了解决以上问题,service 方式在通信模型上与 topic 做了区别。Service 通信是双向的,它不仅可以发送消息,同时还会有反馈。所以 service 包括两部分,一部分是请求方(Clinet),另一部分是应答方/服务提供方(Server)。这时请求方(Client)就会发送一个 request,要等待 server 处理,反馈回一个 reply,这样通过类似“请求-应答”的机制完成整个服务通信。
这种通信方式的示意图如下:Node B 是 server(应答方),提供了一个服务的接口,叫做/Service
,我们一般都会用 string 类型来指定 service 的名称,类似于 topic。Node A 向 Node B 发起了请求,经过处理后得到了反馈。

Service 是同步通信方式,所谓同步就是说,此时 Node A 发布请求后会在原地等待 reply,直到 Node B 处理完了请求并且完成了 reply,Node A 才会继续执行。Node A 等待过程中,是处于阻塞状态的成通信。这样的通信模型没有频繁的消息传递,没有冲突与高系统资源的占用,只有接受请求才执行服务,简单而且高效。
topic VS service

注意: 远程过程调用(Remote Procedure Call, RPC),可以简单的理解为在一个进程里调用另一个进程的函数。
操作命令
在实际应用中,service 通信方式的命令时rosservice
,具体的命令参数如下表:

Parameter server
基于 RPC 的参数服务器
Talker 向 ROS Master 设置变量参数
Listener 向 ROS Master 查询参数值
ROS Master 向 Listener 发送参数值
总结:通信协议都是 RPC
参数服务器(parameter server)。与前两种通信方式不同,参数服务器也可以说是特殊的“通信方式”。特殊点在于参数服务器是节点存储参数的地方、用于配置参数,全局共享参数。参数服务器使用互联网传输,在节点管理器中运行,实现整个通信过程。
参数服务器,作为 ROS 中另外一种数据传输方式,有别于 topic 和 service,它更加的静态。参数服务器维护着一个数据字典,字典里存储着各种参数和配置。
字典简介
何为字典,其实就是一个个的键值对,我们小时候学习语文的时候,常常都会有一本字典,当遇到不认识的字了我们可以查部首查到这个字,获取这个字的读音、意义等等,而这里的字典可以对比理解记忆。键值 kay 可以理解为语文里的“部首”这个概念,每一个 key 都是唯一的,参照下图:

每一个 key 不重复,且每一个 key 对应着一个 value。也可以说字典就是一种映射关系,在实际的项目应用中,因为字典的这种静态的映射特点,我们往往将一些不常用到的参数和配置放入参数服务器里的字典里,这样对这些数据进行读写都将方便高效。
维护方式
参数服务器的维护方式非常的简单灵活,总的来讲有三种方式:
命令行维护
launch 文件内读写
node 源码
下面我们来一一介绍这三种维护方式。
命令行维护
使用命令行来维护参数服务器,主要使用rosparam
语句来进行操作的各种命令,如下表:

load&&dump 文件
load 和 dump 文件需要遵守 YAML 格式,YAML 格式具体示例如下:
简明解释。就是“名称+:+值”这样一种常用的解释方式。一般格式如下:
遵循格式进行定义参数。其实就可以把 YAML 文件的内容理解为字典,因为它也是键值对的形式。
launch 文件内读写
launch 文件中有很多标签,而与参数服务器相关的标签只有两个,一个是<param>
,另一个是<rosparam>
。这两个标签功能比较相近,但<param>
一般只设置一个参数,请看下例:
(1) (2) (3)
观察上例比如序号 3 的 param 就定义了一个 key 和一个 value,交给了参数服务器维护。而序号 1 的 param 只给出了 key,没有直接给出 value,这里的 value 是由后没的脚本运行结果作为 value 进行定义的。序号(2)就是 rosparam 的典型用法,先指定一个 YAML 文件,然后施加 command,其效果等于rosparam load file_name
。
node 源码
除了上述最常用的两种读写参数服务器的方法,还有一种就是修改 ROS 的源码,也就是利用 API 来对参数服务器进行操作。
参数类型
ROS 参数服务器为参数值使用 XMLRPC 数据类型,其中包括:strings, integers, floats, booleans, lists, dictionaries, iso8601 dates, and base64-encoded data。
版权声明: 本文为 InfoQ 作者【芯动大师】的原创文章。
原文链接:【http://xie.infoq.cn/article/5b4f8899e6db5f39e60493256】。文章转载请联系作者。
评论