SVO Dissection (Semi-Direct Visual Odometry 解构)
Published: SVO 1.0 — Forster, Pizzoli, Scaramuzza. ICRA 2014 · SVO 2.0 — Forster et al. IEEE T-RO 2017 · SVO-Pro — Scaramuzza et al. RAL/ICRA 2021 (UZH Robotics & Perception Group) Code:Status: v1。
- 原 SVO: https://github.com/uzh-rpg/rpg_svo(~3k ★,semi-frozen)
- SVO-Pro: https://github.com/uzh-rpg/rpg_svo_pro_open(1.6k ★,57 open issues,GPL-3.0,+ 商业 license available) 核心定位: SVO 是 Direct vs Indirect 战争之外的第三条路。用 sparse 特征做 pose 对齐(像 Direct)+ 用 reprojection 做 map 优化(像 Indirect)。结果:在 embedded CPU 上能跑 200 fps,aerial drone 的首选 mono VO baseline。SVO-Pro (2021) 补齐 IMU + loop closure + iSAM2 backend,等效于 aerial-tuned 的 ORB-SLAM3。
UNVERIFIED 数字 inline 标注;GitHub-validated pitfalls 锚 atlas。
TL;DR: Forster 选了 worst of both worlds 还是 best of both worlds 的赌注 —— 跟踪阶段不算描述子,直接 image alignment 找特征对应;建图阶段用 depth filter + reprojection BA。这让 SVO 跑得比 ORB-SLAM 快 5×(200 fps vs 30 fps mono),比 DSO 收敛半径大(特征 align 比纯 photometric 鲁棒),但代价是 mapping 质量靠 depth filter 收敛(深度不稳定 = 漂得快)。aerial drone 社区把它做成事实标准;地面机器人 / AR 则继续用 ORB-SLAM3。
1 · X-Ray — 与 ORB-SLAM3 / DSO 的三方对照
1.1 一句话定位 — 真正的 hybrid
DSO = photometric residual on raw pixels(Direct, slow & precise, no loop) ORB-SLAM3 = reprojection residual on ORB keypoints(Indirect, full stack, 30 fps) SVO = sparse feature align (no descriptor!) → reprojection BA on depth-filter points(Hybrid, 200 fps embedded)
1.2 ⚡ Eureka Moment
检测要特征,匹配不要描述子 —— 用 image alignment 直接 warp 特征 patch 找对应。 跟踪阶段像 Direct(光度),建图阶段像 Indirect(reprojection)。 结果:embedded CPU 上跑出 200 fps,又同时保留 BA 的 metric consistency。ORB-SLAM 之所以慢,~50% 时间在 ORB descriptor 提取 + Hamming 匹配 + RANSAC outlier。SVO 的洞见:FAST corner 抽出来已经够定位了;匹配可以直接用图像 patch 做 warp + 光度 align,不用算 BRIEF。这等于把 ORB-SLAM 前端 30 ms 压到 5 ms。 但 SVO 也付出代价:没有描述子 = 没有 DBoW2 内置闭环。SVO 1.0 / 2.0 没有 loop closure,SVO-Pro (2021) 才补上(用 BRISK + DBoW2 + iSAM2 backend)。 Aerial drone 社区的赌注:在 100 g 级 drone 上,100 ms loop 延迟 ≫ 200 fps 跟踪的损失。SVO 是赢家。ORB-SLAM3 室内的赌注:tracking 30 fps 够了,但闭环 + Atlas multi-session 不可缺。两个 embodiment 选不同 winner。
1.3 SVO-Pro 架构(2021)
2 · 数学核心
📌 Napkin Formula — Semi-direct Residual 双层
- 跟踪(每帧)用 direct-style alignment(快、不要描述子)
- 建图(每 KF)用 indirect-style reprojection BA(精、metric)
- 深度初始化用 depth filter(recursive,不需 stereo baseline)
2.1 Depth Filter — SVO 的秘方
3 · 📍 研究全景时间线 — UZH RPG 与 aerial 路线
4 · 玩具例子:带数字走一遍
EuRoC MAVMH_01_easy(752×480 mono、20 Hz)。Intel NUC i7 测(论文报告,UNVERIFIED):
实测 ATE(EuRoC MAV,UZH benchmark):
- SVO 2.0 mono+IMU:~0.3 m drift on
MH_01UNVERIFIED - ORB-SLAM3 mono+IMU:~0.04 m drift(更精)
- VINS-Mono:~0.06 m
5 · 工程:UZH RPG 文化与代码栈
SVO 历史栈 (uzh-rpg/rpg_svo, ~3k ★):
- 2014 release,配合 ICRA paper;C++11;ROS Indigo 时代
- 2016-2017 学界广泛 fork;很多 thesis 基础
- 后期 semi-frozen:主 release 走 SVO-Pro
uzh-rpg/rpg_svo_pro_open, 1.6k ★):
- 2021 release(GPL-3.0 + 商业 license)
- 包含完整三模式:VO / VIO / VI-SLAM(iSAM2 backend)
- ROS 1 支持;ROS 2 社区 fork(#70 请求 arrch64 未合)
- 商业版可联系 UZH technology transfer office
- Kalibr(Furgale 2013, ETH/UZH)—— camera-IMU 时间 + 外参 + 内参标定金标准;任何 VIO 部署的入场费
- rpg_trajectory_evaluation(Zhang & Scaramuzza 2018)—— ATE/RPE 评测标准
- rpg_information_field(信息论 active perception 工具)
- VINS-Fusion:港科技 Shen Shaojie 组,feature-based + IMU + GPS fusion,aerial / autonomous driving 通用
- OpenVINS:UDel Geneva et al., MSCKF filter,纯 VIO baseline
- SVO-Pro:UZH,semi-direct + 优秀 mono 性能 + 完整 backend,研究 + drone 部署
6 · 能力与失败模式
出货场景:- Micro-aerial vehicle(100-500 g drone)—— UZH 内部 + ETH Vasarhelyi lab + Stanford Kress-Gazit lab 等学术 drone 平台 baseline
- Embedded mono VO(树莓派 / Jetson Nano 单 mono camera)—— 200 fps 跑得动
- 研究 mono 基线 —— “我们 propose XX 模块,base SVO 做 baseline”
- Aerial benchmark replication —— UZH 自家 benchmark 主要测它
- 大 baseline 立即匹配 —— 没描述子 → 跑 wide-baseline relocalization 不行,需重启
- 低纹理 / 白墙 —— FAST corner 找不出来 → tracking lost(DSO 的高梯度像素这时反而能用,但 DSO 收敛半径小没救)
- 强动态场景 —— depth filter 收敛会被动态物体污染
- 多 session —— 没有 Atlas,无法接续
- 室内 RGB-D 任务 —— ORB-SLAM3 RGB-D mode 是事实默认;SVO 没有同等的 RGB-D 路径
- HDR / 强光切换 —— sparse image alignment 不带 a/b affine 模型,比 DSO 还差
6.1 Hidden Assumptions(隐含假设)
- 足够 FAST corner —— 没有 ORB 那样的多 detector fallback;FAST 失效就停
- Depth filter 能收敛 —— 需连续观测 + 视差累积;hover 不动 / 纯旋转时 depth 不收敛
- Patch warp 假设小旋转 + 小尺度变化 —— 快速 yaw(>2 rad/s)让 patch warp 模型崩
- IMU 高频 + 同步 —— SVO-Pro VI 模式假设 200 Hz IMU + 硬件 sync;与 ORB-SLAM3 / VINS 同样依赖 Kalibr
- Loop closure 仅 BRISK + DBoW2 (Pro) —— 比 ORB-SLAM3 的 DBoW2-on-ORB 弱,跨光照 reloc 不稳
6.2 GitHub 实地失败(atlas 联动)
- GitHub-validated:57 open issues + maintainer 半静默 —— Issue #76 “Drifting issue”(2025-11 open)+ #69 “Relocalization success will cause bias jump”(2024-05)显示 VI-SLAM 模式 reloc bias 跳变是已知未修问题;产品部署要 fork + 自维 patch;详见
github_failure_atlas.md。 - GitHub-validated:ROS 2 / arrch64 / 现代 build 全部社区 fork 拼图 —— Issue #70(arrch64 支持,未实现)+ #72
load_ui128build error 反映与 ORB-SLAM3 同病:研究 codebase 时代固化,靠社区 fork 跟进 platform,详见github_failure_atlas.md。 - GitHub-validated:Monocular init 失败常见 —— Issue #75 “Unsuccessfully run SVO in monocular mode” + #66 “Wrong estimation when running on webcam” 反映 mono-only depth filter 对相机参数 / 同步 / 场景纹理敏感;要先用 EuRoC / stereo+IMU 跑通才能换 mono。
7 · 7.5 · GitHub-validated pitfalls (2026-05-24 deep dive)
扫描 57 个 open issue,分布于 init failure / build / drift / ROS 平台支持四大类。引用 issue 链接 + 原文。
Repo health signal:原 SVO ~3k ★ frozen / SVO-Pro 1.6k ★ + 57 open issues / GPL-3.0 + 商业 license / last commit 不公开(master 历史 commit 数低)/ 商业版分流维护
读者实务含义:
- SVO-Pro 是 aerial drone 研究 codebase,不是 turnkey 产品。Production drone(如 Skydio)走自研 + 闭源;学界用 SVO-Pro 做 baseline + 论文 prototype。
- 工作包络:aerial drone (100-500 g) + stereo+IMU 优先 / mono 谨慎 + ROS 1 / Ubuntu 20.04 + 场景有纹理 + <10 min session(长 session 走 loop closure)。
- 选 SVO-Pro 的判断标准 = 是否真的需要 200 fps + onboard CPU。如果不是 aerial,ORB-SLAM3 / VINS-Fusion / OpenVINS 任一项都更稳。
8 · 比较 & 面试 Tip
🎤 Interview Tip:「我们这台 250 g drone 上选 SVO-Pro 还是 VINS-Fusion?」 正确答:「先看控制 loop 频率。如果 IMU control loop ≥200 Hz 而且 onboard 只有 ARM CPU、需 mono 模式,SVO-Pro 是首选 —— 200 fps tracking + sparse image alignment 让它在 jitter-sensitive 控制场景压 ORB-SLAM3 / VINS 一头。如果有 stereo + Jetson Xavier 以上 + 需要 loop closure 全功能 + 想要更成熟的 ROS 接口和社区支持,VINS-Fusion 更稳(GPS fusion / multi-sensor / 港科技维护更活跃)。ORB-SLAM3 太慢,30 fps 在 aerial 控制环里加 jitter 不接受。」 错答:「都差不多,选 ORB-SLAM3 因为它最有名」—— 这是把室内 manipulation 的事实默认错误外推到 aerial 200 fps 控制。Embodiment 决定选型,不是知名度。
追问:「为什么 SVO 不用描述子?」 答:「Forster 的核心判断:描述子(BRIEF/ORB)50% 时间为了跨光照 / 大基线 reloc 设计;但 frame-to-frame 跟踪根本不需要这个鲁棒性 —— patch warp + 光度 align 就够了。描述子留到必要的 reloc 时再算(SVO-Pro 用 BRISK + DBoW2 做 loop closure 是这时才提描述子)。换言之 —— 每一帧都算描述子是过度工程。这个判断只在 aerial 场景(小基线、frame-to-frame 多)成立;室内 RGB-D / AR(大跳变 reloc 多)则相反。」
9 · Falsifiable Predictions(可证伪预测)
10 · For the Reader(读者实务)
如果你正在 …- … 做 aerial drone mono VIO 项目 → SVO-Pro 是首选 baseline;先在 EuRoC 跑通 stereo+IMU,再切 mono;硬件用 global-shutter + 同步 IMU(Kalibr 标)
- … 做 ground robot / manipulation → 别选 SVO,选 ORB-SLAM3(Atlas + RGB-D + 多模态)
- … 要 SVO 加 ROS 2 → 用社区 fork(搜
svo_pro_ros2);不要等主仓 - … 要 SVO 上 Jetson Orin Nano / arrch64 → 看 issue #70 + 自己交叉编;GCC 9 + Ubuntu 20.04 docker
- … 理解 semi-direct method 设计哲学 → 读 Forster 2017 T-RO §3-4 + 这篇 dissection §1-2
- … 想看 UZH RPG 后续路线 → event camera VIO (Ultimate-SLAM, EVO)、learned drone control、neural radiance for drone NeRF
- … 找 VIO 学术 benchmark → UZH benchmark suite (
rpg_trajectory_evaluation) + Kalibr 是入场费
11 · References
- SVO 1.0 — Forster, Pizzoli, Scaramuzza. ICRA 2014(原始 semi-direct paper)
- SVO 2.0 — Forster, Zhang, Gassner, Werlberger, Scaramuzza. IEEE T-RO 2017 —— + IMU, fisheye, multi-camera
- SVO-Pro — Scaramuzza et al. RAL/ICRA 2021 —— full VIO / VI-SLAM, iSAM2 backend, DBoW2 loop
- Depth filter — Vogiatzis & Hernández. Image and Vision Computing 2011(recursive Bayesian depth fusion)
- IMU preintegration(SVO-Pro VI 用)— Forster, Carlone, Dellaert, Scaramuzza. RSS 2015 / T-RO 2017 · https://arxiv.org/abs/1512.02363
- Cadena SLAM survey — Cadena et al. IEEE T-RO 2016 · https://arxiv.org/abs/1606.05830(Semi-direct 分类经典 ref)
- Kalibr — Furgale, Rehder, Siegwart. IROS 2013(VIO 标定金标准)
- rpg_trajectory_evaluation — Zhang & Scaramuzza. IROS 2018(ATE/RPE 评测标准)
- Code (original) — https://github.com/uzh-rpg/rpg_svo(~3k ★, semi-frozen)
- Code (Pro) — https://github.com/uzh-rpg/rpg_svo_pro_open(1.6k ★, GPL-3.0 + 商业 license)
12 · Boundary(与相邻文件的分工)
这一篇只管 SVO / SVO-Pro(semi-direct VO 的代表)。- ORB-SLAM3(indirect VO 对照) →
./orb_slam3_dissection.md - DSO(direct VO 对照) →
./dso_dissection.md - Direct method 合并对比(LSD + DSO) →
./direct_methods_dso_lsd.md - GitHub-validated 失败 atlas →
./github_failure_atlas.md - PnP / DLT 几何基础 →
./pnp_dlt_primer.md - Aerial 实时 VIO 全家桶(VINS / OpenVINS / DROID 与 SVO 在 aerial 场景的对比) →
../../embodiments/aerial/vio/overview.md - VINS-Fusion vs ORB-SLAM3 代码层对比 →
../../crossing/slam-vio-migration/orb_slam3_vs_vins_fusion_code_comparison.md - IMU 预积分理论(SVO-Pro VI 用) →
../spatial-math/ - 3DGS-SLAM 后端(与 SVO 同 era 但走不同路) →
../3dgs-family/gs_slam_dissection.md - Ontology v3 Semi-direct VO subdivision →
../../cheat-sheet/ontology.md§2
← Back to Classical SLAM · → ORB-SLAM3 dissection · → DSO dissection