SLAM 是 Simultaneous Localization and Mapping 的缩写,中文一般叫同步定位与建图。它要解决的核心问题非常直白:一辆车、一台机器人或一部手机,在没有外部信标的未知环境里移动时,如何一边估计自己的位置,一边构建环境地图。无人驾驶场景里,GPS 到隧道和高架桥下会失效,惯性测量单元会随时间累积漂移,激光雷达和相机又各有短板。SLAM 就是把多种传感器信息组织成完整闭环,让定位和建图互相约束,最终输出高精度位姿和地图。
很多人刚开始学 SLAM 时,会被一堆术语冲昏头:坐标系、旋转矩阵、四元数、卡尔曼滤波、粒子滤波、图优化、因子图、滑动窗口、回环检测、视觉SLAM、激光SLAM、激光视觉融合。这些词单独看都不难,真正难的是理解它们在整条链路里的位置,以及它们之间是替代关系还是协作关系。我见过不少同学一上来就找论文,或者直接下载开源项目刷 Demo,最后卡在坐标系变换、残差构建和优化求解上,反而误以为自己不适合做算法。
这篇内容更适合当一份“拆解路线图”。我会按实际学习的顺序来组织:先讲 SLAM 到底解决什么问题,再讲坐标系和数学基础,然后对比滤波和图优化两条技术路线,接着拆激光 SLAM、视觉 SLAM、激光视觉融合三种形态,最后补学习路径、工具准备和真实项目中容易踩的坑。标题里说“一次打通”,更准确的理解是:把知识脉络一次打通,而不是把所有公式和工程细节一天背完。
1. 先搞清楚SLAM在无人驾驶里到底解决什么问题
1.1 SLAM不是单一算法,而是一条状态估计链路
SLAM 拆开看是同步定位与建图。定位,是回答“我在哪里”;建图,是回答“周围长什么样”。这两个问题不能独立求解,因为地图需要依赖准确的机器人位置才能构建,而位置又需要依赖地图上的特征来估计。
所以 SLAM 本质上是把运动模型、观测模型、传感器数据、历史轨迹全部放到一个状态估计框架里。系统一边接收新的传感器数据,一边更新当前位姿和地图。整个过程中,误差会不断累积,所以必须引入回环检测:当机器重新回到之前到过的地方时,把历史帧拉进来,用全局约束修正漂移。
无人驾驶对这项技术的需求比普通扫地机器人高得多。扫地机器人只要求地图能避开障碍物,定位误差几十厘米也能接受;但无人车要做车道级导航系统、路径规划和避障,定位误差通常要求在厘米级到十几厘米级。高精地图提供先验,SLAM 提供实时位姿和增量地图更新,两者配合,才能保证车辆在城市峡谷、隧道、地下车库等宽松条件下依然有可用定位。
1.2 传感器各有短板,所以需要多源信息组织起来
只靠 GPS 的车辆定位,在空旷路段还行,一到高架桥下、地下停车场、隧道里,卫星信号被遮挡或反射,精度会掉到连车道都分不清。惯性测量单元能短时间推算位置,但噪声会不断积分成巨大漂移,几分钟不校正,位置就能偏出几十米。
激光雷达能直接测量距离,精度高,点云里有丰富的几何结构;但单帧点云没有颜色,在长走廊、隧道这类结构重复的场景里,容易产生退化,简单说就是前、后、左、右看起来都一样,算法不知道朝哪边走了。相机则能提供纹理和语义信息,但单目相机缺乏尺度,深度需要从多帧之间估计,而且对光照极其敏感,夜间大灯直射时特征点会大面积丢失。
SLAM 的价值就在于不要把任何一种传感器当万能解。它通过运动模型和观测模型把不同传感器优势组合起来:激光给深度约束,相机给视觉特征,惯性单元给短时运动先验,轮速计或 GPS 在对应环境下提供辅助观测。这是整套系统能稳定运行的底层原因。
1.3 一套完整定位建图系统的模块组成
如果你去拆一个成熟的 SLAM 系统,会发现核心模块包括几个部分:
- 前端里程计:接收连续帧数据,估计相邻帧之间的相对运动。
- 后端优化:把历史位姿和地图点放进同一优化框架,控制累积漂移。
- 回环检测:识别“当前位置是否曾经到过”,触发全局修正。
- 建图模块:把优化后的位姿与观测数据融合,生成占据栅格地图、点云地图或语义地图。
后面要讲的滤波、图优化,主要落在后端优化;激光视觉融合,主要解决前端里程计和观测模型的问题;坐标系和标定则贯穿所有模块,因为不同传感器的数据必须变换到同一坐标系下才能融合。
理解模块之间的分工很重要。很多人调试时发现定位漂移,第一反应是换算法,但实际上问题可能出在前端特征匹配,也可能出在后端优化频率,还可能出在回环检测阈值,得按模块逐层定位。
2. 坐标系变换和数学基础,决定代码能看懂多少
2.1 四类坐标系:世界系、车体系、传感器系、像素系
SLAM 里最容易乱的是坐标系。一辆无人车上有多种传感器,每个传感器都有自己的坐标原点。要融合它们的数据,必须先把所有观测变换到统一坐标下。
通常涉及四类坐标系:
世界坐标系是整个场景的参考系,可以是第一帧相机或雷达的位置,也可以是 GPS 经纬度投影到平面后的位置。世界系是固定的,所有最终位姿和地图都建立在这个系上。
车体坐标系一般固定在建图平台或车辆底盘中心,也叫 body 系或 IMU 系。车辆运动模型、惯性测量单元输出的加速度和角速度,通常在这个系下表达。
传感器坐标系是激光雷达、相机各自的局部系。以车辆前方的相机为例,相机坐标系原点在光心,Z 轴指向镜头前方,点云里的距离和反射强度都相对于这个系描述。
图像像素坐标系不是物理单位,而是像素行、列坐标。它面向二维图像,任何 3D 空间点投到图像上后,都落在像素坐标系里。
从世界系到像素系,要经历“世界系→车体系→传感器系→图像系”的层层变换。每一层之间都有外参或内参矩阵,SLAM 初始化、融合、可视化都依赖这些变换不写错。
2.2 旋转矩阵、四元数、欧拉角、李代数怎么选
表达物体朝向的方式有四种常见选择。
旋转矩阵是 3×3 的矩阵,直观,但九个元素只有三个自由度,直接优化会受到额外约束,处理起来很麻烦。
欧拉角就是绕固定轴依次旋转的三个角度,比如 roll、pitch、yaw。大多数无人机和车辆系统的控制层面用欧拉角,因为它直观。但它存在万向锁问题:当某个中间旋转角等于 90 度时,两个旋转轴重合,自由度丢失,插值和优化都会有奇异。
四元数用四个分量表达旋转,紧凑且无奇异,适合做插值和状态更新。现代 SLAM 的状态变量通常保存旋转为四元数,输出给上层再转成欧拉角。
李代数是一种更底层的数学表达,把旋转矩阵或变换矩阵映射到无约束向量空间,这样优化问题就能直接用常规的最小二乘求解器处理。你看到很多开源代码里出现Sophus::SE3d或ceres::SE3,本质就是把位姿变换放到李代数上做优化,避免在旋转矩阵上直接加扰动带来的约束问题。
对初学者来说,不需要把所有李群李代数推导都背下来,但至少要理解:旋转矩阵适合直观理解,四元数适合状态存储和插值,李代数适合优化求解。三者之间是可互相转换的,代码里最常见的问题反而是欧拉角转旋转矩阵时顺序写错。
2.3 内参外参和标定为什么绕不开
坐标变换全部依赖内参和外参。
相机内参描述光心、焦距、畸变系数,决定一个三维点如何投影到像素平面。雷达没有内参的问题相对少,但多线雷达各线束之间的安装偏差也需要出厂标定和在线校准。
外参描述传感器与车体或其他传感器之间的相对位置和姿态关系。比如激光雷达坐标系在车体坐标系的哪个位置、朝向什么方向;相机坐标系相对雷达坐标系偏移多少。外参如果差几厘米,融合后的点云投影可能错开一大片;外参如果错了几度,远距离目标的位置可能直接偏差出车道。
常见的相机标定工具都会要求拍摄标定板多个角度,雷达和相机联合标定则需要采集包含特定标定物的数据。这个步骤不能跳过。我见过不少初学者直接在开源 SLAM 工程里套用别人的默认外参,结果点云和图像投影总是对不齐,最后查了半天才发现是标定文件没有生成。
3. 滤波和图优化:两种状态估计主线,适用场景完全不同
3.1 滤波法:卡尔曼、扩展卡尔曼、粒子滤波的演进逻辑
滤波类方法的核心思路,是“预测 + 更新”。系统先根据运动模型预测下一时刻状态,再用新的观测去校正预测结果,最后给出一个带不确定性的状态估计。
标准卡尔曼滤波是这类方法的基础,适合线性高斯系统。但真实车辆运动是非线性的,状态转移和观测模型都很难用线性方程表达,所以扩展卡尔曼滤波(EKF)出现:在均值点做一阶泰勒展开,把非线性问题近似成线性问题。还有无迹卡尔曼滤波(UKF),通过采样点去逼近非线性变换后的分布,精度通常更高。
粒子滤波的思路完全不同:用一堆带权重的随机样本去表示状态分布,不要求高斯假设,能够处理多模态分布。早期的 2D 激光 SLAM 方案里,粒子滤波应用很广,因为它在小场景、低计算资源下有不错的门槛优势。
滤波方法最大的问题在于计算复杂度会随状态维度增长。状态里一旦包含大量路标点,协方差矩阵会迅速膨胀,更新每个观测都要重新计算整个矩阵,实时性很快撑不住。这也是 SLAM 领域逐步转向图优化的原因之一。
3.2 图优化:为什么现代SLAM更喜欢构建图并做最小二乘
图优化不按“预测—更新”的递推方式走,而是把历史上所有待估计的位姿和地图点看作图的节点,把传感器观测看作节点之间的边。边的量就是残差,比如两帧雷达之间估算的相对位姿,或者视觉相机观测到的重投影误差。最终目标是在所有位姿和点确定的约束下,找到一组状态,让所有残差的加权平方和最小。
这样做的好处是,每一次回环检测触发时,可以一次性修正整个历史轨迹,而不是只更新当前状态。滤波方法里历史信息压缩在当前状态中,一旦重新识别到旧地点,旧信息已经无法有效修正。图优化天然适合全局一致性建图。
从工程角度看,图优化还方便扩展。每个节点和边都对应一个清晰的物理含义,你可以在任意位置加入新的事实约束,比如 GPS 位置约束、地面平面约束、回环约束。这也是为什么现代激光 SLAM、视觉 SLAM、融合 SLAM 的后端几乎都朝图优化演进。
3.3 因子图、滑动窗口、BA和回环检测之间的关系
因子图是图优化的一种概率图表达方式。图中的变量节点是待优化的位姿和路标,因子节点是观测、运动和先验约束。因子图本质上把“后验概率最大化”和数据关联统一起来,很多开源系统直接使用基于因子图的优化框架。
滑动窗口则是一种控制计算规模的策略。真实场景长时间运行,图里的节点和边会越来越多,不做限制大规模优化就会越来越慢。于是系统只保留最近 N 帧位姿和相关的路标,丢弃太旧的信息,但为了不丢失旧约束,会把被边缘化变量的信息转化为先验因子保留下来。你听到的“滑窗优化”,目标就是在实时性和精度之间找一个合适的平衡点。
BA 是 Bundle Adjustment 的缩写,中文叫光束法平差。它同时优化相机位姿和三维路标点,目标是让所有观测点的重投影误差最小。视觉 SLAM 和视觉惯性融合里,BA 几乎是绕不开的核心操作。可以说 BA 是一种具体的图优化实现,回环检测触发后通常也会做一次全局 BA 来收敛全轨迹。
回环检测负责识别“之前来过这里”,一旦确认,就在当前位置和历史位置之间添加一条回环边,后端优化随之把长期累积的漂移拉回来。没有回环检测的系统,即使前端里程计做得再好,长时间运行后也不可能保持全局一致。
3.4 怎么判断该用滤波还是图优化
虽然图优化在现代 SLAM 里占据主流,但滤波并没有被完全淘汰。
对于计算资源非常有限的小型嵌入式平台、仅 2D 平面的简单场景、状态维度很低的任务,滤波方法实现简单,占内存少,依然有实用价值。早期的 2D 激光 SLAM 方案就是典型代表,它不需要构建大规模图结构,在 CPU 资源紧张的机器人底盘上也能跑出可用的定位结果。
对于三维场景、长距离建图、多传感器融合、需要回环全局修正的任务,图优化几乎是必然选择。状态维度一旦上去,图优化在精度和扩展性上都占优。
选型时还要考虑团队技术背景。滤波方法相对容易调通,但后期加传感器、加约束会越来越困难;图优化初始学习曲线更高,可一旦框架搭好,多传感器融合和全局优化都会顺手很多。我第一次做融合方案时,就直接选择基于图优化的后端,降低后期改动成本。
4. 激光SLAM、视觉SLAM、激光视觉融合,三条路线怎么选
4.1 激光SLAM:精度高、距离准,但传感器和场景有限制
激光 SLAM 用激光雷达采集的点云做前端里程计和建图。点云数据是三维空间坐标,距离测量非常精确,不受环境光照影响。所以激光 SLAM 在室内和结构化道路场景下,定位精度通常优于视觉 SLAM。
2D 激光 SLAM 主要面向扫地机器人、巡检机器人这类平面运动设备,输出二维占据栅格地图。学习时从 2D 入手比较合适,因为地图表示直观,后端优化流程简单,更容易把坐标系、位姿、地图三者的关系玩明白。
3D 激光 SLAM 面向车辆、无人机和复杂环境,输出三维点云地图。纯 3D 激光 SLAM 的技术难点包括点云配准、地面分割、运动畸变去除和点云退化检测。在隧道、地下车库、高架桥下这类几何重复区域,单帧点云可能对称、甚至完全相同,算法会陷入“不知道往哪走”的退化问题。这个时候通常需要引入惯性传感器来提供运动先验,补偿激光在退化方向的观测缺失。
激光 SLAM 的主要限制是硬件成本。车规级激光雷达价格仍然远高于摄像头。另一个问题是,点云缺乏语义纹理信息,构建出来的地图对无人车来说,几何够用,但缺乏车道线、路牌等语义标记。
4.2 视觉SLAM:成本低、纹理依赖强,入门路径不同
视觉 SLAM 使用相机作为主要传感器。单目、双目、RGB-D 相机都能做视觉 SLAM,但每种相机面临的挑战不同。
单目相机成本最低,但存在尺度不确定问题。单帧图像无法直接得到真实距离,系统必须靠初始化时估计出的尺度,激光或惯性传感器加入后,尺度问题会被进一步解决。
双目相机通过视差计算深度,带有真实尺度,但基线长度限制了有效深度范围,远距离物体的深度精度明显下降。RGB-D 相机能直接输出深度图,适合室内近距离建图,但室外强光下容易失效,而且深度测量范围有限。
特征点法是视觉 SLAM 最主流的技术路线:提取图像角点或描述子,匹配相邻帧特征,通过三角化生成路标点,再用 BA 优化位姿和地图。直接法则不依赖特征提取和匹配,而是直接最小化图像像素灰度差,在纹理稀疏或计算资源受限时有优势,但光照变化大时容易不稳定。
很多入门路线都会推荐《视觉SLAM十四讲》,这本书的价值不是把公式堆齐全,而是把相机模型、李群李代数、特征匹配、BA、回环检测等模块串成一条从传感器数据到局部地图再到全局优化的完整链路。建议配合书中代码一起跑,不要只看文字和公式,不然很容易出现“看懂了但不理解为什么这么组织”的情况。
4.3 激光视觉融合:雷达给深度,相机给纹理,难点在标定和同步
激光视觉融合的目的是取长补短。激光雷达提供精确深度和几何结构,相机提供密集纹理和颜色信息。融合之后,既能获得高精度三维几何,又能获得可用于语义识别和视觉特征匹配的图像信息。
融合系统最简单的耦合方式是松耦合:激光 SLAM 和视觉 SLAM 各自独立跑,输出位姿和地图后,再用卡尔曼滤波或其他算法做一次状态合并。这种方式实现简单,但两个子系统的误差没有在底层互相校正,精度上限不高。
紧耦合方式则把激光点云、图像特征、惯性数据放进同一个状态方程和优化目标里,误差在底层就统一建模。前端可以先用视觉特征辅助激光点云匹配,后端再把视觉重投影因子和激光配准因子同时加入图优化。紧耦合系统的整体鲁棒性更强,但对计算、标定和传感器同步要求更高。
融合系统里最容易踩的坑是时间同步。雷达点云和图像帧的采集时刻往往不同,系统需要做时间插值或硬同步触发。如果时间戳对不齐,视觉特征匹配到的点云可能来自不同时刻的物体位置,融合出来的结果在动态场景里会发生严重错位。所以做融合时,第一件事不是调算法参数,而是确认各传感器的时钟基准和时间戳质量。
5. 从零入门SLAM的学习顺序和工具准备
5.1 不要直接从论文开始,先把知识框架建立起来
很多新手一开始就下载高影响因子论文,想直接看懂 SOTA 方法。但 SLAM 的论文通常默认你已经掌握状态估计、多视图几何和优化工具,直接硬读效率很低。
更合适的顺序是:先看经典教材或总结性课程,把坐标系、传感器模型、关键帧、后端优化、回环检测这些概念串起来;再跑通一个开源方案,观察真实模块的输入输出;最后带着实际问题去读论文。我第一次看激光 SLAM 论文时完全不知道高频前端和低频建图怎么协作,跑完一个开源项目后再回头读论文,思路一下就顺了。
《视觉SLAM十四讲》是从视觉路线入门的好选择。如果做激光方向更贴近无人驾驶,也可以先看激光 SLAM 相关的博客和课程,理解点云配准、占据栅格地图、前端位姿估计这些概念。
5.2 环境准备:系统、依赖库、示例数据和学习代码
SLAM 实操环境主要涉及几块:操作系统、编译环境、核心依赖库、数据集和开源项目。
操作系统方面,大部分开源 SLAM 项目以 Ubuntu 平台为主,尤其配合 ROS 使用更顺手。Windows 和 macOS 也能跑一部分项目,但如果追求复现效率,建议装一个 Linux 双系统或使用 Docker 容器,避免在环境兼容上浪费时间。
核心依赖库通常包括:用于矩阵运算的 Eigen、用于点云处理的 PCL、用于图像处理的 OpenCV、用于非线性优化的 g2o 或 Ceres、用于因子图和惯性融合的 GTSAM,以及可视化工具。不同项目的依赖版本要求不一样,编译报错时优先看日志,不要盲目升级或降级库版本。
示例数据建议使用开源数据集起步。视觉 SLAM 可以用 TUM、KITTI、EuRoC 这类常见公开数据集,激光 SLAM 可以找 KITTI 或自己录一段室内点云。先拿真实验证过的数据跑通,再考虑在自制数据上测试。
5.3 第一次实践:先跑通最小Demo,再读代码和论文
我第一次跑开源 SLAM 时,一上来就想直接复现完整建图效果,结果编译、数据格式、外参配置连续出问题。后来换了个思路,把首次实践拆成三步。
第一步,只跑离线单段数据,确保程序能启动、能正常读入数据包、能输出轨迹。这一步看的不只是成功运行,还要确认终端里没有关键报错,输出目录有结果文件。
第二步,跑一小段带真值的数据,检查轨迹输出是否符合预期。不要直接跑长距离大数据,否则定位误差累积后,你很难判断是系统问题还是数据本身难度高。
第三步,改一个简单参数,比如特征提取数量或匹配阈值,观察结果变化。这一步能帮你快速理解模块之间的依赖关系。跑通全流程后,再打开源码,按前端、后端、回环、建图的顺序逐模块读。
5.4 一个可以参考的学习节奏
这里给一个比较稳的节奏,适合每天能投入两到三小时的人:
前两周先把课本或课程中的核心概念过一遍,重点理解坐标系变换和状态估计问题建模。中间四周做实践:跑通一个视觉 SLAM 和一个激光 SLAM 开源项目,完成数据准备、编译、运行、结果导出。后面六周切入细节,认真实现一个简单的前端里程计或后端优化模块,不需要做到工程级完善,但要把残差、雅可比、优化求解的数据流走通。最后再进入论文和融合方案。
这个节奏没有固定版本,关键是“概念—实践—读码—论文”循环,而不是线性地在某个阶段上死磕太久。
6. 常见卡点、误区与排查思路
6.1 报错不一定代表SLAM难,常见是环境和数据问题
SLAM 学习中最常见的挫败感来自编译和运行报错。很多报错看起来和算法相关,实际原因是依赖库版本不兼容、路径包含中文、数据包格式与代码解析版本不一致、权限不够或者内存不足。
遇到报错时,先按这个顺序排查:一看日志,定位是编译期还是运行期;二看数据格式,确认是否为当前项目支持的类型;三看配置,检查参数文件里的文件路径、相机模型、话题名称是否匹配;四看资源占用,有没有内存和 CPU 被打满;五看依赖库版本,是否存在已知代码接口变更。不要一上来就改代码。
回环检测结果为空、构图不闭合,也不一定是后端问题。要优先确认回环检测的输入帧是否保存完整,回环匹配阈值是否需要调整,前端里程计有没有在回环关键帧附近漂移过大。
6.2 实时性和精度是矛盾,不是单一调参能解决
很多真实场景任务不仅要求高精度,还要求实时输出定位结果。前端处理帧率、后端优化频率、地图更新频率这三者通常是相互制约的。提高后端优化频率,精度往往更好,但 CPU 占用会上升;减少历史关键帧,实时性改善,但全局一致性可能下降。
调参之前,先明确系统瓶颈。可以先用性能分析工具观察 CPU 占用分布:是特征提取太慢,匹配太慢,还是后端优化耗时长?不同瓶颈要采取不同方案。如果后端瓶颈明显,考虑用滑动窗口限制优化规模;如果前端太慢,先调整图像分辨率或特征数量。
不要把实时性理解成单纯的“速度快”。实时性还包含延迟的可控性,即每一帧数据能否在指定时间窗口内得到对应位姿。低速机器人对延迟容忍度高,高速无人车对延迟非常敏感,很多时候需要牺牲一点精度换稳定输出频率。
6.3 怎么评估定位建图结果,不只看可视化效果
可视化工具里显示的轨迹和地图好像很漂亮,不代表精度真的高。真正判断一个系统好不好,需要用定量指标评估。
常见的轨迹评估指标有绝对轨迹误差(ATE)和相对位姿误差(RPE)。ATE 是估计轨迹与真值轨迹之间的整体差异,反映全局漂移;RPE 是比较相邻时段位姿误差,反映局部平滑性。公开数据集通常带有真值轨迹,可以直接计算这两个指标。很多开源工具可以加载估计轨迹和真值轨迹进行对比,输出数值和图表。
地图质量评估则更复杂。可以做几何一致性检查,比如让算法回到起点,看地图闭合误差;也可以对比点云地图和已有高精地图的偏差。室内场景可以用人工测量参考点做对比,室外场景看 GPS 真值辅助判断。
如果你是只为了学习验证,不需要追求指标刷新,但至少要能解释“差在哪里”:是累计漂移大,还是回环闭合不平滑,还是地图点稀疏不完整。
6.4 学习时最容易忽视的部分:数据关联、回环和退化场景
很多人在跑通开源项目后就匆忙进入新方法调研,反而把确定性的基本功忽略了。真正决定定位精度的往往是三个容易被低估的部分。
数据关联是第一个。匹配错误是 SLAM 系统精度下降的主要原因之一。不管是点云配准还是视觉特征匹配,一旦出现错误关联,优化后会把错误约束当成强约束,整个位姿图都会被拉歪。匹配前预处理、匹配后校验、加入 RANSAC 类剔除机制,都是非常必要的工程手段。
回环检测是第二个。回环检测不仅需要准确判断“来过这里”,还需要在重复环境里避免误匹配。停车场里每一排车位看起来都高度相似,把不同车位当回环,会造成地图明显扭曲,这比不回环更可怕。
退化场景是第三个。长走廊、隧道、地库、雪地,是很多 SLAM 系统的失败高发区。遇到退化场景,先分析哪些方向观测不足,再考虑用惯性单元、轮速计或其他传感器提供对应方向的约束,而不是盲目提高配准权重或者凑参数。
7. 后续扩展:从单传感器到融合,从跑通到落地
7.1 从2D SLAM到3D SLAM,需要补哪些知识
如果先接触 2D 激光 SLAM,后续进入 3D SLAM 时,需要补充的知识点会比较明显。
首先是位姿表达维度增加。2D 状态量是 x、y、yaw 三个自由度,3D 状态量变成 x、y、z、roll、pitch、yaw 六个自由度,旋转处理就复杂很多。四元数和李代数在 3D 优化里的重要性会迅速上升。
其次是点云配准算法从 2D 匹配变成 3D 点云配准,需要理解近邻搜索、特征描述子、概率模型等多套思路。地图表示也会从占据栅格转向三维点云地图或八叉树地图,需要处理的数据量和可视化方式完全不一样。
还有运动畸变补偿、深度图生成、语义点云等新问题。建议不要直接跳到多传感器融合,先把 3D 单传感器链路走通,再扩展。
7.2 从离线到实时:队列、同步、日志和失败重试
学习时跑一遍离线数据,只代表代码逻辑可行。真实项目里,SLAM 往往要嵌入到无人驾驶系统,面对流式传感器数据、多话题并发、计算资源争抢等任务。
这时候要额外考虑几个工程点。一是数据队列设计:传感器消息到达时间不固定,需要缓冲和丢弃策略,保证算法始终处理最新数据。二是时间同步:不同传感器消息的时间戳要统一,否则融合数据没有意义。三是日志设计:保存每一帧的位姿、丢失帧信息、回环触发信息,哪天定位异常时能回查原因。四是失败重试和自动恢复:定位丢失或点云配准失败时,系统如何回到正常状态,不能直接崩掉。
这些内容在教科书里往往不会重点讲,但实际部署时比算法本身更决定系统是否稳定。我见过不少效果很好的离线方案,一接实时数据就频繁跳变,本质就是没有处理消息队列和同步问题。
7.3 我的建议
如果目标是快速进入无人驾驶定位建图方向,不妨按“2D 激光入门 → 3D 激光建图 → 视觉 SLAM → 激光视觉融合”的路径走。每一步都用开源项目验证,不要只看不跑。
如果目标是做研究,就更要重视理论基础:李群李代数、因子图、非线性优化,这些底层工具决定你以后能不能提出新的残差模型或算法结构。跑通 Demo 只是开始,真正难的是在真实场景里发现并解决问题。
把定位建图拆开看,它不是一个“黑盒算法”,而是一条由坐标变换、状态估计、数据关联、回环检测、地图表示组成的链路。理解每个环节的作用边界,比记参数和调参数重要得多。踩过几次坑后你会发现,很多问题不是 SLAM 本身有多难,而是前置的坐标系定义、数据格式和传感器标定没有处理清楚。把这些问题先解决,主线算法反而会走得顺畅很多。