教程为赵虚左的天地良心ROS课程:link
话题通讯
话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。话题通信的应用场景也极其广泛,比如下面一个常见场景:
- 机器人在执行导航功能,使用的传感器是激光雷达,机器人会采集激光雷达感知到的信息并计算,然后生成运动控制信息驱动机器人底盘运动。
在上述场景中,就不止一次使用到了话题通信。
- 以激光雷达信息的采集处理为例,在 ROS 中有一个节点需要时时的发布当前雷达采集到的数据,导航模块中也有节点会订阅并解析雷达数据。
- 再以运动消息的发布为例,导航模块会根据传感器采集的数据时时的计算出运动控制信息并发布给底盘,底盘也可以有一个节点订阅运动信息并最终转换成控制电机的脉冲信号。
以此类推,像雷达、摄像头、GPS…等等一些传感器数据的采集,也都是使用了话题通信,换言之,话题通信适用于不断更新的数据传输相关的应用场景。
话题通讯理论模型
该模型中涉及到三个角色:
- ROS Master (管理者)
- Talker (发布者)
- Listener (订阅者)
整个流程可以这么理解:
我们可以把这个通讯当做一次相亲过程,master可以根据话题建立发布者和订阅者之间的连接,起到了一个媒介的作用,也就是相亲中的媒婆。相对应假设Talker是男方,Listener是女方。 - step0:男方(Talker)会在媒婆(ROS Master)这里发布一个征婚广告(advertise)广告上面写着"我在上海有一套房"(话题),还有联系电话(RPC地址)。
- step1:同时女方(Listener)给媒婆(ROS Master)发布一个“征婚标准”(subscribe),比如要找一个“在上海有一套房”的男人(话题)。
- step2:媒婆发现,男方满足女方要求,即有共同话题,那么媒婆(ROS Mster)把男方(Talker)的电话(RPC地址)发从给女方(Listener)。
- step3:女方(Listener)就打电话给男方(Talker):听说你有房,我们聊一聊
- step4:男方(Talker)回复:好啊,电话不方便,加我微信(TCP地址)吧!
- step5:女方(Listener)加男方(Talker)微信(TCP地址)
- step6:两者建立通信,女方就能订阅到男方信息
有几点注意:
- 注意1:上述实现流程中,前五步使用的 RPC协议,最后两步使用的是 TCP 协议
- 注意2: Talker 与 Listener 的启动无先后顺序要求
- 注意3: Talker 与 Listener 都可以有多个
- 注意4: Talker 与 Listener 连接建立后,不再需要 ROS Master。也即,即便关闭ROSMaster,Talker 与 Listern 照常通信。
整个流程翻译成官话:
0.Talker注册
Talker启动后,会通过RPC在 ROS Master 中注册自身信息,其中包含所发布消息的话题名称。ROS Master 会将节点的注册信息加入到注册表中。
1.Listener注册
Listener启动后,也会通过RPC在 ROS Master 中注册自身信息,包含需要订阅消息的话题名。ROS Master 会将节点的注册信息加入到注册表中。
2.ROS Master实现信息匹配
ROS Master 会根据注册表中的信息匹配Talker 和 Listener,并通过 RPC 向 Listener 发送 Talker 的 RPC 地址信息。
3.Listener向Talker发送请求
Listener 根据接收到的 RPC 地址,通过 RPC 向 Talker 发送连接请求,传输订阅的话题名称、消息类型以及通信协议(TCP/UDP)。
4.Talker确认请求
Talker 接收到 Listener 的请求后,也是通过 RPC 向 Listener 确认连接信息,并发送自身的 TCP 地址信息。
5.Listener与Talker件里连接
Listener 根据步骤4 返回的消息使用 TCP 与 Talker 建立网络连接。
6.Talker向Listener发送消息
连接建立后,Talker 开始向 Listener 发布消息。