4. 局部代价地图参数:滚动窗口与更新频率

局部代价地图,说白了就是机器人眼前那一亩三分地的实时地图。全局地图管的是从A到B的整体路径,而局部地图只管机器人周围几米内的障碍物信息。我刚开始调导航的时候,总觉得局部地图参数没啥好调的,后来被机器人撞了几次墙才明白——这里面的门道深着呢。

4.1 rolling_window 滚动窗口

rolling_window 这个参数,决定了局部代价地图是不是跟着机器人走。默认是 true,也就是地图会随着机器人移动而滚动。

你想想看,如果这个参数设成 false,那局部地图就固定在某个位置不动了。机器人一跑出去,地图上啥都没有,那还避什么障?

核心理解: rolling_window = true 时,局部地图以机器人为中心,始终保持一个动态窗口。机器人走到哪,地图就跟到哪。

我个人习惯把这个窗口的大小和机器人的速度挂钩。举个例子:

  • 机器人最大速度 0.5 m/s,窗口设 3m x 3m 就够了
  • 机器人最大速度 1.0 m/s,窗口至少 5m x 5m
  • 机器人最大速度 2.0 m/s,窗口建议 8m x 8m 以上

为什么?因为速度越快,需要的"提前量"就越大。我在项目里遇到过一台AGV,速度设了1.2m/s,窗口只有2m,结果每次转弯都来不及避障,直接怼墙上。后来把窗口扩大到4.5m,问题就解决了。

注意: 窗口不是越大越好。窗口越大,计算量越大,实时性就会下降。找到速度和计算量的平衡点才是关键。

4.2 update_frequency 更新频率

update_frequency 控制的是代价地图的更新速度,单位是 Hz。说白了就是每秒刷新几次。

默认值通常是 5.0 Hz,也就是每秒更新5次。这个值够不够用?得看你的传感器和场景。

场景 推荐频率 说明
室内低速(≤0.5 m/s) 3-5 Hz 够用,CPU负担小
室内中速(0.5-1.0 m/s) 5-10 Hz 平衡实时性和性能
室外高速(≥1.0 m/s) 10-20 Hz 需要高频更新,但CPU压力大
动态障碍物密集 10-15 Hz 人、车频繁出现时需要

我曾经在一个仓库项目里,把更新频率从5Hz调到2Hz,想着省点CPU。结果机器人经常"看到"障碍物时已经来不及刹车了。嗯,那次教训挺深刻的——频率太低,地图就是"过期"的。

我的经验: 更新频率最好和激光雷达的扫描频率匹配。比如雷达是10Hz,那地图更新频率设10Hz左右最合适。设太高了也没用,因为数据源跟不上。

4.3 publish_frequency 发布频率

publish_frequency 和 update_frequency 容易搞混。我刚开始学的时候也分不清。

简单说:

  • update_frequency:地图内部计算的频率
  • publish_frequency:把计算好的地图发布出去的频率

这两个频率可以不一样。比如你可以每秒更新10次,但只发布5次。这样内部计算很及时,但对外发布的频率低一些,减少通信负担。

我个人习惯让 publish_frequency 等于或略低于 update_frequency。比如:

update_frequency: 10.0
publish_frequency: 5.0

这样内部保持高频更新,但对外发布时做了降频,节省带宽。不过要注意,如果你用rviz看地图,发布频率太低会导致显示卡顿,看起来像"跳帧"。

关键区别: update_frequency 影响避障的实时性,publish_frequency 影响可视化和其他节点的数据接收速度。

4.4 三个参数的联动关系

这三个参数不是孤立的。我画了一张图,帮你理清它们之间的关系:

局部代价地图参数联动关系 传感器数据 rolling_window 决定地图范围与跟随方式 update_frequency 控制内部计算刷新速度 publish_frequency 控制对外发布地图的频率 局部代价地图输出 参数联动要点 窗口越大→更新越慢 更新越快→CPU越忙 发布越慢→可视化卡顿 常见配置参考 室内低速:3-5Hz 室内中速:5-10Hz 室外高速:10-20Hz

4.5 实战配置示例

下面是我在一个室内服务机器人项目里用过的配置,你可以参考:

# 局部代价地图参数配置
local_costmap:
  global_frame: odom
  robot_base_frame: base_footprint
  rolling_window: true
  width: 4.0
  height: 4.0
  resolution: 0.05
  
  # 更新与发布频率
  update_frequency: 8.0
  publish_frequency: 4.0
  
  # 其他参数
  static_map: false
  transform_tolerance: 0.5

这个配置里,窗口4m见方,更新频率8Hz,发布频率4Hz。机器人速度大概0.6m/s,在室内跑得很稳。

调试小技巧: 如果你发现机器人反应迟钝,先看 update_frequency 是不是太低了。如果rviz显示卡顿,再看 publish_frequency。这两个问题经常被搞混。

4.6 常见问题与避坑

  • 地图不更新? 检查 update_frequency 是否大于0,以及传感器数据是否正常发布
  • rviz地图不动? 检查 rolling_window 是否设为 true,以及 publish_frequency 是否正常
  • CPU占用过高? 降低 update_frequency 或缩小窗口尺寸
  • 避障不及时? 提高 update_frequency,同时检查窗口是否够大

我曾经在一个项目中,把 update_frequency 设到20Hz,结果CPU直接飙到90%。后来降到10Hz,配合4m窗口,效果反而更好。有时候不是越高越好,找到平衡点才是真本事。