12. Topic 话题📡 与 Message 消息📨
Topic 话题📡 与 Message 消息📨
在ROS(Robot Operating System)中,由于其分布式模块化的设计理念,一个完整的机器人任务会被分解成多个节点(Node)来实现。
这些节点之间需要协作,而最常用的通信方式就是通过话题(Topic)和消息(Message)。
🎮 游戏化理解
- 🕹️ 节点如玩家:
- 超_note:马超,狂发"国服马超戴飞"
- 姚_note:辅助,求"求上升加加加"
- 📡 话题如群聊:
- 不同话题独立,像 QQ 群,避免消息混乱
🌐 一、话题(Topic):节点通信的桥梁
🎯 场景设定
- 超声波传感器节点(超_Node):属于
ssr_package
,负责发布距离信息。📏 - 马达节点(马_Node):属于
atr_pkg
,负责订阅距离信息并控制底盘电机进行避障⚙️ - IMU 传感器节点(姚_Node):属于
ssr_package
,负责发布机器人的姿态信息(如旋转、倾斜等)。🌀
1. 什么是话题?🤔
话题是 ROS 中节点之间进行持续通信的一种方式。消息会以一定频率不停地发送和接收,确保数据的实时性。节点通过话题的名称建立连接,就像加入一个共同的"QQ 群"一样💬
�� 示例:
- 话题名称: "快上车开黑群" 🎮
- 超_Node 加入并发布距离信息,比如每 0.1 秒喊一句:"前方距离 10 cm!" 📢
- 马_Node 加入并接收这些信息,根据距离调整运动状态。🚗
话题名称是连接的关键,两个节点通过它快速"熟络"起来,实现跨包通信。🔗
2. 话题的特点 🌟
- 多方参与:一个话题可以有多个发布者(Publisher) 和多个订阅者(Subscriber) 👥
- 独立性:不同功能的节点(如传感器)通常使用独立的话题名称,避免消息混乱。🚦
- 灵活性:节点可以同时订阅或发布多个话题,适应复杂任务需求。🔄
🔍 扩展示例:
- 姚_Node(IMU 传感器)加入新话题 "只会辅助哥哥带我",发布姿态信息。💃
- 超_Node 在"快上车开黑群"发布距离信息。📏
- 马_Node 可以灵活选择订阅这两个话题,分别获取距离和姿态数据。📊
3. 特殊情况:一个话题多个发布者 ⚠️
- 速度控制话题:导航节点和目标跟踪节点都可能发布速度指令到"速度指令"话题。🚀
- 注意事项:同一时刻只能有一个发布者"发言",否则会造成指令冲突,导致机器人抖动或行为异常。ROS 需要额外的机制来协调。🛠️
通常都不会出现这种情况,因为一个话题只会有一个发布者,多个订阅者。
- 如果需要imu的节点,订阅imu的话题。
- 如果需要速度的节点,订阅速度的话题。
🌐总结(Topic)
- 话题是节点间持续通信的方式,消息不停发送和接收🔄
- 通过话题名称建立连接��
- 支持多个发布者和订阅者👥
- 传感器通常有独立话题,如超声波和 IMU 分开🚦
- 速度控制话题可能有多个发布者,但需控制发言顺序⚠️
📦 二、消息(Message):话题中的数据载体
1. 什么是消息?📬
消息是话题中传输的数据,由发布者发送给订阅者。
- 超_Node 发布的消息可能是:"前方距离 10 cm"📏
- 姚_Node 发布的消息可能是:"倾斜角 15 度"🌀
消息通常以一定频率持续发送("刷屏"),保证订阅者获取最新数据🔄
2. 消息的类型 📋
消息携带的数据类型各不相同,ROS 提供了多种消息类型:
-
标准消息包(std_msgs):包含基础类型,如:
bool
(布尔类型):一个布尔变量,例如data: true
✅byte
(字节类型):单个字节🔢ByteMultiArray
(字节数组):包含数组和其他嵌套类型📦
-
嵌套组合:复杂消息类型由基础类型组合而成。🔗
🔎 查看消息类型的方法:
- 打开 ROS Index。🌐
- 搜索
std_msgs
,选择与你 ROS 版本对应的条目。🔍 - 点击
Website
,进入消息类型列表页面。📄 - 查看具体类型(如
bool
或ByteMultiArray
)的定义,了解其数据结构。📝
3. 自定义消息 🛠️
如果标准消息类型不够用,可以通过组合基础类型创建新消息类型。例如:
float32 distance # 距离
float32 angle # 角度
4. 类比 C 语言结构体 🧩
- 消息类型 ≈ 结构体类型:定义数据结构。
- 消息包 ≈ 结构体变量:具体的实例化数据。
总结📦
- 是话题中传输的数据📬
- 有多种类型,由基础类型(如
std_msgs
)组合而成🧩 - 可通过 ROS Index 查看定义🌐
- 支持自定义类型🛠️
🛠️ 三、发布者与订阅者:通信的参与者
- 发布者(Publisher):发送消息的节点。
- 示例:超_Node 发布距离信息到"快上车开黑群"。📢
- 订阅者(Subscriber):接收消息的节点。
- 示例:马_Node 订阅"快上车开黑群"获取距离信息。👂
一个节点可以同时是多个话题的发布者和订阅者。🔄
🚧 四、协作实现避障任务
实现步骤 📋
- 定义话题:
- "快上车开黑群":用于超声波距离信息��
- "只会辅助哥哥带我":用于 IMU 姿态信息(可选)🌀
- 节点功能:
- 超_Node(发布者):每 0.1 秒发布距离消息到"快上车开黑群"📢
- 马_Node(订阅者):订阅"快上车开黑群",接收距离信息👂
- 逻辑处理:
- 马_Node 根据距离判断:
- 如果距离 < 10 cm,停止或转向🛑
- 如果距离 > 10 cm,继续前进🚗
- 马_Node 根据距离判断:
- 执行动作:马_Node 控制底盘电机实现避障⚙️
系统架构 🏗️
- 节点:
- 超_Node(ssr_package)
- 马_Node(atr_pkg)
- 姚_Node(ssr_package,可选)
- 话题:
- "快上车开黑群"(超_Node → 马_Node)
- "只会辅助哥哥带我"(姚_Node → 马_Node,可选)
- 消息流:
- 超_Node → 距离消息 → 马_Node → 电机控制。