目录
SLAM 的框架
通常的 SLAM 框架由前后端共同构成
1
前端:提取特征点,追踪相机 Pose ,定位相机
2
后端:提供全局优化或滑动窗口优化

前端的步骤?初始化、正常追踪、丢失处理
2
相机和路标的建模和参数化
x camera = [ R , t ] , x landmark = ?
(1)
可能的路标:绝对坐标 xyz ,逆深度 ρ ,灰度值(灰度 Pattern ),
等等
3
关键帧?
• 需不需要关键帧?
• 怎么选关键帧?
• 控制关键帧数量?
• 仅在关键帧中补充新特征点?还是对所有帧提取新特征点?
• 何时进行三角化?
实际上,前端非常能体现一个 SLAM 的追踪效果。
• 在实现中,尽管后端存在明显的理论差异,但很难直观体验在最
终精度上。
• 问:假设给定相同的 Pose 和 Landmark ,给定噪声范围,各种方
法是否有明显差异?还是仅仅有理论性质上的差异?
在某些理想情况下,利用仿真数据可以给出一定的结果
这个实验(双目 Pose/Landmark 估计)中, UKF(SPKF) 给出最接近真
值的结果。
1
实际情况离理论假设有多远?(高斯噪声)
2
拿到的数据究竟有多好?
• 在很多实际场合,很难回答某种后端算法是否明确优于另一种。
• 例如: ORB-SLAM2 使用 Covisibility-Graph , DSO 使用带边缘化
的滑动窗口, Tango 使用 MSCKF ,等等。
• 实验效果: ORB-SLAM2 具有较好的全局精度,但无回环时 DSO
具有漂移较少。 Tango 计算量明显少于其他算法。
• 算法的结果和数据集关系很大 。例如 :Kitti 属于比较简单的(视野
开阔,动态物体少,标定准确), EUROC 一般(人工设定场景,
纹理丰富,但曝光有变化), TUM-Mono 比较难(场景多样,主要
为真实场景)
我们更多考量计算和精度的 trade-off 。
相比来说,前端的差异就比较明显:
• 追踪算法是否很容易丢失?
• 算法对干扰的鲁棒性如何(光照、遮挡、动态物体)?
前端更多是范式( Paradigm )之间的比较,而非范式之内的比较。
好的前端
• 追踪效果好,不容易丢
• 计算速度快
• 累计误差小
不好的前端
• 追踪效果差
• 计算耗时
• 容易出现累计误差
VO 方法的定性比较
光流法最早,最成熟,缺点也明显(抗光照干扰弱,依赖角点)
• FAST+ 光流是比较实用的快速算法 /GFTT+ 光流效果更好,也
具备实时性
• 特征匹配需要提的特征具有旋转平移缩放不变性, SIFT/SURF 是
最好的一类, BRISK 等次之, ORB 算比较差的
• 特征匹配和光流都非常依赖角点,日常生活场景中角点不明显的
很多
直接法不依赖角点,但实现效果根据选点数量变化较大
DSO 在不同关键帧数量 / 不同选点数量下的表现。曲线越靠左上侧越
好。
特征点提取、匹配和光流
特征点提取
我们后文以传统光流为主来展开前端的介绍。 一个传统的双目光流前端流程(正常追踪流程)
除了正常追踪流程以外,还需要考虑初始化、丢失恢复的情况。
VIO 初始化比常规 VO 多一些步骤(主要为 IMU 参数的估计),我们
留到下讲介绍。
思考:为什么要有这样的框架?
特征点提取
在光流中,我们通常选择角点来追踪。 为什么需要角点?
角点的梯度在两个方向都有分布
利用角点附近块的两个特征值大小,可以判断该区是否为角点。
S Harris = det ( M ) − k tr ( M ) 2 . k = 0 . 04 − 0 . 06
FAST/GFTT 角点
FAST :仅含像素亮度、不含计算的快速角点提取方式;
GFTT :在 Harris 基础改进: Shi-tomasi 分数,增加固定选点数,
等等
S Shi − Tomasi = min ( λ 1 , λ 2 )
光流
光流可以追踪一个时刻的角点在下个时刻的图像位置
灰度不变假设:
I ( x + dx, y + dy, t + dt ) = I ( x, y, t )
带 Warp function 的光流
I ( x, y, t ) = I ( W ( x + dx, y + dy ) , t + dt )
其中 W 为 Warp Function ,通常取仿射变换
.

其中 p1 − p6 为 W 的参数,需要在线估计。
金字塔式光流:
Coarse-to-Fine :从顶层最模糊的图像开始计算光流,一直往下迭代到
最高分辨率
光流在SLAM 中的应用
光流可以追踪上一帧的角点
2
可以一直追踪该角点,直到超出图像范围或被遮挡
3
在单目 SLAM 中,新提出的角点没有 3D 信息,因此可通过追踪
角点在各图像位置,进行三角化
光流的局限性
容易受光照变化影响
2
只适合连续图像中的短距离追踪,不适合更长距离
3
图像外观发生明显变化时不适用(例:远处的角点凑近看之后不
为角点了)
4
对角点强依赖,对 Edge 类型点表现较差
5
稀疏光流不约束各点光流的方向统一,可能出现一些 outlier
关键帧与三角化
为什么需要关键帧
1
后端通常实时性较差,不适合处理所有帧;
2
如果相机停止,可能给后端留下无用的优化,甚至导致后端问题
退化 a
a 想象我们对一个停留在原地的窗口做优化会发生什么。
如何选择关键帧
1
关键帧之间不必太近(退化或三角化问题)
2
关键帧之间不能太远(共视点太少)
3
VIO 中,定期选择关键帧(假设 b g , b a 在关键帧期间不变)
• 对于非关键帧,只执行前端算法,不参与后端优化
• 因此,对于非关键帧,它的误差会逐渐累积。直接该帧被作为关
键帧插入后端, BA 才会保证窗口内的一致性
总结关键帧选取的策略:
在计算量允许范围内,且不引起退化时, 应 尽可能多地插入关键帧
ORB-SLAM2 使用非常宽松的关键帧策略(大多数时候只要后端线程
Idle 就会插入关键帧),然后在后端剔除冗余的关键帧
DSO 利用光度误差插入关键帧(插入比较频繁)。然后在后端计算每
个关键帧的 Active Landmarks , Marg 对窗口贡献最低的 2 。
因此, DSO 的关键帧窗口通常有一个很远的和两三个很近的,其他几
个分布在中间
在单目 SLAM 中,通常在插入关键帧时计算新路标点的三角化。
• 有的 SLAM 系统在关键帧时提取新 Feature ( DSO, SVO ),也有
的方案对每个帧都提新 Feature ( VINS, ORB )。
• 前者节省计算量(非关键帧无需提点,节省 5-10ms 左右);后者
效果好( 在单目里需要防止三角化 Landmark 数量不够 )。
三角化的数学描述
• 考虑某路标点 y 在若干个关键帧 k = 1 , · · · , n 中看到。
• y ∈ R 4 ,取齐次坐标。每次观测为 x k = [ u k , v k , 1] ⊤ ,取归一化平
面坐标(这样可以忽略掉内参)。
• 记投影矩阵 P k = [ R k , t k ] ∈ R 3 × 4 ,为 World 系到 Camera 系
• 投影关系:
∀ k, λ k x k = P k y .
(10)
其中 λ k 为观测点的深度值(未知)
• 根据上式第三行:
λ k = P ⊤ k, 3 y
(11)
其中 P ⊤ k, 3 为 P k 的第 3 行