ORB-SLAM笔记———ORB-SLAM3概述

代码地址 https://github.com/UZ-SLAMLab/ORB_SLAM3

论文名称 ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM

文章链接 https://arxiv.org/pdf/2007.11898.pdf

 

时隔五年,在前天也就是2020年7月23日,来自Zaragoza universtiy的slam组终于开源了orb-slam的version 3。论文现在已经挂到了arxiv上,并且在github上已有code,对源码感兴趣的小伙伴们可以立即行动了。感恩各种公众号,自己第一时间就知道了开源的消息。刚刚看过一遍文章,所以趁着热乎,我们来总结一下。

ORB-SLAM3的系统框图

从第一版的单目相机系统,到第二版加入了对stereo以及RGBD camera的支持,再到目前最新版本的orb-slam整合了visual,以及visual-inertial的融合方案,使得整个算法系统可以非常快速地应用于不同的硬件平台上。从这样的进化史来看,他们组的研究者们非常致力于将orb-slam打造成一个通用性很高的系统。这样的观点在论文原文中其实也得到了证实,作者表明orb-slam最优秀,贡献最大的地方就在于这是一个完备,且精度很高的系统:

"This is essentially a system paper, whose most important contribution is the ORB-SLAM3 library itself [5], the most complete and accurate visual, visual-inertial and multi-map SLAM system to date."

在具体讲orb-slam 3的contribution之前,作者从data association的角度谈了下VO和SLAM的区别。这里我认为虽然老生常谈,但也的确有必要再拿他铺垫铺垫。首先按照作者的思路,将现有比较传统的data association分成三种:short-term,mid-term和long-term。

  1. short-term的特征关联对象主要是时间序列上的临近帧,这种关联方法主要用于以估计ego-motion为主的VO或VIO。Short-term往往会很快速地累积误差原因在于当移动范围较大时,先前的观测不会被保存,那么当转回到原来的场景时,再次观测到原先的landmark时,会当作一个新的点处理。这样的motion estimation方式在一个小范围area都不能称为consistent的,所以漂的自然会很快。
  2. 如果我们的系统里存在一个全局的landmark地图的话,在drift还不是很大的情况下,我们可以将临近pose所观测到的landmark投影回来,构建BA问题从而估计当前的pose。这就是论文中说的mid-term方式了。作者表明,orb-slam的精度相比于VO+独立回环模块的方案会更高的原因,这一部分作用很大。
  3. long-term从作者的表述来看,主要用在大场景发生drift或者跟丢时。一般当我们说有了很大的漂移或者跟丢了的时候,其实都丢掉了当前帧和map的部分甚至全部关联。这时候就需要我们借助一些在短中期以外的特征关联手段,在此基础上通过位姿图优化,或者做整体的BA来消除drift或者重定位。

回到正题,我们来讲本文的核心contribution。

在本篇一开始已经提到了,orb3最大的贡献在于整合了一系列sensor方案,使得整个系统更加通用化。对于VI方案,在初始化中,作者提出了从头至尾的MAP estimation的方法。因为在VI系统中,初始化一直是一个非常重要而又相对独立的话题。所以这一部分准备后面独立写一篇blog详细说说,还是有挺多干货的。

那么接下来,结合刚刚讲完的特征关联,作者提到说orb-slam3提出了一个叫做“multi-map data assocition”的关联方法,这部分在系统中具体对应于一个名为orb-slam atlas的模块。它在整个系统中极为重要,基本串联起了所有的主线程。这里先额外提到一点,本篇blog更加侧重于在先前orb-slam版本的基础上,version3的改进之处以及亮点。那对于那些不是完全新的东西呢,比如说主线程模块,就不再从头介绍了。所以如果是之前没接触过orb-slam的小伙伴呢,不嫌弃可以先看看我先前的博客哈!

Atlas里有若干个disconnected map,其中有一个active map,tracking线程用它来实现对当前帧的定位,与此同时它被local mapping线程持续优化并加入新关键帧。与active map相对应,Atlas中剩余的map被称为non-active。重点来了,这些non-active怎么用呢?主要是当tracking线程跟踪失败的时候,该线程会在Atlas的所有地图中试图找回当前帧的pose。如果找回了,那么tracking线程继续后面的工作,同时还要做的一件事就是,根据在Atlas中找回的情况,确定是否要更改active map。当然也会有让人不希望的情况发生,那就是在Atlas中未能找回当前帧,这时候当前active map变为non-active,然后启动一个新的地图。如果新的地图走着走着和之前的non-active发生overlap,此时loop and map merging thread会将有重合的map融合,seamlessly!结合自身的work,抒发一点个人感慨吧,单单讲map management这一块儿,orb的工作我觉得真的会优秀并领先太多!

在先前的work中,place recognition多用DBoW的方法:先用词袋匹到三个连续关键帧,满足时间上的一致性,然后再check几何上的一致性。作者现在认为这种方法虽说有一定的精度但牺牲了召回率。所以针对上述current frame在tracking thread中跟丢后,去到Atlas中找回时,提出了一种全新的识别方法。新方法大体上是先check几何一致性,然后再在map中考虑区域的空间一致性。这样可提升recall,并且加强data association从而提升map的精确度。先前我的orb笔记关于DBoW重定位的介绍也不是很多,这一部分与IMU初始化一样,后面也单独写一篇详细说说吧。不过好歹得先啃一啃源码的,flag先立为敬哈哈。

最后还有一部分在系统整体层面的贡献,作者将pinhole以及fisheye的camera model都做了进一步整合,包括投影,反投影方程,以及相关的雅可比等。真的是相当全面的工作了!感觉未来照如此趋势,会不会学界刚刚出来的东西都可以直接拿来不加粉饰地去做产品了呢?真的太令人期待了不是吗!

 
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页