关于ORBSLAM的发展脉络
ORBSLAM系列存在随机性的原因:RANSAC中随机数生成器的使用;跟踪、映射和回环闭合线程的不可预测的交织,这取决于操作系统调度程序,这种不可预测性使得在不同的执行中估计的关键帧的姿势可能不同,甚至可能选择不同的帧作为关键帧
track in local map: 相机跟踪时利用了局部地图。具体来说,先从所有关键帧中选择与当前关键帧有相同特征点的关键帧集合,之后提取每一个关键帧的共视帧的集合,然后利用两个集合的关键帧的信息进行相机位姿的跟踪。
loop detect: 回环检测共包含四个部分:选择候选关键帧,计算变换,回环融合和essential graph优化
选择候选关键帧:当每次获得一个关键帧时,都会判断是否与之前的关键帧发生了回环。采用bag of words方法进行判断是否是相同的观测场景,论文采用了一个小技巧就是首先判断了当前关键帧与其共视帧的匹配得分,其他关键帧如果低于这个得分不会判定为回环。如果某个关键帧与当前帧的匹配分数达到了阈值,还需要判断共视帧的3个关键帧是否也满足会还的条件。只有都满足时才会判定发生了回环。
计算变换:通过3D地图点计算回环时,当前帧与回环帧之间的SE(3)变换。
回环融合:将重复的地图点融合并更新共视图;通过纠正当前关键帧与当前帧相连关键帧的位姿,并进行回环帧的地图点与当前帧地图点的融合;更新融合后的共视图。
essential graph优化:通过优化,将回环得到的误差均匀分配到整个essential graph当中,纠正建图过程中积累的误差。
ORB-SLAM2在ORBSLAM的基础上,BoW字典有所变化,以及在回环检测essential graph优化后,新增了一个全局的BA进一步优化。
ORBSLAM-Atlas管理着一系列的子地图,这些子地图共用一个DBoW数据库,使得能够实现重定位回环等操作。每个sub-map都有mappoints,keyframes,covisibility和spanning tree
当相机在正常跟踪状态,所生成关键帧所在的地图称为“活动地图(active map)”。如果跟踪失败,首先将进行重定位操作寻找地图集中对应的关键帧,如果依旧失败,则重新创建一个新的地图。此时旧地图变成了“非活动地图(non-active map)”,新的地图作为活动地图继续进行跟踪和建图过程。在跟踪过程中,当前相机必然是位于活动地图当中,可能存在零或多个子地图。
每次插入关键帧时,都与完整地图的DBoW数据库进行匹配。如果发现了相同的场景,且两个关键帧同时位于活动地图,则意味着发生了回环,便按照回环的方式进行融合处理;如果匹配上的关键帧位于非活动地图,则需要将两个子地图进行拼接,这便是ORBSLAM-Atlas的创新之处。
地图无缝融合时,当前活跃的地图吞并对应的非活跃地图。通过以下步骤将非活跃地图的信息补充到当前活跃地图。具体步骤如下:
1、检测:首先由重识别模块检测出当前关键帧Ka与匹配上的待吞并关键帧Ks,并获取两个子地图当中与匹配上的两个关键帧具有共视关系的关键点和关键帧
2、位姿计算:通过Horn+RANSAC方法初步计算两个关键帧之间的变换关系,之后将待吞并地图的地图点通过这个变换投射到当前关键帧Ka上,再利用引导匹配的方法获得更丰富的匹配并进行非线性优化,获得精确的变换。
3、地图点合并:将吞并地图的关键点变换到当前关键帧位姿下,融合重复的地图点。之后将两个地图的关键帧融合,重新生成spanning tree和共视图
4、衔接区域的局部BA优化:融合后于Ka具有共视关系的关键帧参与局部BA优化,为避免gauge freedom,固定之前活跃地图中的关键帧而移动其他的关键帧。优化完成后再次进行地图点的合并于spanning tree/共视图的更新
5、完整地图的位姿图优化:对整个合并后的地图进行位姿图优化
Atlas的方法使得在跟踪丢失时能够重新创建一个地图,并在回到原有位置时利用原地图的信息,使得SLAM更加鲁棒。Atlas的方法也用在了ORB-SLAM3中
ORB-SLAM3中的地图,大致上采用了ORB-SLAM1/2和ORBSLAM-Atlas的方法完成了重定位、回环和地图融合
1、重定位:ORB-SLAM3在重定位的策略上做了一些改进。为了保证重定位不出错,重定位重重设置了严苛的条件,保证高精准率而识别率较低。旧的方法(ORB-SLAM1/2)中当3个关键帧完全匹配上后才判定为重定位成功。
然而作者发现。三个关键帧经过了很长时间。主要改进是,当当前帧于数据库的关键帧匹配上后,检测于当前关键帧具有共视关系的关键帧是否也能够匹配,如果可以则判定为重定位成功;否则才继续使用接下来的关键帧进行判定
2、视觉地图融合:视觉地图融合方式与ORB-Atlas的大致相同,对融合的区域起了一个新的名字叫做“衔接窗口(welding window)”同时指明在衔接后进行完整位姿图融合时,衔接窗口的关键帧固定以保证不会出现gauge freedom,固定之前活跃地图中的关键帧而移动其他的关键帧。优化完成后再次进行地图点的合并于spanning
3、闭环:闭环检测部分与ORB-Atlas的基本相同
关于ORBSLAM的发展脉络的更多相关文章
- HTTP协议发展脉络
1 发展脉络 1.1 1991 HTTP/0.9 建立TCP连接.客户端发送请求(只有GET命令).服务端返回请求(只能返回html格式字符串)后就关闭TCP连接 1.2 1996.5 HTTP/1. ...
- CNN目标检测系列算法发展脉络——学习笔记(一):AlexNet
在咨询了老师的建议后,最近开始着手深入的学习一下目标检测算法,结合这两天所查到的资料和个人的理解,准备大致将CNN目标检测的发展脉络理一理(暂时只讲CNN系列部分,YOLO和SSD,后面会抽空整理). ...
- 标题 发布状态 评论数 阅读数 操作 操作 CNN目标检测系列算法发展脉络简析——学习笔记(三):Fast R-CNN
最近两周忙着上网课.投简历,博客没什么时间写,姑且把之前做的笔记放上来把... 下面是我之前看论文时记的笔记,之间copy上来了,内容是Fast R-CNN的,以后如果抽不出时间写博客,就放笔记上来( ...
- C#线程模型脉络
今天在看同事新买到的<C#本质论 Edition 4>的时候,对比下以前Edtion3的新特性时针对Async/Await关键字时发现对一些线程方面的定义还理解的不是很透彻,脉络还不是很清 ...
- ***Java多线程发展简史
http://blog.jobbole.com/28297/ 本文来自四火的博客(@RayChase),由@_Zhijun 推荐 这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的 ...
- [转] Java多线程发展简史
这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的Knowledge Sharing的一个整理,我希望能对Java从第一个版本开始,在多线程编程方面的大事件和发展脉络有一个描述,并 ...
- 清华大学&中国人工智能学会:2019人工智能发展报告
2019年11月30日,2019中国人工智能产业年会重磅发布<2019人工智能发展报告>(Report of Artificial Intelligence Development 201 ...
- MMC & SD 发展历史
一.概述 MMC 卡和 SD 卡都是基于 Nand Flash 技术的移动存储卡. MMC(MultiMediaCard) 卡于 1997 年由西门子和 Sandisk 推出,SD (Secure D ...
- Atitit 边缘检测原理attilax总结
Atitit 边缘检测原理attilax总结 1. 边缘检测的概念1 1.1. 边缘检测的用途1 2. 边缘检测方法分类1 3. 边缘检测的基本方法2 3.1. Roberts边缘检测算子2 3.2. ...
随机推荐
- Python习题集(六)
每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 ''' 问题1.对 ...
- Docker入门之container篇
启动 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容 器重新启动. 因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器. ...
- 如何实现 iOS 短视频跨页面的无痕续播?
在一切皆可视频化的今天,短视频内容作为移动端产品新的促活点,受到了越来越多的重视与投入.盒马在秒播.卡顿率.播放成功率等基础优化之外,在用户使用体验上引入了无痕续播能力,提升用户观看视频内容的延续性. ...
- 三剑客之sed编辑器 基操
目录: 一.sed编辑器 二.打印内容 三.使用地址 四.删除行 五.替换 六.插入 一.sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流. sed ...
- 海量列式非关系数据库HBase 架构,shell与API
HBase的特点: 海量存储: 底层基于HDFS存储海量数据 列式存储:HBase表的数据是基于列族进行存储的,一个列族包含若干列 极易扩展:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加Da ...
- PHP中的数组分页实现(非数据库)
在日常开发的业务环境中,我们一般都会使用 MySQL 语句来实现分页的功能.但是,往往也有些数据并不多,或者只是获取 PHP 中定义的一些数组数据时需要分页的功能.这时,我们其实不需要每次都去查询数据 ...
- 告别Kafka Stream,让轻量级流处理更加简单
一说到数据孤岛,所有技术人都不陌生.在 IT 发展过程中,企业不可避免地搭建了各种业务系统,这些系统独立运行且所产生的数据彼此独立封闭,使得企业难以实现数据共享和融合,并形成了"数据孤岛&q ...
- Kotlin协程入门
开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 介绍Kotlin中的协程.用一 ...
- mybatis if else if 条件判断SQL片段表达式取值和拼接
前言 最近在开发项目的时候涉及到复杂的动态条件查询,但是mybaits本身不支持if elseif类似的判断但是我们可以间接通过 chose when otherwise 去实现其中choose为一个 ...
- java中的swing设计界面时怎么加上背景图片。而不覆盖其他控件?
通过以下方式设置下背景就可以了: import java.awt.Container; import javax.swing.ImageIcon; import javax.swing.JFrame; ...