ROS通信是ROS的核心之一。
一、基本概念
- 节点(Node)
- 一个节点就表示一个进程
- 多节点、端到端、分布式通信机制
- 消息(Message)
- 节点之间通过订阅和发布传递的数据
- 可以使用ROS提供的消息类型,也可以使用 .msg 文件自定义消息类型
- 话题(Topic)
- 消息通过发布/订阅(Publish/Subscribe)方式传递
- 发布者节点(Talker)针对一个给定的话题发布消息,订阅者节点(Listener)订阅某个话题及其特定数据
- 话题通信是【异步通信】
- 无反馈,有缓冲,弱实时,节点关系多对多,适于数据传输
- 服务(Service)
- 基于服务器/客服端(Sercer/Client)模型
- 可以使用 ROS 提供的服务类型,也可以使用 .srv 文件自定义
- 服务通信是【同步通信】
- 有反馈,无缓冲,强实时,节点关系一对多,适于逻辑处理
- 节点管理器(ROS Master)
- 统筹管理所有节点,进行节点间的查找、连接等
- 为系统提供参数服务器,管理全局参数
- 节点管理器也体现了ROS的弊端:ROS Master 如果 broken down,整个系统将崩溃
二、通信原理
ROS可以形象的描述为一个工厂的运行机制,创建好一个工作空间(workspace)就像一个工厂,工厂里又有好多个生产车间,每个功能包(pkg)看作是一个生产车间,每个生产车间又有好多工人在配合,每个节点(node)看作是一个工人,节点是又是可执行程序的最小单位,工人们之间相互沟通通过消息(mesage)来完成。
ROS中的通信方式有四种,话题、服务、参数服务器、动作库。常用前三种。
2.1 话题通信
对于实时性、周期性的消息,使用topic来传输是最佳的选择。topic是一种点对点的单向通信方式,这里的“点”指的是node,也就是说node之间可以通过topic方式来传递信息。topic要经历下面几步的初始化过程:首先,publisher节点和subscriber节点都要到节点管理器进行注册,然后publisher会发布topic,subscriber在master的指挥下会订阅该topic,从而建立起sub-pub之间的通信。注意整个过程是单向的。
举个例子,有一个软件叫今日头条,你喜欢看汽车类的新闻,这个“汽车类的新闻”就是话题。今日头条软件就经常给你推送这个话题的内容,当你打开的时候就会看到,也就是“订阅”。
再举个例子,你喜欢听FM90.8安徽交通广播的《青春集结号》节目,电台那边就是发布者,你打开收音机调到这个频道就是
2.2 服务通信
service服务通讯机制是一种双向同步数据传输模式。基于客户端/服务器模型,两部分通信数据类型:一个用于请求,一个用于应答,类似web服务器。
举个例子,就像是你打10086客服电话查话费,打过去就是客户端发出请求,客服给你回复就是服务端产生响应。
2.3 参数服务器
在机器人系统中,参数传递十分重要,机器人工作时,我们有需要对机器人的参数(如传感器参数、算法的参数)进行设置。有些参数(如机器人的轮廓、传感器的高度)在机器人启动时就设定好就行了,有些参数则需要动态改变(特别是在调试的时候)。无论是传感器的设置,还是控制参数的调整,都需要留出方便的参数调试接口。ROS提供了参数服务器来满足这一需求,我们可以将参数设置在参数服务器,在需要用到参数的时候再从参数服务器中获取。使用参数服务器配置系统的参数,是全局可见的,方便我们检索和更改系统的配置状态。
相当于把参数都放到一个容器中,需要的时候从中取。参数共享。就像共享单车,单车都是参数,需要的时候进行扫码使用。作为管理者,可能也会投放新的参数,或者删除一些旧的参数。
参考文章:
https://zhuanlan.zhihu.com/p/90425611?from_voters_page=true
https://www.pianshen.com/article/14831374014/
https://blog.csdn.net/sunlin972913894/article/details/103556936