补充 深蓝学院-手写VIO 第六章 与《十四讲》前端知识不重合的部分。内容较少,没有前几章丰富。
- ORB-SLAM2 使用 Covisibility-Graph,具有较好的全局精度
- DSO 使用带边缘化的滑动窗口,无回环时漂移较少
- Tango 使用 MSCKF,计算量明显少于其他算法
算法的结果和数据集关系很大:
- Kitti 属于比较简单的(视野开阔,动态物体少,标定准确)
- EUROC 一般(人工设定场景,纹理丰富,但曝光有变化)
- TUM-Mono 比较难(场景多样,主要为真实场景)
特征点提取、匹配和光流
使用角点的原因:
- 焦点可以避免如下图中对纹理不强的部分提取图像块,难以找到匹配的对象;
- 对边缘特征而言,整个线特征上的像素梯度没有较大改变;
- 可以用同一变换求得的 R, t 通过重投影误差求算其他图像块。
角点的梯度分布:
- Harris:
- FAST:仅含像素亮度、不含计算的快速角点提取方式,也是《十四讲》中讲到的;
- GFTT:在 Harris 基础上改进:Shi-tomasi 分数,增加固定选点数等。
光流的灰度不变假设:
一阶泰勒展开:
带 Warp function 的光流:
其中 W 为 Warp Function,通常取仿射变换:
其中
为 W 的参数,需要在线估计。 可以参考这篇论文: Baker S , Matthews I . Lucas-Kanade 20 Years On: A Unifying Framework[J]. International Journal of Computer Vision, 2004, 56(3):221-255.
关键帧与三角化
如何选择关键帧:
- 关键帧之间不必太近(退化或三角化问题)
- 关键帧之间不能太远(共视点太少)
- VIO 中,定期选择关键帧(假设 在关键帧期间不变,意思是在相机静止时,默认 不变,但实际上是游走的)
- 对于非关键帧,只执行前端算法,不参与后端优化
- 对于非关键帧,误差会逐渐累积。直接该帧被作为关键帧插入后端,BA 才会保证窗口内的一致性
ORB-SLAM2:使用非常宽松的关键帧策略(大多数只要后端线程 ldle 就会插入关键帧),然后在后端剔除冗余的关键帧。
DSO:利用光度误差插入关键帧。然后在后端计算每个关键帧的 Active Landmarks,Marg 对窗口贡献是最低的。DSO的关键帧窗口通常有一个很远的和两三个很近的,其他几个分布在中间。 在单目 SLAM 中,通常在插入关键帧时计算新路标点的三角化。
三角化的数学描述
- 某路标点 在若干个关键帧 中看到。
- ,用齐次坐标表示。每次观测为 ,取归一化平面坐标(这样可以忽略掉内参)。
- 记投影矩阵 ,为 World 系到 Camera 系。
- 投影关系: ,其中 为观测点的深度值(未知)。
- 上式可以剔出 的第三行,也就是对深度处理的一行:
- 把 带入到前两行,有:
- 多次观测提供的方程,视 为未知量,并移到等式一侧:
- 是 零空间中的一个非零元素。
解法:
- 由于 ,在观测值大于等于两次时,很可能满秩,无零空间。
- 求最小二乘解:
- 对 进行 SVD:
- 为奇异值,由大到小排列, 正交。取 。
- 判断解有效性的条件: 。
- Rescale:在某场合(比如用 UTM 坐标的平移), 的数值大小差异明显,导致解不稳定,做一个缩放,很像归一化:
- 为一个对角阵,取 最大元素之逆即可。
- 实用中,还需要加上 投影的正负号的判定作为依据。