经典文献阅读之--OV2SLAM(高速视觉slam)

news2024/9/28 3:26:23

0. 简介

视觉里程计最近几年越来越受到学术界以及工业界的认可,以ORB和VINS为代表的视觉SLAM已经可以满足绝大多数场景,而OV2SLAM在其他VSLAM中脱颖而出,其实时性以及具体的回环性能在测试中都得到了认可。下面我们就来看一下《OV2SLAM : A Fully Online and Versatile Visual SLAM for Real-Time Applications》这篇文章,当然这么经典的论文也已经开源了,代码在Github上可以找到。

【ICRA2021】3475-OV2SLAM:用于实时应用的完全在线和通用的视觉SLAM

1. OV2SLAM与ORB-SLAM2的对比

下图为OV2SLAM的示意图
在这里插入图片描述
下图为ORB-SLAM2示意图
在这里插入图片描述
下面是两个算法的对比

OV2SLAMORBSLAM2对比
特征点提取与匹配Fast + LK光流Fast + ORB 描述子LK光流速度快
输出的实时posePnPMotion-only BAMotion-only BA精度高一点
初始化

单目:前两个关键帧E分解,并三角化,则初始化成功。

双目:第一帧双目计算3D点,即可完成初始化。

单目:前两个关键帧E分解,并三角化,则初始化成功。

双目:第一帧双目计算3D点,即可完成初始化。

一致
三角化

单目:关键帧特征点三角化

双目:光流匹配左帧,右目新检测的点可以进行Temporal三角化

单目:关键帧特征点三角化

双目:描述子匹配完之后,利于fb/d =z 计算深度

ORBSLAM2需要双目矫正过的图像
localBA共视图包含的3D点和位姿一起优化共视图包含的3D点和位姿一起优化一致
回环检测iBowLCD 在线构建字典DBOW 离线训练字典
posegraph作为优化的初始值作为优化的初始值一致
优化looselyBA 仅优化回环帧和当前帧相关联的3D点和关键帧位姿FullBA 优化全部关键帧的位姿和3D点FullBA更准一些

我们从上表中可以看到相比于ORB-SLAM2而言,OV2SLAM有以下四个主要的区别点

  1. 放弃了ORB算子,采用了LK光流来代替。这样可以大大的节省前端特征点提取的时间
  2. 在输出实时pose的时候,ORBSLAM2精度比OV2SLAM高,相比于ORBSLAM2使用TrackLocalMap来进行motion-only的BA而言,OV2SLAM输出的实时pose是通过PnP计算出来的。虽然OV2SLAM也有TrackLocalMap,但是他这一步仅进行特征点的re-track, 没有进行位姿计算。
  3. 在回环检测部分ORBSLAM2使用的是DBOW 离线训练字典,而OV2SLAM使用的是iBowLCD 在线构建字典,这就导致OV2SLAM可以适应更多的场景
  4. 最后也是最关键的就是全局位姿输出,ORBSLAM2使用的是FullBA 优化来优化全部关键帧的位姿和3D点,而OV2SLAM使用的是looselyBA,这个优化方式仅优化当前帧和回环帧关联的信息。所以使用FullBA 可以影响到包括losselyBA以及其余关键帧的pose和3D点。

2 视觉前端

这部分内容其实都大同小异,值得一提的是

图像预处理(image pre-processing )
关键点追踪(keypoint tracking)
离群值滤波(outlier filtering)
位姿估计(pose estimation)
触发条件,创建关键帧(keyframe creation triggering)

这里这篇文章给出了整个流程图
在这里插入图片描述
下面我们来简述一下具体流程

  1. 图像预处理:通过CLAHE进行对比度增强,这既增加了动态范围,又限制了曝光适应引起的强度变化。
  2. 关键点追踪:关键点跟踪是通过引导的从粗到精的光流法来执行的。使用具有9×9像素窗口和金字塔比例因子为2的反向组合Lucas-Kanade(LK)算法[12]的金字塔实现来单独跟踪关键点。这里提到2D点和3D点这两种,对于3D关键点(即已经三角化的3D关键点),会先使用匀速运动模型估计当前帧的初始位姿,然后将3D keyoints对应的3D点投影到当前帧,作为该3D keypoints在当前帧的初始位置。对于2D关键点-即那些没有关于其真实3D位置的先验信息的关键点,会将其在当前帧的初始位置设置为在上一帧中的位置
  3. 离群值滤波:采用基于核线约束的RANSAC滤波,使用3D关键点估计基础矩阵(Essential Matrix)然后用它来过滤不一致的2D关键点。
  4. 位姿估计:使用稳健的Huber成本函数最小化3D关键点重投影误差来执行姿态估计,也就是我们上文提到的PnP计算位姿并更新运动模型
  5. 创建关键帧:跟踪的3D关键点的数量w.r.t.。最后一个关键帧低于阈值(跟踪的关键点少于85%),或者如果检测到明显的视差(平均15个像素的未旋转关键点运动),则会创建新的关键帧。

