前面将近30篇把SLAM从基础到进阶都过了一遍,从数学原理到具体系统,从传统方法到深度学习。这篇做个收尾,把面试官最爱问的SLAM问题做个汇总。
面试SLAM岗位(不管是视觉SLAM还是激光SLAM),面试官的提问思路通常分三步:基础概念看你是不是真的理解、算法细节看你有没有动手做过、系统设计看你能不能解决工程问题。下面按这个思路来整理。
基础概念类(5题)
1. SLAM是什么?和里程计有什么区别?
SLAM全称Simultaneous Localization and Mapping,同时做定位和建图。里程计只做定位(估计运动),不建图。SLAM的核心价值在于闭环——地图可以反过来帮助定位,形成正反馈。
2. SLAM的前端和后端分别做什么?
前端做帧间运动估计(视觉里程计或激光里程计),输出相邻帧之间的相对位姿。后端做全局优化,利用回环检测和因子图把所有位姿约束放在一起优化,消除累积误差。前端追求实时性,后端追求全局一致性。
3. 什么是回环检测?为什么SLAM必须有回环检测?
回环检测是识别"当前来过"的地方。没有回环检测,SLAM就是纯里程计,累积误差无法消除,走一圈回来地图对不上。回环提供了"跨时间"的约束,让后端优化能把轨迹"拉回来"。
4. 单目SLAM的尺度问题是什么?怎么解决?
单目相机只能观测角度不能观测距离,所以估计的轨迹和地图没有绝对尺度——你无法分辨是走了1米还是10米。解决方案包括:融合IMU提供尺度约束(VINS方案)、用深度学习预测深度(DROID-SLAM)、用已知尺寸的物体做标定。
5. 特征法和直接法的区别?
特征法先提取关键点再匹配,用匹配点的重投影误差做优化。直接法不提取特征,直接用像素灰度值的光度误差做优化。特征法对光照变化鲁棒但计算量大,直接法速度快但对光照敏感。ORB-SLAM用特征法,DSO用直接法。
视觉SLAM核心题(5题)
6. 对极几何是什么?本质矩阵和基础矩阵的区别?
对极几何描述两视图之间的几何约束。本质矩阵E用于归一化坐标(去掉了相机内参),基础矩阵F用于像素坐标(包含内参)。已知内参可以从F推出E,从E分解出旋转和平移(差一个尺度)。
7. PnP问题是什么?常用哪些求解方法?
PnP是根据3D-2D对应点估计相机位姿的问题。常用方法有P3P(3个点的最小二乘解)、EPnP(高效n点算法)、迭代法(先用P3P给初值再用非线性优化精调)。OpenCV的solvePnP函数封装了这些方法。
8. Bundle Adjustment在SLAM中扮演什么角色?
BA是SLAM后端优化的核心。它同时优化所有相机位姿和3D点位置,最小化所有观测的重投影误差。本质是一个大稀疏非线性最小二乘问题,利用稀疏性可以高效求解。
# BA优化的目标函数示意 def ba_cost(poses, points, observations): cost = 0 for obs in observations: proj = project(obs.point, obs.pose) # 3D投影到2D cost += (obs.pixel - proj).squaredNorm() return cost # 最小化这个cost面试官追问:BA的稀疏性体现在哪里?回答:每个3D点只被少数几帧观测到,所以雅可比矩阵大部分位置是零。利用Schur补可以把3D点边缘化掉,只对位姿做优化,维度大幅降低。g2o和GTSAM都利用了这种稀疏性。
9. ORB-SLAM的三个线程分别做什么?
Tracking线程做前端跟踪,每帧提取ORB特征、和参考关键帧匹配、估计当前位姿。Local Mapping线程做局部建图,插入新关键帧、局部BA优化、剔除坏点。Loop Closing线程做回环检测和全局优化。三个线程并行工作。
10. VINS-Mono的IMU预积分是什么?为什么不直接积分?
预积分把两帧之间的IMU测量预先积分成一个相对运动约束,这个约束和当前状态估计无关。好处是当状态估计更新时(优化迭代),不需要重新积分IMU数据,只需要用预积分量做简单修正,大幅减少计算量。
激光SLAM核心题(5题)
11. ICP和NDT的区别是什么?
ICP做点到点(或点到面)的最近邻匹配然后最小化距离,对初始值敏感,容易陷入局部最优。NDT把点云分成体素,每个体素拟合一个正态分布,用概率密度函数做配准,不需要显式的点匹配,对初始值要求更低。
面试追问:实际项目中你怎么选?回答:初始位姿比较准(比如用IMU给了好的初值)就用点到面ICP,精度高速度快。初始位姿不确定或者场景特征不明显就用NDT,收敛域更宽。也可以先用NDT粗配准再用ICP精配准。
12. LOAM的核心思路是什么?
LOAM把点云中的点分为边缘点和平面点。边缘点用点到线距离做配准,平面点用点到面距离做配准。这种分类处理利用了环境中的几何结构,比全局ICP更快更准。LOAM是实时激光SLAM的里程碑。
13. Cartographer的子图(submap)机制是什么?
Cartographer把地图分成多个子图。前端扫描匹配在当前子图中做,子图完成后冻结不再更新。后端用回环检测在所有已完成的子图之间做全局优化。这种设计控制了优化规模,适合大场景。
14. 激光SLAM中的运动畸变怎么消除?
激光雷达是旋转扫描,一帧点云采集过程中传感器在运动,导致点云有运动畸变。消除方法是用IMU或里程计数据估计每个点的精确时间戳和位姿,把每个点都投影到帧开始的位姿下。LOAM和LeGO-LOAM都做了去畸变。
15. 点云下采样为什么重要?常用什么方法?
原始点云数据量巨大(16线雷达每秒约30万点),直接处理太慢。下采样减少点数同时保持几何特征。常用方法有体素滤波(voxel filter,把空间分成网格,每个网格只保留一个点)和随机采样。体素滤波最常用,网格大小是关键参数。
优化与系统题(5题)
16. 图优化中节点和边分别代表什么?
节点代表状态变量(位姿、3D点等),边代表观测约束(里程计测量、回环约束、GPS观测等)。每条边有一个信息矩阵表示约束的置信度。优化就是找一组节点值,使所有边的误差加权平方和最小。
17. g2o和GTSAM的区别?
g2o更轻量,接口灵活,ORB-SLAM用的就是g2o。GTSAM更重量级,有完整的因子图框架,支持增量式优化(iSAM2),代码更规范但学习曲线陡。研究用GTSAM更方便,工程部署g2o更灵活。
18. 关键帧选取策略有哪些?
常用策略有三种:基于共视关系(和已有帧共视点太少就插入新帧)、基于运动量(移动距离或角度超过阈值就插帧)、基于时间间隔(每隔固定帧数插入)。ORB-SLAM用的是共视关系+运动量的组合策略。
19. 怎么评估一个SLAM系统的好坏?
从精度、鲁棒性、实时性三个维度评估。精度用ATE和RPE(evo工具),鲁棒性测试光照变化、动态物体、传感器退化等极端条件,实时性统计前端后端各自的耗时。还要关注内存占用和关键帧管理策略。
20. 你在SLAM项目中遇到过什么坑?怎么解决的?
这是开放式问题,面试官想看你的实战经验。准备几个具体的例子:
初始化失败——IMU静止时陀螺仪噪声导致初始化超时,解决方案是要求用户做特定运动(画8字)来激励IMU。回环误检——走廊里两扇门长得很像被误判为回环,导致地图扭曲,解决方案是提高回环阈值并加几何一致性验证(RANSAC验证回环约束)。优化不收敛——信息矩阵设置不当导致某些约束权重过大,解决方案是仔细调信息矩阵的对角元素。特征点跟踪丢失——快速运动时特征点出视野,解决方案是加入运动模型做位姿预测,减少帧间搜索范围。
这20个问题覆盖了SLAM面试的核心知识点。基础概念、视觉SLAM、激光SLAM、优化系统四大块,每块都挑了最高频的问题。面试前把这些问题的答案过一遍,心里就有底了。
SLAM这个系列从第236篇到这篇,一共30篇文章,从数学基础到具体系统,从传统方法到深度学习,再到性能评估和面试题,基本覆盖了SLAM岗位面试需要的所有知识。
上一篇:第264篇 SLAM系统性能评估
下一篇我们进入导航模块,从ROS2 Navigation2框架开始。
如果这篇文章对你有帮助,欢迎点赞支持一下,你的鼓励是我持续更新的动力!