2. 创建第一个ROS2订阅者节点

任务目标

在ROS2环境中创建一个订阅者节点,订阅指定字符串话题,并在控制台打印接收到的每条消息。通过本案例,验证ROS2发布-订阅通信模型的基本工作流程。

环境准备

本案例需要已安装ROS2(Humble或Foxy版本均可),并完成环境变量加载。以下命令假设使用Humble版本,若为其他版本请对应调整。

# 加载ROS2环境(以Humble为例)
source /opt/ros/humble/setup.bash

完整实现代码

创建一个Python文件 subscriber_node.py,代码如下:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class StringSubscriber(Node):
    def __init__(self):
        super().__init__('string_subscriber')
        self.subscription = self.create_subscription(
            String,
            'chatter',
            self.listener_callback,
            10
        )
        self.subscription  # 防止被垃圾回收

    def listener_callback(self, msg):
        self.get_logger().info(f'收到消息: {msg.data}')

def main(args=None):
    rclpy.init(args=args)
    node = StringSubscriber()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass
    finally:
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

运行与验证

按照以下步骤执行,即可完成发布-订阅通信验证:

  1. 运行订阅者节点(终端1):
python3 subscriber_node.py
  1. 启动命令行发布者(终端2,同样先加载ROS2环境):
ros2 topic pub /chatter std_msgs/msg/String "data: 'Hello ROS2'" --once
  1. 观察结果:在终端1中应看到类似 [INFO] [timestamp] [string_subscriber]: 收到消息: Hello ROS2 的日志输出。

通过判定标准:终端1成功打印出与终端2发布内容一致的消息,且无报错信息,即表示订阅者节点工作正常,发布-订阅通信链路已打通。

常见问题排查

  • 找不到模块:确认已正确安装ROS2 Python接口(rclpy),并已执行source /opt/ros/humble/setup.bash。
  • 话题不匹配:检查订阅者代码中的话题名(chatter)与ros2 topic pub命令中的话题名是否完全一致。
  • 消息类型错误:确保发布者使用的消息类型为std_msgs/msg/String,与订阅者代码中导入的类型一致。