编写python订阅者节点
返回到功能包的 Python 源码目录中:
cd ros2_ws/src/py_pubsub/py_pubsub
在此目录下新建文件 subscriber_member_function.py,并使用编辑器打开,输入以下代码:
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MinimalSubscriber(Node):
def __init__(self):
super().__init__('minimal_subscriber')
self.subscription = self.create_subscription(
String,
'topic',
self.listener_callback,
10)
self.subscription # 防止未使用变量的警告
def listener_callback(self, msg):
self.get_logger().info(f'I heard: "{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()
保存文件。
订阅者节点代码详细解释
订阅者节点代码与发布者节点类似,但作用相反。订阅者节点专门用于接收发布者节点发布的话题数据。
1. 导入模块与库
import rclpy:导入 ROS2 Python 客户端库,节点基础功能依赖此库。from rclpy.node import Node:导入 ROS2 节点类,用于创建和管理节点。from std_msgs.msg import String:导入 ROS2 标准消息类型,订阅字符串消息。
2. 创建节点类
- 定义
MinimalSubscriber类,继承自 ROS2 的Node类,创建订阅者节点。
3. 节点构造函数 __init__
-
super().__init__('minimal_subscriber'):- 调用父类的构造方法,创建一个名为
minimal_subscriber的节点。
- 调用父类的构造方法,创建一个名为
-
self.create_subscription(String, 'topic', self.listener_callback, 10):- 创建订阅者,订阅名为
topic的话题,消息类型为String。 - 当有新消息到达时,调用
listener_callback函数。 - 队列大小设置为10,用于缓存未处理的消息。
- 创建订阅者,订阅名为
4. 回调函数listener_callback
- 当订阅者接收到消息时,自动调用此函数,并使用
self.get_logger().info输出接收到的消息内容到控制台。
5. 主函数 main
-
rclpy.init(args=args):初始化 ROS2 环境。 -
创建订阅者节点实例,并使用
rclpy.spin(minimal_subscriber)启动节点监听循环。 -
minimal_subscriber.destroy_node():显式销毁节点实例。 -
rclpy.shutdown():关闭 ROS2 环境。
6. 程序入口
- 通过
if __name__ == '__main__': main()保证节点文件直接运行时,执行节点主函数。
7. 添加订阅者入口点
继续打开功能包根目录下的 setup.py 文件,在之前定义的发布者入口点后方添加订阅者节点入口点:
entry_points={
'console_scripts': [
'talker = py_pubsub.publisher_member_function:main',
'listener = py_pubsub.subscriber_member_function:main',
],
},
listener:命令行中用于启动订阅者节点的名称。py_pubsub.subscriber_member_function:main:指定运行订阅者节点的入口函数。 完成修改后保存文件。
构建与运行节点
在工作空间根目录 ros2_ws,使用以下命令检查依赖关系(可跳过):
rosdep install -i --from-path src --rosdistro jazzy -y
构建功能包:
colcon build --packages-select py_pubsub
打开新终端,加载设置:
source install/setup.bash
运行发布者节点:
ros2 run py_pubsub talker
再打开一个终端,同样加载设置后运行订阅者节点:
ros2 run py_pubsub listener
订阅者将接收到发布者发送的消息,并输出:
[INFO] [minimal_subscriber]: I heard: "Hello World: 0"
[INFO] [minimal_subscriber]: I heard: "Hello World: 1"
[INFO] [minimal_subscriber]: I heard: "Hello World: 2"
...
使用Ctrl+C结束节点运行。
本章小结
本章详细介绍了如何使用Python语言创建 ROS2 发布者和订阅者节点,并对节点代码的各部分进行了深入解释,帮助读者理解 ROS2 节点之间如何通过话题进行消息传递。