工程实践中VINS与ORB-SLAM的优劣分析

描述

很多公司在工程上是用VINS(VINS-Mono或VINS-Fusion)做里程计,而不是ORB-SLAM,但是好像ORB-SLAM比VINS效果更好,这是为什么呢?且看大家是怎么说的

简单回顾

ORB-SLAM是一种基于特征的单目视觉SLAM系统,广泛用于实时三维地图构建和机器人定位。该系统使用ORB特征进行高效的视觉识别和地图重建,支持关键帧技术和回环检测来优化地图的准确性。ORB-SLAM能够在多种环境下稳定工作,适用于动态场景和长时间操作,因其出色的性能和灵活性,被广泛应用于自动驾驶、增强现实等领域。

VINS(Visual-Inertial Navigation System)是一种结合视觉信息和惯性测量单元(IMU)数据的SLAM框架,能够提供高精度的实时定位和地图构建功能。VINS通过融合相机和IMU的数据,即使在视觉信息不足的情况下也能保持较高的定位精度,使其适用于快速运动或低光照条件下的场景。VINS框架因其鲁棒性和准确性,在无人机导航、移动机器人等领域得到了广泛应用。

移动机器人

看看大家怎么说

袁博融说

因为大部分工程师对SLAM都没有深入了解。要么是都试试,哪个能跑通效果好就用哪个,要么是跟着主流意见走。而主流意见未必就是对的,很大程度上也是受公众号自媒体影响。其实VINS和ORB-SLAM都不是适合工程使用的好方案。

工程应用首先应保证前端的鲁棒性,其次才是精度。毕竟你要先能收敛,看精度才有意义。运行时但凡飘一下,之前精度再高也是打水漂。VINS和ORB-SLAM对于corner cases是没啥特殊处理的,连ZUPT都没做,这就注定鲁棒性不足。VINS长时间运行会发散是必然的。

大家觉得VINS和ORB-SLAM精度高,那是它们在几个公开数据集上表现好。但这并不意味着它们在工程应用中也一定表现好。实际上,应用中对精度影响更大的反而是数据质量,而不是算法本身。比如传感器的标定误差、同步精度、曝光、对比度、噪点等都可能会产生显著影响。在这种情况下,算法本身的差异甚至可以忽略不计。即便你出厂标定的再好,产品在整个生命周期里的参数漂移也是要考虑的吧。这些都是工程问题。

我一直不建议SLAM研究者只拿数据集做测试。数据集的固定序列难以让我们认识算法表现的随机性。我见过在某些序列上基础的VO比VINS和ORB-SLAM精度更高。但这显然是随机性引起的,因为综合多个序列的结果还是VINS和ORB-SLAM更好。我经常手持设备去跑测试,即便走同样的线路,多次的表现也会有差异。如果一个算法多次表现起伏很大,我们至少可以说它在这个场景中没有处于合适的工作窗口。

作为开发者不能总是照顾算法的特性,而应该多创造可能产生退化的极端场景做研究。这就是为什么我之前甚至录了过山车数据来做SLAM测试。

我自己实现的VIO方案可以跑完这条序列,但我不觉得VINS或ORB-SLAM能做到。我开源这套数据后也一直没有其他人说能跑通。即便我的方案能跑通这种极端场景,也不意味着它在其它看起来更简单的场景中就不会出问题。事实上我们在其它项目中也遇到过各种挑战,也是花了几个月的时间去分析和优化,现在也还在继续迭代。

VINS和ORB-SLAM的后端其实都不算先进,应该说还不如RTAB-Map。这几个后端其实都在用BoW,但RTAB-Map还有内存管理等高级特性。我一直奇怪咋还不更新成VLAD,是因为大家跑的场景不够大吗?反正RTAB-Map很快会支持VLAD的,因为我也是它的第二大贡献者。但我并不是说RTAB-Map比VINS或ORB-SLAM更好,而是它们根本不好比。RTAB-Map最初就是个VSLAM后端框架,后来才加的前端。我前面说的基础的VO就是RTAB-Map后来加的实现。而你甚至可以在RTAB-Map中用VINS或ORB-SLAM做前端。这也是为什么我要另外做VIO方案,因为RTAB-Map本来就没提供这些,它只是预留了模板。RTAB-Map不是个算法而是个框,什么都可以往里装。

