1. 多机器人话题通信基础

任务目标

创建两个ROS2 Python节点,分别模拟两台机器人(robot1和robot2),通过话题实现字符串消息的发送与接收。robot1作为发送方周期性发布问候消息,robot2作为接收方订阅并打印收到的内容,以此理解ROS2中基于话题的发布/订阅通信模式。

环境依赖

  • Ubuntu 22.04 + ROS2 Humble(或其他已安装的ROS2发行版)
  • ROS2 Python客户端库 rclpy(随ROS2默认安装)
  • 已创建ROS2工作空间并完成 colcon build 环境配置

实现代码

创建功能包 multi_robot_basic,在 src/multi_robot_basic/multi_robot_basic/ 目录下新建以下两个节点文件:

# robot1_publisher.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Robot1Publisher(Node):
    def __init__(self):
        super().__init__('robot1_publisher')
        self.publisher = self.create_publisher(String, 'robot_chat', 10)
        self.timer = self.create_timer(1.0, self.timer_callback)
        self.count = 0

    def timer_callback(self):
        msg = String()
        msg.data = f"Hello from robot1, message #{self.count}"
        self.publisher.publish(msg)
        self.get_logger().info(f'Publishing: "{msg.data}"')
        self.count += 1

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

if __name__ == '__main__':
    main()
# robot2_subscriber.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Robot2Subscriber(Node):
    def __init__(self):
        super().__init__('robot2_subscriber')
        self.subscription = self.create_subscription(
            String, 'robot_chat', self.listener_callback, 10)
        self.subscription  # prevent unused variable warning

    def listener_callback(self, msg):
        self.get_logger().info(f'Robot2 received: "{msg.data}"')

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

if __name__ == '__main__':
    main()

在 setup.py 的 entry_points 中添加:

entry_points={
    'console_scripts': [
        'robot1_publisher = multi_robot_basic.robot1_publisher:main',
        'robot2_subscriber = multi_robot_basic.robot2_subscriber:main',
    ],
},

运行与验证

  1. 编译工作空间:在 src 目录下执行 colcon build --packages-select multi_robot_basic,然后 source install/setup.bash。
  2. 终端1运行发送节点:ros2 run multi_robot_basic robot1_publisher
  3. 终端2运行接收节点:ros2 run multi_robot_basic robot2_subscriber
  4. 终端3可执行 ros2 topic list 查看话题 robot_chat 是否存在,执行 ros2 topic echo /robot_chat 直接查看话题内容。

通过条件:终端2每秒钟打印一条包含递增编号的 Robot2 received: "Hello from robot1, message #N" 日志,且终端1同步显示发布日志,即证明两个节点通过话题完成了字符串消息的收发,多机器人话题通信链路建立成功。