一、核心定义
二维代价(危险度)地图(Costmap 2D)是 NAV2 导航里环境数字建模核心,把真实室内环境转换成网格栅格地图,给每一个格子打上危险代价数值,让机器人知道哪里能走、哪里不能走、哪里需要减速避让,专门用于路径规划、实时避障、边界防撞。
本质:把物理环境 → 量化成代价数值网格。
二、底层基础结构
- 整张地图划分为均等大小正方形栅格
- 常用栅格分辨率:0.05m ~ 0.1m(一格代表现实5 厘米~10 厘米)
- 每个栅格只存一个代价值(0~255)
- 分两层地图:静态层 + 动态实时层
代价数值标准(NAV2 通用)
- 0:自由区域,完全安全无障碍,全速通行
- 1~250:膨胀危险区,离障碍物越近,数值越大,机器人减速绕行
- 253:内置禁区,禁止驶入区域
- 254:致命障碍物,绝对不能碰撞
- 255:未知区域,无法判定环境,禁止通行
三、两大组成层级(NAV2 必分)
1. 静态代价地图层
由提前建好的SLAM 静态地图直接转换而来
- 固定墙体、固定家具、固定柱子
- 开机加载,运行中基本不变化
- 作用:划定整体可通行大区域
2. 动态实时代价地图层
由激光雷达实时扫描生成
- 临时行人、临时桌椅、临时堆放物
- 机器人移动过程中每秒高频刷新
- 作用:实现动态避障
四、核心三大核心原理
1. 障碍物占据原理
雷达探测到障碍物距离 → 映射到对应栅格直接把该栅格标记为254 致命障碍,禁止通行。
2. 障碍物膨胀原理(最关键)
机器人本身有物理体积,不能贴着障碍物边缘走。算法自动从障碍物向外逐层扩散抬高代价:
- 紧贴障碍:高代价,禁止靠近
- 远离障碍:低代价,正常通行作用:预留机器人安全绕行空间,防止剐蹭碰撞。
3. 未知区域判定原理
雷达扫描不到、从未探测过的区域,全部标记为255 未知,机器人默认不进入未知区域,只走已探明安全区域。
五、二维代价地图 完整输入
1. 基础输入
- 静态栅格地图文件(pgm+yaml)
- 地图分辨率、地图原点、地图尺寸参数
- 机器人外形尺寸、安全膨胀半径
2. 传感器实时输入
- 2D 激光雷达点云数据(主流)
- 深度相机测距数据
- 超声波测距数据
3. 坐标变换输入(TF2)
- laser_link → base_link 坐标变换
- base_link → map 全局定位位姿。没有 TF,雷达数据无法匹配到全局地图,代价地图直接失效。
4. 配置参数输入
- 膨胀半径、刷新频率、地图更新范围
- 障碍物阈值、清除旧障碍时效
- 全局地图尺寸、局部滑动窗口大小
六、内部运算处理流程
- 加载静态地图,初始化全局基础代价网格
- 接收雷达原始测距数据
- 通过 TF 把雷达障碍物坐标转换到 map 全局坐标系
- 将坐标匹配填入对应栅格,标记障碍物栅格
- 执行障碍物膨胀扩散,生成安全缓冲区域
- 清除过期消失的临时障碍物(行人走开自动消代价)
- 合并静态层 + 动态层,生成最终融合代价地图
- 持续高频刷新更新环境变化
七、二维代价地图 最终输出
1. 数据输出
- 全局融合代价网格矩阵(0~255 数值矩阵)
- 局部实时滑动代价地图(机器人周边小范围)
- 已占用障碍栅格坐标列表
- 可通行自由区域范围
2. 功能层面输出(供给导航使用)
- 给全局路径规划器:输出大范围可行走路线,避开固定墙体
- 给局部轨迹控制器:输出身边实时动态障碍,紧急绕行避障
- 输出安全边界,防止机器人冲出房间、跌下坡道
- 输出拥堵区域,让机器人自动减速慢行
八、全局代价地图 VS 局部代价地图
- 全局代价地图:覆盖整张场景地图,负责长距离整体路线规划,更新慢。
- 局部代价地图:只保留机器人周边小范围窗口,跟随机器人移动滑动,刷新极快,专门用于即时避障。
九、通俗生活化举例
把整栋房子做成网格纸:
- 墙壁格子标成死路不能走
- 沙发、柜子标成障碍物
- 障碍物周围一圈画成慢行缓冲区
- 人走过的空地标成安全道路
- 突然进来的人实时画上临时障碍这一整张带危险等级的网格纸,就是代价地图。
十、核心作用总结
- 完成机器人环境数字化建模
- 区分固定环境与临时动态环境
- 依靠代价数值实现智能避障 + 安全防撞
- 是全局路径规划、局部运动控制唯一环境依据
- 无代价地图,NAV2 只能定位,无法自主走路导航