2. ROS2基础回顾

在进入 Nav2 导航框架的实战之前,必须先夯实 ROS2 的核心通信原语。Nav2 本质上是一组相互协作的节点集合,它们通过话题、服务、动作和参数进行数据交换与任务调度。如果对这些基础概念的理解停留在“听说过”的层面,那么在调试导航行为时将会寸步难行。本章将系统梳理 ROS2 中六大核心概念及其底层 DDS 通信机制,并结合导航场景中的具体应用,帮助你建立从“API 调用”到“工程行为”的完整映射。

ROS2 通信原语与 DDS 映射关系 DDS 数据分发服务(RTPS/ UDP 组播) QoS 策略:RELIABLE / BEST_EFFORT · VOLATILE / TRANSIENT_LOCAL · 自动发现 Node 节点 nav2_bt_navigator 话题 Topic /odom /scan 异步单向流 服务 Service /get_plan 同步请求/应答 动作 Action /navigate_to_pose 异步+反馈+取消 参数 Parameter robot_radius 动态配置 生命周期节点 Unconfigured→Active 受控启停 话题 服务 动作 参数 生命周期

上图展示了 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 点。流程如下:

  1. 客户端通过动作接口发送目标点(Goal)到 /navigate_to_pose。
  2. 导航器节点接收目标,调用 /compute_path_to_pose 服务计算全局路径。
  3. 控制器节点接收路径,发布速度指令到 /cmd_vel 话题。
  4. 执行过程中,导航器持续发布反馈(Feedback),包括当前位姿、剩余距离等。
  5. 到达目标后,发布结果(Result),任务完成。

风险提示:如果使用服务进行导航,客户端将阻塞等待整个导航过程完成,期间无法取消任务或获取中间状态。因此,Nav2 中所有长时间运行的任务均使用动作接口。

2.3 参数与生命周期节点:导航系统的配置与状态管理

核心原理:参数(Parameter)是节点的可配置变量,支持运行时动态修改。生命周期节点(Lifecycle Node)是 ROS2 提供的一种受控状态机,节点在 Unconfigured、Inactive、Active、Finalized 等状态间切换,确保系统按序启动和关闭。Nav2 的所有核心组件(如 planner、controller、recovery)均为生命周期节点。

操作流程:

  1. 使用 ros2 param list /node_name 查看节点参数。
  2. 使用 ros2 param set /node_name param_name value 动态修改参数。
  3. 使用 ros2 lifecycle get /node_name 查看节点状态。
  4. 使用 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 等命令逐一验证本章内容,将理论转化为肌肉记忆。