ORB-SLAM2


  • Description:ORB-SLAM2 论文与系统详解 — 特征点法 SLAM 巅峰之作,三线程架构 (跟踪 / 局部建图 / 闭环),ORB 特征、共视图/扩展树/本质图、词袋、三种跟踪、局部 BA、Sim3 闭环
  • Paper:Mur-Artal, R., & Tardós, J. D. (2017). ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo, and RGB-D Cameras. IEEE T-RO, 33(5). (初代 ORB-SLAM: Mur-Artal et al. 2015 T-RO)
  • K2E-B ID:[K2E-B-S2-2]
  • Max3 PDF[K2E] SLAM/[K2E-B-S] SLAM Systems/[K2E-B-S2] ORB-SLAM/[K2E-B-S2-2][2016] ORB-SLAM2 an Open-Source SLAM System for Monocular Stereo and RGB-D Cameras.pdf (同目录另有 S2-1 初代 ORB-SLAM + 中文翻译 docx)
  • Notion ID:(待创建)
  • Created:2021-07-06
  • Updated:2026-06-02
  • License转载欢迎 — 请署名 Yu Zhang 并链回 yuzhang.io 原文

Table of Contents


1. 概述与特点

ORB-SLAM2 (Mur-Artal & Tardós 2017) — 特征点法 SLAM 的巅峰之作。三个版本:2015 (单目)、2017 (ORB-SLAM2,双目/RGBD)、2021 (ORB-SLAM3,+IMU/多地图)。

特点:

  • 单目 / 双目 / RGB-D 统一框架
  • CPU 实时 — 不需要 GPU
  • 回环 + 重定位 完整
  • 仅定位模式 (localization only) 支持
  • 特征点法的标杆

2. 三线程框架

ORB-SLAM2 = 跟踪 (Tracking) + 局部建图 (Local Mapping) + 闭环 (Loop Closing) 三线程并行。

图像 → 跟踪线程
       - 提取 ORB 特征
       - 地图初始化
       - 跟踪 (恒速模型 / 关键帧 / 重定位)
       - 局部地图跟踪
       - 判断建关键帧
            ↓ (关键帧)
     局部建图线程
       - 插入关键帧
       - 剔除地图点
       - 生成地图点
       - 局部 BA
       - 剔除冗余关键帧
            ↓
     闭环线程
       - 查询数据库
       - 计算 Sim3
       - 闭环融合
       - 本质图优化 + 全局 BA

地图结构:地图点 + 关键帧 + 共视图 (covisibility) + 生成树。 位置识别:视觉字典 (vocabulary) + 识别数据库。

数据预处理

  • 双目 — rectify,对齐左右图
  • RGB-D — register depth map 与 image (需标定)

3. ORB 特征

ORB = Oriented FAST + Rotated BRIEF (详见 特征描述子)。这里记 ORB-SLAM 视角的要点:

FAST 角点

  • 选点 $p$,亮度 $l_p$
  • 半径 3 的圆上 16 个像素
  • 阈值 $T$:连续 $N$ 个点亮度 $> l_p + T$ 或 $< l_p - T$ → 角点

BRIEF 描述子

  • 二进制描述子 (256 bit),关键点附近 N 个点对比较
  • 汉明距离 + 位操作 (快)
  • 无尺度不变性 (尺度变化大会失败) — 对比 SIFT/SURF 浮点 + 欧氏距离

旋转不变性

  • Oriented FAST — 灰度质心法估主方向
  • rBRIEF 按主方向旋转采样 → 旋转不变 (wide baseline 适应)

4. 关键帧

为什么需要关键帧

  • 降低信息冗余度
  • 普通帧是滤波/优化的结果
  • 算力与精度的平衡 (大量关键帧反而恶化性能)

如何选择

  • 关键帧本身质量好:图像清晰、特征充足、分布均匀
  • 既存在约束,又减少冗余
  • 标准:时间足够多 + 空间足够远 + 局部质量足够好

5. 共视图 / 扩展树 / 本质图

共视图 Covisibility Graph

  • 无向加权图
  • 关键帧 = 节点,共视地图点数 = 边权重
  • 至少 15 个共视地图点 才连边

扩展树 Spanning Tree

  • 只连当前关键帧和父关键帧
  • 父关键帧 = 共视程度最高的关键帧

本质图 Essential Graph

  • 目的:闭环矫正时用相似变换 (Sim3) 矫正尺度漂移,把闭环误差均摊到本质图
  • 含所有关键帧
  • 连接关系 = 扩展树连接 + 闭环连接 + 共视极好 ($\theta_{min}=100$) 的关系

6. 词袋 BoW

Bag of Words — bags of binary words for fast place recognition。

  • 特征点 + 描述子聚类 → 定义 word
  • 词袋 = 每个 word 出现频率
  • Vocabulary Tree:ORB 特征 → K-means 聚类 → 叶节点是 word,权重 = TF-IDF (出现越多分辨力越小权重越小)

用途

  • 闭环检测 — 对视角/光照/曝光变化鲁棒
  • 加速匹配 — 追踪 / 重定位 / 闭环

7. 跟踪 — 三种模式

恒速模型 (Track With Motion Model)

  • 用恒速模型估计初始位姿
  • Search by projection (候选点 Get Features in Areas,范围小)
  • BA 优化 (仅位姿)
  • 默认/最常用

