3、全局规划器调优实战:代价地图膨胀半径、规划超时、路径平滑度权重调节
全局规划器,说白了就是机器人的“大脑地图”。它负责在已知地图上,找出一条从A到B的无碰撞路径。但这条路径好不好走,能不能走通,很大程度上取决于几个关键参数。
我个人习惯,调全局规划器之前,先搞清楚三个核心矛盾:安全 vs 效率、计算时间 vs 路径质量、路径平滑 vs 贴近障碍物。今天我们就围绕这三个矛盾,把膨胀半径、规划超时和平滑度权重这三个参数彻底讲透。
3.1 膨胀半径:安全与效率的博弈
膨胀半径,英文叫 inflation_radius。它决定了障碍物周围“危险区域”的大小。机器人会把膨胀区域视为不可通行区域。
嗯,这里要注意:膨胀半径不是越大越好,也不是越小越好。它直接决定了机器人能不能通过狭窄通道。
核心原则:膨胀半径 = 机器人半径 + 安全余量。安全余量通常取 0.1m ~ 0.3m。
我在项目中遇到过这样一个案例:一台直径0.6米的机器人,在0.8米宽的走廊里死活过不去。检查发现,膨胀半径设了0.5米。你想想看,0.5米半径加上机器人自身0.3米半径,走廊宽度0.8米,两边各占0.8米,中间只剩0.2米——这哪过得去?
后来我把膨胀半径调到0.35米,机器人就能顺利通过了。但代价是,它离墙更近了,碰撞风险增加。
调参建议:
- 保守场景(人机共融、贵重物品运输):膨胀半径 = 机器人半径 + 0.3m ~ 0.5m
- 高效场景(仓库、工厂):膨胀半径 = 机器人半径 + 0.1m ~ 0.2m
- 狭窄通道场景:先测量最窄通道宽度,确保
2 * 膨胀半径 + 机器人直径 < 通道宽度
我曾经踩过的坑:在动态环境中,膨胀半径设得太小,机器人容易因为行人突然靠近而急停。建议在动态区域使用 inflation_layer 的动态膨胀功能,根据障碍物速度动态调整膨胀半径。
3.2 规划超时:别让机器人“想太久”
规划超时,参数名叫 planning_time。它决定了全局规划器最多花多少时间找路径。
说白了,这就是一个“时间预算”。超时了还没找到路径,规划器就返回失败,机器人原地不动。
我记得有一次调试,机器人每次规划都要花5秒以上。用户反馈说“机器人反应太慢了”。我一看日志,planning_time 设了10秒。规划器确实能找到最优路径,但代价是机器人每次都要等很久。
为什么会这样?因为全局规划器(比如 NavFn 或 A*)在复杂地图上搜索空间很大。如果地图有1000x1000个格子,搜索空间就是100万个节点。不加时间限制,它可能会遍历所有节点。
调参建议:
| 场景 | 推荐规划超时 | 说明 |
|---|---|---|
| 小型地图(< 50x50m) | 1.0 ~ 2.0 秒 | 地图小,搜索快 |
| 中型地图(50~200m) | 2.0 ~ 5.0 秒 | 需要平衡搜索深度 |
| 大型地图(> 200m) | 5.0 ~ 10.0 秒 | 建议配合分层规划 |
| 动态环境 | 1.0 ~ 2.0 秒 | 快速重规划更重要 |
我的个人技巧:如果规划经常超时,不要一味增加超时时间。先检查地图分辨率是否太高(比如0.01m/像素),或者尝试使用 NavFn 替代 A*(NavFn 在大型地图上更快)。
3.3 路径平滑度权重:让机器人走得更优雅
路径平滑度权重,在 Nav2 中通常通过 smooth_path 或 path_smoother 的参数来调节。核心参数是 smoothness_weight 和 curvature_weight。
你想想看,全局规划器默认生成的路径,往往是“折线”——直角转弯、锯齿形路径。机器人如果按这种路径走,会频繁加减速,不仅效率低,还容易磨损电机。
平滑度权重的作用,就是让路径更“圆润”。权重越大,路径越平滑,但可能离障碍物更近。
我在项目中遇到过:一台差速机器人,平滑度权重设了0.5,路径非常平滑,但有一次差点撞到墙角。因为平滑算法把路径“拉直”了,导致它切过了障碍物的膨胀区域。
调参建议:
- 差速机器人:平滑度权重 0.1 ~ 0.3,曲率权重 0.5 ~ 1.0(差速机器人转弯灵活,不需要太平滑)
- 阿克曼机器人:平滑度权重 0.3 ~ 0.6,曲率权重 1.0 ~ 2.0(阿克曼转弯半径大,需要更平滑的路径)
- 全向机器人:平滑度权重 0.05 ~ 0.15(全向移动对路径平滑度不敏感)
关键参数配置示例:
# 在 nav2_params.yaml 中配置
path_smoother:
ros__parameters:
smoother_type: "simple_smoother"
simple_smoother:
smoothness_weight: 0.3
curvature_weight: 1.0
max_iterations: 1000
tolerance: 1e-8
我曾经犯过的错误:把平滑度权重设到0.8以上,结果路径变得过于平滑,直接穿过了障碍物之间的缝隙。记住,平滑度权重不是越大越好,它需要和膨胀半径配合使用。膨胀半径大,平滑度权重可以适当增加;膨胀半径小,平滑度权重就要降低。
3.4 三个参数的联动调优
这三个参数不是孤立的。它们之间相互影响,需要一起调。
举个例子:如果你把膨胀半径调大了,路径自然离障碍物更远,这时候平滑度权重可以适当增加,因为安全空间更大了。反过来,膨胀半径调小了,平滑度权重就要降低,避免路径切得太靠近障碍物。
规划超时则像一个“天花板”。如果膨胀半径大、平滑度权重大,规划器需要计算更复杂的路径,超时时间就要相应增加。
我的调优顺序:
- 先定膨胀半径:根据机器人尺寸和场景确定基础安全距离
- 再调规划超时:确保在膨胀半径下,规划器能在合理时间内找到路径
- 最后调平滑度权重:在保证安全的前提下,让路径更平滑
嗯,这套流程我用了很多年,基本没出过大问题。你可以在仿真环境里先试,再上真车。