0. 简介
视觉里程计最近几年越来越受到学术界以及工业界的认可,以ORB和VINS为代表的视觉SLAM已经可以满足绝大多数场景,而OV2SLAM在其他VSLAM中脱颖而出,其实时性以及具体的回环性能在测试中都得到了认可。下面我们就来看一下《OV2SLAM : A Fully Online and Versatile Visual SLAM for Real-Time Applications》这篇文章,当然这么经典的论文也已经开源了,代码在Github上可以找到。
【ICRA2021】3475-OV2SLAM:用于实时应用的完全在线和通用的视觉SLAM
1. OV2SLAM与ORB-SLAM2的对比
下图为OV2SLAM的示意图
下图为ORB-SLAM2示意图
下面是两个算法的对比
OV2SLAM | ORBSLAM2 | 对比 | |
特征点提取与匹配 | Fast + LK光流 | Fast + ORB 描述子 | LK光流速度快 |
输出的实时pose | PnP | Motion-only BA | Motion-only BA精度高一点 |
初始化 | 单目:前两个关键帧E分解,并三角化,则初始化成功。 双目:第一帧双目计算3D点,即可完成初始化。 | 单目:前两个关键帧E分解,并三角化,则初始化成功。 双目:第一帧双目计算3D点,即可完成初始化。 | 一致 |
三角化 | 单目:关键帧特征点三角化 双目:光流匹配左帧,右目新检测的点可以进行Temporal三角化 | 单目:关键帧特征点三角化 双目:描述子匹配完之后,利于fb/d =z 计算深度 | ORBSLAM2需要双目矫正过的图像 |
localBA | 共视图包含的3D点和位姿一起优化 | 共视图包含的3D点和位姿一起优化 | 一致 |
回环检测 | iBowLCD 在线构建字典 | DBOW 离线训练字典 | |
posegraph | 作为优化的初始值 | 作为优化的初始值 | 一致 |
优化 | looselyBA 仅优化回环帧和当前帧相关联的3D点和关键帧位姿 | FullBA 优化全部关键帧的位姿和3D点 | FullBA更准一些 |
我们从上表中可以看到相比于ORB-SLAM2而言,OV2SLAM有以下四个主要的区别点
- 放弃了ORB算子,采用了LK光流来代替。这样可以大大的节省前端特征点提取的时间
- 在输出实时pose的时候,ORBSLAM2精度比OV2SLAM高,相比于ORBSLAM2使用TrackLocalMap来进行motion-only的BA而言,OV2SLAM输出的实时pose是通过PnP计算出来的。虽然OV2SLAM也有TrackLocalMap,但是他这一步仅进行特征点的re-track, 没有进行位姿计算。
- 在回环检测部分ORBSLAM2使用的是DBOW 离线训练字典,而OV2SLAM使用的是iBowLCD 在线构建字典,这就导致OV2SLAM可以适应更多的场景
- 最后也是最关键的就是全局位姿输出,ORBSLAM2使用的是FullBA 优化来优化全部关键帧的位姿和3D点,而OV2SLAM使用的是looselyBA,这个优化方式仅优化当前帧和回环帧关联的信息。所以使用FullBA 可以影响到包括losselyBA以及其余关键帧的pose和3D点。
2 视觉前端
这部分内容其实都大同小异,值得一提的是
图像预处理(image pre-processing )
关键点追踪(keypoint tracking)
离群值滤波(outlier filtering)
位姿估计(pose estimation)
触发条件,创建关键帧(keyframe creation triggering)
这里这篇文章给出了整个流程图
下面我们来简述一下具体流程
- 图像预处理:通过CLAHE进行对比度增强,这既增加了动态范围,又限制了曝光适应引起的强度变化。
- 关键点追踪:关键点跟踪是通过引导的从粗到精的光流法来执行的。使用具有9×9像素窗口和金字塔比例因子为2的反向组合Lucas-Kanade(LK)算法[12]的金字塔实现来单独跟踪关键点。这里提到2D点和3D点这两种,对于3D关键点(即已经三角化的3D关键点),会先使用匀速运动模型估计当前帧的初始位姿,然后将3D keyoints对应的3D点投影到当前帧,作为该3D keypoints在当前帧的初始位置。对于2D关键点-即那些没有关于其真实3D位置的先验信息的关键点,会将其在当前帧的初始位置设置为在上一帧中的位置
- 离群值滤波:采用基于核线约束的RANSAC滤波,使用3D关键点估计基础矩阵(Essential Matrix)然后用它来过滤不一致的2D关键点。
- 位姿估计:使用稳健的Huber成本函数最小化3D关键点重投影误差来执行姿态估计,也就是我们上文提到的PnP计算位姿并更新运动模型
- 创建关键帧:跟踪的3D关键点的数量w.r.t.。最后一个关键帧低于阈值(跟踪的关键点少于85%),或者如果检测到明显的视差(平均15个像素的未旋转关键点运动),则会创建新的关键帧。
值得一提的是OV2SLAM将每张图像分为nbwcells*nbhcells个网格,是基于网格的特征提取。每一帧的更新也是只保留了一个指向当前帧的指针pcurframe,用于实时记录当前帧跟踪到的2D、3D特征点以及位姿信息。接受到新图像时只更新时间戳和帧号,在光流跟踪以及计算位姿后分别更新当前帧的特征点、位姿信息并更新运动模型。
3. 建图线程
主要处理两个任务,负责三角化以及局部地图的跟踪,在双目的配置情况下会增加立体匹配的功能。
3.1 三角化
mapping中的三角化是整个系统中唯一生成3D点的地方,包括初始化成功后的生成初始地图。三角化的主要功能是在当前关键帧与共视关键帧之间产生新的地图点,使得跟踪更稳。
具体过程为:对于当前关键帧中的每一个2D特征点,将当前2D点与第一次观测到该2D点的关键帧中的对应2D点进行三角化。相比ORB-SLAM中将当前关键帧与其共视程度最高的20帧至少有15个共视点的相邻关键帧通过词袋进行特征匹配,再将成功匹配的点对进行三角化的策略,二者的效果有待进一步实验对比。 下图为ORB-SLAM的LocalMapping中的三角化搜索范围。这个操作和ORB-SLAM2类似
3.2 暂时三角化
通常用于单目初始化3D地图,本文发现在双目情况下可以用于在当前关键帧之前,已经正确追踪到,但找不到双目匹配的关键点。这时所有成功三角化的地图点立刻应用于前端进行定位,然后这些3D位置通过BA进行重新优化。
3.3 局部地图追踪
类似于ORB-SLAM2局部地图,局部地图包括当前关键帧或共视图关键帧观察到的3D地图点。
局部地图追踪的目标是找出属于局部地图的3D地图点是否可以与当前帧的关键点相匹配。 这种重追踪的操作可以看做是基本的回环检测。
任意这样的3D地图点,在当前关键帧的投影与一个关键点的距离少于两个像素点时被定义为候选匹配。计算3D地图点和其他几个候选点的距离,接受最近距离的候选。
4. 状态估计线程
使用局部BA来精炼已选择的关键帧位姿和3D地图点位置,此外过滤冗余的关键帧来限制外来局部BA的运行时间。
4.1 局部地图的优化
这里的优化与ORB-SLAM相近,**优化当前关键帧和与其至少有25个共视点的相邻关键帧的位姿以及这些关键帧对应的地图点的3D坐标,**对于那些不在这些关键帧范围内,但是可以观测到这些地图点的关键帧,也将观测添加到BA中但是不对这些关键帧的位姿进行优化。
4.2 关键帧过滤
删去关键帧的标准为:该关键帧观测到的95%3D点已经被至少其他4个关键帧观测到
5. 在线词袋回环检测器
回环检测主要负责检测回环和重定位,即校正当前姿势估计和当前帧与已检测到LC的已传递关键帧之间的估计轨迹。这是一个重要的创新点。主要流程主要分为关键帧预处理、使用iBoW-LCD算法检测候选关键帧、验证候选关键帧、位姿图优化以及looseBA。
5.1 关键帧预处理以及选取候选关键帧
作者在论文中提到,出于定位的考虑,OV2SLAM并不会跟踪太多的特征点(大概只有200多)。在这里为了更新词袋树,对每幅图像额外提取300个FAST特征并计算其描述子,然后将此关键帧传给iBoW-LCD用于更新词袋树,当关键帧数量大于100帧时,在词袋树中查找当前关键帧的闭环候选关键帧。