怎么追踪重定位网页的来源_[细说ORBSLAM2系列] 2.特征追踪

fb9f88ac271cf369ec5a17ce2bddff83.png点击“蓝字”关注我们吧

cd26555fe905963a6ad04a57d5a169de.png

文章:[细说ORB-SLAM2系列] 2.特征追踪

作者:盐粒

589151f025ddc7b2d8a3fc7f1a723fbf.png

ORB-SLAM2是feature-based SLAM最棒的系统,他就像一个图书馆,等待我们去挖掘

1

track()

上一篇文章介绍了系统如何提取特征,以及如何为系统后面tracking和mapping做准备。这里我们将介绍ORB-SLAM2中Track()的策略。

36b77ff3caba67ce20c750a72f896040.png

如上图所示,系统的初始化是在这个函数中完成,初始化根据传感器的不同,分为单目和stereo两种方式,其中将RGB-D转化出来双目信息。

MonocularInitialization();

StereoInitialization();
大家都知道,单目系统为了构建一个稳定的地图,有比较复杂的初始化过程。双目则是直接启动。后面我们会专门介绍单目初始化模块。初始化结束之后,会建立关键帧,全局地图。

然后会进行frame-to-frame, map-to-frame的位姿估计,当然如果丢失,则会进行relocalization。

完成对的当前帧的track,就会建立起来当填充前帧中2D 特征对应的3D landmark。然后去判断是否要加入关键帧。并对追踪状态进行更新。下面,详细介绍追踪的过程。

2

Frame-to-Frame tracking

其实,ORB-SLAM2中的追踪策略是非常值得我们借鉴的。首先是给当前帧一个初始的位姿。通过track reference 或 track motion model来获得用重投影误差去优化当前帧的Pose。每个结构里面,按照当前系统状态是否OK,分成下面三种情况:

OK:

速度值不存在,或者初始化后的一帧,或者重定位后的一帧,使用参考帧 进行追踪:bOK = TrackReferenceKeyFrame();

在追踪正常的情况下,存在运动的速度值,使用运动模型进行追踪:

TrackWithMotionModel();

!OK:

Relocalization()

 if(mVelocity.empty()||mCurrentFrame.mnId        bOK = TrackReferenceKeyFrame();
    else
    {
        bOK = TrackWithMotionModel();
        if(!bOK) {
        bOK = TrackReferenceKeyFrame();
        }
    }

具体分析一下这两个函数:
    bool Tracking::TrackReferenceKeyFrame()
    {
    // Compute Bag of Words vector
    cout<    mCurrentFrame.ComputeBoW();
    ORBmatcher matcher(0.7,true);
    vector vpMapPointMatches;
    //找到 vpMapPointMatches, nmatches
    int nmatches = matcher.SearchByBoW(mpReferenceKF,mCurrentFrame,vpMapPointMatches);
if(nmatches<15)
return false;
cout<mCurrentFrame.mvpMapPoints = vpMapPointMatches;
mCurrentFrame.SetPose(mLastFrame.mTcw);
// 通过优化3D-2D的重投影误差来获得位姿
Optimizer::PoseOptimization(&mCurrentFrame);
cout<// 剔除优化后的outlier匹配点(MapPoints)
int nmatchesMap = 0;
for(int i =0; i{
if(mCurrentFrame.mvpMapPoints[i])
{
if(mCurrentFrame.mvbOutlier[i])
{
MapPoint* pMP = mCurrentFrame.mvpMapPoints[i];
mCurrentFrame.mvpMapPoints[i]=static_cast(NULL);
mCurrentFrame.mvbOutlier[i]=false;
pMP->mbTrackInView = false;
pMP->mnLastFrameSeen = mCurrentFrame.mnId;
nmatches--;
}
else if(mCurrentFrame.mvpMapPoints[i]->Observations()>0)
nmatchesMap++;
}
}
return nmatchesMap>=10;
}

3

map-to-frame

tracking成功后接下来就开始调用TrackLocalMap()函数来优化位姿了。

TrackLocalMap()包括下面几个函数:
UpdateLocalMap():更新局部地图中的keyframes和Local Points
searchLocalPoints():获得局部地图与当前帧的匹配
PoseOptimization():最小化重投影误差来优化位姿

ff36cbff477fd9bfd3dfaaf47fea4776.png点击此处“阅读全文”查看论文原文 da54e89bd45be0e269489eab1ee56c0e.png e5e08854da38c89e7eddc3cef7f231b2.gif
3fb716f4fa3321c50fd860f3abcd97fe.png

扈江离与辟芷兮 

纫秋兰以为佩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值