多种视觉SLAM方案对比

2023-05-16

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自 | 新机器视觉

在SLAM研究中,我们通常需要在各数据集上测试各个方案的性能情况。如下主要对表1中6个视觉SLAM方案进行相关测试,测试其在不同场景、要求下的精度和鲁棒性,并给出最终方案选型。

【由于时间、场地等原因,整合前人测试结果,在此附上链接,谢谢大神的分享!】

**

开源SLAM方案选型:

**

**

数据集:

**

一、ORB-SLAM2

检测流程:Kinect生成地图【地图主要可见的有关键帧(包括相机的pose,相机的内参,ORB特征),3D的地图点( 空间中3D位置,法线方向,ORB的描述子),词袋向量,共视图等】 → 保存地图 → 加载地图和重定位

缺点:1、不能解决实际问题。它基于特征点法,建的图是稀疏的,只能满足定位需求,而无法提供导航、避障、交互等诸多功能。而且目前还没有开放存储和读取地图后重新定位的功能。

2、受光照和车辆、行人等动态物体的影响太大

后续工作:对前端数据进行轨迹的优化和回环,稠密建图

【自我备注:1、保存稀疏地图的MapPoint和KeyFrame成.bin格式 ;2、如果保存成pcd格式,那么关键帧与关键点之间的关系没有办法保存。。。即pcd保存的地图信息并不完整】

二、VINS MONO

参考博文:https://blog.csdn.net/Darlingqiang/article/details/80689123

实现原理:用紧耦合方法实现的,通过单目+IMU恢复出尺度

目标:AR

整体框架:

1、Measurement Preprocessing:观测值数据预处理,包含图像数据跟踪IMU数据预积分;

2、Initialization:初始化,包含单纯的视觉初始化和视觉惯性联合初始化;

3、Local Visual-Inertia BA and Relocalization:局部BA联合优化和重定位,包含一个基于滑动窗口的BA优化模型;

4、 Loop detection and Global Pose Graph Optimization:回环检测;全局图优化,只对全局的位姿进行优化;

代码解读:

VINS代码主要包含在两个文件中:

1、feature_tracker 接收图像,使用KLT光流算法跟踪

2、vins_estimate 包含相机和IMU数据的前端预处理(也就是预积分过程)、单目惯性联合初始化(在线的标定过程)、基于滑动窗口的BA联合优化、全局的图优化和回环检测

vins主要就是两个节点:

1、一个节点算前端,为feature_tracker_node.cpp

2、另一个节点算后端,为estimator_node.cpp

三、ORB_SLAM2、VI ORB SLAM2 、 VINS Mono对比实验

参考链接:http://www.liuxiao.org/2018/02/vi-orb-slam2-与-vins-对比实验/

主要指标:均方根误差

实验结果:

1、ORB 与 VI ORB 对比

由表可以看出:

1)双目 VIO 比单目 VIO 效果要更好也更稳定;

2)原始 VO 的优化已经比较彻底,IMU 误差项的加入给优化结果造成了更多的不稳定性,加入 IMU 的版本均不如原始双目版本的精度。

2、VI ORB 与 VINS Mono 对比(开启闭环)

由表可以看出:

1)VINS Mono 精度与VIORB Mono/Stereo比,精度要高一些;

2)VI ORB 是不能完全跑过所有测试集的,特别是快速运动的 V2_03_difficult 测试集结尾阶段会跟丢;而vins mono采用的光流跟踪,不易跟丢。

3、VI ORB 与 VINS Mono 对比(关闭闭环)

由表可以看出:

VINS Mono 对闭环依赖较大,在关闭闭环后,VINS Mono 的性能下降较多。

4、实验小结

1)在没有闭环情况下,VINS Mono 精度略低于 VIORB;而在有闭环情况下,二者精度差距不大。

2)由于开源 VIORB 版本并非官方实现,与官方版本有很多不同之处,没有办法测试真实官方 VIORB 的性能;但基本可以看出对于VI ORB SLAM2 框架,IMU 的引入主要是在快速运动时能够减少一些丢失,而精度上与 VO 相近或略有下降;

