写点什么

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

作者:芯动大师
  • 2025-01-12
    四川
  • 本文字数:1752 字

    阅读完需:约 6 分钟

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 格式具体示例如下:

name:'Zhangsan'age:20gender:'M'score{Chinese:80,Math:90}score_history:[85,82,88,90]
复制代码

简明解释。就是“名称+:+值”这样一种常用的解释方式。一般格式如下:

key : value
复制代码

遵循格式进行定义参数。其实就可以把 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。

发布于: 刚刚阅读数: 8
用户头像

芯动大师

关注

凡事预则立,不预则废! 2022-06-01 加入

某公司芯片AE工程师,嵌入式开发工程师,InfoQ签约作者,阿里云专家博主,华为云·云享专家,51CTO专家博主,腾讯云社区优秀共创官。

评论

发布
暂无评论
ROS通信机制详解:Service与Parameter Server的工作原理与应用场景_ROS_芯动大师_InfoQ写作社区