基于直接法的双目回环检测算法实现
在视觉SLAM领域中按照误差方程的不同可以分为特征点法的视觉SLAM和直接法的视觉SLAM,比如PTAM(http://www.robots.ox.ac.uk/~gk/PTAM/) 和ORB-SLAM (http://webdiis.unizar.es/~raulmur/orbslam/)都是经典的特征点法SLAM,而DSO(https://vision.in.tum.de/research/vslam/dso)和LSD-SLAM(https://vision.in.tum.de/research/vslam/lsdslam)为经典的直接法SLAM。特征点法和直接法各有优缺点,具体如下表一所示
表一 特征点法和直接法优缺点对比表
优点 | 缺点 | |
特征点法 | 即使相邻帧运动过大,也能很好地tracking | 计算特征点和描述子耗时 |
原生支持回环检测 | 只能构建稀疏地图 | |
相机的自动曝光影响较少,并且对双目比较友好 | 场景要求高,需要大量不同角点 | |
直接法 | 无需计算特征点和描述子 | 回环检测和全局优化较困难 |
对场景要求宽松,只需要有梯度变化,无需角点 | 基于灰度不变的假设,相机的曝光会影响结果,并且对双目不友好 | |
可以构建半稠密或稠密地图 | 非凸性较强,相邻帧运动过大容易陷入局部最优 |
基于直接法的SLAM由于没有特征点的支持,因此无法实现SLAM中的回环检测功能,而回环检测功能又是SLAM中消除累计误差的一个重要功能,因此我们在DSO的基础上增加了回环检测方法。此外直接法多用于单目视觉的计算,没有实际的物理尺寸,我们添加了双目传感器,并基于双目实现了带有物理尺度的直接法SLAM。
增加的回环检测算法利用开源的DBOW3,收集每个关键帧的所有SIFT特征描述子,用于生成BoW(bag of word)并记录保存下来,对每个关键帧进行描述,用于之后的回环检测。每一个用于回环的关键帧被单独记录下来,并在回环检测模块发现回环的时候使用图优化算法进行全局优化,最后实现累积误差的消除。具体结果如下图所示:
图一 在实验室测试结果(左图:回环之前,右图:回环之后)
添加双目后的直接法需要将双目的尺度信息在里程计部分添加到系统中,首先我们将DSO初始化更改为基于双目的初始化,使得直接法在初始化的深度点云具有真实的物理尺寸,同时在tracking过程中将双目的深度点云信息融合到传统的直接法中,保证了整个视觉SLAM运行过程中尺度不会发生漂移,最终结果在ROS的RVIZ中如下图二所示
图二 添加双目后的视觉里程计结果(一个方格边长为1m,测试环境为15x10m)