欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Local Mapping

程序员文章站 2022-07-15 13:12:46
...
这里先介绍下我参考的博客

http://www.cnblogs.com/shang-slam/p/6435124.html

讲的很好。

LocalMapping作用是将Tracking中送来的关键帧放在mlNewKeyFrame列表中;处理新关键帧,地图点检查剔除,生成新地图点,Local BA,关键帧剔除。主要工作在于维护局部地图,也就是SLAM中的Mapping。

我的话就直接从run()函数直接开始看,会讲的更加细一点,啰嗦一点。首先检查是否有关键帧在队列中,如果有就执行新的函数ProcessNewKeyFrame();处理新的关键帧,在这个函数中首先将关键帧队列中的最前面的一个传给local mapping 里面的mpCurrentKeyFrame当前关键帧,计算当前关键帧的bow,将MapPoints关联到新的当前关键帧,并且更新观测方向和描述子。如果MapPoint不在关键帧中,则进行三个函数
 pMP->AddObservation(mpCurrentKeyFrame, i);
 pMP->UpdateNormalAndDepth();
pMP->ComputeDistinctiveDescriptors();
 之前介绍过,就不在啰嗦了。之后还要更当前关键帧的新共视图Covisibility,
mpCurrentKeyFrame->UpdateConnections();

然后将当前关键帧插入到地图中,并返回到run().
总结下:

  1. 处理新关键帧:ProcessNewKeyFrame()

做了三件事:

  a. 计算当前关键帧Bow,便于后面三角化恢复新地图点;

  b. 将TrackLocalMap中跟踪局部地图匹配上的地图点绑定到当前关键帧(在Tracking线程中只是通过匹配进行局部地图跟踪,优化当前关键帧姿态),也就是在graph中加入当前关键帧作为node,并更新edge。而CreateNewMapPoint()中则通过当前关键帧,在局部地图中添加与新的地图点;

  c. 更新加入当前关键帧之后关键帧之间的连接关系,包括更新Covisibility图和Essential图(最小生成树spanning tree,共视关系好的边subset of edges from covisibility graph with high covisibility (θ=100), 闭环边)。

执行
MapPointCulling(),就是剔除MapPoint,它会检查最近加入的一些地图点,它的条件两个:
1. 跟踪(匹配上)到该地图点的普通帧帧数(IncreaseFound)<应该观测到该地图点的普通帧数量(25%*IncreaseVisible):该地图点虽在视野范围内,但很少被普通帧检测到。
2.

  1. 从添加该地图点的关键帧算起的初始三个关键帧,第一帧不算,后面两帧看到该地图点的帧数,对于单目<=2,对于双目和RGBD<=3;因此在地图点刚建立的阶段,要求比较严格,很容易被剔除;而且单目的要求更严格,需要三帧都看到。若从添加该地图点的关键帧算起,一共有了大于三个关键帧,还存在列表中,则说明该地图点是高质量的,从检查列表中去掉。

一旦经过了这样比较严格的筛选,地图点只有在观测到它的关键帧<3时才会被剔除,这主要发生在关键帧被剔除(90%以上匹配点可以被其他帧观察到);或者局部捆集优化时,将地图点归为外点从观测中剔除了的情况。因此地图点中的外点是比较少的,所以整套ORB-SLAM中除了重定位和闭环很少去使用RANSAC。

ORB-SLAM中关键帧和地图点的加入和删除秉承的是送入严出的标准,因此在提高了定位建图准确性的前提下又很好地限制了计算量,可以用于large scale的场景。
返回run()
CreateNewMapPoints();增加新的地图点

根据当前关键帧恢复出一些新的地图点,不包括和当前关键帧匹配的局部地图点(已经在ProcessNewKeyFrame中处理),注意理解与前面两步的先后关系,先处理新关键帧与局部地图点之间的关系,然后对局部地图点进行检查,最后再通过新关键帧恢复新的局部地图点

回到run()
SearchInNeighbors() 更新并融合当前关键帧以及两级相连(共视关键帧及其共视关键帧)的关键帧的地图点。
回到run()
LocalBundleAdjustment(),然后对当前关键帧做个局部优化,
回到run()
KeyFrameCulling();候选的pKF是LocalMapping中当前处理的关键帧的共视关键帧,不包括第一帧关键帧与当前关键帧。遍历pKF中的地图点的观测:若有不少于3帧被观测到(需要满足观测尺度不大于或近似于在pKF中的尺度),则记录下。若pKF中90%以上的地图点能够被其他关键帧观测到,也就是说,该关键帧的存在提供的地图点观测信息有限,则将其删除!
晚安!