注:本文讲解的是整个系统的运行过程,不涉及具体代码的讲解。均假设系统运行没有重复构建现象
上一篇博客:ORB_SLAM2系统代码流程粗讲解(一)
系统有三个线程并行运行,其中追踪线程(tracking)在主函数,即主线程中运行。
今天这篇文章讲一下局部建图线程,具体的函数实现在:***LocalMapping.cc***中,找到 ***run()***函数
1.首先说明,局部建图所需要的数据是追踪线程传送过来的关键帧队列,所以在进行局部的建图的时候,需要将标志位mbAcceptKeyFrames置为false。
2.接下来,从关键帧的队列中取出一帧,计算该关键帧用向量来表示,即根据词袋模型计算得出词袋向量,接下来处理该关键帧中的地图点,并且更新关键帧的连接关系,处理完成之后将该关键帧插入到地图中。
3.接下来根据地图点的观测情况剔除质量不好的地图点,剔除该地图点的条件是:
(1)跟踪到该地图点的帧数相比预计可观测到该地图点的 帧数的比例小于25%
(2)从该地图点建立开始,到现在已经过了不小于两个关键帧,但是观测到该点的项技术却不超过阈值(单目情况下阈值=2.;双目和RGBD情况下阈值=3)
(3)从该地图点建立开始,已经过了三个关键帧没有被剔除,说明是质量好的点,仅将它队列中删除。
4.接下来,用当前关键帧与相邻关键帧通过三角化产生新的地图点,使得跟踪更加稳定。
5.处理完关键帧队列中的关键帧,检查并融合当前关键帧和相邻关键帧中的重复地图点
6.接下来进行一个局部地图的BA优化
7.系统结束,将标志位mbAcceptKeyFrames置为true,即可以开始接收来自追踪线程的关键帧
最后关于标志位的应用,即线程之间的调度可以看我写的另外一篇文章: