在上一篇文章中简单了解了ROS话题通信机制,但是它内部的通信过程,很多人都是不知道的,今天我看了 胡春旭的书籍——《ROS机器人开发实践》,又加深了对ROS话题通信的理解,打算接着讲解一下其过程是怎么样的。
ROS系列文章【ROS入门-1】手把手教你在Ubuntu18.04安装ROS Melodic
【ROS入门-2】带你看ROS文件系统及其工具
【ROS入门-3】嘴对嘴讲解ROS的核心概念——节点与节点管理器
【ROS入门-4】嘴对嘴讲解ROS的核心概念——ROS话题通信机制
【ROS入门-5】深入了解ROS话题通信机制的过程
节点的连接一个节点需要与系统中其他节点进行通信才有意义,系统中任何单独的一个节点其实都是没有意义的。下图是一个话题通讯的过程示意图,一个节点通过节点管理器连接到另一个节点,最终请求话题数据流。
ps:在ROS中有两个节点:一个是发布者Talker
,另一个是订阅者Listener
,两个节点分别发布、订阅同一个话题bar
。
Talker
注册
在系统中,节点与节点是没有任何关系的,都靠节点管理器来处理相关的请求与服务,首先第一步,发布者Talker
需要向节点管理器ROS Master
注册相关信息,包括节点的信息、需要发布的话题名等,然后节点管理器ROS Master
会记录下来Talker
节点的信息。
Listener
注册
同理订阅者Listener
也需要向节点管理器ROS Master
注册相关信息,这其实是启动两个节点时候就已经做了的事情。
ROS Master
进行话题匹配
因为发布者Talker
与订阅者Listener
节点都在节点管理器ROS Master
注册了信息,那么节点管理器ROS Master
就会发现有相同的话题信息,此时它就需要将订阅与发布话题的两个节点匹配在一起,会通过RPC向订阅者Listener
发送Talker
节点的RPC地址信息。
Listener
向Talker
发送连接请求
订阅者Listener
知道发布者Talker
后,就会主动找到它,并且通过RPC向TTalker
发送连接请求,传输订阅的话题名、消息类型以及通信协议。
Talker
确认连接请求
Talker
接收到Listener
发送的连接请求后,继续通过RPC向Listener
确认连接信息,同时发送自身相关的信息。
Listener
尝试与Talker
建立网络连接
Listener接收到确认信息后,使用TCP尝试与Talker
建立网络连接。
Talker
向Listener
发布消息
成功建立连接后,Talker
开始向Listener
发送话题消息数据。
在节点与节点建立连接前,他们的通信协议都是RPC,而这主要都是依赖于节点管理器的,在节点与节点建立连接后,就直接是使用TCP协议进行数据传输,而不需要依赖节点管理器,此时节点管理器允许被关闭,但在关闭后,其他节点就不能订阅、发布这个话题消息了。
总之节点管理器ROS Master
在节点建立连接的过程中起到了重要作用,但是并不参与节点之间最终的数据传输。
本文的部分截图来自书籍《ROS机器人开发实践》 胡春旭 著。
参考ROS官方wiki
ROS笔记(7) 话题通信