ORBSLAM—重定位(一)

ORBSLAM—重定位

文章与公众号“SLAM源码之路”同步推送,扫描文后二维码关注。

变量含义:

  • mCurrentFrame: 当前帧 Frame类

  • vpCandidateKFs: 存储与当前帧相似的候选关键帧容器 vector<KeyFrame*>

  • nKFs: 候选关键帧的数量

  • vpPnPsolvers: 当前帧与候选关键帧的pnp求解器容器

  • vpPnPsolvers 记录每一个候选关键帧的mappoint。 类型:vector<vector<MapPoint*> >

  • vbDiscarded: 有效候选关键帧标志位。

  • bNoMore: RansacPnP是否成功标志位

  • sFound: 当前帧已经匹配上的内点

  • nGood:通过BA优化计算得到内点的数量

  • bMatch: 重定位如果成功为ture

step1:计算当前帧的词袋向量。

mCurrentFrame.ComputeBoW();

step2:在关键帧数据库中找到与当前帧相似的一些关键帧。

DetectRelocalizationCandidates(&mCurrentFrame);

step3:对于上一步得到的每一个关键帧进行词袋匹配

step3.1 对每一个候选帧进行词袋匹配

int nmatches = matcher.SearchByBoW(pKF,mCurrentFrame,vvpMapPointMatches[i]);
  • 如果点匹配数量小于15个,则退出此候选帧。
    step3.2 初始化PnP求解器,同时设置Ransac参数,vvpMapPointMatches变量记录每一个候选关键帧的mappoint,nCandidates变量为有效候选关键帧数量。
 PnPsolver* pSolver = new PnPsolver(mCurrentFrame,vvpMapPointMatches[i]);
 pSolver->SetRansacParameters(0.99,10,300,4,0.5,5.991);

step4:通过EPNP算法估计姿态

step4.1 通过5次EPNP+Ransac迭代计算当前帧位姿

cv::Mat Tcw = pSolver->iterate(5,bNoMore,vbInliers,nInliers);

step4.2 PnP得到的位姿作为优化的初值,同时用匹配上的特征点更新当前帧mvpMapPoints成员,用于后续BA优化时进行投影。vvpMapPointMatches[i][j]是第i个候选关键帧的第j个内点。

step4.3 BA优化,仅优化相机位姿,返回认为正确匹配点的数量,如果正确匹配数量小于10,则放弃此候选帧。

int nGood = Optimizer::PoseOptimization(&mCurrentFrame);

step4.4 如果上一步得到的内点数量在10到50之间,则通过投影的方式对之前未进行匹配的点再次进行匹配。如果最后得到的内点大于50,则认为与当前候选关键帧计算得到的Pose为正确的Pose,重定位成功,结束循环。

step4.4.1 对之前没有进行匹配上的点在一定的阈值之内投影匹配

int nadditional=matcher2.SearchByProjection(mCurrentFrame,vpCandidateKFs[i],sFound,10,100);

step4.4.2 额外获得匹配点加上之前BA得到的内点大于50个,则再次进行BA优化计算位姿。此时如果BA优化后得到的内点数量在30-50之间,那么在更小的搜索区间内通过投影匹配得到更多的匹配点。

if(nGood>30 && nGood<50)
 {
     sFound.clear();
     for(int ip =0; ip<mCurrentFrame.N; ip++)
         if(mCurrentFrame.mvpMapPoints[ip])
             sFound.insert(mCurrentFrame.mvpMapPoints[ip]);
    // 在更小的搜索范围内通过投影搜索匹配点
     nadditional=matcher2.SearchByProjection(mCurrentFrame,vpCandidateKFs[i],sFound,3,64);
     // 最后一次优化, 
    if(nGood+nadditional>=50)
     {
         nGood = Optimizer::PoseOptimization(&mCurrentFrame);
         for(int io =0; io<mCurrentFrame.N; io++)
             if(mCurrentFrame.mvbOutlier[io])
             mCurrentFrame.mvpMapPoints[io]=NULL;
     }
 }

SLAM源码之路,专注于SLAM领域经典代码讲解!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ORB-SLAM是一个用于单目、双目和RGB-D摄像头的实时视觉SLAM系统,它是基于特征的方法,用于估计摄像头在三维空间中的位置和姿态,同时构建环境地图。 ORB-SLAM的代码主要由三个模块组成:前端、后端和地图。 前端模块主要负责图像特征的提取和跟踪。代码中使用ORB特征点作为关键点,并通过FAST角点检测算法进行检测。之后,使用ORB描述子对每个特征点进行描述和匹配。通过采用方向筛选和尺度不变性来增加特征的鲁棒性。在特征点跟踪方面,ORB-SLAM使用了LS矩阵的方法来估计相邻帧之间的运动。 后端模块主要用于优化相机的轨迹和地图点。ORB-SLAM使用了基于图优化的方法,将视觉SLAM问题建模为非线性优化问题,并使用g2o库进行求解。通过最小化重投影误差来优化相机位姿和地图点的位置,使其与实际观测值更加吻合。 地图模块负责构建和更新环境地图。ORB-SLAM使用了栅格地图和稀疏点云地图来表示环境。通过三角测量和三角化方法,将特征点投影到三维空间中,并构建地图点。同时,ORB-SLAM也考虑了地图的管理和关键帧的选择,以保证地图的稳定性和精度。 总体而言,ORB-SLAM在代码的实现上充分考虑了算法的效率和实时性,通过使用ORB特征以及基于图优化的方法,实现了对单目、双目和RGB-D摄像头的实时定位和地图构建。通过分析和理解代码,我们可以更深入地了解ORB-SLAM算法的原理和实现细节,为进一步的研究和应用打下基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值