3)以光流作为前端的 VINS Mono 比描述子作为前端的 VIORB 具有更好的鲁棒性,在快速运动时更不容易丢失。因此在类似于无人机这样的场景,VINS 应该是比 VIORB 更好的选择;而对于精度要求较高、场景更大而运动较慢的场景,VIORB /ORB仍然更合适;

4)不论是否引入 IMU,双目对于精度和鲁棒性都会有一定的提升,VINS Fusion相比于vins mono,性能有所提升;{精度——慢速,双目;鲁棒——快速}

5)除前端差别较大外(比如光流与ORB、滑窗与局部地图),虽然都是预积分,二者后端算法与实现亦有较大不同(李代数与四元数参数化不同、积分方式不同、g2o与ceres实现差别等),因此造成性能差异的原因较复杂。

5、 VI ORB-SLAM初始化与VINS初始化对比(将vi orb-slam初始化方法移植到vins中)

四、VIO:飞行机器人单目VIO算法测评

参考链接:https://blog.csdn.net/u012348774/article/details/81414264

核心思想:

全面的比较了各种公开的单目VIO算法(MSCKF、OKVIS、ROVIO、VINS-Mono、SVO+MSF和SVO+GTSAM);

在多个嵌入式平台上(Laptop,Intel NUC,UP Board,ODROID)测试了各种单目VIO算法,并分析了算法的表现;

3.选用EuRoC MAV数据集。

结论:SVO+MSF是计算效率最高的算法,而VINS-Mono是状态估计精度最高的算法,ROVIO则处于两者之间

五、VINS FUSION

推荐链接:https://blog.csdn.net/huanghaihui_123/article/details/86518880

发布信息:港科大 2019年1月12号

版本:

(1)单目+imu

(2)纯双目

(3)双目+imu

(4)双目+imu+GPS

和vins mono相比:

对比于VINS Mono,主要增加了global_fusion包,用来融合GPS以及视觉IMU定位的结果。代码结构,之前的pose_graph节点更名为loop_fusion,之前的feature_track节点融合进vins_estimator内部。vins_estimator中的factor残差项增加了很多,主要是视觉的残差项增加。

优势:可以静止进行初始化;尺度信息不一定完全依靠IMU(有双目),不会造成尺度不可关的情况;鲁棒性上,双目明显优于单目;

劣势:由于视觉误匹配等各种原因,双目的精度会比单目差一点。

【自我备注:使用vinsfusion闭环跑KITTI的纯双目数据集,跑出来的output结果有vio.txt位姿文件,但这个没有闭环,闭环的数据在单独的vio_loop.csv文件里,这个文件里的数据只有闭环帧,而且数据格式和真实轨迹不一样,不是12列。如何将闭环的vio_loop.csv数据融合到未闭环的vio.txt数据里,然后画出闭环后的整体轨迹估计?】

六、RTAB-MAP

概述:与其他视觉slam方案不同在于提供了一个与时间和尺度无关的基于外观的定位与构图解决方案,优化了大型环境的在线闭环检测问题,主要是利用计算权重使得只利用有限数量的定位点参与闭环检测,但是若需要也可以访问全局的定位点。

流程:开始->特征提取和匹配->求两两帧的视觉里程计->优化php的结果->局部地图->运动状态估计->运动状态估计->位姿图->词袋模型->相似度计算->结束

特征点:使用词袋法创建图像的签名,基于opencv从图像中提取SURF特征来得到视觉单词。

建图方式:1.Octomap(3d占用栅格地图)

2.稠密点云地图

3.2d占用栅格地图

ROS节点:输入:1.TF(传感器相对于机器人底座的位置)

2.里程计

3.相机输入以及带有校准的信息

输出:1.Map Data和Graph

优点:1.适用于长期和大规模环境在线建图的要求

2.里程计鲁棒性较好好且低漂移

