跳到主要内容

编写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 节点之间如何通过话题进行消息传递。