• 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找跟多的匹配。

  • 相关阅读:
    (转)关于c#中的事件
    MySql数据库--持续记录ing
    在Eclipse中通过JDBC连接MySQL步骤,非常详细!
    mybatis传入参数类型parameterType和输出结果类型resultType详解
    关于JDBC访问存储过程的问题
    Mybatis(一)入门
    [Redis] 基于redis的分布式锁
    分布式锁----浅析redis实现
    MyBatis的增删改查操作
    C3P0连接池工具类实现步骤及方法
  • 原文地址:https://www.cnblogs.com/panda1/p/6986758.html
Copyright © 2020-2023  润新知