MapPoint class的使用

介绍

顾名思义,MapPoint 就是一个地图中的点。

在class Frame 中,有成员变量mvpMapPoints,指向所有当前帧的特征点所对应的MapPoint。
在Tracking::TrackLocalMap() 中,使用Optimizer::PoseOptimization(&mCurrentFrame) 函数,优化当前帧的位姿,优化所依据的就是各个MapPoint 的全局位置。优化后,不单单更新的当前帧的位姿,还确定了哪些点是好的,哪些点是不好的。
以此,再在Tracking::TrackLocalMap() 更新每个点的统计数据,增加观测次数。

变量

mWorldPos

世界坐标系中的三维坐标

mDescriptor

所有观测到这个点的帧对这个点的描述子中,和其他所有帧的描述子的距离的中位数最小的描述子。

mObservations & obs

MapPoint 的mObservations 变量是一个向量,记录了在哪些帧中观测到了这个点。
使用mObservations 确定localMap 中的LocalKeyFrame. 只要是当前帧的某个点可以被观测到的关键帧或者是这些帧紧密相连的关键帧(parent children neighbor)都是LocalKeyFrame, LocalKeyFrame 中的所有点都是LocalMapPoints。

mfMaxDistance

MapPoint 的mfMaxDistance 是一个标量,代表着可以在多少的距离内观测这个点,由最开始观测道这个点为标准,有ORBmarcher 中的层数决定,如果超出距离范围,这样,描述子是没有作用的。

mNormalVector

mNormalVector 是个1*3 的cv mat,是各个观测到这个点的帧观测角度的平均值。

mTrackProj + ***

以下这些变量在 tracking 中用到:

    // Variables used by the tracking
    float mTrackProjX;
    float mTrackProjY;
    float mTrackProjXR;
    bool mbTrackInView;
    int mnTrackScaleLevel;
    float mTrackViewCos;

通过判断

  • 距离是否符合之前说的观测具体的限制
  • 如果这个地图中点在当前帧中,会有的在图片中位置是正常
  • 如果这个地图中点相对当前相机位姿的深度是否小于0

来决定mbTrackInView 是1 还是0,其他变量:

  • mTrackProjX: 在当前图片中大致x坐标
  • mnTrackScaleLevel: 应该使用的放大尺度,用于orb match
  • mTrackViewCos: 观测角度的cos值

mnVisible & mnFound

mnVisible 是个int,指在多少的帧里面是“理论可能“ 找到这个点,也就是那时候的mbTrackInView为1 就可以,没有进行orb 匹配;
而mnFound 是实际上找到的。

代码

#ifndef MAPPOINT_H
#define MAPPOINT_H

#include"KeyFrame.h"
#include"Frame.h"
#include"Map.h"

#include<opencv2/core/core.hpp>
#include<mutex>
#include "BoostArchiver.h"

namespace ORB_SLAM2
{

class KeyFrame;
class Map;
class Frame;


class MapPoint
{
public:
    MapPoint(const cv::Mat &Pos, KeyFrame* pRefKF, Map* pMap);
    MapPoint(const cv::Mat &Pos,  Map* pMap, Frame* pFrame, const int &idxF);

    void SetWorldPos(const cv::Mat &Pos);
    cv::Mat GetWorldPos();

    cv::Mat GetNormal();
    KeyFrame* GetReferenceKeyFrame();

    std::map<KeyFrame*,size_t> GetObservations();
    int Observations();

    void AddObservation(KeyFrame* pKF,size_t idx);
    void EraseObservation(KeyFrame* pKF);

    int GetIndexInKeyFrame(KeyFrame* pKF);
    bool IsInKeyFrame(KeyFrame* pKF);

    void SetBadFlag();
    bool isBad();

    void Replace(MapPoint* pMP);    
    MapPoint* GetReplaced();

    void IncreaseVisible(int n=1);
    void IncreaseFound(int n=1);
    float GetFoundRatio();
    inline int GetFound(){
        return mnFound;
    }

    void ComputeDistinctiveDescriptors();

    cv::Mat GetDescriptor();

    void UpdateNormalAndDepth();

    float GetMinDistanceInvariance();
    float GetMaxDistanceInvariance();
    int PredictScale(const float &currentDist, KeyFrame*pKF);
    int PredictScale(const float &currentDist, Frame* pF);

public:
    // for serialization
    MapPoint();
private:
    // serialize is recommended to be private
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive &ar, const unsigned int version);

public:
    long unsigned int mnId;
    static long unsigned int nNextId;
    long int mnFirstKFid;
    long int mnFirstFrame;
    int nObs;

    // Variables used by the tracking
    float mTrackProjX;
    float mTrackProjY;
    float mTrackProjXR;
    bool mbTrackInView;
    int mnTrackScaleLevel;
    float mTrackViewCos;
    long unsigned int mnTrackReferenceForFrame;
    long unsigned int mnLastFrameSeen;

    // Variables used by local mapping
    long unsigned int mnBALocalForKF;
    long unsigned int mnFuseCandidateForKF;

    // Variables used by loop closing
    long unsigned int mnLoopPointForKF;
    long unsigned int mnCorrectedByKF;
    long unsigned int mnCorrectedReference;    
    cv::Mat mPosGBA;
    long unsigned int mnBAGlobalForKF;


    static std::mutex mGlobalMutex;

protected:    

     // Position in absolute coordinates
     cv::Mat mWorldPos;

     // Keyframes observing the point and associated index in keyframe
     std::map<KeyFrame*,size_t> mObservations;

     // Mean viewing direction
     cv::Mat mNormalVector;

     // Best descriptor to fast matching
     cv::Mat mDescriptor;

     // Reference KeyFrame
     KeyFrame* mpRefKF;

     // Tracking counters
     int mnVisible;
     int mnFound;

     // Bad flag (we do not currently erase MapPoint from memory)
     bool mbBad;
     MapPoint* mpReplaced;

     // Scale invariance distances
     float mfMinDistance;
     float mfMaxDistance;

     Map* mpMap;

     std::mutex mMutexPos;
     std::mutex mMutexFeatures;
};

} //namespace ORB_SLAM

#endif // MAPPOINT_H

猜你喜欢

转载自blog.csdn.net/qq_39575818/article/details/94617322