1. 创建并运行第一个ROS2节点

任务目标

编写一个ROS2 Python节点,周期性地向话题 /chatter 发布字符串消息 "Hello ROS2",同时启动一个订阅端验证消息是否正确接收。通过本案例掌握ROS2节点创建、话题通信和命令行验证的基本流程。

环境准备

需要已安装ROS2(Humble或更新版本),并完成环境变量加载:

source /opt/ros/humble/setup.bash

完整实现

创建ROS2功能包并编写发布者与订阅者节点。以下为最小可运行实现:

# 创建功能包(在终端执行)
ros2 pkg create --build-type ament_python py_pubsub

# 编辑 py_pubsub/py_pubsub/publisher.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Publisher(Node):
    def __init__(self):
        super().__init__('publisher')
        self.pub = self.create_publisher(String, '/chatter', 10)
        self.timer = self.create_timer(1.0, self.timer_callback)
        self.count = 0

    def timer_callback(self):
        msg = String()
        msg.data = f'Hello ROS2: {self.count}'
        self.pub.publish(msg)
        self.get_logger().info(f'发布: {msg.data}')
        self.count += 1

def main(args=None):
    rclpy.init(args=args)
    node = Publisher()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

# 编辑 py_pubsub/py_pubsub/subscriber.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Subscriber(Node):
    def __init__(self):
        super().__init__('subscriber')
        self.sub = self.create_subscription(String, '/chatter', self.callback, 10)

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

def main(args=None):
    rclpy.init(args=args)
    node = Subscriber()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

在 setup.py 中注册入口点:

entry_points={
    'console_scripts': [
        'publisher = py_pubsub.publisher:main',
        'subscriber = py_pubsub.subscriber:main',
    ],
},

运行与验证

  1. 构建并加载环境:
cd ~/ros2_ws
colcon build --packages-select py_pubsub
source install/setup.bash
  1. 启动发布者(终端1):
ros2 run py_pubsub publisher
  1. 启动订阅者(终端2):
ros2 run py_pubsub subscriber
  1. 另开终端查看话题列表与消息:
ros2 topic list
ros2 topic echo /chatter

通过条件:订阅者终端每秒打印一条 收到: Hello ROS2: N(N为递增数字),且 ros2 topic echo 能持续输出相同格式的消息,说明节点通信正常。

publisher Python节点 /chatter subscriber Python节点 发布 订阅 String消息 发布者每秒发送一次,订阅者实时接收

常见问题

  • 找不到功能包:确认已执行 source install/setup.bash,且当前目录为工作区根目录。
  • 话题无消息:检查发布者终端是否报错,确认话题名称完全一致(均为 /chatter)。
  • 编译错误:确认 setup.py 中入口点格式正确,且 package.xml 已声明对 std_msgs 和 rclpy 的依赖。