视觉 SLAM 核心理解(以 ORB-SLAM3 为例)
一、什么是 SLAM
SLAM(Simultaneous Localization and Mapping)解决的问题是:
在未知环境中,通过传感器数据,同时估计自身位姿(Localization)并构建环境地图(Mapping)。
对于视觉 SLAM:
-
输入:图像序列(单目 / 双目 / RGB-D)
-
输出:
- 相机轨迹(Pose)
- 地图(Map)
本质上是一个:
时序状态估计 + 几何重建 + 优化问题
二、SLAM 的核心问题拆解
SLAM 的本质可以拆成三个核心子问题:
1️⃣ 位姿估计(Localization)
目标:
求解每一时刻相机在世界坐标系中的位姿 (T_{cw})
依赖:
- 图像特征
- 2D-3D 或 2D-2D 约束
- 几何模型(PnP / 本质矩阵)
2️⃣ 地图构建(Mapping)
目标:
从多帧观测中恢复三维结构
方式:
- 双目视差(Stereo)
- 多视图三角化(Monocular)
结果:
- 稀疏地图(MapPoints)
- 关键帧结构(KeyFrames)
3️⃣ 优化(Optimization)
目标:
通过最小化重投影误差,提高整体一致性
核心形式:
min \sum || x - \pi(T \cdot X) ||^2
其中:
- (X):3D 点
- (x):图像观测
- (T):相机位姿
- (\pi):投影模型
三、SLAM 系统整体架构
以 ORB-SLAM3 为代表的典型视觉 SLAM 系统,通常由以下模块组成:
输入图像
↓
Tracking(前端)
↓
Local Mapping(局部建图)
↓
Loop Closing(回环优化)
↓
输出轨迹 + 地图
四、前端(Tracking)
核心任务
从当前帧估计相机位姿
关键步骤
1)特征提取(Feature Extraction)
- 提取 ORB 特征点
- 计算描述子
2)特征匹配(Feature Matching)
匹配方式:
- 帧间匹配(Frame-to-Frame)
- 地图匹配(Frame-to-Map)
3)位姿估计(Pose Estimation)
常见方法:
- PnP(已知 3D 点)
- 本质矩阵(单目初始化)
- 优化(最小化重投影误差)
4)运动模型(Motion Model)
利用上一帧位姿预测当前位姿:
T_t ≈ T_{t-1} · ΔT
作用:
- 提供初值
- 加速收敛
5)局部地图跟踪(Track Local Map)
核心思想:
当前帧不是只依赖上一帧,而是与局部地图中的 3D 点匹配
即:
Frame → MapPoints(局部地图)
6)关键帧判定(KeyFrame Decision)
判断是否插入关键帧:
- 视角变化
- 距离变化
- 跟踪质量
前端本质
一个带有先验的非线性位姿估计问题
五、地图表示(Map Representation)
SLAM 中地图通常不是稠密模型,而是:
稀疏结构化地图
1️⃣ KeyFrame(关键帧)
作用:
- 地图节点
- 优化变量
- 观测集合
特点:
- 只保留“信息量大”的帧
- 构成图结构
2️⃣ MapPoint(三维点)
来源:
- 双目深度
- 多帧三角化
特点:
- 被多个关键帧观测
- 作为约束参与优化
3️⃣ 图结构(Graph)
关键帧之间形成:
- 共视图(Covisibility Graph)
- 位姿图(Pose Graph)
用于:
- 局部优化
- 回环优化
六、后端(Local Mapping)
核心任务
构建并优化局部地图
关键步骤
1)关键帧插入
- 接收来自 Tracking 的关键帧
2)地图点生成
- 三角化新点
- 双目直接生成深度点
3)地图清理
- 删除观测少的点
- 删除冗余关键帧
4)局部 BA(Bundle Adjustment)
优化变量:
- 若干关键帧位姿
- 若干地图点
目标:
min \sum || x - \pi(T \cdot X) ||^2
本质
局部范围内的非线性最小二乘优化
七、回环检测(Loop Closing)
问题
长期运行会产生:
- 累积误差(Drift)
解决方案
1)回环检测
方法:
- 词袋模型(DBoW2)
- 图像相似度
2)回环验证
- 几何一致性检查
3)位姿图优化
优化:
- 关键帧位姿图
- 全局一致性
本质
在全局尺度上重新分配误差
八、三种核心约束
SLAM 本质依赖三类约束:
1️⃣ 观测约束(Observation Constraint)
来自:
- 图像特征
形式:
2D ↔ 3D
2️⃣ 几何约束(Geometric Constraint)
来自:
- 多视图几何
- 双目模型
3️⃣ 时序约束(Temporal Constraint)
来自:
- 连续帧运动
- 运动模型
九、单目 vs 双目
单目(Monocular)
- 无尺度
- 需初始化
- 易退化
双目(Stereo)
- 有真实尺度
- 初始化简单
- 更稳定
十、SLAM 的本质总结
可以用三个层次理解:
第一层(直观)
一边看,一边知道自己在哪
第二层(工程)
多线程系统:前端跟踪 + 后端建图 + 回环优化
第三层(数学)
一个带有时序结构的非线性优化问题
十一、统一理解公式
SLAM 可以统一表示为:
min_{T_i, X_j} \sum_{i,j} || x_{ij} - \pi(T_i X_j) ||^2
其中:
- (T_i):第 i 帧位姿
- (X_j):第 j 个地图点
- (x_{ij}):观测
- (\pi):投影函数
十二、一句话总结
SLAM 是一个通过视觉观测不断约束并优化相机位姿与三维结构的动态系统