🎉 叮叮叮!恭喜你完成了之前的学习!
相信你现在对 ROS2 的工作空间、节点这些基础概念已经有了一定的了解,也掌握了如何用 C++ 或者 Python 编写一个简单的节点并运行它。
但是,这远远不能满足我们对技术的好奇心,对吧?🤔 仅仅会打印 “Hello World” 还不能让我们的机器人动起来。
所以,从今天开始,我们将开启全新的 《ROS2 核心知识合集》!本合集会带你深入学习 ROS2 中面向企业开发的更多核心知识。让我们先从最基础的话题(Topic)开始吧!👇
📡 一、ROS2 中话题(Topic)相关概念
在 ROS2 中,节点(Node)之间是如何通信的呢?最常用的方式就是通过 话题(Topic)。
你可以把话题想象成一个广播站:
这种发布/订阅模式是一种异步通信机制,发送方和接收方不需要同时在线,解耦性非常好,非常适合机器人中大量数据的实时传输。
🐍 二、使用 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++语言,来实现话题的发布和订阅。
💬 互动一下:
你觉得“话题”这种模式,最适合用来传输机器人的哪些数据?欢迎在评论区留言交流!👇