值得一提的是OV2SLAM将每张图像分为nbwcells*nbhcells个网格,是基于网格的特征提取。每一帧的更新也是只保留了一个指向当前帧的指针pcurframe,用于实时记录当前帧跟踪到的2D、3D特征点以及位姿信息。接受到新图像时只更新时间戳和帧号,在光流跟踪以及计算位姿后分别更新当前帧的特征点、位姿信息并更新运动模型。

3. 建图线程

主要处理两个任务,负责三角化以及局部地图的跟踪,在双目的配置情况下会增加立体匹配的功能。

3.1 三角化

mapping中的三角化是整个系统中唯一生成3D点的地方,包括初始化成功后的生成初始地图。三角化的主要功能是在当前关键帧与共视关键帧之间产生新的地图点,使得跟踪更稳。

具体过程为:对于当前关键帧中的每一个2D特征点,将当前2D点与第一次观测到该2D点的关键帧中的对应2D点进行三角化。相比ORB-SLAM中将当前关键帧与其共视程度最高的20帧至少有15个共视点的相邻关键帧通过词袋进行特征匹配,再将成功匹配的点对进行三角化的策略,二者的效果有待进一步实验对比。 下图为ORB-SLAM的LocalMapping中的三角化搜索范围。这个操作和ORB-SLAM2类似
在这里插入图片描述

3.2 暂时三角化

通常用于单目初始化3D地图,本文发现在双目情况下可以用于在当前关键帧之前,已经正确追踪到,但找不到双目匹配的关键点。这时所有成功三角化的地图点立刻应用于前端进行定位,然后这些3D位置通过BA进行重新优化

3.3 局部地图追踪

类似于ORB-SLAM2局部地图,局部地图包括当前关键帧或共视图关键帧观察到的3D地图点。

局部地图追踪的目标是找出属于局部地图的3D地图点是否可以与当前帧的关键点相匹配。 这种重追踪的操作可以看做是基本的回环检测。

任意这样的3D地图点,在当前关键帧的投影与一个关键点的距离少于两个像素点时被定义为候选匹配。计算3D地图点和其他几个候选点的距离,接受最近距离的候选。

4. 状态估计线程

使用局部BA来精炼已选择的关键帧位姿和3D地图点位置,此外过滤冗余的关键帧来限制外来局部BA的运行时间。

4.1 局部地图的优化

这里的优化与ORB-SLAM相近,**优化当前关键帧和与其至少有25个共视点的相邻关键帧的位姿以及这些关键帧对应的地图点的3D坐标,**对于那些不在这些关键帧范围内,但是可以观测到这些地图点的关键帧,也将观测添加到BA中但是不对这些关键帧的位姿进行优化。

4.2 关键帧过滤

删去关键帧的标准为:该关键帧观测到的95%3D点已经被至少其他4个关键帧观测到

5. 在线词袋回环检测器

回环检测主要负责检测回环和重定位,即校正当前姿势估计和当前帧与已检测到LC的已传递关键帧之间的估计轨迹。这是一个重要的创新点。主要流程主要分为关键帧预处理、使用iBoW-LCD算法检测候选关键帧、验证候选关键帧、位姿图优化以及looseBA。

5.1 关键帧预处理以及选取候选关键帧

作者在论文中提到,出于定位的考虑,OV2SLAM并不会跟踪太多的特征点(大概只有200多)。在这里为了更新词袋树,对每幅图像额外提取300个FAST特征并计算其描述子,然后将此关键帧传给iBoW-LCD用于更新词袋树,当关键帧数量大于100帧时,在词袋树中查找当前关键帧的闭环候选关键帧

…详情请参照古月居

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TiDB分布式数据库架构介绍

简介 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云…

Syncfusion Essential Studio Enterprise新功能

Syncfusion Essential Studio Enterprise新功能 添加了新的MediaQuery、Menute和Rating组件。 应用程序栏、浮动操作按钮、消息和快速拨号组件现在可以在生产中使用。 添加了对甘特图中按需加载的支持。 ASP.NET核心 添加了新的分级控件。 应用程序栏、浮动操作按钮、提及、消息…

什么是密码管理器?它安全吗?

密码管理器或密钥管理员是一类用于生成、检索、保存及管理复杂密码、数字签名的措施,可以由硬件或软件实现。因此,密码管理器一般也称作密码管理软件。复杂密码的生成一般按需要以随机算法产生,而密码数据则保存于一个以密码、数字签名等方式…

DP刷题(一)

目录 拆分单词 牛客题霸_牛客网 【思路梳理】​ 剑指 Offer II 100. 三角形中最小路径之和 【解法一】自顶向下 【解法二】自底向上 路径的数目 剑指 Offer II 098. 路径的数目 【解法一】 【解法二】 路径的数目(加入障碍物)63. 不同路径 II 【解…

unity 简单实现三阶魔方游戏

unity 简单实现三阶魔方游戏 魔方体验地址 工程文件免费下载 实现思路 一、魔方的旋转 三阶魔方由26个方块与 9个旋转轴组成。旋转轴旋转时带动在其控制范围的方块旋转。 旋转轴如何带动方块旋转? 把旋转轴控制范围内的方块设置成旋转轴的子物体,…

必背经典!这些软件测试面试题及答案别放过!