ORB-SLAM的最大硬伤就是它用的是ORB特征。ORB特征除了性能好一些,在各类任务上都没什么优势。不知道有多少研究者仔细测试和比较过,其实传统特征描述子最好的还是SIFT(而且专利也到期了),后来的没一个能打的。但SIFT检测开销大也是众所周知的。而SIFT检测+SIFT描述子也不是最好的。我目前知道的最好的组合是GFTT(Shi-Tomasi)+SIFT描述子,回环检测能力吊打其它各种组合。CV领域就是这么神奇,最老的反而是最好的。GFTT本身开销就低,还方便做硬件加速。ORB做硬件加速都要更麻烦一些。我自己方案就是用GFTT+RootSIFT或SuperPoint(HF-Net)。不考虑后端的话,GFTT+KLT其实都非常好了。

所以如果你要问工程上哪个方案最好,我会告诉你RTAB-Map不错,但它只能做后端,你还需要一个好的前端。我们的前端方案今年会推产品,RTAB-Map这一两年也还会有重量级更新。除了VLAD部分还会有iSAM2,Gaussian Splatting等。目标就是纯视觉做超大场景(至少城市级吧)VSLAM+三维重建。

乐知者说

论文与实际有差别。

这就看你把orbslam和vinsmono用来干什么了。

先作为Vio来说,结论vinsmono优于orb3(没有了回环检测、多地图功能和重定位的orb3,不如vins一根毛)。理由如下:

1、运行资源。orb3远比vins消耗的多,不解释。

2、前段跟踪稳定性。lk光流跟踪比orb3 track跟踪稳定很多。orb3在实际场景中,tracklocalmap容易失败。orb3在室外场景中容易reset,然后新建地图。

3、后端优化这块。怎么说呢,orb3确实强,但是不符合导航要求的定位。因为你会经常看到它明开始跟飞很远,然后又给你突然拉回来。这种跟飞又来回来很蛋疼。没有vins-mono那边平滑。

4、精度这块(假设你成功运行完一个数据集),精度orb3会比vins强(vio初始化好的话,orb3可以到达1%)。然并软,因为orb3并不稳定,跑同一个书籍,你可能得到的结果都差异很大。

5、外参和实延。orb受外参数影响特别大,不如vins一根毛。

6、调试。vins参数量小于orb3,且稳定性比orb3强多了,不然你都不知道这次结果比上次好到底是什么原因导致的。

结论:

vio1   vins-mono+orb3初始化策略

vio2  msckf前段+orb后端

这两个YYDS。

作为slam (三维重建,语义地图),orb3远优越于vins。自己理解。忠告:远离vslam或者Vio,拥抱感知或者激光。

余世杰说

说下自己的理解,ORB强在是一个完整的系统,代码结构逻辑非常清晰,比较模块化,要做修改替换啥的比较方便,同时地图的部分对于需要的项目来说很省事儿,可以直接拿来用。缺点是,代码中还是存在一些致命的bug,会跑崩(程序挂了),以及作为一个VIO系统来说,稳定性不够强,若视觉失效,几乎立马就整体丢了,所以精度高的意义没那么大了又。若要求视觉必须稳定,那为啥我还要加IMU呢,这也是一个ORB3精度可能不如ORB2的一个原因。

VINS强在一个对外参依耐性没那么强,毕竟自己可以估计,导致就算初始化有点点问题,也可以很快稳定下来。而稳定性更是不用说,在视觉失效个5秒左右,系统都能比较正常的跑下来。还可以融合GPS输出个对齐结果,对于需要的项目也是一个加分项。缺点的话,大概就是缺少了地图一部分吧,自身是比较强的。

格雷茨卡说

因为VINS-Mono在真实场景中的稳定性远远好于ORB-SLAM3,虽然ORB-SLAM3在论文中的精度指标大幅度好于VINS-Mono,但是,你总不能一直在那几个数据集刷指标吧,在工程中的应用就要求一个系统必须能够鲁棒稳定,本人实测ORB-SLAM3对外参,特别是rotation,非常敏感,标定差一些直接就跑飞了,而VINS就不会有这个问题,可能虽然整体误差有一些大,但是实时性和鲁棒性足够了,ORB-SLAM3的VI初始化很耗时间,同时在自己实际设备上的有效性一般,VINS的初始化简单明了,实测也不会跑飞,而且又有一个250HZ的IMU预积分线程,能够很好的保证实时性,因此工程应用无脑VINS,会省很多事情

审核编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
王纪凯 07-10
0 回复 举报
作者高见 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分