3.1 ROS 2主题通信的工作原理

【新书介绍】《ROS 2机器人系统开发实践(视频教学版)》-CSDN博客

ROS 2机器人系统开发实践(视频教学版) 梁伟、李园奇、李海慧 清华大学出版社【行情 报价 价格 评测】-京东

3.1 主题通信的工作原理

在开始编写代码前,我们需要先理解"主题通信"的本质:它并非简单的"点对点传输",而是一种"基于主题的异步广播机制"。为了使读者更直观地理解这一概念,可以使用"城市广播系统"来类比ROS 2主题通信的工作原理。

在此类比例子中,广播电台(发布者)主要负责向特定频道(主题)发送节目(消息)。例如,一个交通广播频道向听众发送路况信息。听众(订阅者)只需将收音机调到对应频道(订阅主题),即可收听该节目,而无须知道广播电台的位置等信息。电台所发送的无线电波(对应ROS 2底层通信)负责将广播电台的信号(消息)传递给所有听众,我们也无须关心信号具体是如何传输的。

本节将从"核心组件""通信流程"以及"核心特性"三个维度,对ROS 2主题通信的工作原理进行深入拆解。

  1. 主题通信的核心组件

ROS 2的主题通信主要依赖4个核心组件协同工作。其中每个组件都有明确的功能职责,与交通广播系统中的电台、听众、频道、节目内容一一对应,如表3.1所示。

表3.1 组件类比、定义、功能职责

|-----------------|------------------|-------------------------------------------------------------|---------------------------------------------------|
| 核心组件 | 类比 (交通广播系统) | 在ROS 2中的定义与功能职责 | 机器人场景示例 |
| 发布者(Publisher) | 广播电台 | 数据的"生产者":将指定类型的消息,按一定频率或条件发布到某个主题,可多个发布者共享一个主题 | 激光雷达节点(向/scan主题发布障碍物数据) |
| 订阅者(Subscriber) | 收音机 | 数据的"消费者":订阅某个主题,接收该主题上的所有消息,并通过"回调函数"处理数据,可多个订阅者共享一个主题 | 路径规划节点(订阅/scan主题,用数据计算路径) |
| 主题(Topic) | 广播频道 (例如:FM97.4) | 消息的"传输载体":用唯一名称(例如/chatter)标识,是发布者与订阅者的"连接桥梁",仅传递指定类型的消息 | /scan(激光数据)、/cmd_vel(控制命令) |
| 消息(Message) | 节目内容 (路况/音乐) | 数据的"具体格式":定义了传输数据的结构(例如字符串、数值、自定义结构体),发布者与订阅者必须使用相同消息类型才能通信 | std_msgs/String(字符串)、sensor_msgs/ LaserScan(激光数据) |

备注:消息是主题通信的"语言",如果发布者用"中文"(std_msgs/String)发送消息,那么订阅者必须也懂"中文"(同类型)才能理解,否则会出现通信失败。

  1. 主题通信的完整流程

ROS 2的主题通信流程由底层自动完成,无须我们手动干预,具体可以分为以下4个步骤。以"激光雷达→路径规划"的通信为例,具体执行过程说明如下。

1)节点宣告通信意图

激光雷达节点(发布者)启动后,会主动告知要向主题/scan发布类型为sensor_msgs/LaserScan的消息。而路径规划节点(订阅者)启动后,会向主题/scan订阅同一类型的消息。

2)底层自动匹配连接

ROS 2基于DDS(数据分发服务)实现"节点发现"。当系统检测到同一主题与同一消息类型的发布者与订阅者时,会自动在两者之间建立点对点通信连接,无须中心节点进行转发。

3)发布者发送消息

当激光雷达节点采集数据时,会将数据封装成sensor_msgs/LaserScan类型的消息,并通过已建立的连接发送到主题/scan上。

4)订阅者处理消息

当路径规划节点接收到主题/scan的消息后,会触发用户在ROS 2代码中定义的回调函数对数据(例如,障碍物距离、角度)进行解析,并用于计算机器人的行驶路径。当路径规划节点接收到来自主题/scan的消息后,会触发用户在ROS 2代码中定义的回调函数,对数据(例如,障碍物距离、角度等)进行解析,并用于计算机器人的行驶路径。

备注:以上整个通信流程是异步进行的。发布者发送消息后无须等待订阅者回复,即可直接继续采集数据;订阅者也无须主动请求,只需在主题上"被动接收"消息即可。

  1. 主题通信的核心特性

