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

ORB SLAM2中的mlNewKeyFrames用法

程序员文章站 2024-03-25 19:17:22
...

在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* mpTrackermpLocalMapper变量调用属于类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安装

下一篇: