《概率机器人》读书笔记-第九章_占据栅格地图-马宁-20261109
开篇
当机器人位姿已知而地图 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=logp(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+logp(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)=⎩⎨⎧poccpfreep0∣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 等主流建图系统的基石,在机器人导航中有着不可替代的工程价值。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)