SLAM 前端
目录
SLAM 的框架
相机和路标的建模和参数化
VO 方法的定性比较
特征点提取、匹配和光流
关键帧与三角化
总结关键帧选取的策略:
三角化的数学描述
SLAM 的框架
通常的 SLAM 框架由前后端共同构成
1
前端:提取特征点,追踪相机 Pose,定位相机
2
后端:提供全局优化或滑动窗口优化

前端的步骤?初始化、正常追踪、丢失处理
2
相机和路标的建模和参数化
xcamera = [R, t], xlandmark = ?
(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 参数的估计),我们
留到下讲介绍。
思考:为什么要有这样的框架?
特征点提取
在光流中,我们通常选择角点来追踪。 为什么需要角点?
角点的梯度在两个方向都有分布
利用角点附近块的两个特征值大小,可以判断该区是否为角点。
SHarris = det (M) − ktr (M) 2 . k = 0.04 − 0.06
FAST/GFTT 角点
FAST:仅含像素亮度、不含计算的快速角点提取方式;
GFTT:在 Harris 基础改进:Shi-tomasi 分数,增加固定选点数,
等等
SShi−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 中,定期选择关键帧(假设 bg, ba 在关键帧期间不变)
• 对于非关键帧,只执行前端算法,不参与后端优化
• 因此,对于非关键帧,它的误差会逐渐累积。直接该帧被作为关
键帧插入后端,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,取齐次坐标。每次观测为 xk = [uk, vk, 1]⊤,取归一化平
面坐标(这样可以忽略掉内参)。
• 记投影矩阵 Pk = [Rk, tk] ∈ R 3×4,为 World 系到 Camera 系
• 投影关系:
∀k, λkxk = Pky.
(10)
其中 λk 为观测点的深度值(未知)
• 根据上式第三行:
λk = P ⊤ k,3y
(11)
其中 P⊤ k,3 为 Pk 的第 3 行