当前位置:首页>python>1.Ros2系列课程之-Python编写话题的发布和订阅

1.Ros2系列课程之-Python编写话题的发布和订阅

  • 2026-10-11 07:39:57
1.Ros2系列课程之-Python编写话题的发布和订阅

🎉 叮叮叮!恭喜你完成了之前的学习!

相信你现在对 ROS2 的工作空间、节点这些基础概念已经有了一定的了解,也掌握了如何用 C++ 或者 Python 编写一个简单的节点并运行它。

但是,这远远不能满足我们对技术的好奇心,对吧?🤔 仅仅会打印 “Hello World” 还不能让我们的机器人动起来。

所以,从今天开始,我们将开启全新的 《ROS2 核心知识合集》!本合集会带你深入学习 ROS2 中面向企业开发的更多核心知识。让我们先从最基础的话题(Topic)开始吧!👇


📡 一、ROS2 中话题(Topic)相关概念

在 ROS2 中,节点(Node)之间是如何通信的呢?最常用的方式就是通过 话题(Topic)。

你可以把话题想象成一个广播站:

  • 发布者(Publisher):负责向话题发送消息(比如:不断发布当前的速度、温度或图像数据)。

  • 订阅者(Subscriber):负责从话题接收消息(比如:监听速度指令并控制电机转动)。

这种发布/订阅模式是一种异步通信机制,发送方和接收方不需要同时在线,解耦性非常好,非常适合机器人中大量数据的实时传输。


🐍 二、使用 Python 编写话题的发布和订阅

理论说完,我们直接上实操!接下来我们将用 Python 编写两个节点:一个负责发布“Hello Topic”,另一个负责接收并打印出来。

1. 创建功能包

如果你还没有专门练习用的包,可以快速创建一个(假设在工作空间的 src目录下):

ros2 pkg create py_topic_demo --build-type ament_python --dependencies rclpy

2. 编写发布者 (Publisher)

在功能包的 py_topic_demo目录下,新建 publisher_member_function.py:

import rclpyfrom rclpy.node import Nodefrom std_msgs.msg import Stringclass MinimalPublisher(Node):    def __init__(self):        super().__init__('minimal_publisher')        self.publisher_ = self.create_publisher(String, 'topic', 10)        timer_period = 0.5  # 每0.5秒发布一次        self.timer = self.create_timer(timer_period, self.timer_callback)        self.i = 0    def timer_callback(self):        msg = String()        msg.data = 'Hello ROS2 Topic: %d' % self.i        self.publisher_.publish(msg)        self.get_logger().info('Publishing: "%s"' % msg.data)        self.i += 1def main(args=None):    rclpy.init(args=args)    minimal_publisher = MinimalPublisher()    rclpy.spin(minimal_publisher)    minimal_publisher.destroy_node()    rclpy.shutdown()if __name__ == '__main__':    main()

3. 编写订阅者 (Subscriber)

在同一目录下,新建 subscriber_member_function.py:

import rclpyfrom rclpy.node import Nodefrom std_msgs.msg import Stringclass MinimalSubscriber(Node):    def __init__(self):        super().__init__('minimal_subscriber')        self.subscription = self.create_subscription(            String,            'topic',            self.listener_callback,            10)        self.subscription  # prevent unused variable warning    def listener_callback(self, msg):        self.get_logger().info('I heard: "%s"' % msg.data)def main(args=None):    rclpy.init(args=args)    minimal_subscriber = MinimalSubscriber()    rclpy.spin(minimal_subscriber)    minimal_subscriber.destroy_node()    rclpy.shutdown()if __name__ == '__main__':    main()

4. 编译与运行

温馨提示,编译之前记得修改setup.py,把编译文件列表加入我们编写好的发布和订阅文件:

回到工作空间根目录,编译并运行:

colcon buildsource install/setup.bash
# 终端1 运行发布者ros2 run py_topic_demo publisher_member_function
# 终端2 运行订阅者ros2 run py_topic_demo subscriber_member_function

💡 总结

通过这个简单的例子,我们实现了两个节点通过 Topic 进行通信。话题(Topic) 是 ROS2 通信的基石,后续的激光雷达数据、摄像头图像流,都是通过这种方式传输的。

下一期预告:我们将使用C++语言,来实现话题的发布和订阅。

💬 互动一下:

你觉得“话题”这种模式,最适合用来传输机器人的哪些数据?欢迎在评论区留言交流!👇

最新文章

随机文章