第二章:全局规划器参数详解

各位同学,今天我们来聊聊全局规划器。说白了,全局规划器就是机器人的「大脑地图」——它负责在已知的全局代价地图上,找出一条从起点到终点的最优路径。

我个人习惯把全局规划器比作「导航的灵魂」。你想想看,如果灵魂出了问题,机器人要么原地打转,要么撞墙,要么绕远路。所以这一章,咱们把它的核心参数掰开揉碎了讲清楚。

2.1 全局规划器插件的选择

Nav2 里常用的全局规划器主要有两个:NavFn 和 Smac Planner。嗯,这里要注意,它们不是替代关系,而是各有各的脾气。

2.1.1 NavFn:经典但够用

NavFn 是 ROS1 时代的老将了。它基于 Dijkstra 或 A* 算法,计算速度快,资源占用低。我在项目中遇到过一些低算力的工控机,用 NavFn 反而比 Smac 更稳。

它的核心参数不多,我列一下常用的:

参数名 默认值 说明
use_dijkstra true 是否使用 Dijkstra 算法。false 则用 A*
use_quadratic true 是否使用二次近似计算代价
allow_unknown true 是否允许路径经过未知区域

我曾经踩过一个坑:在动态障碍物多的场景下,把 allow_unknown 设成了 false。结果机器人一遇到未知区域就卡住,死活不走。后来改成 true,配合局部规划器实时避障,问题就解决了。

2.1.2 Smac Planner:新一代的王者

Smac Planner 是 Nav2 的亲儿子。它支持 Hybrid-A*、State Lattice 等多种算法,能生成更平滑、更符合运动学约束的路径。

我个人强烈推荐在差速或阿克曼底盘上使用 Smac。为什么呢?因为它考虑了车辆的最小转弯半径和加速度限制。说白了,它生成的路径,你的机器人真的能走。

核心参数如下:

参数名 默认值 说明
smoother.max_iterations 1000 路径平滑的最大迭代次数
cost_penalty 2.0 代价惩罚系数,越大越远离障碍物
analytic_expansion_ratio 3.5 解析扩展比例,影响搜索效率
motion_model_for_search “dubins” 搜索用的运动模型:dubins、reeds_shepp、state_lattice

这里有个小技巧:如果你的机器人是差速底盘,用 dubins 模型就够了。如果是阿克曼底盘,建议用 reeds_shepp。我曾经在阿克曼车上用了 dubins,结果路径经常出现原地掉头——嗯,那画面太美我不敢看。

避坑指南:Smac Planner 的 cost_penalty 参数不要调太大。我见过有人设到 10.0,结果路径绕了半个地图才到终点。一般 1.5~3.0 之间比较合适。

2.2 代价地图参数

代价地图是全局规划器的「眼睛」。它告诉规划器哪里能走、哪里不能走、哪里最好绕着走。

代价地图分为两种:全局代价地图和局部代价地图。全局的用于规划长距离路径,局部的用于实时避障。这里我们重点讲全局代价地图的参数。

2.2.1 核心参数

参数名 默认值 说明
global_frame “map” 全局坐标系
robot_base_frame “base_link” 机器人基坐标系
resolution 0.05 地图分辨率(米/像素)
width 10.0 地图宽度(米)
height 10.0 地图高度(米)
obstacle_range 2.5 障碍物检测范围(米)
raytrace_range 3.0 光线追踪范围(米)

我个人习惯把 resolution 设为 0.05。为什么呢?因为 0.05 米的分辨率,对于大多数室内机器人来说,既能保证路径精度,又不会让计算量爆炸。如果你在室外大场景,可以放宽到 0.1 甚至 0.2。

2.2.2 膨胀层参数

膨胀层是代价地图的「安全区」。它把障碍物周围的一圈区域标记为高代价,让规划器主动避开。

参数名 默认值 说明
inflation_radius 0.55 膨胀半径(米)
cost_scaling_factor 10.0 代价缩放因子,越大衰减越快

这里有个经典问题:inflation_radius 设多大合适?

我的经验是:至少大于机器人半径的一半。比如你的机器人半径是 0.3 米,那 inflation_radius 至少设 0.15 米。但如果你设得太小,比如 0.05 米,机器人可能会贴着墙走——嗯,刮花了漆别找我。

小提示:cost_scaling_factor 控制代价从障碍物边缘向外衰减的速度。值越大,衰减越快,路径越靠近障碍物。值越小,衰减越慢,路径越远离障碍物。我一般用 10.0,效果比较均衡。

2.3 知识体系总览

为了让你更直观地理解全局规划器的知识结构,我画了一张图:

全局规划器知识体系 全局规划器 插件选择 代价地图参数 NavFn Smac Planner 核心参数 膨胀层参数 Dijkstra / A* Hybrid-A* / State Lattice

2.4 实战建议

最后,我总结几条实战经验:

  • 选插件看底盘:差速底盘用 NavFn 或 Smac 都行,阿克曼底盘建议用 Smac。
  • 调参数要渐进:一次只改一个参数,观察效果。我见过有人一口气改了五个参数,结果机器人原地转圈,根本不知道是哪个参数的问题。
  • 代价地图要匹配:全局代价地图的分辨率不要比局部代价地图低太多,否则路径会「跳来跳去」。
  • 膨胀半径别太小:至少大于机器人半径的一半,否则容易刮蹭。

警告:千万不要在生产环境中直接使用默认参数!每个场景、每个底盘都有自己的脾气。一定要在仿真或测试环境中反复调参,确认没问题后再上线。

好了,这一章的内容就到这里。全局规划器的参数说多不多,说少不少,但每一个都关系到机器人的「生死存亡」。希望你能动手试试,把参数调出最适合你机器人的那一组。

可可精品资料库