参考关键帧 (Track Reference Key Frame)

  • 应用场景:无速度信息 (刚重定位完 / 恒速模型失败)
  • Search by BoW → BA 优化 (仅位姿)
  • 一般不用

重定位 (Relocalization)

  • BoW 逆序索引找共 words 的关键帧
  • 每组计算得分,找候选关键帧
  • Search by BoW 快速匹配 → EPnP 算位姿 + 内点优化 (仅位姿)
  • 内点少 → 投影再 Search by projection → 再 BA

(EPnP 见 PnP §4:质心控制点 + PCA + $A^TA$ 特征分解)

8. 局部地图跟踪

Track Local Map — 前面三种跟踪的后处理 (必须已知位姿+地图点,可不准)。

步骤:

  1. 遍历当前帧地图点,找能观测它们的所有关键帧
  2. 统计观测次数排序
  3. 局部关键帧添加:(策略1) 看到当前帧的关键帧;(2.1) 策略1 共视最高帧的邻居 [代码 GetBestCovisibilityKeyFrames(10)];(2.2) 子关键帧;(2.3) 父关键帧
  4. 更新参考帧 (共视最高)
  5. 局部地图点投影到当前帧 → 判断视深/像素范围/平均观测方向 → 最佳次佳筛选
  6. 优化位姿

9. 局部建图

Local Mapping 步骤:关键帧插入 → 地图点剔除 → 地图点生成 → BA → 关键帧删除。(做 local mapping 时不处理 tracking 过来的新关键帧)

地图点剔除

  • set bad flag 删坏点
  • 观测帧太少删掉 (须被预测可见帧的 >25% 实际观测到;且创建后须被足够多关键帧观测 → 好点 (单目 ≥3,双目/RGB-D ≥4),两条件缺一即删)

地图点生成

  • 关键帧间三角化产生地图点
  • 找共视最高的近邻关键帧 → 判断基线 (双目比硬件长度 / 单目比场景深度中值)
  • 计算基础矩阵 → BoW 快速匹配未匹配点 + 极线约束抑制离群 → 三角化
  • 三角化检查:视差角 → 相机前方 → 重投影卡方检验 → 左右光心距离 + 金字塔尺度比例连续性

地图点融合

  • 一级相邻 (共视最高 N 帧) + 二级相邻
  • 正向融合 (地图点投影到关键帧匹配,检查相机前/方向/距离;有地图点则选观测最多的替换,无则添加)
  • 反向融合 (一二级 → 当前关键帧)

Local BA

  • 条件:处理完最后关键帧 + 闭环没请求终止 + 关键帧 > 2 (别太频繁)
  • 优化当前关键帧 + 共视关键帧的 pose + 地图点
  • 能观测局部地图点但不属局部的关键帧 (二级) 仅作约束不优化
  • 约束边权重按金字塔尺度平方的倒数设置 (mvInvLevelSigma2 = 1 / scaleFactor^(2·level))

关键帧删除

  • 剔除 90% 以上地图点能被至少 3 个其他关键帧看到的冗余关键帧

10. 闭环检测

闭环候选 → 连续性检查 → Sim3 与闭环矫正。

识别候选

  • local mapping 插入关键帧给 loop closing
  • 距上次闭环 > 10 关键帧 [代码实现常数]
  • 统计共视图相连关键帧 (连边阈值 15) 的 BoW 相似度,取最低分为最小得分 $s_{min}$
  • 候选筛选:得分高于最小得分 → 扩展候选+相邻为组算得分 → 取每组最高帧

连续性检查 (Consistency)

  • 每关键帧 + 相连帧 = 候选组
  • 检查是否有"连续组":子候选组与之前成功组相连 → consistency +1;连续 3 次 → 连续组存在
  • 存在连续组 → 候选合理

Sim3 与闭环矫正

相似变换 $S = \begin{bmatrix} sR & t \ 0 & 1 \end{bmatrix}$,逆 $S^{-1} = \begin{bmatrix} \frac{1}{s}R^T & -\frac{1}{s}R^T t \ 0 & 1 \end{bmatrix}$。

  • BoW 粗匹配 → RANSAC + Sim3 初算标内点 → Search by Sim3 (互投未匹配点)
  • 正反向投影建边约束 → g2o 优化 (地图点固定,Sim3 不固定,边做投影)
  • 校准闭环:停 BA → 更新连接 → 当前关键帧组尺度认为还是 1 (无漂移)

(Sim3 / 尺度漂移修正见 几何变换层级 §3 相似变换)

References

  • Mur-Artal, R., Montiel, J. M. M., & Tardós, J. D. (2015). ORB-SLAM: A Versatile and Accurate Monocular SLAM System. IEEE T-RO. — 初代
  • Mur-Artal, R., & Tardós, J. D. (2017). ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo, and RGB-D Cameras. IEEE T-RO, 33(5). — 本笔记
  • Campos, C., et al. (2021). ORB-SLAM3. IEEE T-RO. — +IMU/多地图
  • ORB-SLAM2 代码: github.com/raulmur/ORB_SLAM2
  • Gálvez-López, D., & Tardós, J. D. (2012). Bags of Binary Words for Fast Place Recognition in Image Sequences (DBoW2). IEEE T-RO.
  • 知乎: SVD 讲解各种点法 — 原 note 引用
  • ORB 特征见 特征描述子;EPnP 见 PnP;三角化见 三角化;Sim3 见 几何变换层级