ROS 2主题通信之所以能成为主力通信模式,主要是因其三大核心特性完美适配了机器人开发的需求。具体说明如下。

1)异步通信实现高实时性

发布者无须等待订阅者响应,可持续发送数据(例如,激光雷达每秒向主题发送10次数据),避免了因等待订阅者回复而导致的数据延迟。异步通信特性对于机器人的"实时避障""动态路径规划"等功能实现具有非常重要的作用。

2)多对多通信

多个发布者对同一主题发送数据时,订阅者可以同时获取多组数据。例如,当机器人左、右两个摄像头节点同时向主题/image_raw发送左目和右目图像数据时,订阅者可同时获取两组图像,用于立体视觉数据处理。

多个订阅者接收同一主题的消息数据时,可根据自身功能对相同数据实现不同处理。例如,主题/scan上的激光数据可同时被"路径规划""避障"以及"可视化"三个节点订阅,实现"一份数据,多种功能"的应用效果。

3)架构易于维护

在ROS 2主题通信过程中,发布者与订阅者无须知道对方的存在。例如,若需替换激光雷达节点(如将其类型从2D升级为3D),我们只需保证新节点仍向主题/scan发布类型为sensor_msgs/LaserScan的消息即可,路径规划节点无须任何修改即可继续工作。反之,当我们新增一个"激光数据可视化"订阅者时,也不会影响已有的发布者和订阅者。

  1. 查看主题所涉及的命令

与第2章中的节点检查命令类似,我们可以通过ROS 2命令工具查看当前主题的状态信息,例如当前已运行的主题、主题消息类型、发布者以及订阅者数量等。相关命令如表3.2所示。

表3.2 主题信息检查命令

|--------------------------|----------------------------|------------------------------------------------------------------------------------------------------------|
| 命令格式 | 功能描述 | 示例与输出效果 |
| ROS 2topic list | 查看当前所有活跃的主题 | 例如,输入该命令后,终端将输出:/scan /cmd_vel /rosout /turtle1/pose |
| ROS 2topic info <主题名称> | 查看指定主题的详细信息 (发布者/订阅者/消息类型) | 例如,输入ROS 2topic info /scan后,终端将输出:Type: sensor_msgs/ LaserScanPublishers:1(激光雷达节点)Subscribers:2(路径规划+避障节点) |
| ROS 2topic echo <主题名称> | 实时打印指定主题的消息内容 | 例如,输入ROS 2topic echo/turtle1/pose后,终端会持续输出海龟的实时位置(x /y/theta)和速度信息 |
| ROS 2topic hz <主题名称> | 查看指定主题的消息发布频率(Hz) | 例如,输入ROS 2topic hz/scan后,诊断将输出:average rate:10.00Hz(即每秒10次) |

备注:在开发过程中,我们如果遇到"订阅者收不到消息"的情况,可以使用以下命令进行排查:首先使用ros2 topic list检查并确认主题名称是否正确;然后使用ros2 topic info <主题名称>检查并确认发布者与订阅者是否匹配;最后使用ros2 topic echo <主题名称> 验证消息是否被正常发送。

相关推荐
Dawson Zhu1 小时前
【AI编译器入门②】TVM架构拆解:Relay、Relax、TIR与Runtime四层结构
人工智能·语言模型·架构·aigc·agi
阿狸猿1 小时前
AI Agent自动写自动化脚本
运维·人工智能·自动化
云和数据.ChenGuang1 小时前
项目打开后没有主类
开发语言·人工智能·langchain·1024程序员节
民乐团扒谱机1 小时前
【读论文】音色在微分音程记忆中的作用
人工智能·深度学习·算法
推送者1 小时前
立体桌宠定制:一张正脸照到本地九视角标定的工程链路
人工智能·立体桌宠定制
鬼手点金1 小时前
缓存作为架构约束
开发语言·前端·人工智能·python·microsoft·缓存·架构
lucas_AI1 小时前
24 天、4310 万行代码:AI 集群啃下了人类史上最长的数学证明
人工智能
SEO_juper1 小时前
Node.js 页面主题聚焦度检测:title 和正文各说各的,AI 也读不懂
开发语言·人工智能·node.js·seo·外贸独立站
IT_陈寒1 小时前
React实战技巧总结:如何优雅处理复杂列表的渲染卡顿问题?
前端·人工智能·后端