ORB-SLAM2源码逐行解析系列(十):ORB-SLAM2中的地图点

前言:在特征匹配、跟踪、建图、闭环等过程中存在大量的地图点、关键帧、图结构相关操作,这里先对这些结构及常用的相应函数进行了解。

1. 地图点MapPoint

1.1 MapPoint类的定义

class MapPoint
{
   
public:
    /**
     * @brief 给定坐标与keyframe构造MapPoint
     * @details 被调用: 
     * 双目: StereoInitialization(),CreateNewKeyFrame(),LocalMapping::CreateNewMapPoints()
     * 单目: CreateInitialMapMonocular(), LocalMapping::CreateNewMapPoints()
     * @param[in] Pos       MapPoint的坐标(wrt世界坐标系)
     * @param[in] pRefKF    KeyFrame
     * @param[in] pMap      Map  
     */
    MapPoint(const cv::Mat &Pos, KeyFrame* pRefKF, Map* pMap);
    
    /**
     * @brief 给定坐标与frame构造MapPoint
     * @detials 被双目:UpdateLastFrame()调用
     * @param[in] Pos       MapPoint的坐标(世界坐标系) 
     * @param[in] pMap      Map
     * @param[in] pFrame    Frame
     * @param[in] idxF      MapPoint在Frame中的索引,即对应的特征点的编号
     */
    MapPoint(const cv::Mat &Pos,  Map* pMap, Frame* pFrame, const int &idxF);
    
    // 获取当前地图点的被观测次数
    int Observations();
    /**
     * @brief 添加观测
     *
     * 记录哪些KeyFrame的哪个特征点能观测到该MapPoint \n
     * 并增加观测的相机数目nObs,单目+1,双目或者grbd+2
     * 这个函数是建立关键帧共视关系的核心函数,能共同观测到某些MapPoints的关键帧是共视关键帧
     * @param[in] pKF KeyFrame,观测到当前地图点的关键帧
     * @param[in] idx MapPoint在KeyFrame中的索引
     */
    void AddObservation(KeyFrame* pKF,size_t idx);
    /**
     * @brief 取消某个关键帧对当前地图点的观测
     * @detials 如果某个关键帧要被删除,那么会发生这个操作
     * @param[in] pKF 
     */
    void EraseObservation(KeyFrame* pKF);
    
    /**
     * @brief 计算具有代表的描述子
     * @detials 由于一个MapPoint会被许多相机观测到,因此在插入关键帧后,需要判断是否更新当前点的最适合 
     * 的描述子. 先获得当前点的所有描述子,然后计算描述子之间的两两距离,最好的描述子与其他描述子应该具有
     * 最小的距离中值
     */
    void ComputeDistinctiveDescriptors();
    
    /**
     * @brief 更新平均观测方向以及观测距离范围
     * 由于一个MapPoint会被许多相机观测到,因此在插入关键帧后,需要更新相应变量
     */
    void UpdateNormalAndDepth();
    
public:
    long unsigned int mnId;  // 该MapPoint的全局ID
    static long unsigned int nNextId;
    const long int mnFirstKFid;  // 创建该MapPoint的关键帧ID
    const long int mnFirstFrame;  // 创建该MapPoint的帧ID
    int nObs;  // MapPoint被观测到的相机数目,单目+1,双目或RGB-D则+2
    
protected:
    cv::Mat mWorldPos;  // MapPoint在世界坐标系下的坐标
    // 观测到该MapPoint的KF和该MapPoint对应特征点在KF中的索引
    std::map<KeyFrame*,size_t> mObservations; 
    // 该MapPoint平均观测方向, 用于判断点是否在可视范围内
    cv::Mat mNormalVector;
    // 每个3D点可对应多个特征点,mDescriptor表示最有代表性的特征点的描述子
    cv::Mat mDescriptor; 
    // 参考关键帧, 通常情况下MapPoint的参考关键帧就是创建该MapPoint的那个关键帧
    KeyFrame* mpRefKF;
};

1.2 地图点与关键帧间的相互观测

1.2.1 AddObservation

/**
 * @brief 给地图点添加观测
 * @调用方式: pMP->AddObservation(pKF,i);    主要更新变量mObservations和nObs
 * 表示关键帧pKF的第i个特征点能够观测到地图点pMP, 并增加观测的相机数目nObs, 单目+1, 双目或者rgbd+2
 * 这个函数是建立关键帧共视关系的核心函数,能共同观测到某些地图点的关键帧是共视关键帧
 * @param pKF KeyFrame
 * @param idx MapPoint在KeyFrame中的索引
 */
void MapPoint::AddObservation(KeyFrame* pKF, size_t idx)
{
   
    unique_lock<mutex> lock(mMutexFeatures);
    // mObservations:观测到该MapPoint的关键帧KF和该MapPoint在KF中对应特征点的索引
    // 若mObservations中已经存在关键帧pKF,表示关键帧pKF可以观测到当前MapPoint,那么就直接返回
    if(mObservations.count(pKF)) 
        return;
    // 如果没有添加过观测,表示关键帧pKF目前还没有观测到当前MapPoint
    // 在将当前MapPoint添加到关键帧pKF的观测上时,需要将它关联到与之对应的特征点上
    mObservations[pKF]=idx;

    if(pKF->mvuRight[idx]>=0)
        nObs+=2;  // 双目或者rgbd
    else
        nObs++;   // 单目
}

