ORB-SLAM贡献:
- 所有任务都使用ORB特征:无需GPU加速,在标准的CPU上可实时运行;具有视点和光照不变性;更加高效、可靠。
- 使用covisibility graph:使得跟踪和建图聚焦在局部区域,能在大环境下实时操作。
- 使用 essential graph:基于位姿图的优化实现回环检测。
- 基于视点和光照显著不变性的实时相机重定位。
- 模型选择的自动初始化:选择创建平面和非平面场景的初始地图。
- 对地图点和关键帧的选择优胜劣汰的方法:提高跟踪鲁棒性和长时间运行。
系统综述
- 特征选取:ORB
256位描述符相关的定向多尺度快速角点,能够非常快速地计算和匹配,具有良好的不变性。 - 三个线程:tracking、local mapping、loop closing
- tracking:负责提取特征后对每个帧定进行初始化位姿估计和局部地图的跟踪,并决定何时插入新的关键帧。
- local mapping:处理新的关键帧并执行本地BA,并跟新地图点和关键帧,以在相机姿态的周围实现最佳重建。
- loop closing:搜索每个新关键帧的循环。如果检测到一个循环,我们计算一个相似变换,通知循环中积累的漂移。然后,回环的两侧对齐,重复的点被融合。最后,对相似约束进行姿态图优化,以实现全局一致性。
地图点、关键帧及其选择
- map point:pi
- 世界坐标下的位置Xw,i。
- 观察方向ni是所有观察方向的平均单位矢量
- 相关的ORB描述符Di的汉明距离,相对于其他被观测到的点所在的关键帧中特征点描述子的汉明距离是最小的。
- 根据ORB特征的尺度不变性极限可以观察点的最大dmax和最小dmin距离。
- keyframe:Ki
- 它的相机位姿Tiw是刚体变换,变换点是从世界坐标到相机坐标。
- 相机的内参。
- 在帧中提取的所有ORB特征,伴有或不伴有地图点。
- map point:pi
Covisibility Graph and Essential Graph
- covisibility graph表示为无向加权图:节点是关键帧,关键帧之间在边缘共享相同的地图点,公共地图点数即为权重。
为了不包括由covisibility graph提供的可以非常稠密的所有边,构建保留所有节点(节点即关键帧),但是边缘很少的essential graph,但是仍然保留强大的网络。
从初始关键帧增量生成a spanning tree。
具有高度隐性的covisibility graph的边缘子集。
- BoW
通过从一组大图像中提取的ORB描述符离线创建词汇表。
更新:增加、剔除。
对存在视觉重叠的关键帧连接在covisibility graph中。
返回其分数高于75%的最好成绩的所有匹配关键帧。
Automatic map initialization
- 地图初始化目的:计算两个帧之间的相对姿态,以对初始的一组地图点进行三角测量。
- 与场景(平面或一般)无关,并且不需要人为干预来选择良好的双视图配置,即具有显着视差的配置。
- 两个并行计算的集合模型:假设平面场景的单应矩阵和假设非平面场景的基本矩阵。
- 当确定双视图配置是达到一定的安全阈值,或者检测低视差情况,或者双重平面模糊度时,为了避免初始化损坏地图,才进行此方法的初始化。
算法步骤:
- 找到最初的对应关系:在当前帧提取ORB特征,并与参考帧匹配,若匹配点不够,则重置参考帧。
- 两种模型并行计算:在两个并行的线程中分别用归一化DLT(直接线性变换法)计算单应矩阵H,用八点法计算基础矩阵F。
为了使两个模型的过程均匀化,将两个模型的迭代次数设置成一样(因为单应矩阵自由度为8,四对匹配点即可算出,基础矩阵需要八对点。对于单应矩阵设为4,基础矩阵设为8)
对每一次迭代,计算每个模型的评分(M可以是H或F):
- 模型选择:单应矩阵处理平面模型。如果
的值<0.45则选择单应矩阵模型。 - 从运动中恢复结构:
对于单应矩阵模型,使用Faugeras和Lustman的方法来检索8个运动假设。
对于基础矩阵模型,通过校准矩阵K使本质矩阵E转换为基础矩阵F,然后用奇异值分解法(SVD)求出四个运动的假设。 - 全局BA:改进初始重建。
Tracking
- ORB提取
- 从前一帧初始化位姿估计
如果成功跟踪了最后一帧,使用恒定速度运动模型来预测相机的位姿,并对在最后一帧观察到的地图点进行了指导搜索。
如果跟踪成功,但找不到足够的匹配(即运动模型被明显地破坏),我们将在最后一帧中对其位置周围的地图点进行更广泛的搜索。然后根据所找到的对应关系优化该姿态。 - 通过全局重定位初始化位姿估计
如果跟踪丢失,则将帧转换为词袋,并将需要全局重定位的关键帧在数据库中查询识别。
首先,计算每个关键帧中与地图点相关联的ORB的对应关系,然后,对每个关键帧执行替代RANSAC迭代,并尝试使用PnP算法找到摄像机姿态,如果找到有足够多inliers的相机位姿,则优化这相机位姿,并执行与候选关键帧的地图点更多匹配的引导搜索,最后,再次优化摄像机姿态,如果支持足够的inliers,跟踪过程将继续进行. 跟踪局部地图
优化相机位姿。
关键帧集K1与当前帧共享地图点;关键帧集K2在covisibility graph的K1附近;参考帧Kref属于K1集。
每一个在K1和K2中观测到的地图点遵循以下原则:- 丢弃在当前帧的投影超出图像边界的地图点。
- 丢弃当前观测视线v与地图点平均视线方向n其点积小于cos(60°)的地图点。
- 丢弃地图点到相机中心的距离d不在尺度不变性范围内的地图点。
- 计算帧的尺度比例d/dmin。
- 比较地图点的描述子和帧中未匹配的ORB特征,将地图点与最佳匹配相关联。
新关键帧的提取
- 超过20帧必须通过全局重定位。(确保良好的定位)
- 局部建图闲置,超过20帧必须通过关键帧插入。(确保及时处理)
- 至少追踪当前帧50个点。(确保良好的追踪)
- 当前帧追踪比参考帧90%的点少。(确保最小视觉变化)
Local mapping
- 关键帧插入
更新covisibility graph(增加新的节点Ki,更新与其他帧共享地图点而产生的边)。
将链接Ki和关键帧的生成树更新为大多数普通点。
计算词袋来表示关键帧。 最近地图点的剔除
地图点需在建立三帧关键帧后通过约束测试,必须满足以下条件:- 跟踪必须在超过预测可见的帧的25%中找到该点。
- 如果从创建的地图点中通过了多个帧,则必须从至少三个关键帧观察。
通过测试的点,只有在少于三个关键帧观察时才会被去除。
- 新地图点的创建
通过从covisibility graph中连接的关键帧对ORB三角测距中创建的地图点。
ORB特征点对三角化后,检查正向景深、视差、反投影误差和尺度一致性,这时才得到地图点。 - 局部BA优化
优化当前处理的关键帧Ki,优化在covisibility graph Kc中连接到它的所有关键帧以及这些关键帧看到的所有地图点。
所有观测到这些点但是没有与当前处理的关键帧连接的关键帧也被优化。
标记为异常值的观察在优化过程中或结束时被丢弃。 - 局部关键帧剔除
丢弃covisibility graph Kc中的关键帧,它90%的地图点能在至少在三个其他关键帧中能观测到。
Loop closing
回环条件检测
测试local mapping过程的最后一帧Ki。- 计算Ki的词袋向量与在covisibility graph中所有相邻帧的相似性,并返回最小的评分s。
- 查询识别数据库并且剔除分数小于s的关键帧。
计算相似变换
计算当前帧Ki和候选回环帧Kl的相似变换,得出回环过程的累积误差。- 计算当前关键帧和候选的回环关键帧地图点的ORB之间的相关一致性。
- 用Horn的方法对每个候选回环关键帧交替进行RANSAC迭代,得出相似变换。
- 如果找到一个相似变换矩阵Sil有足够多的inliers,对其进行优化并引导搜索更多的对应关系。
- 继续优化,如果Sil支持足够多的inliers,则确定回环帧Kl。
回环融合
融合向对应的一对地图点,并且在covisibility graph插入新的边。- 当前帧的位姿Tiw通过相似变换Sil矫正,并且将这个矫正传播到所有相邻Ki中。
- 对齐环的两侧。
- 回环关键帧及其相邻帧所看到的所有地图点都投影到Ki中,并在投影周围的狭窄区域中搜索其邻近和匹配项。
- 所有匹配的地图点和在Sil估算出的inliers融合。
- 融合中涉及的所有关键帧将更新其covisibility graph中的边缘,有效地创建附加环闭合的边。
- essential graph优化
为了有效关闭回环,执行essential graph的位姿图优化,分散图中的闭环误差。
通过相似变换矫正尺度漂移。
优化后,根据观察它的关键帧之一的校正来转换每个地图点。