9. gmapping 的局限与激光 SLAM 进阶路线

上一篇:8. 从理解到实现:迷你gmapping | 系列完结篇


一、gmapping 的三条硬伤(原理决定的,非调参能救)

1.1 内存:每个粒子都是”地图收藏家”

算一笔账(沿用 原理分析 的例子):

1
2
3
4
场地 200m × 200m,分辨率 5cm,每格 1 字节
-> 一张地图 = (200/0.05)² = 4000² = 1600 万格 ≈ 16 MB
-> 100 个粒子 = 1.6 GB
-> 500m × 500m + 200 粒子 ≈ 直接爆内存 💥

即便有第 6 篇的地图树共享,地图差异随轨迹分歧增大,共享收益逐渐消失。

1.2 无回环检测:走过回头路就”翻旧账”

1
2
3
4
5
flowchart LR
A["走过一大圈<br/>回到起点"] --> B["里程计漂移累积<br/>(误差可能好几米)"]
B --> C["gmapping: 没有回环检测<br/>不知道'这是同一个地方'"]
C --> D["❌ 地图错位/重影<br/>(加粒子只能缓解)"]
style D fill:#fce8e6,stroke:#d93025

滤波框架”边走边写不回头”的设计使它天然无法回填修正历史–这是与图优化框架的代差。

1.3 粒子数两难

粒子少 -> 大场景/强噪声下丢解;粒子多 -> 内存/算力线性涨。改进提议分布(第 5 篇)缓解但没根治。


二、横向对比:三大 2D 激光 SLAM

gmapping (2007) Hector (2011) Cartographer (2016, Google)
框架 粒子滤波(RBPF) 扫描匹配(高斯牛顿) 图优化(submap + 回环)
里程计 必须有(提供先验) 不需要(为救灾不平地面设计) 不需要(手持也能用)
雷达频率要求 低(5Hz 可用) 高(40Hz+)
回环检测 ✅(分支定界搜索)
大场景 ❌ 内存爆
计算特征 快、省(小场景) 极快但快速转向易崩 重(矩阵优化,Ceres)
适用 室内机器人/扫地机 高频雷达/无轮平台 大场景/手持/商用主力

选型口诀:室内小场景有里程计 -> gmapping;没有里程计但雷达好 -> Hector;要回环、要大图、机器管够 -> Cartographer。


三、滤波 vs 图优化:一张图看懂代差

1
2
3
4
5
6
7
8
9
10
flowchart TD
subgraph F["滤波派 (gmapping): 在线递推"]
A1["t=1 更新"] --> A2["t=2 更新"] --> A3["t=3 更新..."]
A3 -.->|"❌ 历史已定, 不能回头改"| A1
end
subgraph G["图优化派 (Cartographer): 全局优化"]
B1["位姿=节点<br/>约束=边"] --> B2["发现回环: '节点A=节点Z'<br/>加一条边"] --> B3["整体重优化<br/>✅ 全图误差摊平"]
end
style F fill:#fef7e0,stroke:#b06000
style G fill:#e6f4ea,stroke:#188038

类比(第 1 篇的延续):滤波派 = 边走边记日记不修改;图优化派 = 写完通读全书、修正所有矛盾


四、进阶学习路线(从这里出发)

1
2
3
4
5
6
flowchart LR
NOW["📍 你在这里<br/>gmapping 入门完成"] --> A["同代吃透<br/>Hector(高斯牛顿扫描匹配)<br/>Karto(图优化入门)"]
A --> B["现代主流<br/>Cartographer(submap/回环/分支定界)"]
B --> C["3D 时代<br/>LOAM系/LeGO-LOAM/LIO-SAM<br/>(激光里程计+IMU紧耦合)"]
B --> D["多传感器融合<br/>EKF/ESIKF 融合轮速+IMU+激光"]
style NOW fill:#e8f0fe,stroke:#1a73e8
里程碑 学什么 承接本系列哪块
Hector 纯扫描匹配的极限 5 §扫描匹配
Karto 图优化最小入门 9 §三 的对照面
Cartographer 回环检测/子图/工程化 全部
LIO 系 3D + IMU 紧耦合 2 传感器融合的延伸

五、系列总结:九篇一张图

1
2
3
4
5
6
7
8
9
10
11
12
flowchart TD
N0["0️⃣ 概率/贝叶斯/链式法则"] --> N1["1️⃣ SLAM=鸡生蛋, 门派地图"]
N1 --> N2["2️⃣ 激光/里程计/栅格地图/TF"]
N2 --> N3["3️⃣ 粒子滤波: 撒-打分-淘汰, Neff"]
N3 --> N4["4️⃣ RBPF: 拆成 定位(采样)+建图(解析)"]
N4 --> N5["5️⃣ 两大改进: 提议分布+自适应重采样"]
N5 --> N6["6️⃣ 源码: processScan 逐行对号"]
N5 --> N7["7️⃣ 实战调参"]
N6 --> N8["8️⃣ 迷你实现 200 行"]
N7 & N8 --> N9["9️⃣ 局限与进阶路线"]
style N5 fill:#fef7e0,stroke:#b06000
style N9 fill:#e6f4ea,stroke:#188038

最终一句话:gmapping = 链式法则拆解(RBPF)+ 扫描匹配增强的提议分布 + Neff 自适应重采样 + 地图树省内存。理解了它,你就理解了整个粒子滤波 SLAM 时代的思想与黄昏。

📚 参考:原理分析(优缺点/内存账/与 Cartographer 对比,本文主要依据)、源代码解析(滤波 vs 图优化分类)