3.定位鲁棒性较好

4.地图生成开发实用且简便

5.提供软件包

缺点:1.方案偏向于商品化,二次开发难

参考:https://blog.51cto.com/remyspot/1784914

七、RGBD-SLAM V2

概述:系统前端为视觉里程计,从每一帧的RGB提取特征,计算描述符,RANSAC+ICP计算两帧之间的运动估计,并提出了一个EMM(环境测量模型)判断运动估计是否可以接受,后端回环检测基于G2O的位姿图优化

特征点:1.SIFT by GPU(综合表现最好)

2.SURF by CPU(OPENCV)

3.ORB by CPU (OPENCV)(准确率,实时性更加好)

建图方式:八叉树地图octomap(利于导航 ; 易于更新 ;存储方式比较省空间)

优点:1.二次开发较容易,可以在其基础上继续开发

缺点:1.实时性相对较差,相机要慢速运动

参考:http://www.cnblogs.com/voyagee/p/7027076.html

八、RTAB-MAP和RGBD-SLAM V2的对比

系统构建:

1、RGBD_SLAM V2是一个非常全面优秀的系统,将SLAM领域的图像特征、优化、闭环检测、点云、octomap等技术融为一体,

2、RTAB-Map是当前最优秀的RGBD SLAM

开发:RGBD_SLAM2适合RGBD SLAM初学者,也可以在其基础上继续开发。

RTAB-MAP二次开发难度较高(著名的Google Tango(见如何评价Google 的 Project Tango和Google Project Tango 有哪些黑科技)就是使用RTAB-Map做SLAM,)

实时性:RGBD_SLAM2的缺点是其算法实时性不好,相机必须慢速运动,

RTABMAP 通过STM/WM/LTM的内存管理机制,减少图优化和闭环检测中需要用到的结点数,保证实时性以及闭环检测的准确性,能够在超大场景中运行。

回环检测:RGBDSLAMV2:相机较快运动时,会出现很大的地图重叠。

RTABMAP:稳定性相对较好,但是也不稳定。

个人:实际运行中RGBD SLAM V2用点云表达,点云表达方式耗费内存,时间较长后,三维空间中的点云数量增多,画面出现明显的卡顿,但采集得结果细节表现得很好

RTAB-MAP实际运行过程中,画面比较流畅,但是是使用3d栅格占用地图表现的,细节表现得也不错。

九、RTAB-MAP和ORB-SLAM的对比

系统构建:RTAB-MAP:框架较全面,支持联合建图,建立的地图包括三维稠密点云和二维栅格地图(可以直接从ros获取二进制程序)

ORB-SLAM:只满足了定位的需求,无法提供导航,避障,交互等诸多功能 。

代码可读性:RTAB-MAP:差,基本上封装了。

ORB-SLAM:可读性好。

应用:RTAB-MAP:适合作为slam应用

ORB-SLAM:适合研究使用

计算量:RTAB-MAP:内存管理方法计算量相对较小

ORB-SLAM:三线程结构,必须对每幅图像计算一遍orb特征,耗时和计算量大

回环检测:RTAB-MAP:回环检测只访问有限数量的定位点

ORB-SLAM:优秀的回环检测算法保证了ORB-SLAM2有效地防止累积误差,并且在丢失之后还能迅速找回,这一点许多现有的SLAM系统都不够完善。为此,ORB-SLAM2在运行之前必须加载一个很大的ORB字典 。

十、SLAM算法对比:

一:视觉和IMU前端数据处理

对于视觉前端做法基本分为三种:

①特征点提取(feature detection)+根据描述子匹配特征点

orbslam, okvis

优点:因为有描述子,因此对地图的维护很方便(包括重定位,闭环,全局优化)

尤其是对室内环境,当视觉上共视关系较多的时候,这种方法能很大提高定位精度和局部的稳定性。室内移动机器人建议使用这种方法

缺点:每帧图像都要提取特征点数量的描述子,浪费时间;在tracking过程中,如果运动过快(图像出现模糊)比较容易tracking failed,而光流要好一些

