- 啃透 ORB_SLAM3 ➕ 2025-09-16
参考:
GitHub 项目:
文章:
- https://www.zhihu.com/question/408916240
- 如何评价 ORB-SLAM3? - 小秋 slam 实战的回答 - 知乎 https://www.zhihu.com/question/408916240/answer/1361086876
ORB-SLAM3 简介
一、它是什么(一句话)
- ORB-SLAM3 是一个以稀疏点特征为核心、关键帧为单位、用图优化求解的多模态视觉(可选 IMU)SLAM 系统。它能在单目/双目/RGB-D/加 IMU 等不同传感组合下实时估计相机轨迹并构建稀疏地图,具备重定位和回环能力,支持多子图(Atlas)长期运行。
二、核心思想(你需要记住的四个关键词)
- 特征点:用 ORB 角点 + 二进制描述子表示场景,便于快速匹配与回环识别。
- 关键帧:并非每帧都优化,只挑“信息量大”的帧建图,降低计算量。
- 图优化:把位姿与三维点组成图结构,最小化重投影误差(以及 IMU 误差),用非线性最小二乘(g2o)求解。
- 回环/重定位(BoW):用词袋(DBoW2)在全局快速检索相似视角,做闭环校正与丢失后的重定位。
三、工作流水线(前端/后端/回环)
-
- Tracking(前端跟踪)
- 输入:图像(可选 IMU 预积分信息)
- 做什么:提 ORB 特征 → 预测当前位姿(恒速模型或 IMU 预积分)→ 将当前帧与“局部地图”匹配 → 用 PnP 或位姿优化求出位姿 → 评估是否生成关键帧
- 输出:相机位姿、候选关键帧、与地图点的关联
-
- Local Mapping(后端局部建图)
- 插入关键帧、三角化新地图点、剔除质量差的点/帧
- 做局部 BA(仅优化局部子图),若有 IMU,同步优化偏置、尺度、重力方向
-
- Loop Closing(回环)
- 用 BoW 从词典里找历史相似关键帧
- 估计相似变换 Sim3(能纠正单目/松耦合造成的尺度漂移)
- 在“本质图/位姿图”上做图优化(Pose Graph),必要时触发全局 BA
-
- Atlas(多地图)
- 支持多子图并管理切换/合并,利于长期运行与重定位
四、不同传感模式怎么影响原理
- Mono(单目)
- 仅靠几何约束,绝对尺度不可观(轨迹“大小”不定),靠闭环/先验对齐
- 初始化对“平移 + 视差”敏感,纯旋转或弱纹理会失败
- Stereo / RGB-D
- 天然给深度(基线或深度相机),尺度可观,初始化更稳
- Visual-Inertial(任意视觉 +IMU)
- 引入 IMU 预积分因子,联合优化位姿、速度、重力和传感器偏置
- 初始阶段要估计陀螺/加计偏置、重力方向与尺度;之后鲁棒性与短期精度显著提升,快速运动/弱纹理下优势明显
- ORB-SLAM3 在 Stereo-Inertial 上尤其稳,因为视觉深度 +IMU 互补
五、关键数据结构(理解图优化的“骨架”)
- Frame / KeyFrame:普通帧与被选中的关键帧(含位姿、特征、观测)
- MapPoint:三维点(由多帧三角化),记录其外观(描述子)与可见性
- Covisibility Graph:关键帧之间基于共同观测点的稠密连边(局部优化依此选邻居)
- Essential Graph:稀疏骨干图(生成树 + 强连边 + 回环边),用于全局/闭环优化
- Vocabulary(词典):BoW 索引,用于回环与重定位
六、与“前辈”和“旁系”的演进脉络
- MonoSLAM(EKF 时代)
- 早期滤波式 SLAM,把状态打包进一个大滤波器递推更新,易退化、复杂度随地图变大
- PTAM(关键帧 +BA 的开端)
- 将“跟踪”和“建图”线程分离,并用 Bundle Adjustment 优化关键帧与点,实时性大幅提升
- ORB-SLAM(v1)
- 引入 ORB 特征与 DBoW2 回环,三线程结构(Tracking/LocalMapping/LoopClosing),单目端到端鲁棒
- ORB-SLAM2
- 扩展到 Stereo 与 RGB-D,尺度问题基本解决,闭环/全局 BA 更成熟
- ORB-SLAM3
- 多模态统一框架:Mono/Stereo/RGB-D 均可加 IMU(VIO/VI-SLAM)
- Atlas 多地图管理,重定位/地图复用更自然
- 改进的 IMU 初始化与联合优化,长时运行更稳
- 旁系对比(帮助建立坐标系)
- 直接法 LSD-SLAM / DSO:直接用像素强度最小化,弱纹理/低特征场景有优势,但对光照/曝光更敏感;地图多为半稠密/稠密
- VINS-Mono / VINS-Fusion / OKVIS / Kimera-VIO:更“滑窗式”的 VIO(持续优化最近窗口),紧耦合 IMU,短期精度很强;ORB-SLAM 系列在长期运行、回环与重定位生态上更成熟
- 总体理解:ORB-SLAM3 = “特征 - 关键帧 - 图优化 - 强回环”的代表;VINS = “滑窗 VIO 的代表”;DSO = “直接法代表”
七、为什么它稳(技术要点)
- ORB 特征:旋转与尺度鲁棒、二进制描述子快
- 多级金字塔与 RANSAC:对视角/外点有鲁棒性
- 三线程解耦:前端实时不被大优化阻塞
- BoW 回环与 Sim3 对齐:有效抑制尺度/漂移
- VI 联合优化:IMU 让短时姿态与尺度更可观,前端预测更准
八、它的边界与常见问题
- 动态/反光/大范围无纹理:特征法容易掉点,需提升曝光/纹理或加 IMU/换 Stereo
- 单目纯旋转或弱视差:初始化困难
- IMU 使用门槛:外参、时间戳、噪声/单位要严格准确(常见漂移根因)
- 稀疏地图:几何结构好,但不提供稠密表观(需额外重建模块)
支持的模态
enum eSensor{
MONOCULAR=0,
STEREO=1,
RGBD=2,
IMU_MONOCULAR=3,
IMU_STEREO=4,
IMU_RGBD=5,
};-
MONOCULAR (单目相机)
- 只使用一个相机
- 无法直接获得深度信息
- 需要通过运动恢复结构
- 尺度不确定性问题(无法确定真实尺度)
- 初始化需要足够的视差
-
STEREO (双目相机)
- 使用两个校准的相机
- 可以直接计算深度信息
- 有真实的尺度信息
- 初始化更快更稳定
- 计算量相对较大
-
RGBD (RGB-D 相机)
- RGB 图像 + 深度图像
- 直接提供每个像素的深度信息
- 有真实尺度
- 初始化最简单
- 适用于室内环境,受深度传感器限制
-
IMU_MONOCULAR (单目相机 + IMU)
- 单目相机结合惯性测量单元
- IMU 提供加速度和角速度信息
- 可以解决单目的尺度问题
- 提供重力方向约束
- 在运动剧烈或纹理缺失时更鲁棒
-
IMU_STEREO (双目相机 + IMU)
- 双目相机结合 IMU
- 结合了双目的深度优势和 IMU 的运动信息
- 最稳定的配置之一
- 适合快速运动场景
-
IMU_RGBD (RGB-D 相机 + IMU)
- RGB-D 相机结合 IMU
- 提供最丰富的传感器信息
- 在深度传感器失效时 IMU 可以补偿
- 计算复杂度最高
主要区别维度:
- 深度获取方式:无深度 vs 立体视觉 vs 直接深度测量
- 尺度确定:相对尺度 vs 真实尺度
- 运动感知:仅视觉 vs 视觉 + 惯性
- 鲁棒性:从低到高递增
- 计算复杂度:从简单到复杂
- 应用场景:室外大场景 vs 室内精确定位 vs 快速运动