ORB-SLAM2源码学习:总结篇(二)三大线程
1. Tracking线程
1.1 初始化
① 对于单目而言,连续两帧的特征点个数大于100,然后寻找两帧的匹配点对(具体方法在总结篇一),匹配点对大于100后计算两帧的位姿,位姿通过单应矩阵H或基础矩阵F计算;
② 以单应矩阵H为例,从匹配点在随机选择八对点计算H,每个解通过卡方检验计算最优解,代码有个打分机制,最终确定通过H或者F计算位姿;
③若以H进行位姿的恢复,通过SVD计算得到多组解,每个解通过三角化计算空间点坐标,至此得到了两帧的位姿变换、当前帧的位姿Tcw(cur) (初始化第一帧的位姿是单位矩阵)、特征点对应的空间点;
1.2 初始化地图
为关键帧初始化创建了地图点,并将关键帧插入到地图当中,并更新了地图中关键帧和地图点的观测关系。之后进行了一次全局BA优化,优化地图点和位姿。
1.3 初始位姿估计
①参考关键帧跟踪
当前帧和参考关键帧通过词袋模型计算匹配点对,上一帧的位姿作为当前帧的初始位姿,然后进行BA优化当前帧的位姿,最后剔除优化后的匹配点中的外点。
②恒速模型跟踪
当前帧和上一帧通过投影匹配计算匹配点,上一帧的位姿通过速度更新,然后进行BA优化当前帧的位姿,最后剔除优化后的匹配点中的外点。
③重定位跟踪
用词袋找到与当前帧相似的候选关键帧,然后使用3D-2D匹配点的 EPnP算法求初始位姿,再使用BA来优化当前帧的位姿,如果内点数量不够多,通过投影匹配方式对之前未匹配的点进行匹配,再进行BA优化求解。
跟踪方式的选择逻辑如下:
如果上一帧跟踪成功:
- 优先尝试 恒速模型跟踪;
- 如果恒速模型不可用或跟踪失败,则尝试 参考关键帧跟踪;
如果上一帧跟踪失败:
- 尝试 重定位
1.4 局部地图跟踪
搜索局部关键帧、局部地图点,将局部地图点(除了当前帧的地图点)投影到当前帧,计算匹配点对,然后进行位姿优化,初始位姿根据前面三种方法计算得到。
1.5 关键帧插入
关键帧的选取标准:
(1)刚进行重定位,不适合做关键帧,距离上一次重定位距离至少20帧;
(2)局部地图线程空闲、或者距离上一次加入关键帧过去了20帧;
(3)当前帧匹配到的地图点数量 少于参考关键帧的 90%,确保关键帧之间有明显的视觉变化。
跟踪线程思维导图:
2.LocalMapping
①将关键帧插入地图中;
②剔除地图中冗余地图点,冗余条件(满足一个认为冗余):
- 在创建的三帧内观测数目少于2 (双目和RGBD为3)
- 召回率 = 实际观测到该地图点的帧数mnFound / 理论观测到该地图点的帧数mnVisible < 0.25
③当前关键帧与相邻关键帧通过三角化产生新的地图点,当所有的关键帧都处理完,当前关键帧与相邻关键帧帧中重复的地图点;
④局部BA优化位姿
⑤剔除冗余关键帧,冗余的判定:该关键帧的90%的地图点可以被其它关键帧观测到。
3.LoopClosing
①通过词袋从所有关键帧中筛选出和当前帧有可能形成闭环的候选关键帧;
②使用相似求解器Sim3Solver求解出候选关键帧与当前帧之间的相似变换(单目相似变换,而双目或者RGBD是刚体变换),利用相似变换找出更多的匹配地图点,然后使用BA对位姿进行优化,如果内点大于20,认为找到了闭环关键帧;
③闭环矫正:通过计算的相似变换,调整与当前帧相连的关键帧位姿以及这些关键帧观测到的地图点位置;闭环关键帧及其共视关键帧的地图点与当前关键帧及共视关键帧的地图点进行匹配,新增或者替换当前关键帧组的地图点;更新当前关键帧之间的共视相连关系,即更新covisibility graph;然后是本质图的优化(BA),仅优化所有关键帧位姿;最后再来一个全局BA优化。