相比于ORB-SLAM2,ORB-SLAM3比较大的改动有三点:解偶相机模型,融合IMU以及多地图系统,虽然一如既往的不是什么很出色的创新,但工程测试结果确实牛。
ORB-SLAM系列的系统框架大致没有较大的改变,系统的核心线程主要是跟踪线程,局部建图线程,回环检测线程。
(1)跟踪线程:
输入图像(和IMU数据
),输出当前帧对应的位姿。
(要注意的是,在SLAM系统中,输出的位姿是每一时刻相机在世界坐标系中的位置和朝向信息,即3D的旋转和3D的平移向量。而世界坐标系的原点一般默认为初始化成功时对应的相机的位置,即第一帧的位姿由一个单位阵旋转矩阵和一个位移向量[0,0,0]组成。后面算得的每一帧相机位置都是想对于第一帧的旋转和平移变换关系
)
跟踪线程接收图像信息后,通过跟踪匀速模型,跟踪参考帧,跟踪局部地图,不断优化当前帧的位姿,在得到当前帧位姿后跟踪线程根据当前的系统状态决定是否要创建关键帧。
另外,跟踪线程具备重定位功能,在跟踪失败后会通过bow词袋向量搜索进行场景识别快速找回位姿(但如果某一段路况一直都缺少特征这时就位置就找不回来了,在室外环境中实时测试时跟丢了有很大的概率找不回来,这时SLAM系统就会重新初始化。多地图的不同在于如果跟踪彻底失败了,会保留当前的地图并参与后续的回环检测,每次重新初始化都从同一个起点出发,如果检测到回环信息则会把出现回环的两个子地图进行融合
)。
(2)局部建图线程:
本质上将SLAM被分成两部分:前端和后端。
前端就是跟踪线程,包括局部建图线程和回环检测线程的后端最大的目的还是在优化由前端计算得到的位姿,有了准确的位姿SLAM所创建的地图才能有较好的一致性,因为SLAM地图的本质上是一帧帧图像根据位姿拼接融合起来的,用特征点拼接的就是稀疏地图,用整副图像像素拼接的就是稠密地图。
局部建图线程会一直维护一个当前关键帧附近的共视小地图(covisibility graph
),由关键帧和地图点组成,并且随着SLAM的进行对这个小地图不断进行更新,对关键帧和地图点进行增删。在随系统一起初始化之后,局部建图线程会一直等待和检测跟踪线程关键帧的输入,一旦检测到关键帧则对该关键帧的covisibility graph
进行BA优化。
(3)回环检测线程:
在SLAM特别是视觉SLAM系统中,相机的位姿都是根据图像之间的旋转平移运动和几何投影关系算出来的,在视觉SLAM中,每一帧时刻的位姿都是在前一帧(EKF)或者前面好几帧(非线性优化)位姿的基础上计算的来的,在一些大场景中,当SLAM系统运行时间比较长时,相机的投影误差便会一直进行累积,表现在地图上就会看到明明相机转了一圈回到原点了,但是地图和轨迹却没有衔接在一起。
回环检测干的事就是接收关键帧不断的进行位置识别,通过bow词袋向量进行快速的相似性匹配,如果检测到回环后,则建立产生回环的关键帧之间的相似变换关系,根据相似性约束对回环关键帧处的Essential Graph进行优化,在确定回环关键帧的优化位姿后,通过传播更新与回环关键帧存在共视关系的关键帧的位姿。最终得到的结果就是具有全局一致性的轨迹和地图信息,在闭环处地图信息完美的融合。