之前做了一些 VI ORB SLAM2 与 VINS Mono 性能的对比试验,由于 VI ORB SLAM2 并没有官方的版本,我们主要使用王京实现的一个版本(https://github.com/jingpang/LearnVIORB)来做测试(我们加入了双目 VIO 部分,但不论单目还是双目该版本实现与官方版本性能有较大差距)。VINS Mono (https://github.com/HKUST-Aerial-Robotics/VINS-Mono)是港科大开源的一个单目 VIO 算法,速度快而且性能不错,同样受到很大关注。本篇博客我们对二者进行了一些粗浅的实验对比。
说明如下:
1、实验主要指标为 RMSE:
\(RMSE = \sqrt{\frac{1}{n}\Sigma_{i=1}^{n}{\Big(\frac{d_i -f_i}{\sigma_i}\Big)^2}}\)
2、实验采用 EuRoC 测试集(https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets)。以下是一些初步的实验结果,做一记录。因为没有深入研究和调试,试验次数也比较有限,不一定具有代表性。如大家有任何改进建议或者疑问欢迎留言。
1、ORB 与 VI ORB 对比
以下表格是 ORB 与 VI ORB 两个实验对比结果:
EuRoC | ORB Mono | ORB Stereo | VIORB Mono | VIORB Stereo | VIORB Mono Paper |
---|---|---|---|---|---|
RMSE | RMSE | RMSE | RMSE | RMSE | |
V1_01_easy | 0.015 | 0.087 | 0.094 | 0.09 | 0.023 |
V1_02_medium | 0.020 | 0.065 | 0.118 | 0.067 | 0.027 |
V1_03_difficult | x | 0.085 | x | 0.075 | x |
V2_01_easy | 0.015 | 0.064 | 0.242 | 0.07 | 0.018 |
V2_02_medium | 0.017 | 0.06 | 0.104 | 0.118 | 0.024 |
V2_03_difficult | x | x | x | x | 0.047 |
MH_01_easy | 0.070 | 0.038 | 0.092 | 0.072 | 0.068 |
MH_02_easy | 0.066 | 0.048 | 0.089 | 0.054 | 0.073 |
MH_03_medium | 0.071 | 0.038 | 0.091 | 0.053 | 0.071 |
MH_04_difficult | 0.081 | 0.103 | 0.773 | 0.15 | 0.087 |
MH_05_difficult | 0.060 | 0.056 | 0.286 | 0.099 | 0.060 |
在以上表格中,均使用 RMSE 均方根误差作为评测指标,其中 ORB Mono 和 ORB Stereo 是原始 VO 版本的单目和双目 SLAM 算法;VIORB Mono 和 VIORB Stereo 是王京和我们修改后的 VIO 版本的单目和双目 SLAM 算法;最后 VI ORB Mono Paper 是作者论文中的算法。
从中可以看出,相对于作者论文中的算法效果,在我们所使用的开源版本中并没有完全达到。而王京的代码是基本实现了作者论文中的主要思想的,因此猜测差距主要来自于调参和一些论文中没有公布的细节。
双目 VIO 比单目 VIO 效果要更好也更稳定,不过加入 IMU 的版本均不如原始双目版本的精度。应该是原始 VO 的优化已经比较彻底,IMU 误差项的加入给优化结果造成了更多的不稳定性。这一点在作者论文中也能看到,加入 IMU 的版本并没有比原始单目精度更高。
2、VI ORB 与 VINS Mono 对比(开启闭环)
以下表格是 VI ORB 与 VINS Mono 两个实验对比结果:
EuRoC | VIORB Mono | VIORB Stereo | VIORB Mono Paper | VINS Mono |
---|---|---|---|---|
RMSE | RMSE | RMSE | RMSE | |
MH_01_easy | 0.092 | 0.072 | 0.068 | 0.06 |
MH_02_easy | 0.089 | 0.054 | 0.073 | 0.066 |
MH_03_medium | 0.091 | 0.053 | 0.071 | 0.135 |
MH_04_difficult | 0.773 | 0.15 | 0.087 | 0.056 |
MH_05_difficult | 0.286 | 0.099 | 0.060 | 0.058 |
V1_01_easy | 0.094 | 0.09 | 0.023 | 0.098 |
V1_02_medium | 0.118 | 0.067 | 0.027 | 0.061 |
V1_03_difficult | x | 0.075 | x | 0.064 |
V2_01_easy | 0.242 | 0.07 | 0.018 | 0.052 |
V2_02_medium | 0.104 | 0.118 | 0.024 | 0.174 |
V2_03_difficult | x | x | 0.047 | 0.140 |
从中可以看出 VINS Mono 精度与 ORB 作者论文中的单目精度比是明显不如的,但是与开源版本比精度要高一些,比我们修改的双目版本略低。
VI ORB 是不能完全跑过全部测试集的,特别是快速运动的 V2_03_difficult 测试集结尾阶段会跟丢(原作者不丢),这一点不难理解,因为光流是比较简单的像素级别跟踪,是不容易丢失的,而 ORB 虽然是很弱的描述子依然比类似光流、模板匹配要严格很多,相对来说光流还是很易丢失的(我们简单地用二者的纯前端来实验了下,VINS的光流跟踪在所有测试集未发生跟丢的情况,ORB有跟丢)。
3、VI ORB 与 VINS Mono 对比(关闭闭环)
以上 2 小节中的测试均开启了闭环。虽然 VINS Mono 看起来也实现了比较好的精度,但是其本身对于闭环依赖较大,在关闭闭环后,VINS Mono 的性能是下降较多的:
EuRoC | VIORB Mono Paper | VIORB Stereo | VINS Mono | |||
---|---|---|---|---|---|---|
No Loop | Loop | No Loop | Loop | No Loop | Loop | |
RMSE | RMSE | RMSE | RMSE | RMSE | RMSE | |
V1_02_medium | 0.028 | 0.027 | 0.07 | 0.065 | 0.105 | 0.066 |
V2_02_medium | 0.041 | 0.024 | 0.092 | 0.102 | 0.103 | 0.058 |
MH_04_difficult | 0.217 | 0.087 | 0.288 | 0.243 | 0.300 | 0.174 |
由于水平精力所限并未对实验结果进行详细分析,初步小结如下:
1、在没有闭环情况下,VINS Mono 精度应该略低于 VIORB,而在有闭环情况下,二者精度差距并不大。
2、由于开源 VIORB 版本并非官方实现,与作者版本肯定有很多不同之处,因此没有办法测试真实官方 VIORB 的性能,但基本可以看出对于 ORB SLAM2 这一框架来说,IMU 的引入主要是在快速运动时能够减少一些丢失,而精度上与 VO 相近或略有下降;
3、以光流做为前端的 VINS Mono 比描述子作为前端的 VIORB 具有更好的鲁棒性,在快速运动时更不容易丢失。因此在类似于无人机这样的场景,VINS 应该是比 VIORB 更好的选择;而对于精度要求较高、场景更大而运动较慢的场景,VIORB 仍然更合适;
4、不论是否引入 IMU,双目对于精度和鲁棒性都会有一定的提升,但目前 VINS 并没有提供双目的版本,精力所限也没有进行实现,相信如有同学用双目改造下 VINS 会有不错的效果;
5、除前端差别较大外(比如光流与ORB、滑窗与局部地图),虽然都是预积分二者后端算法与实现亦有较大不同(李代数与四元数参数化不同、积分方式不同、g2o与ceres实现差别等),因此造成性能差异的原因很复杂,水平所限无法进行更深入分析。如有大神进行过研究,还望批评指教。