②特征点提取+光流跟踪

vins,svo的初始化

优点:简单高效,tracking要鲁棒一些

缺点:不容易构建全局map,视觉约束只靠滑窗里面的关键帧。

比如vins的闭环和重定位是需要另外再提取特征点和描述子的;但后端做得好

③直接法

lsdslam,dso

优点:在弱纹理下,鲁棒性好

缺点:不容易维护全局地图,对光照影响较大,高精度地图中无法使用等。

对于IMU前端:

IMU前端基本都是使用预积分的方式,和积分的区别(预积分把重力考虑进去了)。imu预积分主要是在两帧图像之间更新imu的5个状态变量(p, v, q, ba, bg)的Jacobian和covariance。

PS:为了使得非线性优化中,不用每次改变位姿后,积分需要重新计算的问题。

现在改变位姿(速度,位移,旋转四元数关于世界坐标系的),预积分内的项保持不变。

改变ba,bg(加速度和陀螺仪偏移)后,预积分的项可以通过泰勒一阶展开来进行更新。

jacobian是单位矩阵,主要是为了求一阶近似的p, v,q;covariance是零矩阵,主要是为了求imu误差项的权重

IMU初值确定:一般结合vins mono 等的视觉信息来求

二:后端优化

滤波:不需要做边缘化,重定位难。因为不需要迭代,速度略快。

**优化:**需要边缘化(比较耗时间),重定位容易。迭代优化,速度略慢。

VINS-Mono与OKVIS类似,是基于非线性优化器优化一个滑窗内的关键帧,帧间通过鲁棒的角点关联。在系统初始化阶段,通过松耦合的方式融合多种传感器;在重定位阶段,则通过紧耦合的方式融合传感器。在优化之前,也通过IMU预积分减少计算量。除此至外,VINS还提供了基于4DoF的位姿图优化和回环检测。

十一、实体测试

十二、方案选定(个人观点,不喜勿喷)

通过上述调研,出于资源等的考虑,初步将ORB_SLAM2、 VINS FUSION、RTAB MAP 和LSD SLAM列入后期调研中,拟再花两周进行相机选型和实体场景测试,先给出现阶段调研结果,希望大家相互学习,共同进步!

作者为CSDN博主「lark_ying」

原文链接:https://blog.csdn.net/hly453/java/article/details/88983123

 End 

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多种视觉SLAM方案对比 的相关文章

