ROS 通信机制全解析:Topic、Service、Parameter Service 和 Actionlib 的核心原理与应用
ROS 的通信方式是 ROS 最为核心的概念,ROS 系统的精髓就在于它提供的通信架构。ROS 的通信方式有以下四种:
Topic 主题
Service 服务
Parameter Service 参数服务器
Actionlib 动作库
Topic(发布/订阅)
ROS 中的通信方式中,topic 是常用的一种。对于实时性、周期性的消息,使用 topic 来传输是最佳的选择。topic 是一种点对点的单向通信方式,这里的“点”指的是 node,也就是说 node 之间可以通过 topic 方式来传递信息。topic 要经历下面几步的初始化过程:首先,publisher 节点和 subscriber 节点都要到节点管理器进行注册,然后 publisher 会发布 topic,subscriber 在 master 的指挥下会订阅该 topic,从而建立起 sub-pub 之间的通信。注意整个过程是单向的。其结构示意图如下:
Subscriber 接收消息会进行处理,一般这个过程叫做回调(Callback)。所谓回调就是提前定义好了一个处理函数(写在代码中),当有消息来就会触发这个处理函数,函数会对消息进行处理。
注意整个过程是单向的。
Talker 向 ROS Master 注册
Listener 向 ROS Master 注册
ROS Master 通过 RPC 向 Listener 发送 Talker 的地址信息
Listener 接收到地址信息,通过 RPC 向 Talker 发送连接请求
Talker 确认连接请求,通过 RPC 向 Listener 确认连接
Listener 与 Talker 建立网络连接
Talker 向 Listener 发布数据
总结:前五步的通信协议都是 RPC,最后两步传输数据才用 TCP
通信示例
怎么样来理解“异步”这个概念呢?在 node1 每发布一次消息之后,就会继续执行下一个动作,至于消息是什么状态、被怎样处理,它不需要了解;而对于 node2 图像处理程序,它只管接收和处理/camera_rgb
上的消息,至于是谁发来的,它不会关心。所以 node1、node2 两者都是各司其责,不存在协同工作,我们称这样的通信方式是异步的。
ROS 是一种分布式的架构,一个 topic 可以被多个节点同时发布,也可以同时被多个节点接收。比如在这个场景中用户可以再加入一个图像显示的节点,我们在想看看摄像头节点的画面,则可以用自己的笔记本连接到机器人上的节点管理器,然后在自己的电脑上启动图像显示节点。
这就体现了分布式系统通信的好处:扩展性好、软件复用率高。
总结三点:
topic 通信方式是异步的,发送时调用 publish()方法,发送完成立即返回,不用等待反馈。
subscriber 通过回调函数的方式来处理消息。
topic 可以同时有多个 subscribers,也可以同时有多个 publishers。ROS 中这样的例子有:/rosout、/tf 等等。
操作命令
在实际应用中,我们应该熟悉 topic 的几种使用命令,下表详细的列出了各自的命令及其作用。
如果你一时忘记了命令的写法,可以通过rostopic help
或rostopic command -h
查看具体用法。
topic 的通信方式是 ROS 中比较常见的单向异步通信方式,它在很多时候的通信是比较易用且高效的。但是有些需要交互的通信时该方式就显露出自己的不足之处了,后续我们会介绍双向同步的通信方式 service。
Message
topic 有很严格的格式要求,比如上节的摄像头进程中的 rgb 图像 topic,它就必然要遵循 ROS 中定义好的 rgb 图像格式。这种数据格式就是 Message。Message 按照定义解释就是 topic 内容的数据类型,也称之为 topic 的格式标准。这里和我们平常用到的 Massage 直观概念有所不同,这里的 Message 不单单指一条发布或者订阅的消息,也指定为 topic 的格式标准。
结构与类型
基本的 msg 包括 bool、int8、int16、int32、int64(以及 uint)、float、float64、string、time、duration、header、可变长数组 array[]、固定长度数组 array[C]。那么具体的一个 msg 是怎么组成的呢?我们用一个具体的 msg 来了解,例如上例中的 msg sensor_msg/image
,位置存放在sensor_msgs/msg/image.msg
里,它的结构如下:
观察上面 msg 的定义,是不是很类似 C 语言中的结构体呢?通过具体的定义图像的宽度,高度等等来规范图像的格式。所以这就解释了 Message 不仅仅是我们平时理解的一条一条的消息,而且更是 ROS 中 topic 的格式规范。或者可以理解 msg 是一个“类”,那么我们每次发布的内容可以理解为“对象”,这么对比来理解可能更加容易。 我们实际通常不会把 Message 概念分的那么清,通常说 Message 既指的是类,也是指它的对象。而 msg 文件则相当于类的定义了。
操作命令
rosmsg 的命令相比 topic 就比较少了,只有两个如下:
版权声明: 本文为 InfoQ 作者【芯动大师】的原创文章。
原文链接:【http://xie.infoq.cn/article/f65e3f304b8549215ab0c9192】。文章转载请联系作者。
评论