2. ROS2基础回顾
在进入 Nav2 导航框架的实战之前,必须先夯实 ROS2 的核心通信原语。Nav2 本质上是一组相互协作的节点集合,它们通过话题、服务、动作和参数进行数据交换与任务调度。如果对这些基础概念的理解停留在“听说过”的层面,那么在调试导航行为时将会寸步难行。本章将系统梳理 ROS2 中六大核心概念及其底层 DDS 通信机制,并结合导航场景中的具体应用,帮助你建立从“API 调用”到“工程行为”的完整映射。
上图展示了 ROS2 中五大通信原语与底层 DDS 的关系。所有节点通过 DDS 域(Domain)进行发现和通信,而不同原语只是 DDS 通信模式的不同封装。理解这张图的关键在于:话题是数据流,服务是命令流,动作是任务流,参数是配置流,生命周期是状态流。Nav2 的各个模块正是通过这五种流协同工作的。
2.1 节点与话题:导航数据的高速公路
核心原理:节点(Node)是 ROS2 中可执行的计算单元,每个节点负责特定的功能。话题(Topic)是节点间异步通信的通道,采用发布/订阅模式。在 Nav2 中,传感器数据、里程计信息、地图数据、速度指令等均通过话题传输。话题通信是单向的、无反馈的,适合高频数据流。
判断方法:使用 ros2 node list 查看当前运行的节点,使用 ros2 topic list 查看所有话题,使用 ros2 topic echo /topic_name 实时查看话题内容,使用 ros2 topic hz /topic_name 检查发布频率。
Nav2 实战场景:在导航过程中,/scan(激光雷达数据)以 10Hz 发布,/odom(里程计)以 50Hz 发布,/cmd_vel(速度指令)由控制器节点发布。如果 /scan 的频率低于 5Hz,代价地图的障碍物检测将严重滞后,可能导致碰撞。
# 查看话题发布频率
ros2 topic hz /scan
# 预期输出:average rate: 10.000 Hz
常见误区:初学者常混淆话题和服务。话题适合持续更新的数据流(如传感器数据),而服务适合一次性请求-应答(如查询地图)。在 Nav2 中,/map 话题持续发布地图数据,而 /map_server/load_map 服务用于加载地图文件。
2.2 服务与动作:导航任务的两种执行模式
核心原理:服务(Service)是同步的请求-应答模式,客户端发送请求后阻塞等待服务器响应。动作(Action)是异步的任务执行模式,包含目标(Goal)、反馈(Feedback)和结果(Result)三个部分,支持任务取消。Nav2 中,/navigate_to_pose 是动作接口,用于向机器人发送导航目标点;而 /compute_path_to_pose 是服务接口,仅计算路径不执行。
判断方法:使用 ros2 service list 和 ros2 action list 查看可用接口。动作接口名称通常以 /action 结尾,服务接口以 /srv 结尾。使用 ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose "{pose: {header: {frame_id: 'map'}, pose: {position: {x: 1.0, y: 2.0}}}}" 发送导航目标。
| 特性 | 服务(Service) | 动作(Action) |
|---|---|---|
| 通信模式 | 同步请求-应答 | 异步目标-反馈-结果 |
| 超时处理 | 客户端阻塞等待 | 可取消、可超时 |
| 适用场景 | 路径计算、地图加载 | 导航执行、跟随路径 |
| Nav2 示例 | /compute_path_to_pose | /navigate_to_pose |
案例拆解:假设机器人需要从 A 点导航到 B 点。流程如下:
- 客户端通过动作接口发送目标点(Goal)到
/navigate_to_pose。 - 导航器节点接收目标,调用
/compute_path_to_pose服务计算全局路径。 - 控制器节点接收路径,发布速度指令到
/cmd_vel话题。 - 执行过程中,导航器持续发布反馈(Feedback),包括当前位姿、剩余距离等。
- 到达目标后,发布结果(Result),任务完成。
风险提示:如果使用服务进行导航,客户端将阻塞等待整个导航过程完成,期间无法取消任务或获取中间状态。因此,Nav2 中所有长时间运行的任务均使用动作接口。
2.3 参数与生命周期节点:导航系统的配置与状态管理
核心原理:参数(Parameter)是节点的可配置变量,支持运行时动态修改。生命周期节点(Lifecycle Node)是 ROS2 提供的一种受控状态机,节点在 Unconfigured、Inactive、Active、Finalized 等状态间切换,确保系统按序启动和关闭。Nav2 的所有核心组件(如 planner、controller、recovery)均为生命周期节点。
操作流程:
- 使用
ros2 param list /node_name查看节点参数。 - 使用
ros2 param set /node_name param_name value动态修改参数。 - 使用
ros2 lifecycle get /node_name查看节点状态。 - 使用
ros2 lifecycle set /node_name configure配置节点,activate激活节点。
# 查看导航器节点状态
ros2 lifecycle get /navigator
# 输出:active [3]
实战场景:在导航系统启动时,必须按照依赖顺序激活节点。首先激活 /map_server 加载地图,然后激活 /amcl 定位,最后激活 /controller_server 和 /planner_server。如果顺序错误,控制器可能因缺少地图数据而崩溃。
经验总结:在调试 Nav2 时,优先检查所有节点是否处于 active 状态。使用 ros2 lifecycle list 可以一次性查看所有生命周期节点的状态。参数修改后,部分节点需要重新配置才能生效,此时应调用 ros2 lifecycle set /node_name configure 重新加载参数。
2.4 DDS通信机制:导航系统的神经网络
核心原理:DDS(Data Distribution Service)是 ROS2 的默认中间件,采用发布-订阅模型,通过 RTPS(Real-Time Publish-Subscribe)协议实现数据分发。DDS 的关键特性包括:自动发现(节点无需手动配置 IP)、QoS 策略(控制数据传输可靠性)、多播支持(高效分发到多个订阅者)。
QoS 策略选择:
| QoS 策略 | 适用场景 | Nav2 示例 |
|---|---|---|
| RELIABLE | 关键数据,不允许丢失 | /map(地图数据) |
| BEST_EFFORT | 高频传感器数据,允许丢帧 | /scan(激光雷达) |
| TRANSIENT_LOCAL | 新订阅者需要获取历史数据 | /map(延迟订阅) |
| VOLATILE | 仅接收订阅后的数据 | /odom(里程计) |
案例拆解:在机器人导航中,/map 话题使用 TRANSIENT_LOCAL 策略,确保后启动的节点(如行为树导航器)能够立即获取地图数据,而不必等待地图重新发布。/scan 使用 BEST_EFFORT 策略,因为激光雷达数据更新频率高,偶尔丢失一帧不会影响导航安全。
常见误区:不要将所有话题都设置为 RELIABLE。如果 /scan 使用 RELIABLE 策略,当网络拥塞时,发布者会持续重传数据,导致延迟累积,最终使导航系统卡顿甚至崩溃。高频传感器数据应使用 BEST_EFFORT。
排障方法:使用 ros2 doctor 检查 DDS 通信健康状态,使用 ros2 topic info /topic_name --verbose 查看 QoS 设置。如果发现节点间无法通信,首先检查是否在同一 DDS 域(ROS_DOMAIN_ID),然后检查 QoS 是否兼容。
总结复盘:本章回顾了 ROS2 的六大核心通信原语。在 Nav2 实战中,你需要做到:看到话题能判断数据类型和频率,看到服务能理解请求-应答逻辑,看到动作能管理任务生命周期,看到参数能调整导航行为,看到生命周期节点能控制系统启停,看到 DDS 能诊断通信故障。这六项能力是后续章节中配置 Nav2 参数、调试导航行为、优化路径规划的基础。建议在真实机器人或仿真环境中,使用 ros2 topic echo、ros2 action send_goal 等命令逐一验证本章内容,将理论转化为肌肉记忆。