zoukankan      html  css  js  c++  java
  • ORB-SLAM2学习6 LocalMapping.h

    这部分主要是处理每个新的关键帧,加入局部地图,该关键帧里面的合适的关键点要变成地图点。

    主要的步骤:论文里面说的非常清楚,代码也是跟着论文的策略。见下图:

    这图十分简洁清楚的将各个部分的具体步骤说的很清楚。

    LOCAL MAPPING 的具体操作:

    a:新来的关键帧插入到局部地图。( 对应论文的第VI部分的 A ),代码的顺序跟论文写的有点小不一样。

    void LocalMapping::ProcessNewKeyFrame()

      第一步,从mlNewKeyFrame(待插入的关键帧)中,找出最前面的那一关键帧做为当前帧,并计算该关键帧的BoW,后面三角化的时候有用。第二步:将地图点和新的关键帧结合起来,(因为在跟踪的时候我们只是利用关键点的匹配关系进行位姿计算,这里就是找出该关键帧对应的地图点)跟新该帧的normal 和描述子。第三步:更新连接关系。使用UpdateConnections,这个函数就是跟新covisiblility graph ,和spanning tree。关键帧插入地图。

    b.地图点的去除策略

    void LocalMapping::MapPointCulling()

      每个地图点要被保留,在该地图点被创建后的三个关键帧里必须要经过严格的测试,这样保证其能被正确的跟踪和三角化。

    第一:该地图点不能是坏点。第二:该地图点在它预测能被找到关键帧们里面,至少发现了25%的这样的关键帧。第三:在该地图点被创造后,已经有一个关键帧通过的话,那么该点至少在3个关键帧里面被看到了。一旦这个关键点被创建了的话,只有这个点被少于3个关键帧看到的话才这个地图点才能被删除。(论文讲的很清楚)

    c.创建新的地图点(这里才三角化地图点)

    void LocalMapping::CreateNewMapPoints()

      第一步:找出与当前帧有共视关系的20个关键帧。将这些关键帧与当前帧进行一个个的三角化搜索,找的要被三角化的点。第三步:通过各种条件判断是不是要三角化这些地图点。

    跟论文里面提到的一样。1,三角化的地图点在两帧都有正深度。2,视差,在每个帧的投影误差,尺度一致性都有被检测。

    d.Local Bundle Adjustment

      Optimizer::LocalBundleAdjustment(mpCurrentKeyFrame,&mbAbortBA, mpMap);

      这里优化的是当前帧,以及与当前帧在covisibility graph里面有连接关系的那些关键帧的位姿,以及这些帧看到的地图点。

    f.去除冗余的关键帧

    void LocalMapping::KeyFrameCulling()

      这个函数在论文里面也讲的很清楚。如果一个关键帧的90%的地图点,在其他至少三个关键帧里面都被看到过了,那么这个关键帧就可以删除了。

    void LocalMapping::SearchInNeighbors()

    这个函数是找当前帧有很多匹配的

    最后还有一个函数

    void LocalMapping::SearchInNeighbors()

    这个函数是在当前帧cur,和与当前帧有联系的很多关键帧keyfs里面,继续寻找很多匹配。投影地图点,在当前帧curr和keyfs找跟多的匹配。

  • 相关阅读:
    HUT1674 火柴棒等式
    HUT1694 零用钱 贪心
    HDU2201 熊猫阿波的故事
    HUT1685 奶牛的锻炼 DP
    HUT1675 找啊找啊找GF DP
    HUT1673 传纸条
    HUT1697 棋盘覆盖
    TYVJ1185 营业额统计 Splay
    HUT2602 01背包 记录路径
    POJ3468 A Simple Problem with Integers Splay树
  • 原文地址:https://www.cnblogs.com/panda1/p/6986758.html
Copyright © 2011-2022 走看看