2020年7月24日大约午时,ORB-SLAM3发布!
瞬间,祖国大地上的各位博士生开始用不同的方式表达对ORB-SLAM3的崇(绝)拜(望)之情。
也有的同学重新规划自己的职业生涯
下面,我们就来看看ORB-SLAM3到底有多强悍
ORB-SLAM3的震惊效果
数据集上效果的惊艳之处
这里,注意看视频的3分29秒处,惊艳!
这里1分钟处,卧槽!
各个数据集上量化指标分析
知乎网友对ORB-SLAM3的实测分析(如何评价ORB-SLAM3?- 知乎 https://www.zhihu.com/question/408916240)
感谢知乎网友fishmarch对ORB-SLAM3在数据集上的实测分析( https://www.zhihu.com/question/408916240/answer/1406296687),发现ORB-SLAM3本身单目情况下,位姿精度并没有大幅度提升,但在加入IMU设备后,ORB-SLAM3的精度提升非常明显:
坂田克里斯,四月小小酱,刘国庆等用户也对OBR-SLAM的代码进行了分析,其中刘国庆指出:目前ORB-SLAM3的代码可能是团队匆忙整理出来,对于高版本的库和编译器支持尚待完善。
ORB-SLAM3解读分析
ORB-SLAM3的研究历史
- 2015年,研究通过多线程实现的基于特征点的实时单目SLAM系统,发表论文与源码ORB-SLAM。
- 2016年,团队给原有的ORB-SLAM系统加入了双目和RGB-D相机支持,并发表论文与源码命名为ORB-SLAM2。
- 2017年,团队在系统中加入了IMU约束,发表论文,但代码未开源。清华大学王京同学对其进行了复现,其代码发布在:https://github.com/jingpang/LearnVIORB.git
- 2019年,团队研究基于多地图的方式对系统对性能的提升,发表论文
- 2020年,团队研究基于最大后验估计的视觉与IMU快速初始,发表论文
流程看创新
从整体流程图中可以看出,相比于左图ORB-SLAM2的整体流程图,ORB-SLAM3的主要创新点如下:
- 实现了基于最大后验估计的IMU快速初始化方法。
- 实现了基于多子图系统Atlas。
论文中还提到另一个创新点:实现了无需离线校正的双目相机模型,主要实现想法是将双目的两个摄像机看做两个单目相机,中间存在一个仿射变化,观测公共区域中的共同特征点来实现校正的方式,但在双目系统初始化的代码注释中,却强调了输入的双目相机图片必须是需要校正的。
这里可能是最终版的代码还未更新的缘故,或者是忘更改之前ORB-SLAM2中的注释。这里就不做深入了解了。
创新点一 基于最大后验IMU初始化算法
这里的主要创新工作源自论文《Inertial-only optimization for visual-inertial initialization 》,为了符号的一致性,就全部用该论文的符号来表示。首先明确对IMU初始化的目标量:输出精确的载体速度、重力方向和IMU位姿的漂移量。下面我们来看下什么是最大后验概率估计:
最大后验概率估计
最大后验估计就是给定数据样本的情况下,来最大化估计判断模型参数的后验概率
算法概述
这里,我们得到的数据样本量应为:
- 缺少尺度的图像位姿:
- 惯性的状态量:
模型应为预积分模型约束,这里大家可以参考泡泡蔡徐坤的著作,就不再赘述。
下面我们来看
注意这里的并不是重投影误差,而是表示在IMU初始化姿态精确时的预积分误差,这里可以定义残差项为:
明确迭代更新方式为:
这里论文给出了分别对和变化的雅克比矩阵推导为:
创新点二 基于多子图方式的视觉SLAM定位算法更新:
论文首先明确了地图点的数据连接方式分为三种:
- 短时数据关联 当前观测信息与观测附近的场景信息进行关联【类似于VO中的PNP,3D点与2D点相关联】
- 中时数据关联 当前观测信息与之前的场景观测信息相匹配【类似于闭环检测、全局优化过程】
- 长时数据关联 通过对两个地图点信息(重叠区域的)关联和匹配【ORB-SLAM3中所才有的Atlas地图数据册方式】
算法概述
这里主要对运行过程中的 Mapping线程进行分析,在运行过程中若发现此时的相机位姿漂移时,将创建关键帧并送入Atlas地图册中与Active Map进行匹配分析,若有闭环检测,发现有共同区域,则进行闭环和地图融合。这里Atlas地图册将整体地图部分分成两块:Active Map和Inactive Map。其中Active Map相当于地图册的工作区,用于和KeyFrame进行匹配和融合,InActive Map部分则不进行匹配相关工作以降低计算量。下面将主要说明如何对相机位姿跟踪失败的情况加以判断:
相机位姿跟踪失败情况判断方法
论文指出,当:
- 匹配的特征点数少于阈值。
- 目前的跟踪点对于位姿解算来说是退化情况,相机位姿不具有可观性。
以上两个条件都满足时,才判断相机位姿已经漂移。论文通过计算相机位姿的协方差矩阵来估计位姿的可观性:
论文认为通过计算点的不确定性造成的计算量过大,所以这里采用对位姿的不确定性进行计算有利于降低计算开销,提升实时性。但笔者发现:早在2012年Co-SLAM就通过观测点的不确定性来进行可观性的判断,而且CO-SLAM可以在3个相机下达到60帧的速率。这里给出CO-SLAM的点不确定性计算公式如下:
C0-SLAM作者邹丹平老师分析俩者的主要区别如下:
一方面CO-SLAM是基于GPU来实现Tracking追踪,可以有效的加速实时性。另一方面ORB-SLAM3加入了IMU模块,位姿可能会漂移,但很难出现跟踪失败的情况。这里加入位姿的不确定度计算主要为了对追踪失败的情况进行有效判断。
地图融合部分
地图融合部分和传统的local Mapping步骤基本上一致,主要区别在于去除融合地图中的冗余地图信息(如俩帧地图中共同观测的部分,只需要添加一次就好)。这里假设待融合的区域分别为和,通过匹配两个地图中的特征和 来解算出位姿【感觉过程类似于ICP】。同时抛弃中与地图共同观测的特征点部分,再将其配准到中,进行局部子图优化。
地图部分代码阅读
ORB-SLAM3中创建了Atlas类来保存整体的地图点信息,如System.h中声明:
Atlas整体数据结构如下:用一个vector保存多个子图信息,每个子图中表示清楚相应的
其中,Atlas还使用了boost::serialization库来对地图信息进行序列化,这一步的好处在于加速地图信息之间的快速传递:
结尾
下面笔者从一个博士研究的角度出发,跟大家说说心里话:在StructVIO出现后,我一直以为传统SLAM在定位精度上很难在做出进一步的突破,传统SLAM算法在研究上似乎也已经到头。SLAM的数学大厦已经建成,我们后期的研究只不过是给这座大厦舔砖加瓦。论文不好发,实现难,等待收益时间太长似乎是每一个传统SLAM研究者的焦虑。End-to-End,语义SLAM,似乎每一篇论文都要和深度学习结合才能显保障其研究的前沿。ORB-SLAM3对我来说,像一针强心剂,让我明白不是传统方法研究到头,而是因为我是一只井底之蛙,传统几何研究有其独特的美尚待我去发掘。我想每一篇优秀的论文都是一份鼓励,让我们看到伟大创造不断出现可能。我们应当怀揣着敬畏和焦虑的心情,去做好每一个实验,写好每一份代码,验证好每一个idea。无论成功与否,都要有乘风破浪的气魄。
好了,本次的ORB-SLAM3分享到这里结束,大家下次再见~
本文仅做学术分享,如有侵权,请联系删文。