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

  • 相关阅读:
    ruby 二进制转十进制 Integer("0b101") = 5
    开始菜单和我的文档的我的图片及我的音乐变成 my pictrues 正常图标了
    ruby watir 莫名其妙的错误
    Excel SaveAS是去掉提示框
    apache && jboss安装
    ruby require include的区别
    ruby控制鼠标
    This error is raised because the column 'type' is reserved for storing the class in case of inheritance
    用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字等各类代码
    ASP.NET 如何动态修改 Header 属性如添加 Meta 标签 keywords description!
  • 原文地址:https://www.cnblogs.com/panda1/p/6986758.html
Copyright © 2020-2023  润新知