一、前言
结合 高翔老师的著作《视觉SLAM十四讲:从理论到实践》,加上小白的工程经验共同完成。建议作为笔记功能反复使用。
二、特征点法
- 特征点;(特征点 = 关键点 + 描述子 )
关键点:特征点在图像里的位置;描述子:通常是一个向量,描述了该关键点周围像素的信息。 - ORB 特征;(FAST角点提取 和 BRIEF 描述子)
FAST 是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称。
BRIEF 是一种二进制描述子,它的描述向量由许多 0 和 1 组成。 - 特征匹配。(通过图像与图像,或者图像与地图之间的描述子进行准确的匹配)
描述子距离表示了两个特征之间的相似程度,我们往往使用汉明距离做为度量——两个二进制串之间的汉明距离指的是它不同位数的个数。
三、实践:特征提取和匹配
目前主流的集中图像特征在 OPenCV 开源图像库中都已经集成完毕。
相机为单目时:问题是两组2D点估计运动,用对极几何来解决。
相机为双目、RGB-D时:问题是两组3D点估计运动,通常用 ICP来解决。
有3D点和它们在相机的投影位置,该问题通过PnP来解决。
四、2D-2D:对极几何
- 对极约束;(基础矩阵(Fundamental Matrix) F 和 本质矩阵(Essential Matrix) E)
对极约束简洁地给出了两个匹配点的空间位置关系。 - 本质矩阵;(八点法)
- 单应矩阵。( 处于共同平面上的一些点,在两张图像之间的变换关系)
避免退化现象,同时估计基础矩阵F和单应矩阵H,选择重投影误差比较小的那个作为最终的运动估计矩阵。
五、实践:对极约束求解相机运动
使用 OpenCV 提供的算法求解
- 尺度不确定性;(单目初始化不能只有纯旋转,必须有一定程度的平移)
- 多于八对点的情况;(使用随机采用一致性求解)
六、三角测量
三角测量是指,通过在两处观察同一个点的夹角,确定该点的距离。
七、实践:三角测量
- 三角测量代码。(调用 OpenCV提供的trangulation函数进行三角化)
- 讨论。
增加三角化的精度:提高特征点的提取精度;增大平移量。
八、3D-2D:PnP
PnP描述了当我们知道n个3D空间点以及它们的投影位置时,如何估计相机所在的位姿。因此,在双目或RGB-D的视觉里程计中,我们可以直接使用PnP估计相机运动。它是一种重要的位姿估计方法。
- 直接线性变换(DLT);(这里的x使用了归一化平面坐标,去掉了内参矩阵K的影响)
- P3P;(使用三对匹配点ABC)
我们知道的是A,B,C在世界坐标系中的坐标,而不是在相机坐标系中的坐标。一旦3D点在相机坐标系下的坐标能够算出,我们就得到了3D-3D的对应点,把PnP问题转换为了ICP问题。 - Bundle Adjustment。(最小化重投影误差)
重投影误差:将像素坐标(观测到的投影位置)与3D点按照当前估计的位姿进行投影得到的位置相比较得到的误差。
在SLAM当中,通常的做法是先使用P3P/EPnP等方法估计相机位姿,然后构建最小二乘优化问题对估计值进行调整(Bundle Adjustment)。
九、实践:求解PnP
- 使用 EPnP求解位姿;(首先使用 OpenCV提供的 EPnP求解 PnP问题,然后使用g2o对结果进行优化)
- 使用 BA优化。(g2o提供了很多BA的节点和边。在使用 g2o之前,我们要把问题建模成一个最小二乘的图优化问题)
程序流程:
首先,声明 g2o的图优化,配置优化求解器和梯度下降的方法;
然后,根据得到的特征点,将位姿和空间点放到图中。
最后,调用优化函数进行求解。
十、3D-3D:ICP(迭代最近点)
仅考虑两组 3D点之间的变换时,和相机并没有关系。ICP的求解也分为两种方式:线性代数的求解(SVD)与 非线性优化求解。
- SVD方法;(先定义第i对点的误差项,然后构建最小二乘问题,求使误差平方和达到极小的R,t )
- 非线性优化方法。(以迭代的方式去寻找最优解,ICP求解可以随意选定初始值)
混合着使用 PnP和 ICP优化:
对于深度已知的特征点,用建模它们的 3D-3D误差;对于深度位置的特征点,则建模3D-2D的重投影误差。于是,可以将所有的误差放到一个问题中考虑,使得求解更加方便。
十一、实践:求解ICP
- SVD方法;(调用 Eigen进行SVD,然后计算R,t矩阵)
- 非线性优化方法。(与 SVD思路不同的地方在于,在优化中我们不仅考虑相机的位姿,同时会优化3D点的空间位置)
《视觉SLAM十四讲:从理论到实践》 PDF资源
下载链接:Robot_Starscream的资源 仅供各位研究员试读,请购买纸质书籍。