学习 ROS2 Python 示例的完整指南

引言

ROS2(Robot Operating System 2)是一个用于机器人开发的平台,提供了一系列工具与库,可以帮助开发者构建高效且模块化的机器人应用。本文将帮助你学习如何使用 ROS2 和 Python 创建一个简单的示例程序。我们将通过一系列清晰的步骤来实现,并在每一步提供详细的解释和必要的代码示例。

流程概览

以下是实现 ROS2 Python 示例的基本步骤:

步骤 描述
1 安装 ROS2 和创建工作空间
2 创建新的 ROS2 包
3 编写发布节点
4 编写订阅节点
5 编译并运行节点
6 确认节点通信

第一步:安装 ROS2 和创建工作空间

在开始之前,需要确保你的系统上已安装 ROS2。具体的安装步骤可以参考 [ROS2 官方文档](

在终端中执行以下命令:

# 创建工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

第二步:创建新的 ROS2 包

我们将创建一个新的 ROS2 包,命名为 my_package。在工作空间的 src 目录下,运行以下命令:

# 创建 ROS2 包
ros2 pkg create --build-type ament_python my_package

文件结构

此命令会创建名为 my_package 的目录,里面包含一些初始化文件。

第三步:编写发布节点

我们将创建一个名为 talker.py 的节点,以发送消息。进入 my_package 目录并创建一个新的 Python 文件。

cd my_package/my_package
touch talker.py

打开 talker.py 文件,添加以下代码:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String
import time

class Talker(Node):
    def __init__(self):
        super().__init__('talker')
        self.publisher_ = self.create_publisher(String, 'topic', 10)
        self.timer = self.create_timer(1.0, self.timer_callback)  # 每秒调用一次

    def timer_callback(self):
        msg = String()
        msg.data = 'Hello, ROS 2!'
        self.publisher_.publish(msg)  # 发布消息
        self.get_logger().info(f'Publishing: "{msg.data}"')

def main(args=None):
    rclpy.init(args=args)  # 初始化 ROS2
    talker = Talker()
    rclpy.spin(talker)  # 运行节点
    talker.destroy_node()  # 销毁节点
    rclpy.shutdown()  # 关闭 ROS2

if __name__ == '__main__':
    main()

代码说明

  1. import rclpy - 导入 ROS2 Python 客户端库。
  2. Node - 创建节点,节点是 ROS2 的基本单位。
  3. create_publisher - 创建一个发布者,类型为 String,主题为 topic
  4. create_timer - 每一秒调用一次 timer_callback 方法,发送消息。
  5. publish(msg) - 发送消息。

第四步:编写订阅节点

接下来,我们将创建一个名为 listener.py 的节点,以接收消息。

my_package/my_package 目录下,创建 listener.py 文件:

touch listener.py

添加以下代码到 listener.py 文件:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Listener(Node):
    def __init__(self):
        super().__init__('listener')
        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(f'Received: "{msg.data}"')

def main(args=None):
    rclpy.init(args=args)
    listener = Listener()
    rclpy.spin(listener)
    listener.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

代码说明

  1. create_subscription - 创建一个订阅者,订阅主题 topic
  2. listener_callback - 处理接收到的消息并输出日志。

第五步:编译并运行节点

在终端中,回到工作空间的根目录(~/ros2_ws),然后运行以下命令以编译包:

cd ~/ros2_ws
colcon build

编译完成后,运行以下命令以轻松设置环境:

source install/setup.bash

现在,你可以在不同的终端中运行发布和订阅节点:

# 运行发布节点
ros2 run my_package talker

# 在另一个终端中运行订阅节点
ros2 run my_package listener

第六步:确认节点通信

当你运行这两个节点时,发布节点会每秒钟发送一条消息,而订阅节点则会接收并打印这些消息。你应该能看到类似下面的输出:

Publishing: "Hello, ROS 2!"
Received: "Hello, ROS 2!"

状态图与序列图

下面是状态图,展示了发布节点与订阅节点的生命周期。

stateDiagram
    [*] --> talker
    talker --> publishing
    publishing --> [*]
    [*] --> listener
    listener --> receiving
    receiving --> [*]

接下来是序列图,展示节点间的消息传递过程。

sequenceDiagram
    participant Talker
    participant Listener

    Talker->>Listener: Publish "Hello, ROS 2!"
    Listener-->>Talker: Acknowledgment

结尾

恭喜你!现在你已经掌握了如何使用 ROS2 和 Python 创建简单的发布-订阅机制的节点。你学会了创建 ROS2 包、编写 Python 节点、发布和订阅消息。可以通过进一步探索 ROS2 的其他功能,让你的机器人成为更加智能的存在。希望这篇文章对你的学习有所帮助,期待你在 ROS2 的旅程中取得更多进展!