ORB-SLAM2的源码阅读(四):Map类
2018-02-28 09:51
961 查看
这个类别算是比较简单,主要是负责维护其中关键帧和地图点,就是后面要讲的几类。包括设置参考地
4000
图点用于绘制地图。还有一些计数和保存地图点,关键帧ID的功能。
如果看具体代码实现,其实基本上都是unique_lock的操作
O(∩_∩)O哈哈~
4000
图点用于绘制地图。还有一些计数和保存地图点,关键帧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::vector<MapPoint*> &vpMPs); void InformNewBigChange(); int GetLastBigChangeIdx(); std::vector<KeyFrame*> GetAllKeyFrames(); std::vector<MapPoint*> GetAllMapPoints(); std::vector<MapPoint*> GetReferenceMapPoints(); long unsigned int MapPointsInMap(); long unsigned KeyFramesInMap(); long unsigned int GetMaxKFid(); void clear(); vector<KeyFrame*> mvpKeyFrameOrigins; std::mutex mMutexMapUpdate; // This avoid that two points are created simultaneously in separate threads (id conflict) std::mutex mMutexPointCreation; protected: std::set<MapPoint*> mspMapPoints; std::set<KeyFrame*> mspKeyFrames; std::vector<MapPoint*> 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" #include<mutex> namespace ORB_SLAM2 { //构造函数 Map::Map():mnMaxKFid(0),mnBigChangeIdx(0) { } //增加关键帧 void Map::AddKeyFrame(KeyFrame *pKF) { unique_lock<mutex> lock(mMutexMap); mspKeyFrames.insert(pKF); if(pKF->mnId>mnMaxKFid) mnMaxKFid=pKF->mnId; } //增加地图点 void Map::AddMapPoint(MapPoint *pMP) { unique_lock<mutex> lock(mMutexMap); mspMapPoints.insert(pMP); } //擦除地图点 void Map::EraseMapPoint(MapPoint *pMP) { unique_lock<mutex> lock(mMutexMap); mspMapPoints.erase(pMP); // TODO: This only erase the pointer. // Delete the MapPoint } //擦除关键帧 void Map::EraseKeyFrame(KeyFrame *pKF) { unique_lock<mutex> lock(mMutexMap); mspKeyFrames.erase(pKF); // TODO: This only erase the pointer. // Delete the MapPoint } //设置参考地图点 void Map::SetReferenceMapPoints(const vector<MapPoint *> &vpMPs) { unique_lock<mutex> lock(mMutexMap); mvpReferenceMapPoints = vpMPs; } // 关于新变化的ID void Map::InformNewBigChange() { unique_lock<mutex> lock(mMutexMap); mnBigChangeIdx++; } //最后变动的ID int Map::GetLastBigChangeIdx() { unique_lock<mutex> lock(mMutexMap); return mnBigChangeIdx; } //得到所有关键帧 vector<KeyFrame*> Map::GetAllKeyFrames() { unique_lock<mutex> lock(mMutexMap); return vector<KeyFrame*>(mspKeyFrames.begin(),mspKeyFrames.end()); } //得到所有地图点 vector<MapPoint*> Map::GetAllMapPoints() { unique_lock<mutex> lock(mMutexMap); return vector<MapPoint*>(mspMapPoints.begin(),mspMapPoints.end()); } //返回现在地图中含有的地图点的个数 long unsigned int Map::MapPointsInMap() { unique_lock<mutex> lock(mMutexMap); return mspMapPoints.size(); } //返回地图中关键帧的个数 long unsigned int Map::KeyFramesInMap() { unique_lock<mutex> lock(mMutexMap); return mspKeyFrames.size(); } //得到参考地图点 vector<MapPoint*> Map::GetReferenceMapPoints() { unique_lock<mutex> lock(mMutexMap); return mvpReferenceMapPoints; } //得到最大关键帧ID long unsigned int Map::GetMaxKFid() { unique_lock<mutex> lock(mMutexMap); return mnMaxKFid; } //清除所有地图 void Map::clear() { for(set<MapPoint*>::iterator sit=mspMapPoints.begin(), send=mspMapPoints.end(); sit!=send; sit++) delete *sit; for(set<KeyFrame*>::iterator sit=mspKeyFrames.begin(), send=mspKeyFrames.end(); sit!=send; sit++) delete *sit; mspMapPoints.clear(); mspKeyFrames.clear(); mnMaxKFid = 0; mvpReferenceMapPoints.clear(); mvpKeyFrameOrigins.clear(); } } //namespace ORB_SLAM
O(∩_∩)O哈哈~
相关文章推荐
- ORB-SLAM2的源码阅读(七):KeyFrame类
- ORB-SLAM2的源码阅读(十一):LoopClosing类
- ORB-SLAM2的源码阅读(一):系统的整体构建
- ORB-SLAM2的源码阅读(五):MapPoint类
- ORB-SLAM2的源码阅读(三):Frame类
- ORB_SLAM2 源码阅读 ORB_SLAM2::ORBextractor
- orbslam:rgbd_tum源码阅读
- ORB_SLAM ORBextractor 特征点提取 opencv源码学习
- 【视觉 SLAM-2】 视觉SLAM- ORB 源码详解 2
- [SLAM] GMapping SLAM源码阅读(草稿)
- jQuery源码阅读(十一)---each、map、grep、merge、makeArray、inArray解读
- SLAM学习笔记3: 源码分析ORB_SLAM中后端图构建
- orb-slam中的orb项目源码解析
- ORB-SLAM2_github源码说明(1)
- JDI源码阅读之SortedMap和SortedSet
- ORB-SLAM:文献阅读笔记