本文想通过MapointCullilng的解读抛砖引玉,分析其中涉及的变量和流程。
想讨论的问题包括:
1. 什么时候进行MappointCulling的操作
2. 那些mappoint是bad
3. GetFoundRatio是怎么算出来的
1. MappointCulling主要发生在局部建图线程(localmapping)的过程中
2. 哪些mappoint是bad?
a. 当跟踪到该地图点的帧数相比预计可观测到该地图点的帧数的比例小于25%,从地图中删除。
跟踪到地图点的数目在函数TrackLocalMap()中被更新, 所以,观测到地图点的普通帧也可以增加Found。
而increaseVisiable则发生在TrackLocalMap()中的SearchLocalPoints()中,被当前帧观测的地图点,以及在当前帧视野范围内的mvpLocalMapPoints都可以被添加。此外,在地图殿replace之后,观测信息也会被更新。
mCurrentFrame.mvpMapPoints[i]->IncreaseFound();
b. 从该点建立开始,到现在已经过了不小于2个关键帧。但是观测到该点的相机数却不超过阈值cnThObs,从地图中删除。
(所以,对于地图点的观测发生在哪里呢?)
对于地图点观测的在增加发生在地图点初始化以及插入关键帧的时候。
有趣的是,新加的地图点存放在list<MapPoint*>这一数据结构里,这样的好处是,对于badpoint的删除开销较小。
lit = mlpRecentAddedMapPoints.erase(lit);
为了防止内存问题,每次对于lit的操作采用了copy内存的方式
MapPoint* pMP = *lit;
关于问题2产生了两个延伸问题。
地图点的观测在哪里建立?
“预计可观测到该点的帧数 ”如何确定?