这个类别算是比较简单主要是负责维护其中关键帧和地图点就是后面要讲的几类。包括设置参考地图点用于绘制地图。还有一些计数和保存地图点关键帧ID的功能。#ifndef MAP_H #define MAP_H #include MapPoint.h #include KeyFrame.h #include set #include mutex namespace ORB_SLAM2 { class MapPoint; class KeyFrame; class Map { public: Map(); void AddKeyFrame(KeyFrame* pKF); void AddMapPoint(MapPoint* pMP); void EraseMapPoint(MapPoint* pMP); void EraseKeyFrame(KeyFrame* pKF); void SetReferenceMapPoints(const std::vectorMapPoint* vpMPs); void InformNewBigChange(); int GetLastBigChangeIdx(); std::vectorKeyFrame* GetAllKeyFrames(); std::vectorMapPoint* GetAllMapPoints(); std::vectorMapPoint* GetReferenceMapPoints(); long unsigned int MapPointsInMap(); long unsigned KeyFramesInMap(); long unsigned int GetMaxKFid(); void clear(); vectorKeyFrame* mvpKeyFrameOrigins; std::mutex mMutexMapUpdate; // This avoid that two points are created simultaneously in separate threads (id conflict) std::mutex mMutexPointCreation; protected: std::setMapPoint* mspMapPoints; std::setKeyFrame* mspKeyFrames; std::vectorMapPoint* mvpReferenceMapPoints; long unsigned int mnMaxKFid; // Index related to a big change in the map (loop closure, global BA) int mnBigChangeIdx; std::mutex mMutexMap; }; } //namespace ORB_SLAM #endif // MAP_H如果看具体代码实现其实基本上都是unique_lock的操作#include Map.h #includemutex namespace ORB_SLAM2 { //构造函数 Map::Map():mnMaxKFid(0),mnBigChangeIdx(0) { } //增加关键帧 void Map::AddKeyFrame(KeyFrame *pKF) { unique_lockmutex lock(mMutexMap); mspKeyFrames.insert(pKF); if(pKF-mnIdmnMaxKFid) mnMaxKFidpKF-mnId; } //增加地图点 void Map::AddMapPoint(MapPoint *pMP) { unique_lockmutex lock(mMutexMap); mspMapPoints.insert(pMP); } //擦除地图点 void Map::EraseMapPoint(MapPoint *pMP) { unique_lockmutex lock(mMutexMap); mspMapPoints.erase(pMP); // TODO: This only erase the pointer. // Delete the MapPoint } //擦除关键帧 void Map::EraseKeyFrame(KeyFrame *pKF) { unique_lockmutex lock(mMutexMap); mspKeyFrames.erase(pKF); // TODO: This only erase the pointer. // Delete the MapPoint } //设置参考地图点 void Map::SetReferenceMapPoints(const vectorMapPoint * vpMPs) { unique_lockmutex lock(mMutexMap); mvpReferenceMapPoints vpMPs; } // 关于新变化的ID void Map::InformNewBigChange() { unique_lockmutex lock(mMutexMap); mnBigChangeIdx; } //最后变动的ID int Map::GetLastBigChangeIdx() { unique_lockmutex lock(mMutexMap); return mnBigChangeIdx; } //得到所有关键帧 vectorKeyFrame* Map::GetAllKeyFrames() { unique_lockmutex lock(mMutexMap); return vectorKeyFrame*(mspKeyFrames.begin(),mspKeyFrames.end()); } //得到所有地图点 vectorMapPoint* Map::GetAllMapPoints() { unique_lockmutex lock(mMutexMap); return vectorMapPoint*(mspMapPoints.begin(),mspMapPoints.end()); } //返回现在地图中含有的地图点的个数 long unsigned int Map::MapPointsInMap() { unique_lockmutex lock(mMutexMap); return mspMapPoints.size(); } //返回地图中关键帧的个数 long unsigned int Map::KeyFramesInMap() { unique_lockmutex lock(mMutexMap); return mspKeyFrames.size(); } //得到参考地图点 vectorMapPoint* Map::GetReferenceMapPoints() { unique_lockmutex lock(mMutexMap); return mvpReferenceMapPoints; } //得到最大关键帧ID long unsigned int Map::GetMaxKFid() { unique_lockmutex lock(mMutexMap); return mnMaxKFid; } //清除所有地图 void Map::clear() { for(setMapPoint*::iterator sitmspMapPoints.begin(), sendmspMapPoints.end(); sit!send; sit) delete *sit; for(setKeyFrame*::iterator sitmspKeyFrames.begin(), sendmspKeyFrames.end(); sit!send; sit) delete *sit; mspMapPoints.clear(); mspKeyFrames.clear(); mnMaxKFid 0; mvpReferenceMapPoints.clear(); mvpKeyFrameOrigins.clear(); } } //namespace ORB_SLAMO(∩_∩)O哈哈~