4. 全局规划器参数诊断
在 Nav2 中,全局规划器负责把“起点—目标”转换成一条可被局部控制器跟踪的全局路径。路径生成失败(planner 返回空路径、报 NO_VALID_PATH 或超时)与路径绕远(明明有近路却绕大圈)往往不是同一类原因:前者多与容差、代价地图可通行性、规划器搜索能力相关,后者多与启发式权重、运动模型约束、代价惩罚相关。本节围绕 NavFn 与 Smac Planner(SmacPlanner2D / SmacPlannerHybrid)三类规划器,梳理参数与故障现象的关联,并给出可执行的调参路径。
一、先分清规划器类型与参数语义
NavFn 是基于 Dijkstra/A* 的栅格规划器,输出的是栅格中心点连成的折线路径,不满足车辆最小转弯半径等运动学约束,适合差速底盘或作为对照基线。SmacPlanner2D 同样是栅格 A*,但支持更丰富的启发式与代价调优;SmacPlannerHybrid 则在 (x, y, θ) 状态空间上搜索,使用 Hybrid-A* 与 Dubins/Reeds-Shepp 运动基元,输出满足最小转弯半径的平滑可执行路径,适合阿克曼或需要前进/倒车切换的底盘。
三类规划器共有的关键参数包括:tolerance(目标容差)、max_iterations/max_planning_time(搜索上限)、cost_penalty/cost_weight(代价权重)、use_astar 或启发式类型、allow_unknown(是否允许穿越未知栅格)。Hybrid 额外有 minimum_turning_radius、motion_model_for_search(DUBINS / REEDS_SHEPP)、reverse_penalty、change_penalty、non_straight_penalty、analytic_expansion_ratio 等。
二、路径生成失败的参数关联与排查
tolerance 过小是最常见的“目标不可达”诱因。Nav2 要求规划终点落在目标容差范围内;若目标点恰好位于障碍物膨胀层边缘或代价地图的致命栅格外,而 tolerance 仅设为 0.1 m,规划器可能找不到任何满足条件的终点栅格。实践中可先将 tolerance 放宽到 0.3~0.5 m 观察是否恢复,再结合定位精度回调。
搜索上限不足表现为规划耗时达到 max_planning_time 后返回失败。SmacPlannerHybrid 的状态空间远大于 2D 栅格,长距离或狭窄通道场景下 max_iterations 默认值可能不够。可先临时把 max_planning_time 从 1.0 s 提到 3.0 s,若成功则说明是搜索预算问题,再通过缩小地图范围或提高 analytic_expansion_ratio 优化。
allow_unknown 与代价地图:若全局代价地图中起点或目标附近存在未知栅格,而 allow_unknown: false,规划器会直接判定不可通行。此时应检查 global_costmap 的 track_unknown_space 与规划器 allow_unknown 是否一致,而不是盲目调大容差。
运动模型不匹配:Hybrid 规划器若 minimum_turning_radius 设得大于实际通道可容纳的转弯半径,狭窄区域会搜索失败。例如通道宽 1.2 m、车长 0.9 m 的阿克曼底盘,若半径设为 1.5 m,则几乎无法在通道内完成转向基元,表现为“明明能过却规划失败”。此时应依据车辆实际最小转弯半径(可用 wheelbase / tan(max_steer) 估算)设置,而非凭经验放大。
三、路径绕远的参数关联与调参
代价权重过低:Smac 的 cost_penalty(2D)或 cost_weight(Hybrid)控制对高代价栅格的惩罚强度。若设得过低,规划器倾向穿越膨胀层边缘的“便宜”区域,看似绕开障碍,实则贴着代价梯度走大圈;设得过高又可能因惩罚过重而放弃可行近路。建议以 1.0~3.0 为起点,在典型场景中对比路径长度与离障碍最小距离。
启发式与权重:NavFn 的 use_astar: true 比 Dijkstra 更快收敛到近路;若关闭则可能因等代价扩展产生绕行。Hybrid 的 analytic_expansion_ratio 过小会减少解析扩展,导致搜索在栅格上“爬行”而绕远;适当提高(如 3.0~5.0)可让规划器更早用 Dubins/Reeds-Shepp 曲线直达目标。
运动基元惩罚:Hybrid 中 reverse_penalty、change_penalty、non_straight_penalty 会显著影响路径形态。若 non_straight_penalty 过大,规划器偏好长直线段而绕开需要转弯的近路;若 reverse_penalty 过大,则避免倒车掉头,可能选择绕大圈。调参时应一次只改一个惩罚项,并记录路径长度与转向次数。
四、可执行的调参流程与判断依据
建议按“先复现、再定位、后微调”的顺序操作:固定同一张地图与同一组起终点,用 RViz 的 Planner 面板单独触发全局规划,观察返回的 nav_msgs/Path 是否为空、路径长度、与障碍最小距离。每次只改一个参数,记录下表所示的三项指标,避免多参数耦合导致误判。
| 现象 | 优先检查参数 | 调整方向(示例值) | 判断依据 |
|---|---|---|---|
| 空路径 / NO_VALID_PATH | tolerance、allow_unknown | 0.1→0.3 m;allow_unknown 与代价地图一致 | 放宽后恢复即容差问题 |
| 规划超时 | max_planning_time、max_iterations | 1.0→3.0 s | 延长后成功即预算不足 |
| 狭窄处失败 | minimum_turning_radius | 按 wheelbase/tan(max_steer) 设定 | 半径小于通道可容纳值 |
| 路径绕远 | cost_penalty / cost_weight | 1.0→2.0 逐步试 | 路径长度下降且不贴障碍 |
| 频繁倒车/掉头 | reverse_penalty、change_penalty | 适度提高 | 转向次数下降、路径更顺 |
global_costmap 的代价可视化,确认“绕远”是否其实是在避开真实的高代价区域;若代价地图本身把可通行区误标为高代价,应先修地图再调规划器参数。最后需要强调:容差、启发式与运动模型三者并非独立。容差决定“终点是否可达”,启发式与代价权重决定“走哪条路”,运动模型决定“这条路能否被执行”。诊断时应先确认失败类型属于哪一类,再沿对应参数链排查,避免在错误的参数上反复试错。