第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里调好参数,再上真车。不然撞坏了墙,老板会找你谈话的。
一句话总结:代价地图是导航的「眼睛」,参数配置是「眼镜度数」。度数不对,再好的算法也白搭。
好了,这一章就到这里。记住,代价地图的调优没有银弹,多试几次,找到最适合你机器人的参数组合。