Skip to main content

ORB-SLAM3 Dissection (ORB-SLAM3 解构)

Published: arXiv 2020, IEEE T-RO 2021 · Campos, Elvira, Gómez Rodríguez, Montiel, Tardós (Univ. of Zaragoza) arXiv: https://arxiv.org/abs/2007.11898 · Code: https://github.com/UZ-SLAMLab/ORB_SLAM3 核心定位: 这个”一栈通吃”的 feature-based 视觉 / 视觉惯性 SLAM 至今仍是 indoor / manipulation / AR robotics 默认要 fork 的版本 —— 没有第二个工程化 codebase 在一份代码里同时做 mono + stereo + RGB-D + IMU + multi-map atlas。
Status: v1。延迟 / 内存 UNVERIFIED。 TL;DR: ORB-SLAM3 胜不在精度,而在能用同一套三线程架构跑在 Jetson Nano、手机、或 RGB-D arm cell 上,并通过 Atlas multi-map 从绑架(kidnap)中恢复。换成 feed-forward 3D 模型,你会同时丢掉 IMU 耦合、闭环、长期建图。 X-Ray. 视觉 SLAM 在三个时间尺度上要做三件事:跟每一帧、建局部地图、检测闭环。ORB-SLAM(2015)是第一个把这三件事放到独立线程里做的。ORB-SLAM3(2021)能交替接受 mono / stereo / RGB-D + IMU —— 并且 —— 它最大的新点子 —— 把多张不相连的地图保存在 Atlas 里,让 tracking loss 不再终结 session。可以理解为”视觉 SLAM 界的 Linux”:不是最快的,但是工具默认的那个。

📍 研究全景时间线

keyframe-and-features 家族的顶点。为什么室内 RGB-D / manipulation 5 年没有替代品?

1 · 架构

1.1 三线程骨架 + Atlas

1.2 ⚡ Eureka Moment

Tracking 丢失不是要躲掉的失败 —— 它是要规划的常规事件。新开一张地图、继续跑,等 place recognition 找到重叠时再 merge 回来。
ORB-SLAM3 之前的系统把 tracking 丢失当 session 结束。Atlas 重构这个语义:N 张不相连地图共存;闭环变成地图合并。这让 ORB-SLAM3 能部署到仓库巡检 / 多房间 AR。

1.3 数据流 —— 三线程 + Atlas 一张图

传统 SLAM (ORB-SLAM 1/2 · 单图): ────────────────────────────────────────────────── Session start ●─●─●─●─●─● Map A │ ▼ tracking 丢失 (绑架 / 黑屏 / 跑出去) 💥 └─► SESSION END (历史丢失) ORB-SLAM3 with Atlas (多图共存): ────────────────────────────────────────────────── Session start ●─●─●─●─●─● Map A (active) │ ▼ tracking 丢失 🆕 New empty Map B (now active) │ ●─●─●─●─●─●─● Map B grows │ ▼ DBoW2 place recognition │ ✓ overlap detected with Map A! │ ▼ ╔═══════════════════╗ ║ MERGE A ∪ B ║ ║ + full BA on ║ ║ combined essential║ ║ graph ║ ╚═════════╤═════════╝ │ ▼ ●─●─●─●─●─●─●─●─●─●─●─● Map AB (continued) Session continues, history preserved 💡 关键洞见:tracking 丢失 = 规划事件,不是 session 结束。 这让 ORB-SLAM3 能跑仓库巡检 + 多房间 AR + 长期 mapping 这种长 session 场景。
T* = argmin_T Σᵢ ρ( ‖ π(T · Xᵢ) − uᵢ ‖_Σ )
┌──────────────────────────────────────────────────────────────┐ │ │ │ ① Motion-only BA [Tracking 线程 · 每帧] │ │ ╔══════════╗ │ │ ║ T_new ║ ← 只调 1 个位姿 (新帧) │ │ ╚════╤═════╝ │ │ │ 地图固定 │ │ ●─●─●─●─●─● (map frozen) │ │ │ │ ~5 ms/frame · 4 iter LM · 100s of features │ │ │ ├──────────────────────────────────────────────────────────────┤ │ │ │ ② Local BA [Local mapping 线程 · 每 KF] │ │ │ │ ╔══════════════════════╗ │ │ ║ ~20 covisible KFs ║ ← 滑窗内全调 │ │ ║ + their points ║ │ │ ╚════════╤═════════════╝ │ │ │ Schur complement │ │ ●─●─●─●─[●─●─●─●─●─●]─●─●─● │ │ └─ window ──┘ │ │ │ │ ~100 ms/KF · 几十 KF · 几千 features │ │ │ ├──────────────────────────────────────────────────────────────┤ │ │ │ ③ Full BA [Loop & merging 线程 · 闭环时] │ │ │ │ ╔══════════════════════════════════════════╗ │ │ ║ Active map 全部 KFs ║ │ │ ║ + 全部 map points ║ │ │ ║ + IMU residuals (如 VI) ║ │ │ ╚════════╤═════════════════════════════════╝ │ │ │ Schur + PGO 配合 │ │ ●─●─●─●─●─●─●─●─●─●─●─●─● (全图 + 闭环约束都跑) │ │ │ │ 几秒 · 闭环触发 · 1000s of KF, 100k+ points │ │ │ └──────────────────────────────────────────────────────────────┘ 📌 同一个 min Σ ‖u − π(T,X)‖² 公式,三个时间尺度复用: • 单帧 (实时) → 滑窗 (异步) → 全图 (闭环) ⇒ Schur complement 数学细节 → foundations/spatial-math/bundle_adjustment.md