开篇

当机器人位姿已知而地图 mmm 未知时,我们要如何从带噪声的测距观测中逐步还原出可靠的环境地图 mmm?占据栅格地图正是解决这一问题最经典、工程上应用最广的表示。沿着本章的推导走一遍,你会发现建图可以逐格递推、简单到只用加法,你会掌握它背后的二值贝叶斯滤波原理与完整算法,并理解它与 gmapping 等 ROS 建图包的关系。

前置依赖:需要第二章的贝叶斯滤波,以及第六章的测距仪模型。
后继联系:到第 11~13 章 SLAM,建图将与定位耦合;占据栅格也是后端地图常见的输出格式。


核心知识点

9.1 占据栅格的表示

我们先把连续二维空间切分为方格 mi\mathbf{m}_imi​(cell),于是地图可以写成集合 m={mi}m=\{\mathbf{m}_i\}m={mi​}。每个栅格独立维护一个占据概率:

p(mi∣z1:t,x1:t)∈[0,1]p(\mathbf{m}_i \mid z_{1:t}, x_{1:t}) \in [0,1]p(mi​∣z1:t​,x1:t​)∈[0,1]

  • 111:确定被占据(障碍物)。
  • 000:确定空闲。
  • 0.50.50.5:未知。

独立性假设:这里假定栅格之间彼此独立,从而建图可以逐格计算,工程实现非常友好;代价则是丢失了空间结构相关性(比如墙体的连续性)。

9.2 占据栅格建图的概率公式

接下来我们把"占据"看作二值状态,用二值贝叶斯滤波逐格递推:

记 lt,i=log⁡p(mi∣z1:t,x1:t)1−p(mi∣z1:t,x1:t)l_{t,i} = \log\frac{p(\mathbf{m}_i\mid z_{1:t},x_{1:t})}{1-p(\mathbf{m}_i\mid z_{1:t},x_{1:t})}lt,i​=log1−p(mi​∣z1:t​,x1:t​)p(mi​∣z1:t​,x1:t​)​ 为对数占据比(log-odds),则有

lt,i=lt−1,i+log⁡p(mi∣zt,xt)1−p(mi∣zt,xt)−l0l_{t,i} = l_{t-1,i} + \log\frac{p(\mathbf{m}_i\mid z_t,x_t)}{1-p(\mathbf{m}_i\mid z_t,x_t)} - l_0lt,i​=lt−1,i​+log1−p(mi​∣zt​,xt​)p(mi​∣zt​,xt​)​−l0​

  • l0l_0l0​ 是先验对数比(通常对应 p=0.5p=0.5p=0.5,即 l0=0l_0=0l0​=0)。
  • 第二项 lmeasl_{\text{meas}}lmeas​ 是当前观测贡献的对数比增量。
  • 概率从对数比还原:p=σ(l)=1/(1+e−l)p = \sigma(l) = 1/(1+e^{-l})p=σ(l)=1/(1+e−l)。

直觉:可以把每个栅格的占据度理解为"投票"——激光穿过它就投"空闲",激光打在它上就投"占据",多次观测不断累加,最终每个栅格都被推到 0 或 1。

9.3 反射地图 / 逆传感器模型

p(mi∣zt,xt)p(\mathbf{m}_i\mid z_t,x_t)p(mi​∣zt​,xt​) 称为逆传感器模型(inverse measurement model),由几何关系直接给出:

  • 沿激光从机器人位姿 xtx_txt​ 到端点的栅格:高概率空闲。
  • 端点处栅格:高概率占据(假设是障碍表面)。
  • 射线未覆盖的远处栅格:保持先验 0.50.50.5。