对于很多软件测试新手来说,技术面试往往是整个面试体系里最让人头疼的部分,今天我为选取了软件测试面试中,一些经典的问题和答案,供大家参考使用。并且,还给你们奉上了一个免费的面试刷题小程序哟!拿走不谢…

调试前端代码二三事--(一)-调试基础

一&#xff0c;在网页上调试代码 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

房产管理系统中CAD图形管理分析

随着技术的不断进步和升级&#xff0c;以及高校房屋建筑物数量的不断扩充&#xff0c;建立房屋资产管理信息系统进行信息化、数字化、图形化房屋资产管理已经是势在必行。学校有庞大的房屋数据、大量的CAD图纸、复杂的房屋分类&#xff0c;建设房屋管理系统&#xff0c;能够加强…

JavaSE高级篇:运行时数据区

文章整理自深入理解Java虚拟机第一章概述第二章&#xff1a;运行时数据区域一&#xff1a;程序计数器二&#xff1a;Java虚拟机栈三&#xff1a;Java堆四&#xff1a;方法区五&#xff1a;运行时常量池六&#xff1a;直接内存第一章概述 Java程序员把内存控制的权利交给了JVM …

Spring MVC 获取参数

1..获取参数 得到单个参数&#xff1a; 运行结果&#xff1a; 得到俩个参数&#xff1a; 运行结果&#xff1a; 得到多个参数&#xff08;对象&#xff09; 运行结果&#xff1a; 通过表单传递参数&#xff1a; 但是&#xff0c;如果我用json传递就不行了&#xff0c;namenul…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的3D点云分割模型

给我推荐20个比较流行的点云 3D 分割模型 这里是 20 个比较流行的点云 3D 分割模型: PointNet PointNet PointCNN Kd-Net SpiderCNN PointSIFT PointASNL PointGroup PointConv PointWeb PointGNN PointPillars PointSESA PointSNE DensePoint PointSAP PointSGN PointGCN Po…

Java 应用与数据库的关系

1.什么是数据库• 数据库就是用来存储和管理数据的仓库• 数据库存储数据的优先。2.数据库的优点• 可存储大量数据;方便检索;• 保持数据的一致性、完整性﹔安全&#xff0c;可共享;• 通过组合分析,可产生新数据。3.数据库的发展历程• 没有数据库,使用磁盘文件存储数据,层次…

2022年度AI亮点项目大起底,ChatGPT是你心目中的第一吗?

回顾2022年&#xff0c;人工智能取得了巨大进步&#xff0c;我有一种感觉&#xff0c;人工智能正在扭曲我的时间感官。谁能相信Stable Diffusion只有4个月大&#xff0c;而ChatGPT的出现才一个多月&#xff1f;感觉只是眨了眨眼&#xff0c;我们差点错过了一个全新的行业。 在过…

Effective_Objective-C_4协议与分类】

文章目录前言23.通过委托与数据源协议进行对象间的通信协议委托模式数据源模式要点总结24.将类的实现代码分散到便于管理的数个分类之中分类Xcode创建一个分类分类需要注意什么要点25.总是为第三方的分类名称加前缀要点26.切勿在分类里面声明属性关联对象扩展可以添加属性要点2…

用javascript分类刷leetcode20.字符串(图文视频讲解)

1143. 最长公共子序列 (medium) 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删…

系分 - UML【概念】

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录UML - Unified Modeling LanguageUML中有4种事物结构事物行为事物分组事物注释事物UML图的分类结构型图&#xff08;静态图&#xff09;行为型图&#xff08;动态图&#xff09;UML图 - 静态图[结构型]类图…

C#枚举器和迭代器

C#枚举器和迭代器 使用foreach语句时&#xff0c;可以依次取出数组里面的元素&#xff0c;原因就是数组提供了“枚举器&#xff08;Enumerator&#xff09;”&#xff0c;枚举器知道元素的位置并返回请求项。 枚举器IEnumerator 枚举器实现了IEnumerator接口&#xff0c;该接…

Angular页面使用指令和路由守卫进行权限控制

在各种业务系统中&#xff0c;为了保证业务及数据安全&#xff0c;除了要求用户必须登录后才能操作外&#xff0c;还针对不同的角色对不同用户设置了各自的访问权限&#xff0c;包括确定的某个页面的权限和页面中特定元素的权限。本文记录了一种Angular页面常用的权限管理方法。…

C++:std::function模板类

一&#xff1a;function定义 类模板 std::function是一种通用的多态函数包装器&#xff0c;它的实例可以对任何可以调用的目标实体进行存储&#xff0c;复制和调用操作。简单的来说&#xff1a;C中有几种可调用对象&#xff1a;函数&#xff0c;指针&#xff0c;lambda表达式&…

区块链之开发命令行操作模块

文章目录功能介绍go语言中flag用法简介项目命令行具体实现链接&#xff1a; 区块链项目github地址项目目前进度&#xff1a;功能介绍 利用命令行操作区块链相较于图形用户界面来说&#xff0c;编写代码简单&#xff0c;同时也可以实现复杂的功能。命令行模块的功能应该满足&am…