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{},接着存储帧的姿态信息,以便随后检索完整的摄像机轨迹。
最后返回Tcw,并退出trackRGBD()函数,回到主函数。基本完成了第一帧的处理。然后开始第二帧的读入。
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()函数,回到主函数。基本完成了第一帧的处理。然后开始第二帧的读入。
相关文章推荐
- Ubutu搭建ORB_SLAM运行环境
- ORB-SLAM2(一)----使用Eclipse进行开发
- ORB-Slam2详解5 局部建图
- ubuntu16.04编译ORBSLAM2问题解决
- orb-slam2源码解读(一)——Frame类
- 编译最新的ORB_SLAM2报错
- SLAM入门之ORBSLAM2代码解析(一)代码入口 System.cc
- ORB-SLAM2的vs2017工程
- ORBSLAM2 -- 记录
- OMG IDL语法规则及ORB
- [导入]Flex使用Weborb与.NET交互的问题:使用DataSet出现"提供的索引超出范围"异常
- weborb .net 在IIS7中注意事项
- 利用特征点(Brief,ORB,SIFT)进行图像匹配,模板匹配
- BRISK与ORB对比
- OpenCv ORB例子代码
- PX4/Pixhawk---uORB深入理解和应用
- Source code for SIFT, ORB, FAST and FFME for OpenCV C++ for egomotion estimation
- ORB+暴力匹配
- 见过的介绍ORB最清楚的博文
- ORB:新一代 Linux 应用