ORB SLAM2中的mlNewKeyFrames用法
在orbslam文件LocalMapping.h的LocalMapping
类中,有这样一个list
类型的成员函数,它的作用是存放还未处理的关键帧
std::list<KeyFrame*> mlNewKeyFrames;
1. 第一步.关键帧的插入(list的输入)
初始化后的mlNewKeyFrames应该是空的,
首先是在
SLAM.TrackRGBD(imRGB,imD,tframe);
中通过SLAM的成员变量Tracking* mpTracker;
调用了属于Tracking类的函数GrabImageRGBD();
又在这个函数中调用了同属于一个Tracking类的Track();
在这个函数里会判断当前帧是否加入关键帧,每次图像都会进入SLAM.TrackRGBD(imRGB,imD,tframe);
每次都会判断是否加入关键帧,如果需要加入关键帧,就调用函数void Tracking::CreateNewKeyFrame();
使用LocalMapping* mpTracker
的mpLocalMapper
变量调用属于类LocalMapping
的函数mpLocalMapper->InsertKeyFrame(pKF);
把关键帧存入mlNewKeyFrames.push_back(pKF);
这样关键帧就存放到了链表mlNewKeyFrames
中
2.关键帧的处理(list的传出和判断)
在线程 LOCAL MAPPING中,回调函数是LocalMapping::Run();
在执行这个函数时,如果检查到mlNewKeyFrames是非空的说明有关键帧等待处理,那么执行函数ProcessNewKeyFrame()
,具体内容如下
mpCurrentKeyFrame = mlNewKeyFrames.front();
mlNewKeyFrames.pop_front();
把第一个元素(也就是最先检测到的未处理的关键帧)赋值给mpCurrentKeyFrame
,然后删除掉
就这样,当mlNewKeyFrames里面有元素时,说明有选择进来的关键帧等待系统处理,当它为空即mlNewKeyFrames.empty()
为真,说明没有关键帧等待处理
上一篇: ORB SLAM2安装