第236篇 SLAM概述——同步定位与建图到底在解决什么问题
上一篇我们聊完了运动规划算法的实测对比。规划做得再好,机器人不知道自己在哪、周围环境长什么样,一切都是白搭。这就引出了机器人领域最核心的问题之一——SLAM。
SLAM,全称Simultaneous Localization and Mapping,中文叫"同步定位与建图"。说白了就是一件事:机器人到了一个完全陌生的地方,它得一边搞清楚"我在哪",一边画出一张"这里长什么样"的地图。这两个问题互相依赖——你不知道自己在哪,就画不准地图;你没有地图,又没法精确定位。
听起来像个鸡生蛋蛋生鸡的死循环,但前辈们硬是把这个问题给解了。这篇文章带你理清SLAM的全貌,搞清楚它到底在解决什么问题、有哪些技术路线、面试时该怎么聊。
一个直觉:蒙眼走路的人类版本
想象你被蒙上眼睛空投到一个陌生的商场里。你看不见,但每走一步你能感觉到自己移动了多远(里程计),同时你能摸到周围的墙壁、柱子(传感器观测)。
你的大脑在做两件事:根据脚步的感觉估算自己走到了哪里(定位),根据摸到的墙壁和柱子在脑子里构建商场的布局(建图)。而且这两件事是互相校正的——当你摸到一根之前摸过的柱子,你立刻就知道"哦,我回到刚才那个位置了",然后修正之前可能走偏的估计。
这就是SLAM在做的事。里程计会累积误差(你走路会偏),传感器观测有噪声(你摸墙壁的感觉不完全准),但两者结合起来就能得到一个比单独用任何一个都准的结果。
SLAM的数学本质
用数学语言描述,SLAM要解的是两个东西:
- 机器人的运动轨迹 x₀, x₁, x₂, ..., xₙ(每个时刻的位姿)
- 环境地图 m(路标点的位置或者环境的几何表示)
已知的是传感器的观测数据 z(比如相机拍到的图像、激光雷达扫到的点云)和机器人的控制输入 u(比如轮子的转速)。
运动方程描述机器人怎么动的:xₖ = f(xₖ₋₁, uₖ) + 噪声 观测方程描述机器人看到了什么:zₖ = h(xₖ, m) + 噪声
SLAM的目标就是从一堆u和z里面,反推出x和m。这是一个"逆向问题"——正向很容易(已知位置和地图算观测),逆向很难。
为什么难?因为状态空间的维度太高了。假设机器人在三维空间运动,每个位姿有6个自由度(3个平移+3个旋转),地图里有1000个路标点,每个路标点3个坐标。那一共有 6×N + 3×1000 个未知数需要求解。而每次观测只能提供很少的约束。这是一个严重欠定的问题,需要大量的观测数据才能收敛。
用Python简单表示一下这个过程:
# SLAM的核心循环
for k in range(num_steps):
x[k] = predict(x[k-1], u[k]) # 运动模型预测
z[k] = observe(x[k], m) # 观测模型
x[k], m = update(x[k], m, z[k]) # 用观测修正估计
这个predict-observe-update的循环,就是所有SLAM算法的骨架。区别只在于每一步用什么数学工具来实现。
两大技术路线:滤波vs优化
SLAM的发展历史上有两条主线。
早期用滤波,核心思想是递推估计。每个时刻来了新数据,就在之前的估计基础上更新一下。代表算法是EKF-SLAM,用扩展卡尔曼滤波来处理SLAM的非线性问题。滤波方法的优点是实时性好、理论优雅,缺点是处理大规模地图时计算量爆炸——因为地图里每个路标点都要维护和其他所有路标点的协方差,复杂度是O(n²)。
后来优化方法崛起了。核心思想是把SLAM看成一个优化问题:找到一组位姿和地图,使得所有观测误差的总和最小。代表框架是g2o和GTSAM。优化方法的优点是能处理大规模问题、精度更高,缺点是计算量大、不容易实时跑。
现在主流的方案是两者结合:前端用轻量级的方法(比如PnP、ICP)快速估计位姿,后端用优化或者滤波来做全局一致性。这个前后端分离的架构,几乎所有现代SLAM系统都在用。
传感器的选择
SLAM可以用不同的传感器,这决定了系统的特性。
视觉SLAM用相机,便宜、信息丰富,但受光照影响大,计算量也不小。相机分单目和双目(包括RGB-D)。单目相机便宜但有个致命问题——尺度不确定性,你没法从一张照片里判断物体的真实大小。双目或RGB-D相机能解决这个问题,但硬件成本更高。
激光SLAM用激光雷达,精度高、不受光照影响,但设备贵、信息量少(没有纹理颜色)。激光雷达分2D和3D。2D激光便宜但只能扫一个平面,3D激光信息丰富但价格劝退很多人。
惯性SLAM用IMU(惯性测量单元),频率高、不受环境影响,但漂移严重,单独用根本不行。所以IMU通常和其他传感器融合使用,比如视觉+IMU(VIO)或者激光+IMU。
多传感器融合是现在的趋势。视觉提供丰富的特征点,激光提供精确的距离信息,IMU提供高频的运动的约束。三者互补,效果远好于单一传感器。
面试中怎么聊SLAM
面试官问SLAM,通常想听你说清楚三件事:
第一,SLAM在解决什么问题。不是背定义,而是用通俗的话解释"定位和建图的耦合"。你能把鸡生蛋蛋生鸡的比喻讲清楚,就说明你真的理解了。
第二,SLAM的技术框架。前端后端分离、回环检测这三个模块各自在干什么。前端负责实时估计位姿,后端负责全局优化消除累积误差,回环检测负责发现"我回到原来的地方了"。
第三,你对具体系统的了解。ORB-SLAM、VINS-Mono、Cartographer这些经典系统,你至少得深入看过一个。面试官会追问细节,比如ORB-SLAM的三个线程分别在干什么、VINS-Mono的紧耦合是怎么实现的。
别贪多。把一个系统吃透,比泛泛地聊十个系统强得多。
SLAM的典型应用场景
SLAM不是实验室里的玩具,它已经落地到了很多真实场景。
自动驾驶是最典型的应用。车辆在陌生道路上行驶,需要实时知道自己的精确位置(定位),同时构建周围环境的三维模型(建图)。高精地图就是靠SLAM跑出来的。
无人机巡检也离不开SLAM。电力巡检、管道巡检,无人机要在GPS信号弱甚至没有的环境里自主飞行,必须靠SLAM来定位和避障。
服务机器人,比如扫地机器人、酒店送餐机器人,它们需要在室内环境中导航。扫地机器人用的就是2D激光SLAM或者视觉SLAM,在家庭的复杂环境里建图、规划路径。
AR/VR领域也在用SLAM。你戴上AR眼镜,设备需要实时理解你的位置和周围环境,才能把虚拟物体准确地叠加到真实世界里。手机上的AR功能(比如AR测量)底层就是视觉SLAM。
仓储物流的AGV(自动导引车)也是SLAM的重要应用。以前AGV靠地面上的磁条导航,现在越来越多的方案改用激光SLAM,不需要铺设磁条,柔性更强。
面试追问准备
面试官听完你的SLAM概述之后,通常会追问几个问题:
"视觉SLAM和激光SLAM你更推荐哪个?" 没有绝对答案,看场景。室内结构化环境激光SLAM更稳定,室外或者需要语义信息的场景视觉SLAM更合适。最好的方案是多传感器融合。
"SLAM的累积误差怎么解决?" 靠回环检测。当机器人回到之前经过的地方,识别出来之后做全局优化,把累积误差消除掉。
"SLAM初始化需要注意什么?" 单目视觉SLAM的初始化特别关键,需要足够的视差才能三角化出路标点。如果机器人原地转圈或者看的是白墙,初始化就会失败。
学习路线建议
如果你刚开始学SLAM,建议按这个顺序来:先把线性代数和概率论的基础打牢(特别是变换矩阵、贝叶斯估计),然后学视觉SLAM的前端(特征提取、对极几何、PnP),再学后端优化(BA、g2o),最后挑一个经典系统(推荐ORB-SLAM2)读源码。
高翔的《视觉SLAM十四讲》是入门首选,讲得清楚、代码齐全。看完之后再去读论文和源码,效率会高很多。
英文好的话推荐看Cyrill Stachniss的YouTube课程,讲得特别直观。论文方面,ORB-SLAM2和VINS-Mono的论文是必读的,不管你做不做这个方向,面试大概率会问到。
SLAM是个门槛高但天花板也高的领域。入门难,但一旦入门了,你的竞争力会比只会调ROS的工程师强不少。
SLAM这个系列我们会用30篇文章的篇幅,从数学基础到经典系统,从前端到后端,从激光到视觉,把面试中会问到的SLAM知识点全部覆盖。
上一篇:第235篇 运动规划算法实测对比
下一篇我们先来聊SLAM的数学基础——概率论与贝叶斯估计
这是理解所有SLAM算法的底层逻辑。
如果这篇文章对你有帮助,欢迎点赞支持一下,你的鼓励是我持续更新的动力!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)