视觉SLAM十四讲——第七讲视觉里程计1
@ 《视觉SLAM十四讲》知识点与习题
《视觉SLAM十四讲》第七讲知识点整理+习题
正在学习SLAM相关知识,将一些关键点及时记录下来。
知识点整理
本讲主要关注基于特征点方式的视觉里程计算法,涵盖了特征点提取、匹配,2D-3D, 3D-3D,点云匹配以及利用三角化获得2D图片上对应点的三维结构
特征点法中,将特征点看作是固定在三维空间的不动点,根据它们在相机中的投影位置,通过最小化重投影误差来优化相机运动。因此需要准确的知道空间点在两个相机中投影后的像素位置——所以需要对特征点进行匹配或跟踪
-
特征点法的前端 :前端的目的是如何根据图像来估计相机运动。特征点法的前端运行稳定,对光照、动态物体不敏感,是目前比较成熟的解决方案
-
视觉SLAM中的路标 :指图像特征,可以在不同图像中找到相同的点。希望特征点在相机运动之后保持稳定。理想的情况是,当场景和相机视角发生少量改变时,还能从图像中判断哪些地方是同一个点
-
人工设计的特征点的性质 :可重复性,可区别性,高效率,本地性
-
特征点 :包含关键点和描述子。关键点指该特征在图像里的位置,有时还有朝向、大小等信息;描述子通常是一个向量,描述了该点周围像素的信息。只要两个描述子在向量空间上的距离相近,就可以认为它们是同样的特征点
-
几种特征 :SIFT精确度最高,但是计算量极大,无法在CPU上实时计算。ORB特征,在FAST检测子的基础上加上方向性,且用速度极快的二进制描述子BRIEF,同一幅图片中同时提取1000个特征点,ORB约15.3ms,SURF约217.3ms,SIFT约5228.7ms
-
ORB特征 :
1. FAST角点提取。ORB对FAST方法的改进:引入图像金字塔(对图像进行不同层次的降采样,哇哦!这个和深度学习里面的下采样效果很像欸!),并在每一层上检测角点来获得尺度不变性;对于特征的旋转问题的解决,采用灰度质心法,连接几何中心和质心来表示特征点的方向(因为质心只与像素点的位置和灰度有关,从而导致该特征点方向不会随着图像的旋转而发生改变)
2. BRIEF描述子:使用了随机选点的比较,速度非常快,且由于使用二进制来表示,所以存储也很方便 -
特征匹配 : 解决数据关联问题data association,即确定当前看到的路标与之前看到的路标之间的对应关系。由于图像特征的局部特性,误匹配的情况广泛存在,而且长期以来一直没有得到有效解决,目前已经成为视觉SLAM中制约性能提升的一大瓶颈。因为场景中存在大量重复纹理,使得特征描述非常相似。
-
特征之间的相似程度 :对于二进制描述符,多采用Hamming distance作为度量(不同位数的个数);对于浮点类型的描述子,多采用欧式距离表示
-
根据匹配的点对估计相机的运动 :这里由于相机的原理不同,情况发生了变化:
当相机为单目时,只知道2D的像素坐标,此时问题是根据两组2D点估计运动。该问题用对极几何来解决
当相机为双目、RGB-D时,或通过某种方法得到了深度信息,那么问题就是根据两组3D点估计运动。该问题通常由ICP来解决
如果有3D点及其在相机中的投影位置,也能估计相机的运动。该问题通过PnP求解 -
对极约束 :是等式为零的约束。几何意义是O1,P,O2三者共面,其中包含了平移和旋转。于是,相机位姿估计问题变为了以下两步:根据匹配点的像素位置求出E或F; 根据E或F求出R,t。**2D-2D的对极几何方法需要8个或8个以上的点对,且存在着初始化、纯旋转和尺度的问题。**简洁地给出了两个匹配点的空间位置关系

-
本质矩阵 :E具有尺度不变性。可以使用经典的八点法来求解E。采用SVD进行分解,其中将奇异值矩阵取值为diag(1,1,0)。选择在两个相机中P点都具有正的深度的t和R。
-
单目视觉的初始化 :注意,由于E本身具有尺度不变性,这就导致经过SVD分解以后的t具有尺度不确定性。所以对于单目视觉来说,需要进行单目SLAM的初始化,后续的轨迹和地图的单位就是初始化时固定的尺度。这也就使得,对于单目视觉来说,初始化得两张图像必须有一定程度的平移,而后的轨迹和地图都将以此步的平移为单位
-
基础矩阵 :F
-
单应矩阵 :若场景中的特征点都落在同一平面上,则可以通过单应性来进行运动估计。单应性矩阵通常描述处于共同平面上的一些点在两张图像之间的变换关系
-
当特征点共面或相机发生纯旋转时,基础矩阵的自由度下降,出现“退化”。通常会同时估计基础矩阵F和单应矩阵H,选择重投影误差比较小的那个作为最终的运动估计矩阵
-
三角测量 :通过三角测量来估计地图点的深度,即通过相机的运动来估计特征点的深度。由于噪声的存在,我们估计的R,t不一定精确的使式子为0,更常见的做法是求最小二乘法而不是零解
-
3D-2D PnP :如果两张图片中其中一张特征点的3D位置已知,那么最少只需3个点对就可以估计相机运动。在双目或RGB-D中可以直接使用PnP估计相机运动,但是在单目中,必须先进行初始化,然后才能用Pnp。 此时不需要使用对极约束,又可以在很少的匹配点中获得较好的运动估计,是最重要的一种姿态估计方法
-
注意,使用PnP时需要使用3D点,所以,可以使用RGB-D相机中的深度图作为特征点的3D为止 。
-
P3P :利用三角形相似性质,求解投影点a,b,c在相机坐标系下的3D坐标,最后把问题转换成一个3D到3D的位姿估计问题
-
在SLAM中,通常的做法是先使用P3P/EPnP等方法估计相机位姿,然后构建最小二乘优化问题对估计值进行调整
-
Bundle Adjustment :将相机位姿和空间点位置都看成优化变量,将它们放在一起优化,是一个最小化重投影误差问题。在过程中,会调整相机的位姿,使得这个距离变小。注意,在使用G-N和L-M之前,都需要对每个误差项关于优化变量进行线性化,即一阶Taylor展开。然后,就可以通过链式法则求解误差函数关于位姿和路标位置的偏导


-
迭代最近点ICP :仅考虑两组3D点之间的变换时,和相机并没有关系。用ICP来指代匹配好的两组点间的运动估计问题。用下述步骤来求解ICP

-
对于ICP,当使用非线性优化方法进行求解时,ICP求解可以任意选定初始值
实践
- 特征提取和匹配 :
源代码比较好懂,直接使用ORB类中的create()函数创建对应的detector和descriptor。然后分别调用detect和compute两个函数来计算对应的角点位置和BRIEF描述子。使用暴力汉明距离BruteForce-Hamming进行特征点匹配。
优化过程是指:设置一个经验值30作为下限。当描述子之间的距离大于两倍的最小距离时则认为有误,若在[30, 2*最小距离]之内的匹配点都可以算是好的匹配点


2. **对极约束求解相机运动** :

