ROS 2 的发布/订阅通信验证
ROS 2 自带了一个经典的demo_nodes_cpp包,包含talker(发布者)和listener(订阅者)节点。我们可以通过官方提供的方法去验证。
下面命令 验证了 ROS 2 的核心通信机制:
写在前面的定义:
talker= 发布者(Publisher)
listener= 订阅者(Subscriber)
/chatter= 话题(Topic)
ros2 topic echo= 窥探话题上流动的数据
demo_nodes_cpp:这个包主要用于学习和验证。核心作用是为开发者提供大量可直接运行的 C++ 代码示例,用于演示 ROS 2 中各种核心通信机制和高级特性的用法。它源自 ROS 2 的examples仓库,被独立出来作为演示用途。因此,在开发实际项目时,应将其代码作为参考,
完整命令速查表
| 命令 | 作用 |
|---|---|
ros2 run demo_nodes_cpp talker | 启动发布者节点 |
ros2 run demo_nodes_cpp listener | 启动订阅者节点 |
ros2 topic list | 列出所有活跃话题 |
ros2 topic info /chatter | 查看话题的发布/订阅统计 |
ros2 topic type /chatter | 查看话题的消息类型 |
ros2 topic echo /chatter | 实时打印话题上的消息内容 |
ros2 topic pub /chatter std_msgs/msg/String "{data: 'test'}" | 手动向话题发布一条消息(无需 talker) |
动手环节:
下面是完整的操作步骤:
📡 第一步:启动 Talker(发布者)
打开终端1,运行:
source /opt/ros/humble/setup.bash ros2 run demo_nodes_cpp talker
你会看到类似这样的输出(每 0.5 秒更新一次):
[INFO] [1700000000.123456789] [talker]: Publishing: 'Hello World: 1' [INFO] [1700000000.623456789] [talker]: Publishing: 'Hello World: 2' [INFO] [1700000001.123456789] [talker]: Publishing: 'Hello World: 3'
这个节点在话题/chatter上持续发布std_msgs/msg/String类型的消息。
👂 第二步:启动 Listener(订阅者)
保持 talker 运行,打开终端2,运行:
source /opt/ros/humble/setup.bash ros2 run demo_nodes_cpp listener
你会看到:
[INFO] [1700000000.223456789] [listener]: I heard: 'Hello World: 1' [INFO] [1700000000.723456789] [listener]: I heard: 'Hello World: 2' [INFO] [1700000001.223456789] [listener]: I heard: 'Hello World: 3'
talker 发布的消息被 listener 成功接收。
📋 第三步:查看所有活跃话题
打开终端3(保持 talker 和 listener 运行),执行:
source /opt/ros/humble/setup.bash ros2 topic list
输出:
/chatter /parameter_events /rosout
/chatter就是 talker 和 listener 通信使用的话题。
🔍 第四步:查看话题详细信息
# 查看话题的发布者、订阅者数量 ros2 topic info /chatter
输出示例:
Type: std_msgs/msg/String Publisher count: 1 Subscription count: 1
# 查看话题的消息类型结构 ros2 topic type /chatter
输出:std_msgs/msg/String
# 查看话题的实时消息内容(非常重要!) ros2 topic echo /chatter
你会看到 topic 上正在传输的原始数据:
text
data: 'Hello World: 42' --- data: 'Hello World: 43' ---
ros2 topic echo会持续输出,按Ctrl + C停止。
🛑 第五步:停止所有节点
在 talker 和 listener 的终端中分别按Ctrl + C即可停止。
🧪 额外:手动发布消息(无需启动 talker)
你可以直接手动向/chatter发布消息,测试 listener 是否正常工作:
# 发布一条消息 ros2 topic pub --once /chatter std_msgs/msg/String "{data: 'Hello manually'}"如果 listener 正在运行,会立即显示I heard: 'Hello manually'。
