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',
],
},
运行与验证
- 编译工作空间:在
src目录下执行colcon build --packages-select multi_robot_basic,然后source install/setup.bash。 - 终端1运行发送节点:
ros2 run multi_robot_basic robot1_publisher - 终端2运行接收节点:
ros2 run multi_robot_basic robot2_subscriber - 终端3可执行
ros2 topic list查看话题robot_chat是否存在,执行ros2 topic echo /robot_chat直接查看话题内容。
通过条件:终端2每秒钟打印一条包含递增编号的 Robot2 received: "Hello from robot1, message #N" 日志,且终端1同步显示发布日志,即证明两个节点通过话题完成了字符串消息的收发,多机器人话题通信链路建立成功。