以PTAM为基础
contributions:
总结一下就是,tracking、local mapping、loop closing三个线程并行,这三个部分都使用ORB特征。mapping部分的关键帧和地图点存储宽进快出,数据结构比较常规。loop closing部分使用DBoW2进行匹配以检测闭环。构造了两图一树,表示关键帧之间的临近关系,这个两图一树暂时不知道是用在哪儿的。
特征的选择要求:
选取ORB特征。 并在tracking、mapping、place recognition(用于重定位和闭环检测)中都使用ORB特征。
分为三个并行线程:tracking、local mapping、loop closing
功能:每一帧相机位姿的估计以及关键帧的检测。
步骤:
功能:处理新进入的关键帧,执行局部BA,以达到当前相机位姿附近的最优的局部重建。维护地图,加入新的点,去除低质量的点和关键帧。
步骤:
功能:在每个新关键帧执行闭环检测,若检测到闭环,则做调整。
步骤:
包含:
包含:
宽容选取,紧急去除。去除冗余关键帧、误匹配地图点、漏匹配地图点。能够提高地图探索时的鲁棒性,外点少。
essential graph的权重阈值是多少?比spaaning tree小?
好像这不是三个图,而是两个图。
spanning tree指的就是essential graph,essential graph是covisibility graph的最小生成树(MST)。
无向有权图。表示关键帧之间的相邻关系。
保留covisibility graph中的全节点,保留很少量的边。
从最初关键帧开始持续维护的树,是covisibility graph的子图。
当新关键帧插入:此节点连接到与他有最多共同观测的节点上
当关键帧删除:更新受影响的其他节点的连接关系
essential graph包含spanning tree,这个树的权重阈值很高(100)。
基于DBoW2的词袋模型,实现回环检测和重定位。词典由数据集抽取的ORB描述子离线制作。
维护一个数据集:包含单词到包含它的关键帧的索引。对于overlap的情况,将这些重叠的关键帧建成covisibility graph。(这儿不太懂,这个图是干嘛的,之前的方法是怎么做的)
trick:在对比两组ORB特征的相似性时,强制只匹配单词树特定等级的属于相同节点的特征,以加速。(???这节点是啥,单词树的等级是啥?是K叉树吗)
目标:计算相邻两帧之间的位姿,用于三角化匹配点,得到其深度,以初始化地图点。
方法:同时并行两个几何模型。
使用启发式方法选择一个模型,并使用该模型的特定方法恢复其位姿。
算法流程:
总结一下是,先提取特征点并匹配,然后同时计算单应和基础两个模型,根据得分选则其中的一个,计算出来矩阵后,根据矩阵算出相机位姿,再三角化算出匹配点深度。最后用BA优化位姿和深度。
对当前帧 F c F_c Fc抽取ORB特征,与参考帧 F r F_r Fr进行匹配。若匹配到的数量不足,则重置参考帧(这个重置是什么意思?)
并行的计算单应矩阵 H c r H_{cr} Hcr和基础矩阵 F c r F_{cr} Fcr。
X c T F c r X r = 0 X_c^{T} F_{cr}X_r=0 XcTFcrXr=0
X C = H c r X r X_C=H_{cr}X_r XC=HcrXr
在RANSAC迭代中,使用DLT和8点法分别计算单应矩阵和基础矩阵,二者的迭代次数固定且相同,每次迭代用的点分别是4和8。每次迭代,使用对称转换误差(symmetric transfer errors)计算模型分数 S M S_M SM,并维护最高得分。
选取标准:
R H = S H S H + S F R_H=\frac {S_H}{S_H+S_F} RH=SH+SFSH
平面、低视差,选择单应模型, R H > 0.45 R_H>0.45 RH>0.45。
非平面、高视差,选择基础矩阵模型, R H < = 0.45 R_H<=0.45 RH<=0.45。
选择相应模型并计算,可以得到矩阵。根据这个矩阵求出相机运动(R,t),三角化得到点的深度。
对于单应矩阵模型:使用参考文献[23]的方法得到8种可能的假设,对其分别三角化,选取低视差、景深为正(点在相机前面)、低重投影误差的假设。
对于基础矩阵模型:使用内参矩阵 K K K将其转为本质矩阵。
E r c = K T F r c K E_{rc}=K^{T}F_{rc}K Erc=KTFrcK
使用奇异值分解得到4种可能的假设,对其分别三角化,选取景深为正的假设。
使用BA优化初始位姿和深度。
此部分的整个系统始终运行的平行三线程之一,其作用是:对每一帧,估计其相机位姿,选择新的关键帧。
(这部分和初始化的关系是啥?初始化只用了前面一部分的帧,初始化了一部分的地图点吗?初始化部分是用单目2D-2D的方式,然后再 通过tracking,使用3D-2D的方式,估计随后的每一帧位姿?)
(这里的提取ORB特征,和初始化部分的应该是不一样的,这里在八个尺度上进行,初始化部分只在一个尺度上,这里得到的ORB描述子,应该也没用于初始化?但是初始化用的是啥呢,初始化的“当前帧”和这里的“新帧”不是一个吗?)
基于前一帧的位姿初始化,是建立当前帧与上一帧之间的联系;基于全局重定位的位姿初始化,是建立当前帧与某一关键帧的联系;基于局部地图的位姿估计,是建立当前帧与局部关键帧地图的联系,也就是通过搜索更多的3D-2D的匹配点来对更精确的估计当前帧的位姿。
先对图像提取固定量的FAST角点,尽量保证角点分布均匀。然后计算焦点的朝向和ORB描述子。
最终得到ORB描述子,用于所有模块的特征匹配。
如果前一帧的估计成功,则使用匀速运动模型(constant velocity motion model)估计当前帧的位姿,并使用guided search在当前帧中搜索上一帧的地图点。这个模型是认为相机处于匀速运动,根据匀速运动来估计当前帧位姿的初始值。
之后根据搜索到的点匹配关系(3D-2D),优化当前帧的相机位姿。若没有搜索到足够的匹配点,则在地图点的周围搜索,看有没有匹配。
若前一帧丢失,则把当前帧转化为词袋向量,查询关键帧数据库实现全局重定位。
对于数据库中的每一个关键帧,使用RANSAC和PnP算法,估计相机初始位姿,若由足够多的内点, 就优化这个位姿(咋优化的???),并根据这个关键帧,使用guided search,找到匹配的3D-2D点,再次优化相机位姿。若内点足够多,当前帧则被tracking到。
得到初始化的相机位姿和3D-2D匹配点集后,根据局部地图丰富匹配点集,对相机位姿再次优化。
局部地图的选取:与当前帧具有相同观测地图点的关键帧、以及这些关键帧在covisibility graph上的邻居关键帧。其中,与当前帧有最多共同观测地图点的关键帧,就是参考帧。
对这些关键帧观测到的每一个地图点:
遍历完成后,用丰富的3D-2D匹配集再次优化当前帧的位姿。
用于决策当前帧是否作为关键帧加入,其条件是:
这部分的平行三线程之一,它的任务是:处理每一个新关键帧,在其插入的时候,管理地图点和关键帧的集合,进行局部BA优化。
关键帧插入的时候,要更新以下内容:
地图点剔除策略是:在其创建后的前三个关键帧之内,对其稳定性测试。过了这段视时间后,进入稳定状态,不容易被剔除。
创建后前三帧内的稳定性条件:
稳定状态后的剔除条件:
K i K_i Ki:当前关键帧
K c K_c Kc:covisibility graph中与 K i K_i Ki相连的关键帧
对于每一个 K i K_i Ki中未匹配的ORB特征,在 K c K_c Kc中寻找它的匹配点,并丢弃不满足堆积约束的ORB特征。找到匹配对后,对其三角化。
若其满足:
则作为新地图点加入。
如果这个新创建的地图点还能被其他帧匹配到,就把它当作3D-2D对,用于优化那一帧的相机位姿[四-4]。
优化的目标有:
同时,能观测到这些被优化的地图点的关键帧,也参与优化,但其值固定不变。
过程中会抛弃被判定为外点的地图点。
若一个关键帧观测到的90%的地图点,能被其他三个关键帧观测到,则剔除这个关键帧。
闭环检测部分对于当前最后一个被local mapping线程处理完的关键帧, 进行回环的检测和优化。
这部分看不太懂啊。
大概是,先进行闭环检测,先检测候选帧,从候选帧中检测是不是闭环帧。
检测到闭环帧之后,消除累积误差。通过计算得到的相似性矩阵,调整当前帧局部的关键帧位姿、调整它们观测到的地图点、调整他们相关的covisibility graph、最后通过位姿图优化调整全局的关键帧位姿和地图点。
首先检测闭环候选帧:
确定闭环帧:
单目slam中有七个自由度可以累积漂移:三个平移、三个旋转、一个缩放。
计算当前帧和闭环帧的相似变换,可以得知闭环中的累积误差,也能用来验证闭环的有效性(确定闭环候选帧是不是闭环帧吗?)。
首先计算当前帧和闭环帧分别对应的地图点,其ORB特征的相似性。(闭环帧和当前帧虽然是同一个地方,但是却生成了不同的地图点,要找出来这些相同真实点的不同地图点的匹配对?)得到3D-3D点对,对于每一个闭环候选帧(为啥这里还是候选帧??)使用RANSAC算法迭代,计算相似性矩阵。
若计算的相似性矩阵有足够的内点,就优化这个候选帧,然后使用guided search,得到更多的匹配点对,再次优化,若计算得到的相似性矩阵仍然有足够的内点,则选为闭环帧。
检测到闭环,要用闭环帧纠正当前帧的错误。
调整关键帧位姿:
当前帧的位姿 T i w T_{iw} Tiw,被相似性矩阵作用,调整其位姿估计。covisibility graph中与当前帧相连的关键帧,其位姿也会被调整。
调整地图点:
闭环帧和其邻居观测到的地图点,都被投影到当前帧和其邻居中,并寻找3D-3D匹配对。这些被匹配到的地图点,和相似性矩阵中的内点进行融合。
更新covisibility graph:
所有参与融合的关键帧,都更新其边的信息(?),并创建与回环帧相连的边(地图点融合了,这个帧就能看到地图点,就与回环帧有边了)。
调整全局:
为了有效的闭合回环,在essential graph上进行位姿图优化。优化后,对每个地图点,根据其中一个观测到它的关键帧的校长,对其进行变换。
进行了三组实验:
评测标准:
20fps, 512*382, 存在闭环和视角的快速旋转。
有轨迹标签,适于评测定位精度。测试时,去除了弱纹理、纯旋转、无运动的部分。
有高精度的轨迹标签,含有回环。