1. 课程导入与故障诊断全景
Nav2(Navigation2)是ROS2中负责移动机器人自主导航的核心软件栈。它把“从当前位置到目标点”这件事拆解为定位、全局规划、局部控制、代价地图维护、行为恢复等多个可替换的模块,并通过行为树(Behavior Tree)把它们编排成一条可观测、可干预的执行链。当机器人出现“不动、绕圈、撞墙、卡死、频繁重规划”等路径故障时,问题往往不在某一个孤立的节点,而是某个组件的参数、坐标系、话题连接或状态机逻辑共同作用的结果。本课程的目标,是建立一套“从现象定位到组件、从组件定位到参数、从参数定位到修复”的诊断方法,而不是零散地背诵参数名。
一、Nav2 的核心组件与数据流
理解故障诊断,首先要清楚导航过程中数据是怎么流动的。Nav2 的典型运行链路如下:定位模块(AMCL 或 SLAM)发布 map→odom 变换;代价地图(global_costmap / local_costmap)融合激光、点云、静态地图与膨胀层,生成障碍与可通行区域;规划器(Planner Server,常用 NavFn、Smac)在全局代价地图上生成 nav_msgs/Path;控制器(Controller Server,常用 DWB、MPPI、RPP)跟踪路径并输出 cmd_vel;行为树导航器(BT Navigator)负责任务编排;恢复器(Recovery Server)在失败时执行清图、旋转、后退等动作;平滑器(Smoother Server)对路径做曲率优化。所有这些组件通过 nav2_msgs 动作接口和话题连接,任何一个环节的输入缺失或参数失配,都会在最终路径行为上表现出来。
二、参数体系:三层结构与关键参数族
Nav2 的参数不是平铺的一堆 YAML 键值,而是按“组件—插件—行为”三层组织。第一层是节点级参数,如 use_sim_time、robot_base_frame、odom_topic,它们决定组件能否正确接入系统;第二层是插件级参数,如规划器的 tolerance、控制器的 max_vel_x、代价地图的 inflation_radius,它们决定算法行为;第三层是行为树级参数,如重规划频率、恢复行为重试次数,它们决定任务在失败时如何降级。诊断时若把三层混为一谈,就容易出现“改了控制器参数却解决不了规划失败”的错位。
与路径故障最相关的参数族可以归纳为四组:几何组(robot_radius、footprint、inflation_radius、cost_scaling_factor),决定“哪里能走”;运动组(max_vel_x、max_vel_theta、acc_lim_x、xy_goal_tolerance),决定“怎么走、能否停准”;规划组(planner_frequency、expected_planner_frequency、tolerance),决定“多久重算、算多准”;时序组(transform_tolerance、update_frequency、publish_frequency),决定“数据是否新鲜”。一个常见的教学示例是:机器人半径 0.22 m,但 inflation_radius 设为 0.55 m,在 1 m 宽的走廊中两侧膨胀区重叠,全局规划器直接返回空路径——现象是“规划失败”,根因却在几何组参数。
三、诊断流程总览:从现象到根因的四步法
面对路径故障,建议按“看现象 → 查数据 → 对参数 → 做验证”的顺序推进,而不是一上来就改参数。第一步,记录现象的可观测特征:是规划阶段失败(无 /plan 输出),还是控制阶段失败(有路径但 cmd_vel 为零或振荡),抑或是任务层反复触发恢复行为。第二步,用 ros2 topic echo /plan、ros2 run tf2_tools view_frames、RViz 的代价地图图层确认数据是否真实存在、坐标系是否连通、时间戳是否过期。第三步,把现象映射到上文四组参数族,检查是否存在明显失配。第四步,做最小化验证:只改一个参数、重启对应生命周期节点、复现同一目标点,观察行为是否按预期变化。
use_sim_time 不一致,会制造出与参数失配完全相同的表象,却无法通过调参解决。四、学习路径说明
本课程后续将沿着这条诊断链逐层展开:先建立 Nav2 组件与生命周期的整体认知,再分别深入代价地图与膨胀、全局规划、局部控制、行为树与恢复、TF 与时间同步等专题,每一部分都围绕“参数如何影响路径结果”组织案例与验证方法。学习时建议同步打开 RViz 与终端日志,把每个参数改动都对应到一次可观察的行为变化上。只有把“参数—数据—现象”三者绑定,诊断能力才真正建立起来,而不是停留在记忆参数默认值。