Direct Methods: DSO & LSD-SLAM (直接法 SLAM 解构)
Published: LSD-SLAM (Engel ECCV 2014); DSO (Engel T-PAMI 2018, arXiv 1607.02565); SVO 2.0 (Forster T-RO 2017) —— TUM CV group / UZH RPG 核心定位: 主流视觉 SLAM没有走的那条路。直接法跳过特征、直接在原始亮度上最小化光度误差 —— 在富梯度场景下赢,在闭环与长期一致性上输。Status: v1。数字
UNVERIFIED。
TL;DR: 直接法证明了可以不用描述子做视觉 SLAM —— 在高梯度区域直接对像素亮度做 tracking 与建图。子像素精度、半稠密地图免费送。代价:光度标定非搞不可、曝光变化静默毁掉一切、闭环没解决。DSO 作为 DROID-SLAM 和 feed-forward 稠密方法的祖先而幸存。
X-Ray. 特征 SLAM 留角点(~99% 丢掉)。直接 SLAM 留所有梯度像素(~2000–10k/帧)。前端更轻、子像素、半稠密地图。但光度标定强制、曝光变化致命、闭环未解。这个领域押注 features 有原因;DSO 是解释这个押注为什么对的 demo。
📍 研究全景时间线
1 · 架构
1.1 根本分歧
1.2 ⚡ Eureka Moment
“你不需要识别一个像素是什么 —— 只需要它在被正确重投影时亮度保持不变。”押下这个赌注,descriptor 提取、匹配、feature-based BA 都消失。你拿到子像素精度和半稠密地图;你交出闭环、光照鲁棒性、scale 恢复。
1.3 DSO 架构(稀疏直接)
2 · 数学核心
📌 Napkin Formula
i、点 p,经位姿 (R_ij, t_ij) + 逆深度 d_p 投到 j;最小化经 affine-brightness 校正后的亮度差。(a, b) = 每帧曝光参数。
直觉:
(a, b) 是挡在你和”曝光导致 crash”之间的那一层。DSO 的不变量是光度,ORB-SLAM3 是几何 —— 各自有各自的崩溃方式。滑窗约 7 个 KF;直接法追求局部完美,不是全局一致。
3 · 模式例子
同一条走廊,两种光照场景:
DSO 在干净场景赢,在真实世界光照下输 —— features 在 production 占主导的原因。只有相机级光度预标定(response + vignette)才能让 DSO 在户外跑下去。
4 · 工程:何时选直接法
模式: 直接法 → 研究 / 稠密建图;特征法 → 量产。例外:摄影测量(BundleFusion 风格的后处理稠密对齐)。
SVO 的中间路线: 半直接 VO(Forster):选点用 feature,tracking 用光度(子像素直接对齐)。drone 上 100+ Hz 出货
UNVERIFIED;UZH RPG 谱系。如果非选一个”能部署的直接法”,是 SVO,不是 DSO。
5 · 数据与评测
DSO —— TUM mono + EuRoC:在友好序列上直接法 translational 比 features 好 2–3×UNVERIFIED。LSD-SLAM —— TUM RGB-D 半稠密重建。⚠️ 两者都室内 + 光度已标定。户外 / aerial / 没标过的手机就是另一个故事。
6 · 能力与失败模式
优势: 子像素 tracking;免费的半稠密地图;嵌入式 CPU 占用更低;显式光度标定。 劣势: 曝光 / 光照变化(#1 杀手);闭环未解(没 descriptor → DBoW2 不适用);大位移破坏线性化;梯度稀少区失败。6.1 Hidden Assumptions
- 亮度恒定 —— 立项前提。自动曝光 / HDR / 闪烁 / 阴阳交界违反它。仿射
(a,b)只修全局偏移。 - 帧间小运动 —— 激烈运动 → 线性化间隙 → tracking 丢。
- Lambertian 表面 —— 镜面(玻璃、抛光地板)在运动中破坏亮度恒定。
- 光度标定可用 —— 大部分用户跳过实测 response + vignette → 静默退化。
- 不需要闭环 —— 非回路轨迹 → 漂移无界。
6.2 GitHub 实地失败(atlas 联动)
- GitHub-validated:DSO 在自录手机数据上反复触发
Assertion 'std::isfinite' failed(#123, 9 reactions) — 与 §6 “光度可标定 / Lambertian / 亮度恒定” 三条假设的同时破裂直接对应;textureless / use-after-free (#251 / #269) 是同源症状,详见github_failure_atlas.md。 - GitHub-validated:DSO 输出无时间戳 (#237 6 reactions) 让 EVO 评测直接卡 — 教学读源码 OK,做 benchmark 要自己补 timestamp pipeline;最近 merged PR 停在 2017–2018,Engel 已转 Meta / RealityLabs,这是学术冻结,详见
github_failure_atlas.md。 - GitHub-validated:LSD-SLAM 被 ROS 1 + Ubuntu 14.04 锁死(#330 / #302 / #290 build 失败、#321 / #351 / #348 运行时崩、#350 教学提问自 2020 无人回),完全 frozen — 只剩博士论文 chapter 用途,详见
github_failure_atlas.md。
7 · 比较 & 面试 Tip
🎤 Interview Tip. “DSO 精度更好,直接法为什么没赢?” —— 正确答:“闭环与曝光不变性。直接法优化的是正确的局部目标,但没继承全局 place-recognition 基元;亮度恒定在没有受控光度标定的场景下很难强制。ORB-SLAM3 让一个较差的局部目标在全局上能用;DSO 让一个较好的局部目标在全局上崩。” 错答:“DSO 更差” —— 它是结构性不同。
Boundary
- ORB-SLAM3 机制 →
./orb_slam3_dissection.md。 - Aerial 实时 VIO(VINS / OpenVINS / DROID) →
embodiments/aerial/vio/。不重复。 - VGGT / feed-forward 3D 后继 →
foundations/feed-forward-3d/。 - 光度 / 传感器标定流程 →
./slam_toolchain_ecosystem.md。
References
- DSO —— Engel, Koltun, Cremers · T-PAMI 2018 · https://arxiv.org/abs/1607.02565
- LSD-SLAM —— Engel, Schöps, Cremers · ECCV 2014
- SVO 2.0 —— Forster et al. · T-RO 2017 · https://rpg.ifi.uzh.ch/svo2.html
- DTAM —— Newcombe et al. · ICCV 2011
- TUM mono —— https://vision.in.tum.de/data/datasets/mono-dataset
← Back to Classical SLAM