第3章:代价地图详解

各位同学,今天我们来聊聊代价地图。说实话,这是Nav2导航里最容易被忽视、却又最关键的部分。我见过太多项目,算法调了半天没效果,最后发现是代价地图参数没配好。

3.1 什么是代价地图?

代价地图,说白了就是一张「风险热力图」。机器人走到哪里,地图上就会标记出对应的风险值。0表示完全安全,255表示禁区。

嗯,这里要注意:代价地图不是静态的。它会随着传感器数据实时更新。你想想看,如果前面突然出现一个行人,代价地图必须立刻把那个区域标记为高代价。

核心概念:代价地图 = 静态地图 + 传感器数据 + 膨胀处理

3.2 全局代价地图 vs 局部代价地图

这两个东西,我刚开始学的时候也搞混过。后来在项目里摔了几次跟头,才真正理解它们的区别。

对比项 全局代价地图 局部代价地图
作用范围 整个已知地图 机器人周围(通常5-10米)
更新频率 较低(1-5Hz) 较高(10-50Hz)
主要用途 全局路径规划 局部避障与轨迹优化
数据来源 静态地图 + 长期传感器数据 实时传感器数据
分辨率 可较低(0.05-0.1m) 较高(0.02-0.05m)

我在项目里遇到过这样的情况:全局代价地图分辨率设得太高,导致规划耗时暴增。后来我学乖了,全局地图用0.1m,局部地图用0.05m,效果刚刚好。

3.3 膨胀层与障碍物层

代价地图由多个「层」叠加而成。最核心的就是障碍物层和膨胀层。

3.4.1 障碍物层(Obstacle Layer)

障碍物层负责把传感器数据「翻译」成代价。激光雷达扫到障碍物,就在对应位置标记高代价。

# 障碍物层典型配置
obstacle_layer:
  enabled: true
  observation_sources: laser_scan
  laser_scan:
    topic: /scan
    max_obstacle_height: 2.0
    min_obstacle_height: 0.0
    obstacle_range: 2.5
    raytrace_range: 3.0

这里有个坑:obstacle_range和raytrace_range的区别。前者是「多远能检测到障碍物」,后者是「多远能清除障碍物」。我曾经把这两个值设反了,结果机器人对着墙直冲过去……

3.4.2 膨胀层(Inflation Layer)

膨胀层,就是给障碍物「加个安全距离」。机器人不是质点,它有自己的尺寸。膨胀层确保机器人不会贴着障碍物走。

我的经验:膨胀半径一般设为机器人半径的1.2-1.5倍。太小容易刮蹭,太大又过不了窄门。我习惯先设1.5倍,实测后再微调。

# 膨胀层典型配置
inflation_layer:
  enabled: true
  inflation_radius: 0.55  # 膨胀半径(米)
  cost_scaling_factor: 10.0  # 代价衰减因子

cost_scaling_factor这个参数很有意思。值越大,代价衰减越快,机器人越敢靠近障碍物。值越小,代价衰减越慢,机器人越保守。我个人习惯设10.0,比较中庸。

3.4 代价地图参数配置详解

配置参数,说白了就是调「灵敏度」。我整理了一份常用参数表,都是实战经验。

参数名 默认值 推荐范围 说明
global_frame map map/odom 全局坐标系
robot_base_frame base_link base_link/base_footprint 机器人本体坐标系
update_frequency 5.0 1.0-10.0 地图更新频率(Hz)
publish_frequency 2.0 0.5-5.0 地图发布频率(Hz)
resolution 0.05 0.02-0.1 地图分辨率(m/像素)
inflation_radius 0.55 0.3-1.0 膨胀半径(m)
cost_scaling_factor 10.0 5.0-20.0 代价衰减因子

避坑指南:我曾经把update_frequency设到20Hz,结果CPU直接拉满,机器人卡成PPT。后来发现5Hz完全够用,除非你跑的是F1赛车。

3.5 代价地图的工作流程

为了让大家更直观地理解,我画了一张流程图。

代价地图工作流程 静态地图层 传感器数据 障碍物层 膨胀层 最终代价地图 已知地图信息 激光/深度相机 实时障碍物标记 安全距离膨胀 供路径规划使用

流程其实很简单:静态地图提供基础信息,传感器数据实时更新障碍物层,然后膨胀层加上安全距离,最终生成完整的代价地图。

3.6 实战建议

最后,分享几个我在项目里总结的经验:

  • 先调膨胀层,再调障碍物层。膨胀层影响的是「能不能过」,障碍物层影响的是「能不能看到」。我习惯先让机器人能安全通过,再优化障碍物检测。
  • 分辨率不是越高越好。0.05m对于大多数室内场景已经足够。分辨率太高,计算量成倍增加,得不偿失。
  • 注意传感器盲区。激光雷达在机器人正下方有盲区,代价地图会留下「空洞」。我一般会加一个超声波传感器来补盲。
  • 测试时先跑仿真。在Gazebo里调好参数,再上真车。不然撞坏了墙,老板会找你谈话的。

一句话总结:代价地图是导航的「眼睛」,参数配置是「眼镜度数」。度数不对,再好的算法也白搭。

好了,这一章就到这里。记住,代价地图的调优没有银弹,多试几次,找到最适合你机器人的参数组合。

可可精品资料库