论文地址:https://arxiv.org/abs/2007.11898v1
代码地址:https://github.com/UZ-SLAMLab/ORB_SLAM3
ORB_SLAM1算法框架解析地址: https://blog.csdn.net/weixin_43503355/article/details/121474574spm=1001.2014.3001.5501
ORB_SLAM2算法框架解析地址 : https://blog.csdn.net/weixin_43503355/article/details/121618694spm=1001.2014.3001.5501
一个典型的视觉SLAM系统主要包含数据处理、初始化、视觉里程计、地图维护、闭环检测等部分。
orb_slam3中上述框架主要完成的任务:
ORB_SLAM3也满足上述几部分。与前两代相比主要是在单目、立体视觉、RBGD基础上加入了惯性传感器,引入了视觉惯性和多地图模式(atlas)以及地图融合(map merging).。系统框架如图所示与前一代相比新增的内容如红色框图所示:
整个ORB3最牛逼的地方就在这里了,最早在IROS2019的一篇文章,即参考文献[9]中提到。在ORB3中,Atlas地图集由一系列不连续的小地图构成,并能够无缝连接,实现重定位、回环检测、地点识别等功能。当每一个新的视觉帧进入流程,跟踪线程立即追踪并定位新一帧的位姿。地图集本身也随着时间逐步优化且会将新的视觉帧经过挑选作为关键帧。在Atlas中,DBoW2被用于重定位、回环检测、地图合并。地图的状态也分为active和non-active两个状态,在跟踪线程的介绍里将会详细介绍这一机制
当定位跟踪失败时:首先会在所有的Atlas地图集中搜索当前位置的匹配,如果成功,则将当前的地图设置为non-active,而将在Atlas搜索到的地图设置为active,并继续在active的地图上进行局部跟踪。如果在全图搜索失败,则在一定时间后,当前的active地图会强行被设置为non-active,新的小地图将被构建,并设置为active。这样,就的地图的正确性不会被局部定位的失败影响,新旧地图之间的位姿变换关系不确定性也有希望被之后的共视减小或者消除
局部建图线程中规中矩,只有active的地图被添加关键帧,在添加关键帧的时候,重复的关键点被移除。VI-Bundle Adjustment在当前被插入帧前后窗口内被用来提升地图的质量。但是,在Local mapping框图中的后三项,ORB3加入了一些改进,用了他们的novel MAP,后续会介绍
当每一个关键帧被插入,地点识别都被启动,这一关键帧被和整个Atlas地图集关键帧进行比较,如果检测到两关键帧是同一地点,分为两种情况:若被召回帧是当前的active地图中的一部分,则需要进行loop correction回环矫正,在回环矫正之后,Full BA在另一个线程中被悄悄进行,全局位姿图得到优化,整体的地图一致性得到了提升;若被召回帧是属于一个non-active的map,两个地图则会被合并成一个地图并将大地图设置为当前的active地图。这一过程和跟踪并行,不会影响跟踪的实时性
ORB_SLAM3 提供针孔模型和鱼眼模型的实现。并优化了以下问题:
当双目具有共同观测区域,则可以使用双目三角化真实的landmark scale。否则就当作多视图几何原理进行三角化。
总结 在SLAM系统中相机模型的主要功能有:
由于单目视觉SLAM没有尺度信息,可以通过增加惯性传感器IMU解决,imu的引入为目标优化函数带来额外的约束,最常见的约束即将一段时间内 IMU 构建的预积分量作为测量值,对两时刻之间的
状态量进行约束。获得惯性残差。在纯视觉SLAM中,估计状态仅包括当前相机姿态,而在视觉惯性SLAM中,需要计算其他变量。这些包含主体body姿态和在世界坐标系下的速度vi,以及陀螺仪的偏差big和加速度计的偏差bia——假定根据布朗运动而演化。这导致状态向量的表示方式为:
imu状态预测模型可以表示为:
即从第 i 时刻的PVQ 对 IMU 的测量值进行积分得到第 j 时刻的PVQ,预测模型存在:每次i处位姿被优化更新后,后续的状态量都需要重新进行积分,运算量较大,因此通过公式将预测模型转化为预积分模型:
转化后PVQ公式中的积分项则变成相对于第i 时刻的姿态,而不是相对于世界坐标系的姿态,
两侧相减即可获得预积分惯性残差:
等价于论文中:
连同重投影误差,VIO总的优化函数可以表示如下,对应的因子图如图(a)所示
由于上述预积分模型会受到重力方向g和IMU偏差bias的影响因此在需要对IMU进行初始化,获得惯性变量获取良好的初始值:机体速度v,重力方向g和IMU偏差bias。针对ORB-SLAM-VI 系统存在的受限于针孔单目针孔相机、imu初始化很慢且在部分场景会失败等缺点,进行了以下改进:
新的IMU初始化主要分为以下三个步骤。
Vision-only MAP Estimation
2秒钟内完成初始化纯单眼SLAM ,以4Hz频率插入关键帧。在此期间之后,可以得到了一个由k = 10个相机姿态和数百个点组成的up-to-scale(不含尺度的)的最新比例地图,此时该地图已使用Visual-Only BA进行了优化(图2b)。将这些姿态转换为body参考系,获得轨迹T-,其中的横条表示up-to-scale的变量。
Inertial-only MAP Estimation
在这一步中,我们的目标是在MAP估计的意义上,仅使用Vision-only中的T-和这些关键帧之间的惯性测量值(预积分量)来获得惯性变量的最佳估计。这些惯性变量可以堆叠在仅惯性状态向量中
其中s是仅视觉解决方案的比例因子scale,Rwg是重力方向,用两个角度表示,因此世界参考中的重力矢量为g=Rwg*gi,gi=(0,0,G),G为的重力大小;b,是在初始化期间假设加速度计和陀螺仪恒定的偏置值,v是从第一个关键帧到最后一个关键帧的up-to-scale的body速度,最初是根据Vision-only中的T-估算的。
在高斯误差分布且测量独立假设下,通过对最大后验取负对数将其转化成为最小二乘进行处理
如图2c所示,此优化与VIO目标函数的不同之处在于:这里不包括视觉残差,但包含施加给IMU bias的、接近于零的先验残差rp,它的协方差由IMU的特性给出。(rp就是先验,后面那个就是针对每一次IMU预积分的求和。这个y函数的最小值就是我们所需要估计的参数的最大后验估计)。由于是在流形中进行优化时,需要定义一个回缩 retraction [62]用以在优化过程中更新重力方向估计(在优化上为了保证旋转矩阵还在流形上,我们整了指数变换来更新这一李群):
仅惯性优化完成后,帧的姿态和速度,3D地图点就会以估计的比例s缩放,并旋转以使world系z轴与估计的重力方向对齐。由于Bias被更新,因此需要重复计算IMU预积分,以减少将来的线性化误差。初始化过程先验选取中,IMU的bias设置为0,使之不会偏离0太远,且初始的协方差矩阵按照IMU的datasheet设定。当完成了IMU的MAP估计后,纯视觉的尺度被对齐,并且重力方向上也与Rwg旋转后的方向对齐,Bias值也得到了一个合理的估计。
Visual-Inertial MAP Estimation
单目系统一旦系统对惯性和视觉参数有了良好的估计,就可以执行联合视觉惯性优化以进一步完善解决方案。该优化可以表示为图2a——对于所有关键帧,具有共同的偏差;与仅惯性步骤相比,包括相同的先验信息。但bias是不变的。且IMU方面的先验是和纯惯性估计的先验是一样的。
对于双目通过将比例因子固定为1并将其从仅用于惯性的优化变量中删除,可以轻松地将monocular-inertial初始化扩展为stereo-inertial初始化,从而增强其收敛性。
Tracking解决了一个简化的视觉惯性优化问题,只优化最后两帧的状态,而地图点保持不变。
Mapping使用滑动窗口内的关键帧及其地图点作为可优化变量,包括优化关键帧的共视帧,但保持它们固定。(此处的滑动窗口与VINS中并不相同,此处主要滑窗主要包含当前关键帧,当前关键字的共视关键帧,以及当前关键帧共视关键帧的共视关键帧(仅作为约束不参与优化))
在某些特定情况下,当运动过慢不能提供良好的惯性观测时,初始化可能仅在15秒内无法收敛到精确解。为了在这种情况下获得鲁棒性,ORB3提出了一种新的尺度优化策略:基于改进的仅惯性优化,括所有插入的关键帧,尺度以及重力方向作为估计参数(子图的图d),这种情况下,并不是将IMU的偏差Bias设定为恒定。而是使用每个帧的估计值,然后对其进行修复。这种优化的计算效率非常高,它每十秒钟在本地映射线程中执行一次,直到映射自初始化以来已超过100个关键帧或超过75秒为止。
在纯视觉SLAM或VO系统中,暂时的相机遮挡和快速运动会导致失去视觉元素的跟踪,从而使系统迷路。 ORB-SLAM率先使用了基于词袋位置识别的快速重定位技术,但事实证明它们不足以解决EuRoC数据集中的困难序列。当跟踪少于15个点的地图时视觉惯性系统会进入视觉丢失状态,由于IMU的引入ORB将丢失状态又细分成短期丢失和长期丢失。
短期丢失:根据IMU读数估算当前的body状态,并在估算的摄像机姿态中投影地图点,并在Localmapping大滑动窗口中搜索匹配项。所得的匹配项包括在视觉惯性优化中。在大多数情况下,这可以恢复视觉跟踪。否则,在5秒钟后,我们进入下一个阶段。
长期丢失:如上所述短期丢失无法解决,一个新的视觉惯性地图图将被初始化,并成为活动图(active map)。
tracking和mapping线程通过将地图点投影到估计的相机位姿中,在附近几个像素的图像窗口中搜索匹配项,此来找到帧和活动地图之间的短期和中期的数据关联,短期数据关联能获得较为准确的里程计数据,但是对于跟踪丢失的时候就无能为力了。因此系统需要具备长数据关联能力。为了实现重定位和回环检测的长期数据关联,ORB-SLAM3使用DBoW2词袋位置识别系统,BoW2用它们的词袋向量建立一个关键帧数据库,且给定一个查询图像能够根据它们的词包高效地提供最相似的关键帧。
提及闭环检测必须提到两个衡量指标,召回率和准确率,召回率:系统所有的闭环中有多少闭环能通过检测算法被正确的检测出来。准确率:闭环检测算法检测到的闭环中有多少是真正正确的闭环。
本文提出了一种新的具有改进召回率的位置识别算法,用于长期和多地图数据关联。每当建图线程创建一个新的关键帧时,就会启动位置识别,尝试检测当前关键帧与地图集中关键帧的匹配。如果找到的匹配关键帧属于活动地图,则执行回环闭合。否则,它是一个多地图数据关联,然后合并活动地图和匹配地图。另外的创新点在于,一旦新的关键帧和匹配映射之间的相对姿态被估计出来,定义一个local window(局部窗口),其中包含匹配的关键帧及其在共视图中的邻域。在这个窗口中,进行中期数据关联,提高循环闭合和地图合并的精度。
为了获得较高的召回率,对于每个新的活动关键帧,ORB3在DBoW2数据库中查询Atlas中的几个相似的关键帧。为了达到100%的精度,每个候选关键帧都要经过几个步骤的几何验证。所有几何验证步骤的基本操作是检查图像窗口内是否存在其描述符与映射点的ORB描述符匹配的ORB特征点,并使用它们之间的Hamming距离阈值。如果在搜索窗口中有多个候选项,为了丢弃不明确的匹配项,我们检查与第二个最近匹配项的距离比。位置识别算法的步骤是:
首先,使用DBoW匹配得到三个当前帧Ka的匹配候选帧Km;然后将Km、Km的n个最佳共视帧、所有这些帧看到的路标点放进local window里,通过词袋库的正向索引得到各个匹配点的2D匹配关系,从而建立匹配点的3D-2D匹配关系;然后需要计算Km到Ka的一个相似变换,若尺度不确定视计算Sim(3)。计算这一变换时,采用Horn algorithm(霍恩法),同时还要做一个RANSAC操作:为得到候选变换,我们把每个匹配的点对重投影误差计算出来,当小于一定阈值,就给这个变换投一票,采用民主共和的方式选出最好的位姿变换T。得到T后,由于前面是基于采样计算的位姿变换,没有用到全部的特征点匹配信息,需要用上所有信息refine一下这个位姿变换(RANSAC经典流程)。在local window里找所有与这帧图像中特征点匹配的路标,并使用双向转移误差作为误差目标函数来优化这一位姿变换,还用一下Huber来增强一波稳定性。如果inlier的个数ok,再在更小的local window(减小前面的n)中开始第二次的引导匹配。为了验证这一结果,把后续进来的3帧都做一下检验:在Ka的active map中找两个共视帧,然后看这两帧与local windows的匹配点数目是否超过阈值。这一过程持续三帧成功或者连续两帧失败来作为验证成功失败的判断条件。最最最最后用IMU重力再验证一波pitch和roll才算最终通过考验,成为一个place recognition。
如果位置识别成功,产生了多地图之间的数据关联,在活动地图中的关键帧和地图集中的不同地图中的匹配关键帧之间,使用对齐变换进行地图合并操作。需要确保当前活跃地图中的信息能被tracking线程及时调用,避免地图重复。合并过程分为两步:缝合和优化两部分
和上一节差不多,区别有两点:
IMU的引入是的地图具有尺度信息此时计算SE(3),如果尺度信息不可用需要用相似变换Sim(3))将Ma中的点对齐到Mm。
优化的变量和固定的变量如图所示
测
参考:
epnp: https://blog.csdn.net/jessecw79/article/details/82945918
MLPNP https://blog.csdn.net/qq_39266065/article/details/115614421
https://zhuanlan.zhihu.com/p/181363155
https://blog.csdn.net/shyjhyp11/article/details/109540631
https://blog.csdn.net/shyjhyp11/article/details/110621998