第4章 · 局部代价地图参数详解
rolling_window、voxel_layer、inflation半径 —— 这三个家伙几乎决定了你的机器人能不能在走廊里优雅转身。
4.1 rolling_window —— 会“滚动”的局部视野
说白了,rolling_window 就是让代价地图始终跟着机器人走。你想想看,全局地图是固定的,但局部地图得实时反映机器人周围的环境。这个参数设置的就是“窗口”的宽、高,单位是米。
我个人习惯把宽度设成 4~6 米,高度 4~5 米。太小了,转弯时地图边缘突然出现障碍物,路径规划容易懵;太大了,计算量上去了,而且老旧障碍物信息迟迟不退出,反而干扰规划。
配置示例:
local_costmap:
rolling_window: true
width: 5.0
height: 5.0
resolution: 0.05
4.2 voxel_layer —— 给代价地图加上“高度”维度
大部分 2D 代价地图只用激光雷达的平面数据,但如果你有深度相机或者多线雷达,voxel_layer 就能派上大用场。它把空间切成小立方体(体素),能区分障碍物的高度。
为什么要关心高度?举个例子:你的机器人高度 0.4 米,遇到一个 0.3 米高的矮台阶,2D 地图会把它当成障碍物,机器人可能绕一大圈。但用 voxel_layer 后,只要设置合适的 z_resolution 和 z_voxels,就能知道这个障碍物其实碰不到机器人底盘,直接压过去就行。
z_voxels 一般设 8~16 就够,z_resolution 用 0.1~0.2 米。别设太大,否则内存涨得飞快。我在一个项目里试过 32 层体素,结果工控机直接报警。
voxel_layer 的典型配置:
plugins:
- {name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
obstacle_layer:
enabled: true
max_obstacle_height: 2.0
min_obstacle_height: 0.0
z_voxels: 16
z_resolution: 0.1
origin_z: 0.0
注意 min_obstacle_height 和 max_obstacle_height 决定了哪些高度的障碍物会被考虑。我一般把 min 设成 0.05,过滤掉地面噪点;max 设成 1.8 米,高于机器人的障碍物其实可以忽略,但保留一点余量。
4.3 inflation 半径 —— 安全感的“边界”
inflation 半径,就是给障碍物“吹气球”。每个障碍物周围会生成一个代价梯度,越靠近障碍物代价越高。路径规划器会尽量避开高代价区域。
这个值设多大?我见过有人直接设 0.5 米,结果机器人离墙八丈远就开始绕路,在窄走廊里直接卡住。设太小呢?比如 0.1 米,机器人贴着障碍物走,稍微有点定位误差就撞上。
cost_scaling_factor 调高到 10,让代价衰减更陡,才顺利通过。
inflation 参数示例:
inflation_layer:
enabled: true
inflation_radius: 0.2
cost_scaling_factor: 8.0
cost_scaling_factor 控制代价下降的陡峭程度。数值越大,远离障碍物时代价下降越快。我个人习惯在 5~12 之间调,配合实际机器人尺寸微调。
4.4 三个参数的联动效应
你想想看,rolling_window 决定了地图范围,voxel_layer 决定了障碍物建模的精细度,inflation 决定了安全边界。它们不是孤立的。
- 窗口小 + 大 inflation:机器人容易在窗口边缘突然“看到”高代价区域,急转弯或急停。
- 窗口大 + 小 inflation:地图包含太多陈旧障碍物,路径可能绕远路。
- voxel 层数多 + 小 inflation:适合有悬空障碍物的环境(比如货架上层板),但计算压力大。
我在做服务机器人时,常用这样一组初始值:rolling_window 5x5m,inflation_radius 0.2m,voxel 层数 8。然后根据实际场景微调。记住,没有万能参数,只有不断试出来的最佳组合。