如果初始化成功,开始读入下一帧彩色和深度图像。由于一直没有介绍其它两个主要的线程(Local Mapping 和 Loop closing),但是其实它们也已经开始工作了,之后你就会发现的。~~~~
直接从Tracking对象的track()函数开始, 还是判断是否初始化,因为我们已经初始化成功了,所以直接进入else{},判断是否是定位建图模式还是仅仅定位模式,如果是定位建图模式,判断状态是否ok,如果ok不ok就开启重定位,如果ok,执行下面这个函数
CheckReplacedInLastFrame();
这个函数是检测在局部建图可能改变了一些在上一帧中跟踪的地图点。可以进入函数里面看下,上一帧的每一个mapPoint都调用一次这个函数pMP->GetReplaced();但是接着进如这个函数发现它直接返回一个return mpReplaced;然后就找mpReplaced变量的相关函数,最后只发现MapPoint::Replace(MapPoint* pMP)这个函数里面调用了这个变量,然而尴尬的是,我在所有的.cpp文件中都没有知道任何函数调用过这个函数,也就是说这个函数没有起作用么?(不太懂)。所以跳过,接着往下看。
接着还是判断(mVelocity.empty() || mCurrentFrame.mnId<mnLastRelocFrameId+2)
直接贴代码了,就是判断速度矩阵或者当前帧的id是否小于上一次重定位帧id加2,如果满足这个条件跟踪参考关键帧。计入这个函数看看
matcher.SearchByBoW(mpReferenceKF,mCurrentFrame,vpMapPointMatches);
首先会将当前帧和参考关键帧进行匹配,得到匹配对数,如果小于15个,那么就return false;后面有一个Optimizer::PoseOptimization(&mCurrentFrame);优化求位姿。
后面就是检查是否是外点如果是的就将指针设置为空,并将该点的布尔值设置为false,并在屏幕上不显示。nmatchesMap–。最后判读nmatchesMap是否大于10,并返回布尔值。返回到函数track()中,那么此时就需要跟踪运动模型,并返回布尔值,如果布尔值为假的话还是需要去跟踪参考帧。结束一个if ,到了下一个模式,就是仅仅定位模式,mbVO默认值为false(匹配的点不够的时候为true),因此第一次就使用默认值,mbVO代表我们在上一帧中跟踪到了足够多了MapPoints,根据不同条件跟踪参考帧或者运动模型,跟踪继续。
假如什么时候mbVO为true了,那就说明此时跟踪的点不够多,那么它会进行重定位或者依据运动跟踪,优先考虑重定位的结果。然后就跳出这个大if-else.
又是判断,如果在定位建图模式下,同时bOK为真,那么开始跟踪局部地图。如果在仅定位模式下,在跟踪点较少且bOk为为真(也就是说跟踪点少,但是人家重定位了成功了呀),那么此时也开始跟踪局部地图。但是不是说仅定位模式不激活Local Mapping么,哪儿来的局部地图可跟呢。(没想通)~~跟踪局部地图需要看看。
然后是接着判断跟踪效果,如果效果可以,那么考虑是否插入关键帧,清理一些观测次数小于1的点,删除临时地图点,然后检查是否需要插入一个新的关键帧,如果需要就创建。后面是一堆作者注释,但是我看的一知半解,但是看后面的代码感觉是要把外点剔除掉了。
后面判断是否初始化很快就丢失了,如果是很快,就是小于5帧,那么就充值reset().最后就是如果当前帧没有参考帧就把参考帧补上。
把当前帧给上一帧,离结束不远了。复制粘贴一下,Store frame pose information to retrieve the complete camera trajectory afterwards.
今天暂且休息,明天继续。