ROG-Map:基于 LiDAR 的高效机器人中心栅格地图
引言
在自主飞行与移动机器人领域,视觉传感器测量范围有限(通常约 35m),而激光雷达(LiDAR)则能提供精确的远程感知。为了避开小障碍物并实现复杂环境导航,高分辨率的占用栅格地图(OGM)至关重要。然而,传统的 OGM 在大场景中面临两个核心挑战:地图更新和障碍物膨胀的计算负载显著增加。
基于八叉树或哈希表的方法虽然节省内存,但在实时性上往往难以满足要求;而基于均匀网格的方法计算效率高,却因大规模环境下的内存消耗变得不可行。ROG-Map 正是为了解决这些问题而生,它提出了一种以机器人为中心的局部地图策略,配合增量障碍膨胀方法,实现了大场景下的高分辨率与高效率平衡。
核心创新点
- 零拷贝地图滑动策略:仅维护机器人周围的局部地图,随机器人移动动态更新,大幅降低大场景任务的内存成本。
- 增量障碍膨胀方法:通过状态变化触发邻居更新,将计算复杂度降至 O(N),显著优于传统遍历方法。
- 概率更新优化:采用对数几率(Log-odds)截断策略,有效应对动态环境中的障碍物消失问题。
该方案已作为 ROS 包开源,并在基于 LiDAR 的四旋翼无人机上进行了广泛的真实世界测试。
占据栅格地图理论基础
贝叶斯概率更新
当激光雷达扫过环境时,我们需要判断某个栅格是否被占据。这是一个典型的贝叶斯推断问题。假设这是一个马尔可夫过程,我们计算在已知历史测量数据的情况下,栅格 $n$ 被占据的概率 $P_{1:k}(n)$。
经典的二元贝叶斯更新公式涉及连乘运算,经过成千上万次扫描后,浮点数乘法不仅慢,还容易导致数值下溢。因此,引入'对数几率'是工程上的必然选择。
对数几率定义为几率的对数: $$L_{1:k}(n) = \log\frac{P_{1:k}(n)}{1-P_{1:k}(n)}$$
利用对数性质,复杂的连乘转化为简单的加法: $$L_{1:k}(n) = L_{1:k-1}(n) + L_{k}(n)$$
这意味着当前时刻的地图状态等于上一时刻的状态加上本次观测带来的变化。由于对数几率是双射的,地图中只需保存 $L$ 值即可还原概率。
增量计算与截断策略
单次观测的增量由击中(Hit)和未击中(Miss)次数决定: $$L_{k}(n) = n_{hit}\cdot l_{hit} + n_{miss}\cdot l_{miss}$$
其中 $l_{miss}$ 为负值,因为光束穿过意味着该处为空。为了防止动态环境中障碍物移除后概率无法回退,论文采用了截断策略,限制对数几率的上下界: $$L_{1:k}(n) = \max(\min(L_{t}, l_{max}), l_{min})$$
这确保了即使障碍物突然移走,地图也能迅速更新,避免'死锁'。
关键概念解析
在实现过程中,有两个概念对后续膨胀算法至关重要:
- 上升栅格 (Rising Grid, RG):状态从未知或空闲变为占据的栅格。
- 下降栅格 (Falling Grid, FG):状态从占据变为空闲或未知的栅格。
系统只需关注这两种状态的栅格,无需遍历全图。
ROG-Map 核心架构
A. 机器人中心局部地图 (Robocentric Local Maps)
解决的核心痛点是:无人机内存有限,但现实世界无限。如果存储全局地图,飞出几公里后内存就会崩溃。
ROG-Map 采用'跑步机'机制:地图核心始终罩在机器人周围,超出范围的旧数据直接丢弃,新探测数据补入。这通过循环缓冲区(Circular Buffer)实现。
坐标转换流程如下:
- 全局坐标 -> 全局索引:根据机器人位置 $p_k$ 和分辨率 $r$ 计算。
- 全局索引 -> 中间索引:对地图长度取模,利用循环特性。
- 中间索引 -> 局部索引:归一化处理,确保数组下标非负。
- 局部索引 -> 1D 内存地址:通过展平公式映射到连续内存空间。
最核心的魔法在于Zero-copy(零拷贝)。当机器人移动导致局部地图偏移时,被淘汰的旧内存地址只需清零,随后立即复用为新区域的数据。数据格子在物理层面永远不移动,仅通过数学取模运算确定位置,极大降低了内存搬运开销。


