12. Topic 话题📡 与 Message 消息📨

Topic 话题📡 与 Message 消息📨

image.png|400
在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 需要额外的机制来协调。🛠️

通常都不会出现这种情况,因为一个话题只会有一个发布者,多个订阅者。
image.png|400

  • 如果需要imu的节点,订阅imu的话题。
  • 如果需要速度的节点,订阅速度的话题。

🌐总结(Topic)

  1. 话题是节点间持续通信的方式,消息不停发送和接收🔄
  2. 通过话题名称建立连接��
  3. 支持多个发布者和订阅者👥
  4. 传感器通常有独立话题,如超声波和 IMU 分开🚦
  5. 速度控制话题可能有多个发布者,但需控制发言顺序⚠️

📦 二、消息(Message):话题中的数据载体

1. 什么是消息?📬

image.png|600

消息是话题中传输的数据,由发布者发送给订阅者。

  • 超_Node 发布的消息可能是:"前方距离 10 cm"📏
  • 姚_Node 发布的消息可能是:"倾斜角 15 度"🌀

消息通常以一定频率持续发送("刷屏"),保证订阅者获取最新数据🔄

2. 消息的类型 📋

消息携带的数据类型各不相同,ROS 提供了多种消息类型:

  • 标准消息包(std_msgs):包含基础类型,如:

    • bool(布尔类型):一个布尔变量,例如 data: true
    • byte(字节类型):单个字节🔢
    • ByteMultiArray(字节数组):包含数组和其他嵌套类型📦
  • 嵌套组合:复杂消息类型由基础类型组合而成。🔗

🔎 查看消息类型的方法:

  1. 打开 ROS Index。🌐
  2. 搜索 std_msgs,选择与你 ROS 版本对应的条目。🔍
  3. 点击 Website,进入消息类型列表页面。📄
  4. 查看具体类型(如 boolByteMultiArray)的定义,了解其数据结构。📝

3. 自定义消息 🛠️

如果标准消息类型不够用,可以通过组合基础类型创建新消息类型。例如:

float32 distance  # 距离
float32 angle     # 角度

4. 类比 C 语言结构体 🧩

  • 消息类型 ≈ 结构体类型:定义数据结构。
  • 消息包 ≈ 结构体变量:具体的实例化数据。

总结📦

  1. 是话题中传输的数据📬
  2. 有多种类型,由基础类型(如 std_msgs)组合而成🧩
  3. 可通过 ROS Index 查看定义🌐
  4. 支持自定义类型🛠️

🛠️ 三、发布者与订阅者:通信的参与者

  • 发布者(Publisher):发送消息的节点。
    • 示例:超_Node 发布距离信息到"快上车开黑群"。📢
  • 订阅者(Subscriber):接收消息的节点。
    • 示例:马_Node 订阅"快上车开黑群"获取距离信息。👂

一个节点可以同时是多个话题的发布者和订阅者。🔄


🚧 四、协作实现避障任务

实现步骤 📋

  1. 定义话题
    • "快上车开黑群":用于超声波距离信息��
    • "只会辅助哥哥带我":用于 IMU 姿态信息(可选)🌀
  2. 节点功能
    • 超_Node(发布者):每 0.1 秒发布距离消息到"快上车开黑群"📢
    • 马_Node(订阅者):订阅"快上车开黑群",接收距离信息👂
  3. 逻辑处理
    • 马_Node 根据距离判断:
      • 如果距离 < 10 cm,停止或转向🛑
      • 如果距离 > 10 cm,继续前进🚗
  4. 执行动作:马_Node 控制底盘电机实现避障⚙️

系统架构 🏗️

  • 节点
    • 超_Node(ssr_package)
    • 马_Node(atr_pkg)
    • 姚_Node(ssr_package,可选)
  • 话题
    • "快上车开黑群"(超_Node → 马_Node)
    • "只会辅助哥哥带我"(姚_Node → 马_Node,可选)
  • 消息流
    • 超_Node → 距离消息 → 马_Node → 电机控制。

posted @ 2025-04-03 10:35  边走边唱如诗如理想  阅读(26)  评论(0)    收藏  举报