ROS2 Python教程:创建发布与订阅节点

6 下载量 129 浏览量 更新于2024-08-29 收藏 309KB PDF 举报
"这篇教程是关于ROS2中的客户端库使用,特别是如何用Python编写一个简单的发布和订阅程序。教程分为背景、前提、任务三个部分,旨在帮助用户理解ROS2节点间通过主题进行通信的基本原理。" ROS2是Robot Operating System的第二代版本,它提供了一套框架,使得机器人系统的开发和组件之间的通信变得更为便捷。在这个教程中,我们将学习如何使用ROS2的Client Libraries创建两个节点:一个发布者(talker)和一个订阅者(listener),它们通过ROS graph中的主题(topic)来交换字符串消息。 ### 背景 ROS2中的节点是可执行程序,它们通过主题和服务进行通信。在这个实例中,我们创建的"talker"节点会周期性地发布字符串消息到一个名为"topic"的主题,而"listener"节点则会订阅这个主题,从而接收到这些消息。 ### 前提 在开始之前,确保已经创建并设置了ROS2的工作空间。这通常包括设置环境变量、安装必要的依赖,并且创建一个用于存放项目的工作目录(如`dev_ws`)。 ### 任务 #### Ⅰ 创建一个包 首先,我们需要创建一个新的ROS2包,名为`py_pubsub`,用于存放我们的发布者和订阅者节点。在`dev_ws/src`目录下,使用`ros2 pkg create`命令创建一个基于ament_python的包: ```bash ros2 pkg create --build-type ament_python py_pubsub ``` #### Ⅱ 写发布节点 接着,我们将下载并修改`minimal_publisher`示例代码作为发布者节点。代码主要包含以下部分: 1. 导入必要的ROS2和标准消息库。 2. 定义一个名为`MinimalPublisher`的类,继承自`Node`。 3. 在类中初始化节点,创建一个发布者对象,用于发布`std_msgs/msg/String`类型的消息。 4. 创建一个定时器,每隔一定时间(例如0.5秒)调用回调函数`timer_callback`。 5. `timer_callback`函数中,构造一个`String`消息,设置其`data`属性,并通过发布者对象发布出去。 ```python import rclpy from rclpy.node import Node from std_msgs.msg import String class MinimalPublisher(Node): def __init__(self): super().__init__('minimal_publisher') self.publisher_ = self.create_publisher(String, 'topic', 10) timer_period = 0.5 # seconds self.timer = self.create_timer(timer_period, self.timer_callback) self.i = 0 def timer_callback(self): msg = String() msg.data = 'HelloWorld:%d' % self.i self.publisher_.publish(msg) ``` #### Ⅲ 写订阅节点 类似地,我们需要创建一个订阅者节点,它订阅"topic"并处理接收到的消息。这部分代码会涉及创建一个订阅者对象,设置回调函数来处理接收到的数据。 #### Ⅳ 编译和运行 完成代码编写后,需要编译ROS2包,然后运行这两个节点。编译过程通常是通过`ament build`命令,而运行节点则可以使用`ros2 run`命令分别启动`talker`和`listener`。 ### 总结 这个教程详细介绍了如何在ROS2中使用Python编写发布者和订阅者节点。通过实践这个例子,用户能够理解ROS2中的基本通信机制,即节点通过主题交换消息,以及如何使用ROS2的API创建和管理这些节点。这对于任何想要开发ROS2应用程序的人来说都是一个重要的起点。