学习 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()
代码说明
import rclpy
- 导入 ROS2 Python 客户端库。Node
- 创建节点,节点是 ROS2 的基本单位。create_publisher
- 创建一个发布者,类型为String
,主题为topic
。create_timer
- 每一秒调用一次timer_callback
方法,发送消息。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()
代码说明
create_subscription
- 创建一个订阅者,订阅主题topic
。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 的旅程中取得更多进展!