【ros2】ROS2 Python节点创建指南
文章目录
- ROS2 Python节点创建指南
-
- 一、核心概念:节点的定义与作用
- 二、基于书中第2章的Python节点创建核心步骤
-
- 1. 前置准备:创建ROS2功能包
- 2. 编写节点代码(基础框架)
- 3. 配置功能包(让ROS2识别节点)
-
- (1)修改`package.xml`
- (2)修改`setup.py`
- 4. 编译与运行节点
-
- (1)编译功能包
- (2)运行节点
- 三、书中第2章核心功能:节点的基础通信能力
-
- 1. 话题发布者(Publisher)
- 2. 话题订阅者(Subscriber)
- 3. 运行发布者与订阅者
- 四、书外拓展知识:节点高级特性与最佳实践
-
- 1. 节点命名与命名空间
- 2. 日志系统的高级用法
- 3. 参数(Parameter)的使用
- 4. 节点生命周期管理
- 5. 节点调试工具
- 五、常见问题与解决方案
- 六、总结
ROS2 Python节点创建指南
(基于《ROS2机器人开发:从入门到实践》第2章及拓展知识)
一、核心概念:节点的定义与作用
节点(Node)是ROS2系统的基本执行单元,代表一个独立的功能模块(如传感器驱动、控制算法、数据可视化等)。每个节点通过ROS2的通信机制(话题、服务、动作等)与其他节点交互,共同构成机器人系统。
节点的核心特征:
- 独立性:每个节点专注于单一功能(如“激光雷达处理节点”“底盘控制节点”)。
- 通信性:通过话题(Topic)、服务(Service)等机制与其他节点交换数据。
- 可配置性:支持通过参数(Parameter)动态调整行为。
- 轻量级:一个机器人系统可运行多个节点,通过节点名称区分。
二、基于书中第2章的Python节点创建核心步骤
1. 前置准备:创建ROS2功能包
节点需放在功能包(Package)中管理,因此首先创建一个Python功能包:
# 创建Python类型功能包,依赖ROS2核心库rclpy
ros2 pkg create py_node_demo --build-type ament_python --dependencies rclpy
- 关键参数说明:
--build-type ament_python:指定为Python功能包(C++功能包用ament_cmake)。--dependencies rclpy:声明依赖ROS2的Python客户端库(必须包含)。
2. 编写节点代码(基础框架)
在功能包的py_node_demo目录下创建节点文件(如simple_node.py),基础结构如下:
# 导入ROS2 Python核心库
import rclpy
from rclpy.node import Node# 定义节点类,继承自Node
class SimpleNode(Node):def __init__(self):# 调用父类构造函数,指定节点名称(必须唯一)super().__init__('simple_node')# 初始化节点功能(如创建发布者、订阅者、定时器等)self.get_logger().info("简单节点已启动!") # 日志输出# 主函数:初始化并运行节点
def main(args=None):# 初始化ROS2系统rclpy.init(args=args)# 创建节点实例node = SimpleNode()# 运行节点(进入事件循环,等待回调)rclpy.spin(node)# 退出时清理资源node.destroy_node()rclpy.shutdown()# 程序入口
if __name__ == '__main__':main()
3. 配置功能包(让ROS2识别节点)
需在package.xml中声明节点信息,并在setup.py中配置入口点,确保ros2 run能找到节点。
(1)修改package.xml
添加节点描述和依赖声明(确保包含以下关键内容):
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>py_node_demo</name><version>0.0.0</version><description>ROS2 Python节点示例</description><maintainer email="your@email.com">用户名</maintainer><license>Apache-2.0</license><!-- 依赖声明 --><buildtool_depend>ament_python</buildtool_depend><exec_depend>rclpy