SLAM 脑内架构图(状态估计 → VO → 后端)

发布时间:2026/7/11 6:19:00
SLAM 脑内架构图(状态估计 → VO → 后端) SLAM 脑内架构图状态估计 → VO → 后端 SLAM 脑内架构图状态估计 → VO → 后端一、最顶层SLAM 是什么┌─────────────────────────────────────────────┐ │ SLAM 状态估计问题 │ │ 我从带噪声的观测中估计机器人的状态 │ └─────────────────────────────────────────────┘二、状态估计的数学骨架带噪声的观测 z │ ▼ 真实状态 x 是什么 │ ┌──────────┴──────────┐ │ 贝叶斯公式 │ │ P(x|z) ∝ P(z|x)·P(x)│ └──────────┬──────────┘ │ 忽略先验 P(x) → 最大似然 │ 假设高斯噪声 → 取负对数 │ 最小二乘法 │ 非线性 → 迭代优化 │ GN / LM 求微调量 Δx │ x ← x ⊕ Δx │ 收敛 → 最优估计三、前端视觉里程计VO┌──────────────────────────────────────────────────────┐ │ 前端VO │ │ 用相邻帧的视觉观测估计短时间内的相机运动 │ ├──────────────────────────────────────────────────────┤ │ │ │ 状态 x相机位姿 T ∈ SE(3) │ │ 观测 z图像像素坐标 / 灰度 │ │ 观测方程 h(x)投影模型 │ │ 残差 e │ │ • 特征法 → 重投影误差 │ │ • 直接法 → 光度误差 │ │ 优化GN / LM │ │ 更新T ← T · exp(Δξ) │ │ │ ├──────────────┬───────────────────────────────────────┤ │ 特征点法 │ 直接法 │ │ • 提取特征 匹配 │ • 不用特征 │ │ • 稀疏点云 │ • 用灰度 │ │ • 对光照不敏感 │ • 弱纹理友好│ │ • 依赖纹理 │ • 怕光照变化│ └──────────────┴───────────────────────────────────────┘四、后端全局优化┌──────────────────────────────────────────────────────┐ │ 后端SLAM │ │ 把前端估计和回环信息融合成全局一致的轨迹和地图 │ ├──────────────────────────────────────────────────────┤ │ │ │ 目标函数 │ │ min ‖e_前端‖² ‖e_回环‖² ‖e_先验‖² │ │ │ │ 优化方法 │ │ • 图优化g2o / Ceres / GTSAM │ │ • Bundle AdjustmentBA │ │ • 滑动窗口 / 全局优化 │ │ │ │ 节点位姿 地图点 │ │ 边 │ │ • 前端里程计边 │ │ • 回环边闭环约束 │ │ • 先验边IMU / GPS │ │ │ └──────────────────────────────────────────────────────┘五、完整数据流从传感器到轨迹┌────────┐ ┌────────┐ ┌────────────┐ ┌────────────┐ │ 图像帧 │────▶│ 前端VO │────▶│ 后端优化 │────▶│ 轨迹 地图│ │(RGB-D) │ │(位姿估计)│ │(BA回环) │ │(全局一致) │ └────────┘ └────────┘ └────────────┘ └────────────┘ │ ▲ │ │ └────回环检测──────┘六、一句话串起所有层SLAM 本质上是一个分层状态估计系统底层是最小二乘优化中间层是视觉里程计特征法 / 直接法上层是带回环和先验的全局图优化。七、面试速记版脑内折叠图SLAM ├── 数学基础贝叶斯 → 最大似然 → 最小二乘 → GN/LM ├── 前端 VO │ ├── 特征法重投影误差 │ └── 直接法光度误差 └── 后端 ├── BA / 图优化 ├── 回环检测 └── 先验融合IMU / GPS前端 VO 的完整时间线一步一步来 Step 0初始化唯一一次“纯单帧”第 0 帧到来 ↓ 人为设定 T₀ I单位矩阵 ↓ 深度图 / 三角化得到一些 3D 点✅这里用了“单帧位姿估计”但这个“估计”是人为指定的没有任何特征法 / 直接法参与 原因没有上一帧没法算相对运动 Step 1第 1 帧 → 第 2 帧第一次真正 VO第 1 帧已知 T₁ 第 2 帧新图 ↓ 特征法 / 直接法登场 ↓ 建立观测方程 ↓ 计算残差 e ↓ GN / LM 求 ΔT₁₂ ↓ T₂ T₁ · ΔT₁₂❌这里不“算单帧位姿”✅只用特征法 / 直接法算相对运动 ΔT 关键点特征法 / 直接法只负责“算 ΔT”不负责“算 T₂” Step 2第 2 帧 → 第 3 帧重复第 2 帧已知 T₂ 第 3 帧新图 ↓ 特征法 / 直接法 ↓ 算 ΔT₂₃ ↓ T₃ T₂ · ΔT₂₃✅ 模式完全一样 Step N一直往后走Tₖ Tₖ₋₁ · ΔTₖ₋₁,ₖ前端 VO 的本质99% 的时间特征法 / 直接法在干活“单帧位姿”只是记账用的结果三、什么时候“单帧位姿估计”真的被“算”出来✅ 情况 1初始化假算T₀ I人为规定不是算出来的。✅ 情况 2递推得到最常见Tₖ Tₖ₋₁ · ΔT这是通过相对运动推出来的不是单帧独立估计。✅ 情况 3PnP真·单帧位姿估计发生在这些场景1️⃣ 重定位Tracking Lost当前帧 已有地图 ↓ PnP ↓ 直接算出 T_current✅ 这里真的在用单帧图像算位姿✅ 通常配合特征点法EPnP / DLT2️⃣ 后端 BA 中的一次迭代固定地图点 ↓ 优化某一帧的 T ↓ 本质也是单帧 PnP四、一句话区分非常重要前端 VO特征法 / 直接法 → 算ΔT位姿更新公式 → 算Tₖ重定位 / PnP特征法 → 直接算Tₖ用熟悉的“状态估计语言”再讲一遍观测 z ↓ h(x)观测方程 ↓ 残差 e ↓ 优化求 Δx ↓ x_new x_old ⊕ Δx在前端 VO 里符号含义x_oldTₖ₋₁x_newTₖΔxΔTh(x)投影 / 光度模型优化方法特征法 / 直接法特征法 / 直接法 优化模块单帧位姿 优化结果的累积正确理解特征法和直接法从来不算‘这一帧在哪’它们只算‘这一帧相对于上一帧怎么动’。​单帧位姿是“动完之后累加出来的”。[第 0 帧] 已知 T₀ 3D 点[第 1 帧] 新图像│▼特征法 / 直接法 登场│├─ 特征法找匹配点 → 重投影误差└─ 直接法灰度不变 → 光度误差│▼GN / LM 迭代│▼算出相对运动 ΔT₀₁│▼T₁ T₀ · ΔT₀₁│▼记录 T₁丢弃 / 缓存中间量