我第一次把激光雷达的数据接到可视化窗口里时,看到的是一团混乱的散点。雷达转了一圈,屏幕上出现了几百个点,有的在房间里,有的甚至穿过了墙壁——那一刻我才意识到,一个能输出距离的传感器,和一整套能回答“我在哪”“周围长什么样”的系统之间,隔着整整一个领域。这个领域就是激光SLAM。
激光SLAM这几年几乎是机器人从业者的必修课:扫地机器人靠它建图导航,仓储AGV靠它在货架间穿行,自动驾驶车辆拐进地库时也离不开它。它解决的是机器人最原始也最要命的问题:在没有GPS、对周围环境一无所知的情况下,能不能靠自己的传感器,一边走路一边画地图,并且在地图上找到自己。这篇笔记是这个系列的第一篇,不深入公式,不讲工程细节,先把“激光SLAM到底是什么、它分几块、为什么这么难、入门应该走哪条路”讲透。适合刚接触机器人和SLAM的学生、准备转行做定位算法的工程师,以及那些手里有雷达却不知道下一步该干什么的朋友。
1. 为什么是“激光SLAM”,先搞清楚它到底在解决什么问题
1.1 一个快递机器人把自己弄丢的故事
想象一个快递机器人,被推进一栋从未见过的写字楼。楼层结构未知,走廊宽度未知,货架位置未知,连它自己是从哪个门进来的都说不清。它只有一个大脑、一组轮子、一个可以测距离的激光雷达。如果它想知道自己走到哪了,最简单的方法是数轮子转了多少圈——但轮子会打滑,地面有接缝,转几圈之后,“我大概走了8米”可能实际上是7.3米。如果它想靠墙上的文字分辨位置,激光雷达只能看到距离,看不懂任何文字。唯一可靠的信息就是:我能测出周围物体离我多远,并且每隔一小段时间就测一次。问题来了:两次测量之间,我移动了多少?这些测量值拼在一起,应该长成什么形状?
通俗地说,SLAM要同时回答两个问题:第一个是“定位”——我在哪里;第二个是“建图”——周围是什么样。但这两个问题谁都不能独立先回答:你要知道自己在哪,得先有一张地图;你要建一张地图,得先知道自己每一步在哪。这就是经典的“鸡生蛋、蛋生鸡”难题,也是SLAM翻译成“同步定位与建图”而不是简单“地图构建”的原因。
1.2 使用一套数学语言描述这件事
用数学一点的说法,SLAM是在给定传感器观测序列的前提下,估计机器人每个时刻的位姿(位置加朝向)和环境中路标的位置。位姿通常用三维向量表示,在二维平面里是横坐标、纵坐标再加一个航向角。地图可以是稀疏的(几十个特征点),也可以是稠密的(成百上千万个点组成的点云)。激光SLAM因为传感器直接给出大量距离测量点,做出来的地图通常是稠密的,这也是激光方案在直观感上比视觉方案更“实在”的原因——你看到的图就是环境的真实几何轮廓。
大多数经典SLAM框架把问题建模成概率估计:我有一堆已知和未知的量,已知量是观测数据、控制数据,未知量是连续时间内机器人的轨迹和地图。框架要做的是寻找一组最可能的未知量,使得“已知这些轨迹,观测到的数据最有可能出现”。听起来很复杂,但本质上就是贝叶斯推断,落到工程上,常用的两套工具分别是滤波器和图优化。滤波器更适合小场景、算力受限的嵌入式设备;图优化则在现代系统里成为主流,因为它能把历史上所有关键位姿都放在一张图里一起优化,精度更高。
1.3 入门笔记为什么要分篇写
SLAM这个学科被切成了很多块:数据预处理、前端配准、后端优化、回环检测、建图,再到工程部署。刚接触的人常犯的毛病是“一上来就跑开源框架,对着Launch文件改半天,图出来了,却完全说不清楚哪一步干了什么”。所以这个系列打算顺着一条学习者路线慢慢拆,每一篇专注一个环节。第一篇只解决“全景和框架”,之后会依次补上“坐标变换与点云预处理”“前端配准到底在配什么”“图优化是怎么把误差摊平的”“回环检测为什么能让地图不重影”这些具体主题。
2. 激光SLAM的信息链路:从一帧点云到一张地图
2.1 雷达到底给出了什么
激光雷达的核心原理不复杂:发射一束激光,打到物体表面反射回来,通过计算光往返时间,就能得到距离;再结合激光发射的角度,就能算出物体在雷达坐标系下的位置。一帧数据包含几百到几十万个点,每个点都是“某方向上有一个障碍物,离我这么远”。把一帧点画出来,就能大致看到走廊、墙壁、货架的轮廓。
但雷达原始输出不能直接用于建图,有两个头疼的问题。第一是运动畸变:雷达扫完一圈需要时间,比如单线雷达转一圈可能是50毫秒,这50毫秒里机器人已经往前走了几厘米。如果你把这50毫秒内所有点都当成是“在同一时刻”测到的,建出来的墙壁就会带一条歪斜的尾巴。第二是噪声和杂点:玻璃会透光,反光地板会把一条光束打成两个点,灰尘和飘落的塑料袋也会产生离群点。因此,每套SLAM的第一步几乎都是预处理——去畸变、滤波、剔除异常点,把“脏”数据清洗成可用的几何信息。
2.2 前端配准:走一步看一步
有了干净的点云,接下来要回答的是“这一帧和上一帧之间,我动了多少”。这就是前端里程计,也叫配准。做法是拿两帧点云去对齐:上一帧点云里的某个墙边拐角,在下一帧里应该还存在于附近,只是整体平移和旋转了一点。通过寻找最优旋转和平移,让两帧点云在几何上尽可能吻合,你就能推出这两帧之间的相对位姿变化。
常见的经典算法包括迭代最近点(ICP)和正态分布变换(NDT)。ICP的思路很直觉:先猜一个变换,把两帧点云放到一起,然后为每个点找最近邻点,计算误差,迭代调整变换直到误差收敛。NDT的做法稍微绕一点:把一帧点云用一个个体素网格内的正态分布来描述,然后用优化的方式求变换。在实际工程里,直接做帧间配准会有累积误差——每一步都有微小偏差,走10米之后偏差叠加可能就到了半米量级。所以现代系统普遍采用“帧到子图”的配准思路,把当前帧和已经建好的局部地图对齐,而不是只和上一帧对齐,累积漂移被大大抑制。
2.3 后端优化:把账本重新算一遍
光有前端,机器人确实能在短时间内保持较高局部精度,但时间一长,误差会像滚雪球一样越来越大。这时需要后端,它的职责是“全局记账”:把历史上所有经典位姿当作节点,把每两次位姿之间的相对约束当作边,最终构建出一张位姿图(Pose Graph)。某两个节点之间如果有约束,就要求它们在图形上看起来一致;如果存在矛盾——比如你已经走了一圈,回到了出发点附近,却发现轨迹在图上没有闭合——后端就要调整所有节点的位置,设法让矛盾最小化。
最简单的理解是:你手里有一根橡皮筋,上面串了几十个珠子,按顺序摆在桌面上,每个珠子之间的弹簧长度已经大致知道,但摆到最后发现首尾对不上。你需要小幅移动所有珠子,让整个弹簧系统达到受力平衡。图优化做的就是这件事,只是约束不是线性的,要用迭代的非线性优化方法求解。现代激光SLAM里,回环检测结果也会作为强约束加入后端,一旦检测到“我回到了之前来过的地方”,优化器就会把所有位姿拉回正确的相对位置上,地图不再重影。
2.4 回环检测和建图,最后两环
回环检测解决的是一个看似简单、实则非常难的问题:机器人兜一圈回到原点附近时,它自己能不能意识到“我回到这了”?如果意识不到,前端和后端会继续把进来的走廊当成新走廊,地图在同一个物理位置出现双重墙面,这就是地图重影。激光SLAM做回环检测通常靠的是“scan-to-map匹配的分数”——当前帧和过去某个位置的局部地图匹配程度非常高,就认为形成了回环。视觉SLAM里常提到的词袋模型在激光方案里用得少一些,因为激光点云缺少描述子信息,但这几年也有不少融合雷达强度信息做重定位的方案。
最后是建图。前端的精配准固然重要,但最终地图的质量取决于所有位姿的整体一致性。通常流程是:用后端优化后的位姿,把每帧点云变换到世界坐标系下,进行拼接融合。这里还要处理“同一个物体被看到多次”的问题——两面墙你路过两次,两帧点云在同一个地方各有一坨点,需要靠栅格占用地图或TSDF等方式做融合,否则点云又会重叠成雾状。二维方案里最常用的是栅格地图,每个栅格记录“被占据概率”;三维方案则常用体素地图或八叉树地图,便于后续导航避障。
3. 激光SLAM和视觉SLAM的分工:为什么入门先选激光
3.1 传感器信息形态差在哪
视觉SLAM使用摄像头图像,图像本质上是像素颜色矩阵,它和激光点云最大的区别在于:图像里没有直接的距离信息。一台单目相机拍到的画面里,你能看到桌子比椅子高,却不知道桌子离你究竟是2米还是3米;双目相机可以通过左右视图视差推算出深度,但也受基线长度和纹理丰富度影响;RGB-D相机倒是能给每个像素一个深度值,但在室外强光下表现会崩。激光雷达则是直接把距离写进数据里:点云里每一个点都自带三维坐标,不需要额外推测。
这个差异决定了两种方案的信息处理逻辑完全不同。视觉SLAM要先从图像里找到可追踪的特征点,再通过多帧之间的几何关系恢复相机运动,一旦场景里缺少纹理(一面白墙、一条无特征的走廊),视觉前端立刻会找不到足够多的特征点。激光SLAM面对白墙反而很高兴,因为墙就是最标准的几何特征。所以在这类“结构性很强、纹理稀疏”的室内场景里,激光方案底气明显更足。
3.2 视觉方案的优势和它的代价
视觉SLAM不是没有优势:摄像头极其便宜,一个工业相机几百块钱;图像信息里有颜色、纹理、文字甚至语义信息,能帮机器人理解“这是一扇门”或“这是一张桌子”;在结构比较放松的环境里,视觉建图的效果可以非常精细。此外,视觉对动态物体的区分能力强于纯几何激光:彩色图像能追踪一个移动的人,而点云里它只是“一团会移动的点”。
但视觉方案的代价也很直观。首先是光照和环境变化:同一个走廊,白天和晚上拍摄到的图像差异极大,稍一变化,特征匹配就会崩。这个弱点在仓储物流车夜间作业时尤其致命。其次,视觉的深度估计精度在远距离处断崖式下降,尤其是单目,平移和旋转之间还天然存在尺度模糊问题,需要额外的惯性测量单元(IMU)来拉直尺度。因此,视觉SLAM的调试心智负担明显更高,对入门者来说,跑通容易,跑稳定很难。
3.3 激光方案的短板也要提前知道
激光SLAM也远不是万能药。最现实的问题是成本:多线机械雷达动辄上万,3D激光雷达在自动驾驶场景成本更高,这也是为什么大量消费级机器人都用视觉或劣质2D雷达而不是高端3D雷达。其次,激光点云没有颜色和语义,纯几何点云在动态场景里很难区分“移动的托盘”和“静止的墙”,误匹配一多,地图就会被污染。再次,在长走廊、电梯口、空旷广场这类几何退化环境下,激光SLAM同样会翻车——前后方向的约束在一条笔直走廊里几乎为零,机器人很容易把自己定位到一个对称的另一个位置,地图“打不开”。
入门阶段我始终建议先学激光SLAM。不是因为它比视觉简单很多,而是因为它的输入数据直观、物理意义明确,新手能拿着点云在可视化工具里盯着看,亲眼看到算法每一步在干什么。视觉SLAM的整个流程更像在猜谜,而激光SLAM更像在拼拼图,学习曲线对零基础的人来说友好太多。处理过点云脏数据、理解过几何配准的坑,再回头看视觉方案,你会更容易理解SLAM为什么需要做鲁棒化。
4. 2D还是3D,这是个选择问题
4.1 2D激光SLAM:平面世界里的小而美
2D激光SLAM使用单线雷达,只能扫描一个平面,得到的是二维轮廓线。它天然假设机器人只在一个水平面内运动——轮式机器人、扫地机、仓储AGV大多符合这个假设。一个2D雷达扫一圈,得到一条360度的距离包络,一张栅格地图就足够建出整个屋子的轮廓。这带来两个巨大优势:一是数据量小,单线雷达一秒只产生几千个点,处理器压力低,嵌入式芯片也能跑;二是算法简单,位姿只有三维(x、y和航向角),优化问题规模小,实时性容易保证。
2D方案的经典算法路线发展得很早,也比较成熟。最早一批粒子滤波方案虽然计算重,但思路直白,适合理解SLAM的概率本质;后来Hector、图优化框架这类方案通过匹配局部地图,逐步把精度和速度都提上来了。在实现细节上,2D SLAM通常会利用里程计或IMU作为运动预测初值,再用激光配准精修,这样既快又稳。
4.2 3D激光SLAM:三维空间里的完整建模
3D激光SLAM使用多线或固态面阵雷达,输出的是完整的三维点云。它不限定平面运动,无人机可以爬升、俯仰,机器人可以上下坡,车辆可以过桥梁。三维位姿有六个自由度(位置三个、姿态三个),数据量比2D方案大几十倍到上千倍,因此对实时算法和硬件算力都提出了高得多的要求。
三维方案里前端配准通常直接做3D-3D点云对齐,后端图优化的节点数也会更多,回环检测通常配合重定位一起做。近年来还有个明显的趋势是把惯性数据(IMU)和激光雷达做紧耦合,形成LIO(激光惯性里程计)结构。IMU能在激光退化或帧间剧烈运动时维持姿态估计,激光又能修正IMU的积分漂移,两者配合能显著提升SLAM系统在这类剧烈运动场景下的稳定性,这点在手持扫描和无人机场景里几乎成了标配。
4.3 选型不是越高越好,够用才最优
很多新手容易掉进“3D更强、更高级”的思维,一上来就要上多线雷达。但实际场景是:两台扫地机对接,2D SLAM完全足够;反之,你要做一个室外巡检无人机,单线雷达根本不够用。选型应该从平面约束和需求出发:
| 维度 | 2D激光SLAM | 3D激光SLAM |
|---|---|---|
| 传感器类型 | 单线雷达(室内导航型) | 多线机械雷达、混合固态雷达 |
| 位姿维度 | 3自由度(x, y, 航向角) | 6自由度(位置+姿态) |
| 数据量与算力要求 | 低,嵌入式可实时 | 高,通常需要GPU或高性能CPU |
| 典型场景 | 清扫机器人、室内AGV、服务机器人 | 自动驾驶、无人机、工程测绘、复杂巡检 |
| 主要难点 | 动态人物、对称环境退化 | 配准计算量大、点云畸变、成本高 |
| 入门友好度 | 高,迭代快、容易调 | 中到高,除算法外还要懂传感器和标定 |
当你同时拥有“场景是否平面”和“成本预算”两把尺子,选择题其实不难。入门阶段甚至可以直接从已有的2D硬件和开源框架开始,先把整个流程跑熟,再用仿真3D数据接触三维方案。我就是这么过来的:2D方案帮我建立了完整的SLAM心智模型,等到换3D传感器时,大多数概念都可以平移,只是数学形式和数据规模变大了。
5. 经典工具链:我建议新手从哪条路线开始
5.1 先跑通一个最小闭环
无论用什么硬件、什么框架,入门的第一目标永远是用真实数据或官方数据集跑通一个最小闭环:读取数据、驱动SLAM、输出轨迹、生成地图、最后可视化。先别急着调算法,先把各个环节的名字和边界搞清楚。我的建议是选一个最常见的2D开源方案,配一个开源的2D室内数据集,跑一遍看地图生成过程;再打开可视化工具,盯着雷达数据和地图随机器人在走廊里前进而生长,这一步对建立直觉帮助极大。
2D方案里,经典粒子滤波方案适合理解“预测-更新”的概率流程;现代图优化方案则更符合实际工程方向。对于纯入门,先用简单方案跑通再换现代方案,会顺利很多。可视化方面,主流机器人开发环境自带可视化工具,能看到关键帧、轨迹、子图和地图,别关掉它硬啃日志。
5.2 然后在自己的雷达上复现一遍
跑通仿真之后,强烈建议把代码接到自己的雷达上。真奇怪,仿真里一切正常,一换真实传感器,问题立刻冒出来:点云里有噪声、ROI里多了行人、室内回环失败、墙壁依然歪的。这时候你才会被迫处理标定、时延、过滤参数和运动畸变补偿。从“能出地图”到“地图准”之间,隔着一个车轮十年的调参经验,但这一步没人能替你走。
最稳妥的做法是:先固定雷达,在干净小房间里试,逐一对齐传感器坐标系;再用遥控器或手推小车缓慢走动,观察前端里程计是否和实际轨迹一致;最后检查回环发生前后地图是否重合。每一步都存一个日志片段,方便后续复盘对比。
5.3 数据集和仿真环境的补充
没有雷达也别急,公开数据集是救命稻草。室内2D数据集、室内外3D数据集都可以配合开源方案直接运行。这类数据集通常同时包含激光数据、里程计真值和IMU数据,能让你精确对比自己的结果和标准答案的误差。进阶一点还可以上仿真平台,在虚拟环境里建模复杂场景,自由制造回环、退化长廊、动态遮挡这些极端情况,比纯跑官方数据更能锻炼排查能力。
唯一要注意的是,仿真数据过于干净,跑通不算能力;一旦你换了真传感器,前面说的各种幺蛾子都会来。所以我的顺序建议永远是:先官方数据建立信心,再真机数据接受毒打,最后再回到仿真里做压力测试。
6. 评价一个SLAM系统好不好的四个维度
6.1 精度:看轨迹,也看地图
精度的最直接体现是估计轨迹和真实轨迹之间的误差。评测时通常有两种指标:绝对轨迹误差(ATE),衡量的是整体轨迹和真值之间差多少,回环能力对ATE影响极大;相对位姿误差(RPE),衡量的是每走一小段路程后的局部一致性,前端里程计的稳定性直接反映在这里。真值获取方式在室内常用高精度动作捕捉系统,室外则常用高精度定位系统,没有真值也可以靠回环闭合后地图的重合度粗略判断。
除了数值指标,经验之谈是直接用眼睛看地图:一面墙应该是直线,墙角应该是直角,同一个位置扫两次不能出现重影。很多高精度指标漂亮的地图,眼观却有重影,说明轨迹局部精度尚可、全局一致性欠佳。做SLAM千万别光学理论,要练出一双“看图的毒眼”,这本身就是入门第一课。
6.2 鲁棒性:不挑场地才算合格
一套SLAM系统如果只在一个装修简单的房间跑得稳定,不能说明任何问题。搬到复杂的仓库、金属网墙、玻璃幕墙、低纹理的大厅,系统还能不能撑住?鲁棒性考察的是系统在退化环境和异常数据下的表现。常见的鲁棒性问题包括:快速旋转时点云畸变过大导致配准发散;走廊中前后约束弱导致位姿漂移;动态行人挡住雷达,导致前端匹配到错误几何上;以及回环误检——明明不在同一个地方,却因为几何太相似被判成回环,地图会被彻底拉坏。
提升鲁棒性没有一招鲜。常见的工程手段包括:加入IMU约束;使用更鲁棒的匹配打分函数;限制最大匹配距离和范围;维护一个局部子图缓存,避免远点误匹配;必要时使用多重假设验证回环候选。这一块最能体现经验和功底,也是后期技术水平拉差距的地方。
6.3 实时性:能跑多次刷新才实用
机器人是实时系统,算法必须在传感器数据到达的间隔内算完。2D雷达常见在10Hz到40Hz,3D雷达常见在10Hz,有些固态雷达还能更高。如果SLAM计算时间超过数据帧间隔,数据就会排队变旧,地图和轨迹都会变得延迟、滞后。
工程上评估实时性有三件事:单帧平均处理时间、最大处理时间(最差情况)、以及CPU占用率。很多框架在官方数据上跑得很快,但一到录制的复杂数据就偶尔卡顿,就是最大处理时间超了。调优方向通常是降低点云分辨率、简化优化次数、把非关键帧降频、给优化器加超时上限。
6.4 资源占用:给嵌入式设备留条活路
最后,SLAM最终要部署到机器人本体。机器人的主控可能是汽车级平台,也可能是几十块钱的MCU加低端CPU。资源占用指标包括CPU占用、内存、IO带宽和电池功耗。在做选型时,90%的系统不是死在算法精度,而是死在算力瓶颈上。2D SLAM在主流ARM处理器上通常能跑,但要保证不会和导航模块抢CPU导致卡死,需要合理分线程和限频。3D SLAM则往往要评估是否上GPU加速。
提示:入门阶段不要把资源占用当第一考虑,先把精度和鲁棒性弄懂。但心里要记住这条约束线,否则后面做产品化时会被现实狠狠教育。
7. 写在系列开头的一些实话
最后聊几句实在话。激光SLAM这个领域,入门最焦虑的往往不是“技术难”,而是“东西太多不知道先学哪个”。有人一上来就啃优化库源码,盯着一堆雅可比矩阵发呆;也有人疯狂跑开源框架,跑来跑去只学会了“改参数”。我自己的体会是:先建立整个系统的地图,再锁定一个环节往下钻。看框架代码时,先顺着数据流走一遍,画出每个模块的输入输出,再深挖算法数学原理,效果会比从底层逐步往上层拼好得多。
还有一件常被忽视的事:SLAM不是纯算法问题,它是传感器、机械、计算机组成原理、数学优化交织的工程问题。你调不通的一个回环,很可能是雷达安装角度歪了2度;你抱怨的一个定位跳变,很可能是底盘打滑被里程计报出了一个不可信的运动更新。很多“算法不好使”的案例,到最后都是“细节没伺候好”。如果这篇概述能让你在入门之初就记住“SLAM是系统,不是单一算法”,这个系列就没白写。
下一篇我打算写坐标变换和点云预处理。那块内容看着基础,坑却比想象中多,值得单独拆开讲透。