为什么工程上选择VINS而不是ORB-SLAM?

作者 | 3D视觉之心  编辑 | 自动驾驶Daily

原文链接:https://www.zhihu.com/question/650407644

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心SLAM技术交流群

本文只做学术分享,如有侵权,联系删文

前言

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

简单回顾

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

b53a18e1338274791f8caedfaf2346f3.jpeg

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

0bc50d1cdfae095c8171572ae4a3f4b4.png

看看大家怎么说

袁博融说

因为大部分工程师对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,会省很多事情

投稿作者为『自动驾驶之心知识星球』特邀嘉宾,欢迎加入交流!

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署大模型与自动驾驶Nerf语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

6f071c9ff44b8ffeb62643d5783681ed.png

网页端官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

国内最大最专业,近3000人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案大模型、端到端等,更有行业动态和岗位发布!欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频

ae595622f331d9eb3549a3e3da0d9aa7.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦感知、定位、融合、规控、标定、端到端、仿真、产品经理、自动驾驶开发、自动标注与数据闭环多个方向,目前近60+技术交流群,欢迎加入!

自动驾驶感知:目标检测、语义分割、BEV感知、毫米波雷达视觉融合、激光视觉融合、车道线检测、目标跟踪、Occupancy、深度估计、transformer、大模型、在线地图、点云处理、模型部署、CUDA加速等技术交流群;

多传感器标定:相机在线/离线标定、Lidar-Camera标定、Camera-Radar标定、Camera-IMU标定、多传感器时空同步等技术交流群;

多传感器融合:多传感器后融合技术交流群;

规划控制与预测:规划控制、轨迹预测、避障等技术交流群;

定位建图:视觉SLAM、激光SLAM、多传感器融合SLAM等技术交流群;

三维视觉:三维重建、NeRF、3D Gaussian Splatting技术交流群;

自动驾驶仿真:Carla仿真、Autoware仿真等技术交流群;

自动驾驶开发:自动驾驶开发、ROS等技术交流群;

其它方向:自动标注与数据闭环、产品经理、硬件选型、求职面试、自动驾驶测试等技术交流群;

扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

f3e3c05b1ea9c7e713420fe688d219f6.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

d0aa30db12a67cf096ad94510ba52f3f.jpeg

### 解决方案 `rospack cannot find ORB_SLAM3 package` 的错误通常表明 ROS 系统无法找到 `ORB_SLAM3` 包的相关路径配置。以下是可能的原因以及解决方案: #### 可能原因分析 1. **未设置工作空间环境变量** 如果当前目录不在 ROS 工作空间中,或者没有正确初始化 ROS 环境,则可能导致 `rospack` 找不到包。 2. **编译失败或文件缺失** 若 `ORB_SLAM3` 编译过程中存在错误(如引用中的 CMake 配置不完整[^4]),则生成的目标文件和依赖项可能不存在。 3. **ROS 路径未更新到 `.bashrc` 文件** 当新的 ROS 包被创建或移动时,需要手动将其路径添加到 `$ROS_PACKAGE_PATH` 中并刷新终端会话。 --- #### 具体解决方法 ##### 方法一:检查 ROS 环境变量 确保已正确加载 ROS 环境变量,并将目标工作空间路径加入其中。执行以下命令以验证: ```bash echo $ROS_PACKAGE_PATH ``` 如果 `/home/ao/vins_orb/ORB_SLAM3_detailed_comments-master/Examples_old/ROS/ORB_SLAM3` 不在此列表中,则需将其显式添加至 `.bashrc` 文件中: ```bash export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/ao/vins_orb/ORB_SLAM3_detailed_comments-master/Examples_old/ROS/ORB_SLAM3 source ~/.bashrc ``` ##### 方法二:重新构建项目 由于可能存在编译问题,建议清理旧的构建缓存并重新编译整个工程。具体操作如下: ```bash cd /home/ao/vins_orb/ORB_SLAM3_detailed_comments-master/Examples_old/ROS/ORB_SLAM3/ catkin_make clean rm -rf build devel install catkin_make source devel/setup.bash ``` 此过程可修复因 CMake 或其他工具链引起的潜在问题。 ##### 方法三:确认 `package.xml` 和 `CMakeLists.txt` 正确无误 检查 `ORB_SLAM3` 的根目录下是否存在标准的 `package.xml` 文件及其内容是否合法。同时,在对应的 `CMakeLists.txt` 文件中应包含必要的声明语句,例如: ```cmake find_package(catkin REQUIRED COMPONENTS cv_bridge roscpp std_msgs sensor_msgs image_transport) catkin_package() include_directories(${catkin_INCLUDE_DIRS}) target_link_libraries(orb_slam_node ${catkin_LIBRARIES}) ``` 上述片段用于定义 ROS 包所需的组件链接关系[^1][^2]。 ##### 方法四:测试运行节点前先定位包位置 尝试通过以下指令来验证 `rospack` 是否能够识别该包名: ```bash rospack find ORB_SLAM3 ``` 正常情况下应该返回类似这样的路径字符串: ``` /home/ao/vins_orb/ORB_SLAM3_detailed_comments-master/Examples_old/ROS/ORB_SLAM3 ``` 如果没有输出任何有效结果,则说明仍存在问题待排查。 --- ### 总结 以上提供了四种主要途径帮助排除 `rospack cannot find ORB_SLAM3 package` 错误的可能性。实际应用中可以根据具体情况逐一试验直至恢复正常功能为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值