您的位置:首页 > 其它

ORB_SLAM2捋思路(2)

2017-09-08 16:33 92 查看
pNewMP->AddObservation(pKFini,i),函数做的是判断这个关键帧是否已经在我的一个map中,通过函数if(mObservations.count(pKF))判断,其中主要是看这个mObservations里面是否已经存在pKF,据我查看了其他 的函数可以推断此时mObservations中应该是不包含pKF的。如果存在就直接返回,不存在就加上该关键帧,并且给予索引(就是这个点在该关键帧中的索引,仅仅在该关键帧的索引),这个函数就是就该关键帧的所有mapPoint都绑定在一个关键帧中,因为它的函数的i不会改变。并且将obs双目和rgbd加2,单目加1.

pKFini->AddMapPoint(pNewMP,i);函数将mapPoint添加到该关键帧的一个专管地图点的向量中。

pNewMP->ComputeDistinctiveDescriptors();函数是计算描述子的,mObservations再提一下,map()里面存的关键帧和mappooint在该帧上的索引,里面也许有多个关键帧,就是看到这个点的多个帧以及分别对应的mappoint索引。这个函数其实就是在看到该点的多个关键帧中找到对应的描述子区分度最高的一个,它取的是中间值,就是离两边都远。

pNewMP->UpdateNormalAndDepth()

该函数主要是求该地图点的平均观测方向和观测深度范围。(里面有几个函数算距离的函数没看懂。)

最后mCurrentFrame.mvpMapPoints[i]=pNewMP;把这个新的地图点加入到当前帧的地图点向量中。

然后将出事关键帧插入到局部地图中。将当前帧传递给上一帧,将当前帧的id赋值给上一关键帧的id,初始关键帧给上一关键帧。

mvpLocalKeyFrames.push_back(pKFini);将初始关键帧放入局部关键帧中,将地图中的所有点都给局部地图(因为这是第一帧吧),将初始关键帧传递给参考关键帧,

mCurrentFrame.mpReferenceKF = pKFini;同时将初始关键帧传递给当前帧的参考关键帧,mpMap->SetReferenceMapPoints(mvpLocalMapPoints);将局部地图点设置为地图的参考地图点。mpMap->mvpKeyFrameOrigins.push_back(pKFini);将初始关键帧放入地图的原始关键帧。 mpMapDrawer->SetCurrentCameraPose(mCurrentFrame.mTcw);将当前帧的坐标设置为当前相机的位姿。

初始化成功,将状态赋值为OK。此时双目和rgbd的初始化就结束了。返回到track() 函数中,然后会跳过一大段的else{},接着存储帧的姿态信息,以便随后检索完整的摄像机轨迹。

cv::Mat Tcr = mCurrentFrame.mTcw*mCurrentFrame.mpReferenceKF->GetPoseInverse();
mlRelativeFramePoses.push_back(Tcr);// l  == last
mlpReferences.push_back(mpReferenceKF);
mlFrameTimes.push_back(mCurrentFrame.mTimeStamp);
mlbLost.push_back(mState==LOST);


执行完这些函数后,就退出了track()函数,回到GrabImageRGBD(),返回一个位姿矩阵。返回到system.TrackRGBD()继续执行里面的函数,
`mTrackingState = mpTracker->mState;
mTrackedMapPoints = mpTracker->mCurrentFrame.mvpMapPoints;
mTrackedKeyPointsUn = mpTracker->mCurrentFrame.mvKeysUn;`

第一个函数返回跟踪的状态,第二个函数将当前帧的mappoint传给mTrackedMapPoints。将当前帧的特征点赋值给mTrackedKeyPointsUn.


最后返回Tcw,并退出trackRGBD()函数,回到主函数。基本完成了第一帧的处理。然后开始第二帧的读入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  地图 orb算法