ORB-SLAM2源码学习:MapPoint.cc④: 新增地图点总结

前言

让我们来总结ORB-SLAM2 中的新增地图点。

1.在第一阶段跟踪中的恒速模型跟踪中新增地图点

针对双目相机或RGB-D相机,找出上一帧中具有有效深度值且不是地图点的特征点,将其中较近的点作为上一帧新的临时地图点, 并记录在向扯mlpTemporalPoints 中。注意,这里因为是临时地图点,所以没有添加地图点的相互观测和属性信息(最佳描述子、平均观测方向、观测距离范围)。

ORB-SLAM2源码学习:Tracking.cc:Tracking::UpdateLastFrame更新上一帧位姿并创建临时地图点-优快云博客

void Tracking :: UpdateLastFrame ()
{
    //Step 1 : 利用参考关键帧更新L - 帧在世界坐标系F 的位姿
    //······
    //Step 2 : 对于双门相机或RGB-D 相机,为上一帧生成新的临时地图点
    //······
    //加入上一帧的地图点中
    mLastFrame.mvpMapPoints[i] =pNewMP;
    //标记为临时添加的地图,之后会全部删除
    mlpTemporalPoints.push_back(pNewMP);

2.第二阶段跟踪结束后新建关键帧时

针对双目相机或RGB-D相机,找出当前帧中具有有效深度值且不是地图点的特征点,将其中较近的点作为当前帧的新的地图点。与函数Tracking::UpdateLastFrame()功能类似,不同之处是这里添加的是真正的地图点, 会添加地图点和关键帧的相互观测和属性信息,如最佳描述子、平均观测方向、观测距离范围。

....
MapPoint* pNewMP = new MapPoint(x3D,pKF,mpMap);
                    // 这些添加属性的操作是每次创建MapPoint后都要做的
                    pNewMP->AddObservation(pKF,i);
                    pKF->AddMapPoint(pNewMP,i);
                    pNewMP->ComputeDistinctiveDescriptors();
                    pNewMP->UpdateNormalAndDepth();
                    mpMap->AddMapPoint(pNewMP);

                    mCurrentFrame.mvpMapPoints[i]=pNewMP;
....

ORB-SLAM2源码学习:Tracking.cc: void Tracking::CreateNewKeyFrame 创建新的关键帧-优快云博客

3.局部建图线程中

1.在局部建图线程中,用当前关键帧与相邻关键帧通过三角化生成新的地图点。这里地图点会添加相互观测和属性信息,如最佳描述子、平均观测方向、观测距离范围,并且会将新增地图点放到一个名为“最近新增地图点”的队列mlpRecentAddedMapPoints中,这些新增的地图点后续需要接受函数MapPointCulling 的检验。

            //三角化生成3D点成功,构造成MapPoint
            MapPoint* pMP = new MapPoint(x3D,mpCurrentKeyFrame,mpMap);

            // Step 6.9:为该MapPoint添加属性:
            // a.观测到该MapPoint的关键帧
            pMP->AddObservation(mpCurrentKeyFrame,idx1);            
            pMP->AddObservation(pKF2,idx2);

            mpCurrentKeyFrame->AddMapPoint(pMP,idx1);
            pKF2->AddMapPoint(pMP,idx2);

            // b.该MapPoint的描述子
            pMP->ComputeDistinctiveDescriptors();

            // c.该MapPoint的平均观测方向和深度范围
            pMP->UpdateNormalAndDepth();

            mpMap->AddMapPoint(pMP);

ORB-SLAM2源码学习:LocalMapping.cc: LocalMapping::CreateNewMapPoints生成新的地图点-优快云博客

2.在局部建图线程中, 将当前关键帧的地图点分别与一级、二级相连关键帧的地图点进行正向融合和反向融合。这里的融合包括替换或新增地图点,并且会添加相互观测。最后会统一更新地图点的属性信息。

    ....
 vpMapPointMatches = mpCurrentKeyFrame->GetMapPointMatches();
    for(size_t i=0, iend=vpMapPointMatches.size(); i<iend; i++)
    {
        MapPoint* pMP=vpMapPointMatches[i];
        if(pMP)
        {
            if(!pMP->isBad())
            {
                // 在所有找到pMP的关键帧中,获得最佳的描述子
                pMP->ComputeDistinctiveDescriptors();

                // 更新平均观测方向和观测距离
                pMP->UpdateNormalAndDepth();
            }
        }
    }
    ....

ORB-SLAM2源码学习:LocalMapping.cc: void LocalMapping::SearchInNeighbors 检查并融合当前关键帧和相邻帧(两级相邻)的重复地图点-优快云博客

结束语

以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值