时间:2025-08-26 08:03
人气:
作者:admin
ROS2(Robot Operating System 2)是新一代机器人操作系统,旨在解决ROS1的核心痛点(如去中心化通信、实时性、跨平台/多语言支持、分布式部署),同时保留ROS1的易用性和生态优势,适用于从消费级机器人到工业级机械臂的各类场景。
在理解核心模块前,需先明确ROS2的设计初衷,这决定了其模块架构的逻辑:
roscore(主节点),基于DDS(数据分发服务)实现节点间直接通信,提升系统可靠性和分布式能力。ros1_bridge)。ROS2的架构从底层到上层可分为通信层、计算层、工具链、功能层四大层级,各层级包含多个核心模块,以下按逻辑优先级拆解:
DDS是ROS2的“通信 backbone”,负责所有节点间的数据传输,是ROS2与ROS1最本质的区别。
作用:实现去中心化的“发布-订阅”(Publish-Subscribe)通信,支持节点自动发现、数据可靠传输、多域隔离。
核心特性:
Domain ID(域ID)划分通信域,不同域的节点互不干扰(如Domain 0和Domain 1的节点无法通信)。| QoS策略类型 | 作用场景举例 | 选项 |
|---|---|---|
| 可靠性(Reliability) | 控制指令(必须送达) | RELIABLE(可靠,重传丢失数据)/ BEST_EFFORT(尽力而为,不重传) |
| 持续性(Durability) | 参数配置(新节点需获取历史值) | TRANSIENT_LOCAL(保存历史数据)/ VOLATILE(仅实时传输) |
| Deadline( deadlines) | 实时控制(超时丢弃过期数据) | 设定数据有效期(如50ms) |
常用DDS实现:ROS2默认集成多个DDS厂商的实现,用户可按需切换:
Fast DDS(默认):开源、轻量,适合大多数场景;Cyclone DDS:低延迟,适合实时需求;RTI Connext DDS:工业级,支持复杂分布式系统。计算层是ROS2的“业务逻辑载体”,负责实现机器人的具体功能(如传感器处理、运动控制)。
/lidar_processor),避免同名冲突;/camera_node:发布摄像头图像数据;/obstacle_detector:订阅图像数据,检测障碍物;/motion_controller:接收障碍物信息,控制电机避障。SingleThreadedExecutor(单线程执行器):所有回调在一个线程中执行,适合简单场景(如低算力嵌入式设备);MultiThreadedExecutor(多线程执行器):回调分配到多个线程,适合高并发场景(如同时处理激光、视觉、IMU数据)。ROS2提供4种核心通信机制,覆盖机器人不同交互场景:
| 通信机制 | 通信模式 | 适用场景 | 示例 |
|---|---|---|---|
| 话题(Topics) | 单向、异步、多对多 | 持续数据流传输(如传感器、图像、里程计) | 摄像头节点发布/image话题,多个节点订阅 |
| 服务(Services) | 双向、同步、一对一 | 单次请求-响应(如查询状态、执行单次操作) | 客户端请求/get_robot_pose服务,获取当前位置 |
| 动作(Actions) | 双向、异步、带反馈 | 长时间任务(需进度反馈+取消) | 导航节点执行/navigate_to_goal动作,实时反馈导航进度 |
| 参数(Parameters) | 键值对、动态配置 | 节点配置(如阈值、频率、硬件参数) | 动态调整/lidar_processor的滤波参数 |
/point_cloud话题,一个SLAM节点订阅)。ros2 param set /motion_controller max_speed 0.5)。ROS2的通信依赖标准化的数据接口,需通过特定文件定义,编译后生成多语言代码(C++/Python等)。
.msg文件描述(类似结构体)。sensor_msgs/msg/LaserScan.msg(激光雷达数据)定义:
std_msgs/Header header # 时间戳、坐标系
float32 angle_min # 最小扫描角度
float32 angle_max # 最大扫描角度
float32 angle_increment # 角度步长
float32 time_increment # 时间步长
float32 scan_time # 扫描周期
float32 range_min # 最小距离
float32 range_max # 最大距离
float32[] ranges # 距离数据数组
float32[] intensities # 强度数据数组
.srv文件描述,分为“请求部分”和“响应部分”(用---分隔)。turtlesim/srv/SetPen.srv(设置海龟绘图笔)定义:
uint8 r # 请求:红色通道
uint8 g # 请求:绿色通道
uint8 b # 请求:蓝色通道
uint8 width # 请求:笔宽
bool off # 请求:是否关闭画笔
---
bool success # 响应:操作是否成功
.action文件描述,分为“目标(Goal)”“反馈(Feedback)”“结果(Result)”三部分(用---分隔)。nav2_msgs/action/NavigateToPose.action(导航到目标位姿)定义:
# Goal(目标)
geometry_msgs/PoseStamped pose # 目标位姿
---
# Result(结果)
bool success # 导航是否成功
string message # 结果描述(如失败原因)
---
# Feedback(反馈)
float32 distance_remaining # 剩余距离
geometry_msgs/PoseStamped current_pose # 当前位姿
ROS2提供一套完整的命令行和可视化工具,简化开发、调试和监控流程。
ROS2的核心命令行工具,支持所有核心操作,常用命令如下:
| 命令类别 | 常用命令 | 作用 |
|---|---|---|
| 节点管理 | ros2 node list / ros2 node info <节点名> |
列出所有节点 / 查看节点详细信息(话题/服务) |
| 话题操作 | ros2 topic list / ros2 topic echo <话题名> |
列出所有话题 / 打印话题数据 |
| 服务操作 | ros2 service list / ros2 service call <服务名> <请求数据> |
列出所有服务 / 调用服务 |
| 参数操作 | ros2 param list / ros2 param set <节点名> <参数名> <值> |
列出参数 / 修改参数 |
| 袋文件操作 | ros2 bag record <话题名> / ros2 bag play <袋文件名> |
录制话题数据 / 回放数据 |
| 系统检查 | ros2 doctor |
检查ROS2环境配置(如DDS、依赖) |
rqt命令启动。ros2 bag record /image /lidar(录制图像和激光数据);ros2 bag play <袋文件名>(按原时间戳回放数据);ros2 bag info <袋文件名>(查看袋文件包含的话题、数据量、时间范围)。ROS2通过“功能包(Package)”组织代码,通过Colcon(替换ROS1的Catkin)实现构建,是代码管理的核心。
lidar_driver);ros2 navigation2,包含导航所需的所有子包)。colcon build:编译工作空间中的所有功能包;colcon build --packages-select <包名>:仅编译指定功能包;source install/setup.bash:加载编译后的环境变量。ROS2针对实时场景和嵌入式设备做了专门优化:
RTI Connext DDS Micro等实时DDS实现,延迟可低至微秒级;ROS2 Humble Hawksbill对嵌入式的优化)。通过上述模块,ROS2实现了对ROS1的全面升级,核心优势可概括为: