VI ORB SLAM2 与 VINS 对比实验
一、实验说明
之前做了一些 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} \sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}}
其中:
y_{i} 代表真值,\hat{y}_{i} 代表估计值。
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实现差别等),因此造成性能差异的原因很复杂,水平所限无法进行更深入分析。如有大神进行过研究,还望批评指教。
请问你的双目VIO的代码能开源吗?
目前只是简单改的初步实验代码比较糙,后续如果整理好可能考虑开源:)
感谢您的分享,表格中的VIORB和ORB的实验数据与数据的对应关系有问题吧?
你好,是说的哪一行有问题呢?
关系对应错了,数据包的名字顺序错了.
对呀,我也发现了,对比了原paper表格,的确数据包对应错了。
您好,感谢您做所的工作.
不过在您分享的第一个实验表格"ORB 与 VI ORB 对比"中,从实验数据看,ORB单目的数据要优于ORB双目的,但为什么您得出的结论是"不论是否引入 IMU,双目对于精度和鲁棒性都会有一定的提升"呢?是这两个数据写反了吗?
是这样的,这个数据没有错误均是出自ORB作者的论文。这里能看出的明显改善是指跟踪成功的数量,单目有2个跟不到,双目有1个。没有IMU的单目是没有尺度的,这个尺度本身就是根据真值拟合的,所以肯定是最接近真值的,与双目本身可以计算绝对尺度是不能对比的。
哦哦,明白了。非常感谢^_^
建议您应该在Github上面进行一些开源的分享
如果有比较完善的东西或者结论会考虑开源的,感谢支持:)
您好,感谢您的分享。我最近也在测试王京大神的VIORB,请问为什么我测的euroc的数据,单目VIORB也没有尺度信息呢,用evo工具查看明显不能对齐
如果你的调用VIO接口没有问题,而且确实初始化成功了,是肯定有尺度信息的。
感谢您的工作!
请问您做这个实验时处理器的配置方便说明一下吗?
您好!
非常感谢您的工作,请问您的实验平台是怎样的呢?比如处理器CPU和内存的大小?
谢谢!
您好,EuRoC的Ground Truth世界坐标系与VINS的世界坐标系转换,你是怎样做的?RMSE公式中的delta_i 是什么?
二、2和3中V202数据与MH04 RMSE = 0.174,作者的数据是不是搞错了 RMSE=0.058这个数据又对应了上表MH05和下表V202。
得到的数据和我测出来差好多。
之前的数据的确对应错了,因为作者和我的顺序不一样,我核对了下论文改了一下,现在是不是一样?另外,paper里面的数据我这边也无法复现,估计作者单目和双目参数是不一样的。
你好 大佬,请教个问题,计算RMSE值中的数据 是怎么获得的?期待回复
不太理解计算RMSE值中的数据是什么意思?有自己SLAM跑的轨迹和数据集中的真值,就可以用evo计算RMSE了。
好的,谢谢您的回复,我现在已经有跑的轨迹,现在还没想好用什么办法获取真值,还有一个问题想请教下,比如数据vicon room 101 easy,这个数据的真值是从哪里获取?谢谢
我下载的 EuRoC 数据集里面有 state_groundtruth_estimate0 和 vicon0 文件夹,印象中这两个里面的 data.csv 数据都可以当做真值来用。
好的 感谢大佬的回复
好的 感谢大佬的解答
大佬,我现在使用orbslam2-Mono,在ROS环境里跑了MH_04_difficult这个数据,保存了运行的轨迹是TXT格式,真值是data.csv,能否使用官网给的脚本进行测评?或者其他的方式
大佬,请教个问题,我现在是使用的官网给的脚本文件,进行Groundtruth测试,大佬使用EVO的原因是什么?
使用官方的也可以,evo我觉得图表比较清晰。
请问大佬,ros环境下运行如何得到保存的txt与csv数据文件
evo工具可以更改
你好,请问下ros环境下运行怎么保存轨迹?
请问您说的官网的脚本文件是什么?可否发个链接呢?谢谢
大佬,问题解决了,我现在用orb mono 跑的MH04difficult,发现误差很大,最大是11多,不知道问题出在哪里,大佬用的是rpe吗?我用ape测试误差较小
大佬,请教个问题啊,VINS_MONO 运行后保存的轨迹信息在哪里?如何做groundtruth,期待回复,谢谢
vins mono 我记得应该需要自己写保存轨迹,不过tum格式很简单,写个node接收topic然后保存下来就行了。
好的 谢谢大佬指教
大佬我又来了,你是不是都烦了啊?哈哈 ,问个问题,我在测试orb_mono时,测试的结果不太理想,MH_01:1.072,MH_04:4.879,MH_05:6.08,V1_01:0.751,V2_01:1.421,V2_02:1.423,暂时测试的是这些数据集,都是RMSE值,感觉偏差有些大,是不是scale的原因?麻烦大佬指教,谢谢
你好,单目的话应该开启 –align –correct_scale 选项使用 Sim(3) 拟合轨迹,不知你是否开启了?我之前测试感觉在MH数据集上开源代码基本和Paper一致,V数据集上则有所偏差。具体用法参见:https://github.com/MichaelGrupp/evo/wiki/evo_traj
刚看到大佬的回复,检查了一下,的确没有开启这个选项,感谢大佬指导,祝大佬工作顺心!
指出一下,我核对了一下,你第一个表格最后一列VIORB Mono Paper的数据顺序抄错了,也就是跟数据集的对应关系不对。
感谢大家指正,最近比较忙没仔细看,找了下原始数据对应关系是错了,我近期有空更新下。
你好,不知道你双目的源代码公开了吗
您好,我在测试ORB_SLAM2时发现每次测试的数据都不相同,有时两次测试结果的偏差很大。一般情况下您是怎么选择数据的呢?是删除偏差明显的值然后求平均值吗?
Comment你好,请问我在利用VINS运行euroc数据集的时候,如何将IMU初始化的结果显示出来呢?
Comment您好,请问改后的 VIO 版本的双目算法现在可以开源吗?
hi 这个时间已经很久了,从现在这个时间点来说,我觉得如果从学习角度看没有必要开源我很多年前自己实验的这个双目VIO代码了。这一部分工作我相信在 ORB SLAM3 已经包括。
博主您好,请问您计算RMSE的公式中,分子是轨迹估计值和轨迹真值的差,分母那个符号是啥?我看了其他人的RMSE计算公式,都没有分母那个符号呀。
年久失修的老文,已经忘记当时咋写的了,感觉是错了或者不是 SLAM 里面的定义,我觉得应该 evo 里面就是:
RMSE=\sqrt{\frac{1}{n} \sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}}
而不是
RMSE = \sqrt{\frac{1}{n}\Sigma_{i=1}^{n}{\Big(\frac{d_i -f_i}{\sigma_i}\Big)^2}}
Comment感谢回复!我想问下,您测试的vins-mono(带回环检测的),在MH场景下的精度这么高(MH01 0.06, MH02 0.066,MH03 0.135,MH04 0.056, MH05 0.058),我测试了几次都比您的结果差一点,是由于什么原因造成的呢?和电脑配置有关系吗?
请问大佬,orbslam如何关闭回环检测呀?