因为kitti目前榜单排行第一的是soft2,所以这周对于soft的两篇论文做解读分析(本人对视觉SLAM的认识比较粗糙,分析有误之处请各位不吝赐教)
《SOFT-SLAM:Computationally efficient stereo visual simultaneous localization and mapping for autonomous unmanned aerial vehicles》( JFR 2017 )
Motivation
虽然目前有很多的精确鲁棒的VSLAM方法,但是他们都需要比较大的计算资源,考虑到理论上只需要三个精确的点就可以计算准确的位姿,那么是否可以选择最佳的特征子集并以最小的计算资源计算最精确的位姿?
Contribution
-
不使用BA(BA太吃计算资源),使用SOFT里程计进行定位,达到了0.8%的误差和20hz的速度,目前在KITTI榜单上排名第一。
-
提出的SLAM框架支持大范围的闭环检测,并且完全解偶里程计和建图线程(即里程计可以实时运行,不需要等待建图线程的消息)。并且和ORB-SLAM2不一样的是,因为ORB-SLAM2是多线程,所以它会对同样的输入数据产生不同的输出结果,但是这个方法可以保证对同样的输入数据,输出结果相同。
-
使用SOFT特征进行回环,使得整个系统更加高效简洁,并且可以实现亚像素级别的精度,尽管SOFT特征对于旋转和尺度不是不变的,但是作者通过实验证明了在大部分数据集上的准确性。
-
在Euroc和kitti数据集上进行了系统的分析。
Content
-
系统框架
如下图, 里程计线程和建图线程是两个相互独立的线程,这两个线程的输出最后通过一个指数滤波进行关联。在里程计模块,特征点提取是用角点和blob mask,IMU用来预测相对位移用来定义特征匹配的搜索半径,然后通过SAD进行匹配,用到预测坐标系的距离进行加权,得到的特征点通过RANSAC获得内点,如果有IMU,那就1-RANSAC,如果没有,那就5-RANSAC, 另外,在kitti数据集中,先通过一个相机获得旋转约束再进行估计会精度更高。建图部分基于g2o。
-
里程计线程
在这个部分,作者描述了两套配置的里程计,主要区别在于是否携带IMU。
a. 特征点管理模块
这个模块主要包含三个部分,分别是特征点提取和匹配,特征点跟踪,特征点选择:
- 特征点提取和匹配: 这个部分主要需要重点提一下的是作者提出的环形匹配规则,主要当特征点符合环形匹配规则时才保留,否则丢弃,环的构成分成四帧五步(k到k-1的帧的预测,如果有IMU,就通过IMU提供,没有就通过匀速运动模型预测。):
- 特征点追踪: 将唯一标识符和描述添加到相关特征,并且特征的年龄设置为0,在次像素级别迭代优化特征的位置,使用的优化补丁如下图:蓝点和橙点分别是两个不同的特征点,实现代表特征点匹配,虚线代表优化过程,右上角的补丁里的灰度等级代表给定的像素的权重更大,最小行是图片匹配实例。
为了加长特征点的生命周期(如果对应特征点变化的过快,则生命周期会缩短,特征点生命周期越长说明这个特征点越有效),需要根据先验位姿预测来矫正特征点,并且为了降低计算量,一个通用的方法是假设一个指向相机的法向量补丁。这样的假设虽然延长了特征点的寿命,同样也增大了累积误差,所以需要维持新旧特征点合适的比值。
-
特征点选择: 提出了一种选择策略,该策略考虑了跨图像的强特征的空间和时间变化。这个策略使得远近特征的数量很好地平衡,并且特征在整个图像上均匀分布。整个策略如下:
- 首先,图片通过5x5的corner patch和5x5的blob patch进行卷积,两个卷积图像的最大最小值代表四类特征的图像坐标: corner max, corner min, blob max, blob min.然后根据图像梯度中的周围像素值构建特征描述,包括水平和垂直方向。
- 然后,将图像分成50x50个bucket,每个bucket里有四类特征: corner max, corner min, blob max, blob min。
- 对于每一类特征,特征点使用如下的对比函数进行排序:
-
对于符合选择标准的特征点,依次放入对应bucket的特征点集。
b. 不使用IMU的位姿估计
流程如下图, 并且因为主要依赖的是单目五点法,所以不受左右相机矫正不完美的影响。大体流程分成两步,一是先通过五点法估计旋转,二是将估计的旋转作为先验通过重投影误差来估计平移
c. 使用IMU的位姿估计
流程如下图
d. 指数滤波
主要是因为真实环境的无人机的突然的震荡可能会对位姿更新产生非常负面的影响,所以将位姿分割成四元数和平移向量,然后分别通过指数滤波进行更新:
\[\begin{array}{l} R_{m, k}^{b}=R_{m, k-1}^{b}\left(\left(R_{m, k-1}^{b}\right)^{-1} R_{m, k}^{b, z}\right)^{\frac{1}{\alpha}} \\ t_{m, k}^{b}=t_{m, k-1}^{b}+\alpha\left(t_{m, k}^{b, z}-t_{m, k-1}^{b}\right) \end{array}\]-
建图线程之关键帧选择模块
如下图,图片阐述的非常清晰。
-
回环检测
将关键帧候选集里的关键帧按照如下步骤评分:
- 使用循环匹配和NCC来确定参与的关键帧和新的关键帧之间的匹配度
- 通过三点RANSAC来确定最合适的平移变化假设和内点。
- 如果内点数量大于阈值,应用图优化获得位姿
- 另外如果优化的位姿距离过大,则停止回环检测。
-
实验结果
Conclusion
作为17年的JFR, 这篇文章还是很厉害的,里程计建图模块都是自己设计,描述子也自己设计,并且对于点的管理,关键帧的管理,都有自己创新的方式,最终的效果也很好,唯一的缺点在于没有开源….