从零手写VIO——(五)视觉前端 Frontend

150
0
2020年10月7日 20时24分

补充 深蓝学院-手写VIO 第六章 与《十四讲》前端知识不重合的部分。内容较少,没有前几章丰富。

 

从零手写VIO——(五)视觉前端 Frontend插图

 

从零手写VIO——(五)视觉前端 Frontend插图(1)
前端 Frontend 非常能体现一个 SLAM 的追踪效果
  • ORB-SLAM2 使用 Covisibility-Graph,具有较好的全局精度
  • DSO 使用带边缘化的滑动窗口,无回环时漂移较少

 

图标

 

从零手写VIO——(五)视觉前端 Frontend插图(3)
纵坐标为运行次数,横坐标为误差。越偏↖角效果越好。说明误差小的运行轮数多,也就是更多次迭代的结果呈现出来的好
  • Tango 使用 MSCKF,计算量明显少于其他算法

算法的结果和数据集关系很大:

  • Kitti 属于比较简单的(视野开阔,动态物体少,标定准确)
  • EUROC 一般(人工设定场景,纹理丰富,但曝光有变化)
  • TUM-Mono 比较难(场景多样,主要为真实场景)

 

从零手写VIO——(五)视觉前端 Frontend插图(4)
直接法(↘)台阶、墙壁的线特征都可以使用,但特征点很难在这些纹理上提取到。光流法最早、最成熟,但容易受关照影响。FAST+光流/GFTT+光流是使用的快速算法。特征匹配需要特征具有旋转平移缩放不变性,SIFT/SURF最好,BRISK次之,ORB最差

特征点提取、匹配和光流

从零手写VIO——(五)视觉前端 Frontend插图(5)
传统双目光流前端流程

使用角点的原因:

  1. 焦点可以避免如下图中对纹理不强的部分提取图像块,难以找到匹配的对象;
  2. 对边缘特征而言,整个线特征上的像素梯度没有较大改变;
  3. 可以用同一变换求得的 R, t 通过重投影误差求算其他图像块。
从零手写VIO——(五)视觉前端 Frontend插图(6)
光流的局限性:①容易受光照变化影响;②只适合连续图像短距离追踪;③图像外观发生明显变换不适用;④对角点强依赖,对 Edge 类型点表现差;⑤稀疏光流不约束各点光流的方向统一,可能出现 outlier。

角点的梯度分布:

从零手写VIO——(五)视觉前端 Frontend插图(7)
↗:无明显梯度特征,纹理特征少;↙:角点特征,x y方向有明显梯度特征;↘:边缘特征,仅有一个方向的梯度特征
  • Harris:
从零手写VIO——(五)视觉前端 Frontend插图(8)
(1)
从零手写VIO——(五)视觉前端 Frontend插图(9)
(2)
  • FAST:仅含像素亮度、不含计算的快速角点提取方式,也是《十四讲》中讲到的;
  • GFTT:在 Harris 基础上改进:Shi-tomasi 分数,增加固定选点数等。
从零手写VIO——(五)视觉前端 Frontend插图(10)
(3)

光流的灰度不变假设:

从零手写VIO——(五)视觉前端 Frontend插图(11)
(4)

一阶泰勒展开:

从零手写VIO——(五)视觉前端 Frontend插图(12)
(5)
从零手写VIO——(五)视觉前端 Frontend插图(13)
(6)

带 Warp function 的光流:

从零手写VIO——(五)视觉前端 Frontend插图(14)
从零手写VIO——(五)视觉前端 Frontend插图(15)
(7)

其中 W 为 Warp Function,通常取仿射变换:

从零手写VIO——(五)视觉前端 Frontend插图(16)
(8)

其中 [公式] 为 W 的参数,需要在线估计。

 

可以参考这篇论文:

Baker S , Matthews I . Lucas-Kanade 20 Years On: A Unifying Framework[J]. International Journal of Computer Vision, 2004, 56(3):221-255.

 

 

关键帧与三角化

如何选择关键帧:

  1. 关键帧之间不必太近(退化或三角化问题)
  2. 关键帧之间不能太远(共视点太少)
  3. VIO 中,定期选择关键帧(假设 [公式] 在关键帧期间不变,意思是在相机静止时,默认 [公式] 不变,但实际上是游走的)

 

从零手写VIO——(五)视觉前端 Frontend插图(19)
如果相机静止,可能给后端留下没有用的优化,如图,会出现逆深度无法估计,不能三角化
  • 对于非关键帧,只执行前端算法,不参与后端优化
  • 对于非关键帧,误差会逐渐累积。直接该帧被作为关键帧插入后端,BA 才会保证窗口内的一致性

 

从零手写VIO——(五)视觉前端 Frontend插图(20)
在计算量允许的范围内,且不引起退化,应尽可能多地插入关键帧

 

ORB-SLAM2:使用非常宽松的关键帧策略(大多数只要后端线程 ldle 就会插入关键帧),然后在后端剔除冗余的关键帧。

从零手写VIO——(五)视觉前端 Frontend插图(21)
DSO

 

DSO:利用光度误差插入关键帧。然后在后端计算每个关键帧的 Active Landmarks,Marg 对窗口贡献是最低的。DSO的关键帧窗口通常有一个很远的和两三个很近的,其他几个分布在中间。

 

在单目 SLAM 中,通常在插入关键帧时计算新路标点的三角化。

三角化的数学描述

  • 某路标点 [公式] 在若干个关键帧 [公式] 中看到。
  • [公式] ,用齐次坐标表示。每次观测为 [公式] ,取归一化平面坐标(这样可以忽略掉内参)。
  • 记投影矩阵 [公式] ,为 World 系到 Camera 系。
  • 投影关系: [公式] ,其中 [公式] 为观测点的深度值(未知)。
  • 上式可以剔出 [公式] 的第三行,也就是对深度处理的一行:
从零手写VIO——(五)视觉前端 Frontend插图(30)
(9)
  • 把 [公式] 带入到前两行,有:
从零手写VIO——(五)视觉前端 Frontend插图(32)
(10)
  • 多次观测提供的方程,视 [公式] 为未知量,并移到等式一侧:
从零手写VIO——(五)视觉前端 Frontend插图(33)
(11)
  • [公式] 是 [公式] 零空间中的一个非零元素。

 

解法:

  • 由于 [公式] ,在观测值大于等于两次时,很可能满秩,无零空间。
  • 求最小二乘解:
从零手写VIO——(五)视觉前端 Frontend插图(36)
(12)
  • 对 [公式] 进行 SVD:
从零手写VIO——(五)视觉前端 Frontend插图(38)
(13)
  • [公式] 为奇异值,由大到小排列, [公式] 正交。取 [公式] 。
  • 判断解有效性的条件: [公式] 。
  • Rescale:在某场合(比如用 UTM 坐标的平移), [公式] 的数值大小差异明显,导致解不稳定,做一个缩放,很像归一化:
从零手写VIO——(五)视觉前端 Frontend插图(43)
(14)
  • [公式] 为一个对角阵,取 [公式] 最大元素之逆即可。
  • 实用中,还需要加上 [公式] 投影的正负号的判定作为依据。

发表评论

后才能评论