栅格位置p(mi∣z,x)p(\mathbf{m}_i\mid z,x)p(mi​∣z,x)
射线经过处接近 0(空闲)
射线端点接近 1(占据)
射线范围外0.5(未知)
算法
算法: Occupancy_grid_mapping({x_{1:t}, z_{1:t}}, m)
─────────────────────────────────────────────
输入: 位姿序列 x_{1:t}, 观测序列 z_{1:t}, 栅格地图 m
1. 对所有栅格 m_i: l_{0,i} = log-odds(p_0)   // 通常 0
2. 对 t = 1..T:
     对每条激光射线 z_t:
       对射线穿过/打中的每个栅格 m_i:
         b = inverse_sensor_model(m_i, x_t, z_t)
         l_{t,i} = l_{t-1,i} + log(b/(1-b)) - l_0
3. 输出 m_i = σ(l_{t,i}) = 1/(1+e^{-l_{t,i}})
─────────────────────────────────────────────

9.4 逆传感器模型细节

具体到单条激光 zt=(range,beam)z_t=(\text{range}, \text{beam})zt​=(range,beam),只需考察给定栅格 mi\mathbf{m}_imi​ 距机器人的距离 rir_iri​ 与角度差 ∣ϕi−beam∣|\phi_i-\text{beam}|∣ϕi​−beam∣:

p(mi∣zt,xt)={pocc∣ri−zt∣<ϵ(端点附近)pfreeri<zt−ϵ(射线经过)p0其它p(\mathbf{m}_i\mid z_t,x_t) = \begin{cases} p_{\text{occ}} & |r_i-z_t| < \epsilon \text{(端点附近)}\\ p_{\text{free}} & r_i < z_t - \epsilon \text{(射线经过)}\\ p_0 & \text{其它} \end{cases}p(mi​∣zt​,xt​)=⎩⎨⎧​pocc​pfree​p0​​∣ri​−zt​∣<ϵ(端点附近)ri​<zt​−ϵ(射线经过)其它​

典型取值 pocc≈0.85p_{\text{occ}}\approx 0.85pocc​≈0.85,pfree≈0.35p_{\text{free}}\approx 0.35pfree​≈0.35,p0=0.5p_0=0.5p0​=0.5。

9.5 位姿已知假设的局限

值得注意的是,本章算法假设位姿 x1:tx_{1:t}x1:t​ 完全已知。但实际中位姿总有误差,因此:

  • 里程计漂移会导致地图扭曲。
  • 必须与定位(第 7、8 章)耦合解决:SLAM(第 11~13 章)做的就是同时求解位姿与地图。

章节小结

  • 占据栅格将空间离散化,每个栅格存放"占据概率",各自独立递推。
  • 借助对数占据比实现二值贝叶斯滤波:每条激光射线为沿途栅格投票更新。
  • 逆传感器模型依据射线几何直接给出投票值(空闲/占据/未知)。
  • 本章假设位姿已知;位姿未知的情形留待后续 SLAM 章节处理。

后续联系:第 10 章会介绍其它建图表示;第 11~13 章的 SLAM 把本章建图与 MCL/EKF 定位联合求解;占据栅格也是 ROS gmapping/cartographer 的标准地图输出。


思考与延伸

  • 栅格分辨率权衡:5cm 栅格精度高,但内存占用大、计算慢;20cm 栅格则相反。实践中常折中取 5~10cm。
  • 动态障碍:本章假设环境是静态的;行人等动态物体会留下"鬼影",可以用时间滤波或最近 N 帧滑动窗口来缓解。
  • 对数比表示的好处:规避了概率连乘带来的数值下溢问题,且每次更新只需做加法。
  • 未知区域表达:占据栅格天然区分"空闲/占据/未知",非常适合导航规划;拓扑地图(第 10 章)则更适合大范围路径规划。
  • 与神经地图融合:现代方法(如 Neural Radiance Field、隐式表示)尝试学习连续地图,但在工程实践中占据栅格仍是基线选择。

结语

回顾本章,我们以二值贝叶斯滤波为核心,用对数占据比把占据栅格建图化为逐格的加法更新,再借助逆传感器模型从射线几何直接得到每次观测的投票值。你会发现,这套方法以极低的计算代价换来了区分空闲、占据与未知的高质量地图,至今仍是 gmapping、cartographer 等主流建图系统的基石,在机器人导航中有着不可替代的工程价值。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