本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析-接如下:
(01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/123092196
有兴趣的朋友可以加微信 17575010159 相互讨论技术 - 文末公众号也可关注
一、前言对
上篇博客对 src/Tracking.cc 文件中 Tracking::CreateInitialMapMonocular() 函数进行了总体介绍,该片博客主要对该函数进行细节分析,也就是分析其中被该函数调用的函数。
废话也
二、MapPoint* pMP = new MapPoint(worldPos,pKFcur, mpMap):
该为地图点的初始化函数,从代码中可以看到,该函数位于初始化帧(第一帧)特征点(匹配成功)循环中,也就是初始帧中每个匹配的特征点,都是为其生成一个地图点。每个地图点,主要包含如下成员:
mWorldPos(Pos) //3D点,或者说世界坐标
mpRefKF(pRefKF) // 生成该地图点的关键帧
mpMap(pMap) //地图点所属地图
mnFirstKFid(pRefKF->mnId), //第一次观测/生成它的关键帧 id
mnFirstFrame(pRefKF->mnFrameId), //创建该地图点的帧ID(因为关键帧也是帧啊)
nObs(0)// 被观测次数
mnVisible(1), //在帧中的可视次数
mfMinDistance(0), //当前地图点在某帧下,可信赖的被找到时其到关键帧光心距离的下界
mfMaxDistance(0), //上界
从代码中可以看到,地图点初始化时,主要的参数为 worldPos,pKFcur, mpMap。地图点创建完成之后,首先把地图点添加到初始化帧关键帧 pKFini 以及当前帧关键帧 pKFcur 之中。另外该地图点,可以被那些点观测到,也需要记录下来:
// a.表示该MapPoint可以被哪个KeyFrame的哪个特征点观测到
pMP->AddObservation(pKFini,i);
pMP->AddObservation(pKFcur,mvIniMatches[i]);
AddObservation 的第一个参数为关键帧,第二个参数为该地图点在该帧中对应的第几个特征点。比如 pMP->AddObservation(pKFini,i); 就表示,该地图点,对应与 pKFini 关键帧中第 i 个特征点。
三、pMP->ComputeDistinctiveDescriptors()
ComputeDistinctiveDescriptors()