随机推荐

  • 栈的应用之括号匹配算法

    算法思路 xff1a 初始化一个栈 xff0c 命名为s 依次遍历待匹配的字符串 如果当前字符为左括号 xff08 即 39 39 39 39 39 39 中的任意一个 xff09 xff0c 则将其入栈 如果当前字符为右括号 xff08
  • jsp页面在浏览器中显示乱码( 没有账号?)

    错误 xff1a jsp页面在浏览器显示乱码 xff0c 如下图所示 xff1a 解决方法 xff1a 主要是因为浏览器使用的编码格式与自己开发文件存储内容的编码不一致导致的 xff0c 所以需要在jsp页面中添加如下代码 xff0c 问题
  • 队列的应用之打印杨辉三角形

    题目 xff1a 利用队列打印杨辉三角形 特点 xff1a 杨辉三角除第一行为两个1以外 xff0c 从第二行开始 xff0c 每一行的首尾都为1 xff0c 中间位置的数为上一行中与之相邻的两个数之和 xff0c 可以使用我们学过的队列问
  • 栈和队列的应用之停车问题

    题目 xff1a 设停车场是一个可停放n辆汽车的狭长通道 xff0c 且只有一个大门可供汽车进出 汽车在停车场内按车辆到达时间的先后顺序 xff0c 依次由北向南排列 xff08 大门在最南端 xff0c 最先到达的第一辆车停放在停车场的最
  • Jupyter Notebook 安装与使用教程

    一 什么是Jupyter Notebook xff1f 1 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序 其可被应用于全过程计算 xff1a 开发 文档编写 运行代码和展示结果 Jupyter Notebook官
  • java.lang.NoSuchMethodError: org.springframework.core.type.AnnotationMetadata.introspect之解决方法

    错误 xff1a idea中使用spring整合mybatis报错 xff1a java lang NoSuchMethodError org springframework core type AnnotationMetadata int
  • 栈和队列的应用之回文数判断

    题目 xff1a 采用栈和队列的方法检测并输出一个单词是否为回文 代码 xff1a include lt stdio h gt include lt malloc h gt define SIZE 20 using namespace st
  • 二叉链表树的遍历

    题目 xff1a 使用二叉链表树创建算法Status CreatBiTree BiTree amp T 和其他代码 二叉树的遍历有三种 xff1a 前序遍历 xff1a 先访问根节点 xff0c 再遍历左子树 xff0c 最后遍历右子树 x
  • opencv的框架与各模块功能介绍

    记录一下自己的所学知识 xff0c 便于日后回顾与整理 文中内容多为摘录 xff0c 具体链接如下 xff1a 摘录自 xff1a https zhuanlan zhihu com p 33008701 xff08 框架介绍 xff09 h
  • Android调用C/C++库

    AndroidStudio版本2021 1 1 一 AndroidStudio将C C 43 43 库打包成so库过程 AndroidStudio新建NativeC 43 43 工程 xff1b 在Tools gt SDK Manager里
  • SocketCan 应用编程

    SocketCan 应用编程 由于 Linux 系统将 CAN 设备作为网络设备进行管理 xff0c 因此在 CAN 总线应用开发方面 xff0c Linux 提供了SocketCAN 应用编程接口 xff0c 使得 CAN 总线通信近似于
  • QT开发笔记(继承 QObject 的线程 )

    继承 QObject 的线程 在第 10 章章节开头已经说过 xff0c 继承 QThread 类是创建线程的一种方法 xff0c 另一种就是继承 QObject 类 继承 QObject 类更加灵活 它通过 QObject moveToT
  • CoppeliaSim:视觉传感器的使用与属性参数

    视觉传感器类型 http www coppeliarobotics com helpFiles index html Orthographic projection type the field of view of orthographi
  • 华为Atlas200DK环境配置指南(版本20.0.0)

    官方参考文档 https support huaweicloud com usermanual A200dk 3000 atlas200dk 02 0024 html 务必保证配置时版本 20 0 0 一致 1 配置开发环境 自己电脑 若不
  • PX4 QGC地面站自定义参数

    QGC地面站自定义参数 xff08 新手操作 xff09 v1 8 2 QGC以往版本下载地址 htps github com mavlink qgroundcontrol tags 最终的添加结果如下 xff1a 具体步骤如下 xff1a
  • Linux网络编程----UDP编程基础知识

    UDP概述 UDP 是 User Datagram Protocol 的简称 xff0c 中文名是用户数据报协议 xff0c 是一个简单的面向数据报的传输层协议 xff0c 在网络中用于处理数据包 xff0c 是一种无连接的协议 UDP 不
  • get 命令汇总

    get 命令汇总 git config 配置 Git 的相关参数 Git 一共有3个配置文件 xff1a 1 仓库级的配置文件 xff1a 在仓库的 git gitconfig xff0c 该配置文件只对所在的仓库有效 2 全局配置文件 x
  • c++ socket简单封装

    简单封装 并不实际应用 框架图 Mysocket 主要是定义TCP和UDP的一些相同的操作 xff0c 需要的他们各自去实现 Mysocket h ifndef MYSOCKET H define MYSOCKET H class MySo
  • pixhawk2飞控接头型号

    BM04B GHS TBT BM05B GHS TBT BM06B GHS TBT
  • 多种视觉SLAM方案对比

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文转自 新机器视觉 在SLAM研究中 xff0c 我们通常需要在各数据集上测试各个方案的性能情况 如下主要对表1中6个视觉SLAM方