4. 全局规划器参数配置与诊断
全局规划器负责在已知栅格代价地图上,从机器人当前位姿到目标点生成一条全局参考路径。矿山环境与室内场景差异明显:巷道狭长、宽度受限、交叉口呈直角或斜交、可通行区域被矿车与设备临时占用,因此同一套默认参数往往在长直巷道表现正常,却在交叉口或窄段出现贴墙、绕远、规划失败等问题。本节围绕 NavFn 与 Smac 两类规划器的关键参数展开,并给出针对长巷道与交叉口的排查方法。
一、两类规划器的定位差异
NavFn 基于 Dijkstra/A* 在代价地图上做全局搜索,输出路径后由 nav2_controller 跟踪。它的核心参数是 tolerance(目标容忍度)、use_astar、allow_unknown 以及代价地图的 cost_scaling_factor、inflation_radius。NavFn 的路径倾向于沿代价梯度下降,容易贴近膨胀层边缘,在窄巷道中表现为“贴墙走”。
Smac(SmacPlanner2D / Hybrid-A*)在搜索时显式引入代价惩罚与启发式权重,参数包括 tolerance、cost_penalty、reverse_penalty、change_penalty、motion_model 等。Smac 更适合需要控制路径与障碍距离、需要平滑转向的矿山巷道,但参数不当会导致搜索时间过长或路径过度保守。
tolerance 含义一致:当搜索节点与目标点的距离小于该值时即认为到达目标。矿山场景中目标点常由巡检任务下发,若目标点落在膨胀层内,过小的 tolerance 会导致规划失败。二、关键参数与配置示例
以下为 NavFn 与 Smac 的示例配置片段,参数值属于教学示例,需按实际巷道宽度与代价地图分辨率调整:
planner_server:
ros__parameters:
expected_planner_frequency: 1.0
planner_plugins: ["GridBased"]
GridBased:
plugin: "nav2_navfn_planner/NavfnPlanner"
tolerance: 0.5 # 目标容忍度,m
use_astar: true
allow_unknown: false
# Smac 示例
plugin: "nav2_smac_planner/SmacPlanner2D"
tolerance: 0.25
cost_penalty: 2.0 # 代价惩罚权重
reverse_penalty: 2.0
change_penalty: 0.0
allow_unknown: false
参数选择的基本判断:巷道宽度约 2.5 m、机器人半径 0.4 m 时,inflation_radius 建议不小于 0.6 m,cost_scaling_factor 取 3~5,使路径与墙保持约 0.5 m 以上距离;tolerance 取 0.3~0.5 m,避免目标点落在膨胀层内时直接失败。Smac 的 cost_penalty 增大后路径更远离障碍,但过大可能使长巷道内路径偏向中心线过度绕行。
三、长巷道与交叉口的典型问题排查
长巷道贴墙:先看代价地图膨胀层是否过窄,再检查 NavFn 是否因 cost_scaling_factor 过大导致代价衰减过快、路径贴边。可将 cost_scaling_factor 调小、inflation_radius 适当增大,或改用 Smac 并提高 cost_penalty。
交叉口绕远或斜穿:交叉口处可通行区域呈十字形,若膨胀层在转角处重叠,搜索会认为转角不可通行而绕行。应检查交叉口实际宽度与膨胀半径之和是否小于通道宽度;必要时降低 inflation_radius 或提高地图分辨率。Smac 在交叉口出现“切角”时,可适当增大 change_penalty 抑制急转。
规划失败:常见原因是目标点位于未知区域或膨胀层内。确认 allow_unknown 设置与目标点代价,查看 /plan 话题与 planner_server 日志中的 Failed to create plan 提示,结合代价地图可视化定位目标点代价。
四、诊断流程与观察点
排查时建议按“地图—参数—日志”顺序进行。先打开代价地图可视化,确认巷道与交叉口的可通行宽度、膨胀层是否在转角处重叠;再核对 tolerance 与目标点代价,确认目标点不在膨胀层内;最后查看 planner_server 日志与 /plan 输出,判断是搜索失败还是路径质量不佳。
观察路径质量时,可关注三个指标:路径与最近障碍的最小距离、路径长度相对直线距离的比值、路径在交叉口处的转角数量。长巷道中最小距离应稳定大于机器人半径加安全余量;交叉口处转角数量异常增多,通常说明膨胀层在转角处形成了“瓶颈”,需要调整膨胀参数或改用 Smac 的转角惩罚。
inflation_radius 与 cost_scaling_factor 会同时影响局部规划器的避障行为,调整后应同步检查 controller_server 的 inflation_radius 与 cost_scaling_factor,避免全局路径与局部避障冲突。实际调参时建议每次只改一个参数,记录修改前后的路径长度、最小障碍距离与规划耗时,形成可对比的记录。例如将 cost_scaling_factor 从 5 降到 3 后,若长巷道最小障碍距离由 0.35 m 提升到 0.55 m 且路径长度增加不超过 5%,则可认为该调整有效。以上数值为示例,实际应以现场代价地图与机器人尺寸为准。
对于交叉口频繁绕远的情况,还可检查地图分辨率是否过粗:0.05 m 分辨率下 2.5 m 巷道约有 50 个栅格,膨胀层占用后剩余通道较窄;若分辨率改为 0.1 m,通道栅格数减半,搜索更容易判定不可通行。此时应优先保证分辨率与膨胀半径匹配,而不是一味增大 tolerance。