1.2.2 AddMapPoint

/**  KeyFrame.cc
 * @brief 将当前地图点pMP添加到所调用帧(pKF)对应地图点集合mvpMapPoints的idx处
 * @调用方式: pKF->AddMapPoint(pMP,i);    
 * @param pKF     待添加的地图点
 * @param idx     添加到的索引位置
 */  
void KeyFrame::AddMapPoint(MapPoint *pMP, const size_t &idx)
{
   
    unique_lock<mutex> lock(mMutexFeatures);
    mvpMapPoints[idx]=pMP;
}


/* Map.cc
 * @brief 将当前地图点pMP插入到所调用的地图中
 * @调用方式: mpMap->AddMapPoint(pMP); 
 * @param pMP    待插入的地图点
 */
//向地图中插入地图点
void 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ORB-SLAM2是一款基于特征SLAM算法,可以在实时运行实现稠密地图的构建和定位。ORB-SLAM2的源代码解析v1.2 pdf为ORB-SLAM2算法的源代码进行详细讲解的文档。 这个文档详细介绍了ORB-SLAM2算法的各个模块以及其组成部分,包括图像预处理、特征提取、视觉里程计、回环检测、地图构建和定位等。对于每个模块,文档都进行了详细的讲解,并展示了一些代码实现和示例。 其ORB特征的提取是ORB-SLAM2的一个重要特。文档详细介绍了ORB特征的提取与描述,并对其进行了性能优化。在视觉里程计,文档详细介绍了基于ORB-SLAM2的相机位姿估计算法,并同时对其进行了实验验证。 此外,orb-slam2源码解析 v1.2 pdf还对ORB-SLAM2的一些扩展进行了介绍,如RGBD-SLAM、半稠密地图构建、直接法视觉里程计等等。 总之,ORB-SLAM2是一个非常强大的SLAM算法,通过对orb-slam2源码解析 v1.2 pdf的学习,可以更好地理解其原理和实现,也为进一步研究和应用提供了参考。 ### 回答2: ORB-SLAM2是一种基于单目相机的实时稠密SLAM系统,被广泛应用于机器人、自动驾驶、增强现实等领域。ORB-SLAM2源码解析v1.2 pdf是一份PDF文档,对ORB-SLAM2源代码进行了详细的解析和分析。 该文档分为多个章节,首先介绍了ORB-SLAM2的概述和背景,包括SLAM系统的基本原理和ORB特征的提取与匹配算法。接着,文档对ORB-SLAM2的系统框架、流程和算法进行了详细介绍,主要包括定位、建图、闭环检测和重定位等核心模块的实现细节。 文档还对ORB-SLAM2的实验结果和性能进行了评估和分析,包括系统的重定位精度、建图质量、算法复杂度和实时性等指标。同时,文档还针对ORB-SLAM2的应用场景进行了讨论和展望,包括基于ORB-SLAM2的三维重建、SLAM与深度学习的融合等前沿研究方向。 总之,ORB-SLAM2源码解析v1.2 pdf是一份非常有价值的文档,对想要深入了解和应用ORB-SLAM2的研究者和开发者有很大的帮助和启发作用。它不仅详细介绍了ORB-SLAM2的理论基础和实现细节,还从实验和应用角度对其性能和前景进行了评估和展望,为相关领域的技术人员提供了重要的参考和指导。 ### 回答3: ORB-SLAM2是一种基于单目或双目相机的实时视觉SLAM系统,可以在无GPS信号的情况下,通过对相机的位置和姿态的估计,构建3D环境地图ORB-SLAM2源码解析 v1.2 PDF是一份解析ORB-SLAM2源码的文档,其包含了ORB-SLAM2的基本架构、算法实现以及关键代码的详细解释。通过学习该文档,可以深入了解ORB-SLAM2的原理和实现方法,从而更好地应用该系统进行SLAM操作。 该文档主要包括以下几个部分: 1.ORB-SLAM2的系统结构:介绍ORB-SLAM2的整体结构和各模块之间的关系。 2.特征提取与匹配:详细介绍ORB特征的提取和匹配算法,包括ORB算法原理、特征对齐和描述符生成等。 3.全局BA和回环检测:讲解ORB-SLAM2的全局优化和回环检测方法,其包括BA算法流程、优化目标函数、回环检测的实现等。 4.实时定位:探讨如何实现ORB-SLAM2的实时运动估计和位姿估计,包括相机位姿估计、尺度恢复和云重建等内容。 除此之外,该文档还对ORB-SLAM2的一些高级技术进行了讲解,如基于深度学习的特征提取、基于语义信息的地图构建等。 总之,该文档是一份非常有价值的ORB-SLAM2源码解析资料,对于深入了解ORB-SLAM2的实现原理、优化方法和应用场景,具有重要的参考意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值