区别
TrackWithMotionModel() 和 TrackReferenceKeyFrame()都是通过输入的帧(cur frame)计算cur frame 的R,T。不同之处是二者ORB特征点匹配的方法不同。
TrackReferenceKeyFrame()
步骤1:将当前帧(cur frames)的描述子转化为BoW向量。
步骤2:利用BOW方法对ORB特征点进行匹配,这两步的方法点击这里。
步骤3: 将上一帧的位姿态作为当前帧位姿的初始值,之后将其带入优化模型中。
这时keyframe(KF)的内容有:mappoints(地图点) , keypoints(特征点),TCW(位姿)
cur frame 的内容: mappoints(地图点)取自KF 和KF 的mappoints相同
keypoints(特征点) 通过与KF中ORB特征点匹配获得(利用BOW方法加速)
TCW(位姿)初始值 设置与上一个 frame 相同
步骤4: 这时设KF为世界坐标,cur frame 可以通过优化3D-2D的重投影误差来获得cur frame的位姿TCW
也就是Optimizer::PoseOptimization(&mCurrentFrame)函数
步骤5:剔除优化后的outlier匹配点(MapPoints)
TrackWithMotionModel()
这个函数前提假设是相机是匀速运动的
步骤1:首先根据上一帧的位姿和上一帧相机运动的速度来估计cur frame 的当前位姿TCW(相机运动速度暂时不知道怎么求的)
mCurrentFrame.SetPose(mVelocity*mLastFrame.mTcw);//将当前帧的初始位姿设为上一帧位姿乘上一帧位姿的变化速度,得到当前的R,T
步骤2:将上一帧带有的mappoints ,根据步骤1 估计的R,T投影到cur frame上。
步骤3: 设定一个阈值,在cur frame 投影点附近进行搜索,以找到与上一帧中匹配的 ORB特征点。
步骤4:步骤3已经将两帧的ORB特征点进行了匹配,接着通过优化3D-2D的重投影误差来获得cur frame的位姿TCW。
步骤5: 优化位姿后剔除outlier的mvpMapPoints。