这部分主要是处理每个新的关键帧,加入局部地图,该关键帧里面的合适的关键点要变成地图点。
主要的步骤:论文里面说的非常清楚,代码也是跟着论文的策略。见下图:
这图十分简洁清楚的将各个部分的具体步骤说的很清楚。
LOCAL MAPPING 的具体操作:
a:新来的关键帧插入到局部地图。( 对应论文的第VI部分的 A ),代码的顺序跟论文写的有点小不一样。
void LocalMapping::ProcessNewKeyFrame()
第一步,从mlNewKeyFrame(待插入的关键帧)中,找出最前面的那一关键帧做为当前帧,并计算该关键帧的BoW,后面三角化的时候有用。第二步:将地图点和新的关键帧结合起来,(因为在跟踪的时候我们只是利用关键点的匹配关系进行位姿计算,这里就是找出该关键帧对应的地图点)跟新该帧的normal 和描述子。第三步:更新连接关系。使用UpdateConnections,这个函数就是跟新covisiblility graph ,和spanning tree。关键帧插入地图。
b.地图点的去除策略
void LocalMapping::MapPointCulling()
每个地图点要被保留,在该地图点被创建后的三个关键帧里必须要经过严格的测试,这样保证其能被正确的跟踪和三角化。
第一:该地图点不能是坏点。第二:该地图点在它预测能被找到关键帧们里面,至少发现了25%的这样的关键帧。第三:在该地图点被创造后,已经有一个关键帧通过的话,那么该点至少在3个关键帧里面被看到了。一旦这个关键点被创建了的话,只有这个点被少于3个关键帧看到的话才这个地图点才能被删除。(论文讲的很清楚)
c.创建新的地图点(这里才三角化地图点)
void LocalMapping::CreateNewMapPoints()
第一步:找出与当前帧有共视关系的20个关键帧。将这些关键帧与当前帧进行一个个的三角化搜索,找的要被三角化的点。第三步:通过各种条件判断是不是要三角化这些地图点。
跟论文里面提到的一样。1,三角化的地图点在两帧都有正深度。2,视差,在每个帧的投影误差,尺度一致性都有被检测。
d.Local Bundle Adjustment
Optimizer::LocalBundleAdjustment(mpCurrentKeyFrame,&mbAbortBA, mpMap);
这里优化的是当前帧,以及与当前帧在covisibility graph里面有连接关系的那些关键帧的位姿,以及这些帧看到的地图点。
f.去除冗余的关键帧
void LocalMapping::KeyFrameCulling()
这个函数在论文里面也讲的很清楚。如果一个关键帧的90%的地图点,在其他至少三个关键帧里面都被看到过了,那么这个关键帧就可以删除了。
void LocalMapping::SearchInNeighbors()
这个函数是找当前帧有很多匹配的
最后还有一个函数
void LocalMapping::SearchInNeighbors()
这个函数是在当前帧cur,和与当前帧有联系的很多关键帧keyfs里面,继续寻找很多匹配。投影地图点,在当前帧curr和keyfs找跟多的匹配。