SLAM学习笔记(二) 视觉里程计

视觉里程计属于前端优化工作,核心包括估计相机的运动(通常用旋转矩阵R和平移矩阵t来表征)和估计特征点三维位置。常见方法包括特征点法、光流法和直接法。

视觉里程计

  • 特征点法
    • 特征点及其匹配
    • 估算相机运动
      • 2D-2D:对极几何
      • 3D-2D:PnP
      • 3D-3D:ICP
  • 光流法
  • 直接法
  • 实践设计
  • 仍待深入探讨的问题

特征点法

根据图像中特征点的运动,估计相机的运动。

特征点及其匹配

特征点由关键点(特征点位置)和描述子(关键点周围像素信息)组成。常用特征为ORB,它包括FAST关键点(角点,灰度值与相邻像素相差大)和BRIEF描述子(相邻像素大小关系)。常见匹配方法包括暴力匹配和快速近似最邻(FLANN)

估算相机运动

2D-2D:对极几何

已知匹配的特征点在图像中的坐标,求解相机运动时的旋转矩阵和平移矩阵。关键在于求解本质矩阵E(可用八点法,即八个点对来估计),再将E进行分解即可通过对应关系求出R,t。


也可以通过单应矩阵H(平面与平面的对应关系)来求解。当特征点共面或者发生纯旋转时,自由度会减少,这时候会同时求解E和H,选取重投影误差小的作为最后的估计值。

值得注意的是,单目相机建图具有尺度不确定性,它的初始化不能只有纯旋转,必须有一定程度的平移。当点多于八对时,更倾向于采用随机采样一致性(RANSAC)来求解,而不是最小二乘法。

单目SLAM中,获得相机运动估计后,可使用三角测量的方法估计特征点深度(s即为深度)。提高三角测量的精度有一个矛盾,如果提高图像分辨率计算量就会增大,如果增大平移量,图像外观会发生变换。所以会用深度滤波器计算特征点的位置及不确定性。

3D-2D:PnP

已知空间点及其投影位置(至少需要四对,其中一对用于验证结果),在双目或RGB-D中应用较多。这里主要介绍直接线性变换(DLT)、P3P、Bundle Adjustment三种方法。

  • 直接线性变换(DLT):最少通过六对匹配点,直接求解参数,匹配点过多时用最小二乘法。
  • P3P:三对匹配点,一对验证点。利用三角形相似原理,求解2D点对应的三维坐标,将其转换为3D-3D问题。
  • Bundle Adjustment:李代数上的非线性最小二乘,最小化重投影误差(先估计相机位姿,再求空间点的投影,使估计值与实测值相差小)。误差对空间点的导数可用于与优化特征点的空间位置,这些导数关系能给实际的优化提供梯度方向。

3D-3D:ICP

已知两组3D点的对应关系,可用于激光SLAM。主要介绍线性代数求解(SVD)和非线性优化求解两种方法。

  • 线性代数(SVD):求解去质心坐标(记为q),求解R后求解t。



  • 非线性优化方法:迭代找最优值,可以任意选定初始值

光流法

可节省特征点匹配的时间,用像素变换来求解角点的运动。基于两个假设:同一点在不同图像中灰度不变,某窗口内的像素具有相同的运动。已知两幅图像,求解像素的运动。之后,用特征点中的方法求解相机的运动。

直接法

最小化光度误差(即求解相机运动后,最小化两幅图像的亮度误差)


直接法中可以选择稀疏关键点、带有梯度的像素点或者所有像素。直接法的缺点有:运动很小时才成功(图像一般是非凸的,搜索容易陷入局部极小)、单个像素没有区分度、灰度值不变较难满足(可用光度模型标定相机)

实践设计

程序框架:bin放可执行二进制文件,include下放头文件,src放源代码,test放测试用的文件,lib放编译好的库文件,config放配置文件,cmake_module放第三方cmake文件。

有五个类:Frame为帧,Camera储存相机内参和外参及坐标系转换,MapPoint为特征点(估计其世界坐标,匹配地图中的特征点,估计相机运动,记录点被观测和匹配的次数),Map管理所有特征点,Config负责参数文件的读取。

可以两两帧匹配,但与局部地图匹配效果更好。

仍待深入探讨的问题

  • 如何提高特征匹配的速度和正确率

你可能感兴趣的:(SLAM学习)