ROS 2 的发布/订阅通信验证

📅 2026/7/3 18:14:39 👁️ 阅读次数 📝 编程学习
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'