亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ORB-SLAM代碼詳解之SLAM系統初始化

2019-11-10 18:59:09
字體:
來源:轉載
供稿:網友

systemhsystemc的SystemSystem

轉載請注明出處:http://blog.csdn.net/c602273091/article/details/54933760

system.h

這里包含了整個SLAM系統所需要的一起,通過看這個文件可以對ORB-SLAM系統有什么有一個大概的了解。不過之前我們需要對于多線程了解一些基本的東西——信號量【1】和多線程【2】。

具體注釋如下:

/*** This file is part of ORB-SLAM2.** Copyright (C) 2014-2016 Ra煤l Mur-Artal <raulmur at unizar dot es> (University of Zaragoza)* For more information see <https://github.com/raulmur/ORB_SLAM2>** ORB-SLAM2 is free software: you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation, either version 3 of the License, or* (at your option) any later version.** ORB-SLAM2 is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with ORB-SLAM2. If not, see <http://www.gnu.org/licenses/>.*/#ifndef SYSTEM_H#define SYSTEM_H#include<string>#include<thread>#include<opencv2/core/core.hpp>#include "Tracking.h"#include "FrameDrawer.h"#include "MapDrawer.h"#include "Map.h"#include "LocalMapping.h"#include "LoopClosing.h"#include "KeyFrameDatabase.h"#include "ORBVocabulary.h"#include "Viewer.h"namespace ORB_SLAM2{class Viewer; // 畫圖class FrameDrawer; // 畫每一幀class Map; // 對map進行操作class Tracking; // 追蹤的過程class LocalMapping; // 局部地圖class LoopClosing; // 閉環檢測class System{public: // Input sensor // 輸入設備:單目、立體視覺、RGBD enum eSensor{ MONOCULAR=0, STEREO=1, RGBD=2 };public: // Initialize the SLAM system. It launches the Local Mapping, Loop Closing and Viewer threads. // 對SLAM系統的初始化:包含局部地圖、閉環檢測、視圖三個線程 System(const string &strVocFile, const string &strSettingsFile, const eSensor sensor, const bool bUseViewer = true); // PRoccess the given stereo frame. Images must be synchronized and rectified. // Input images: RGB (CV_8UC3) or grayscale (CV_8U). RGB is converted to grayscale. // Returns the camera pose (empty if tracking fails). cv::Mat TrackStereo(const cv::Mat &imLeft, const cv::Mat &imRight, const double &timestamp); // Process the given rgbd frame. Depthmap must be registered to the RGB frame. // Input image: RGB (CV_8UC3) or grayscale (CV_8U). RGB is converted to grayscale. // Input depthmap: Float (CV_32F). // Returns the camera pose (empty if tracking fails). cv::Mat TrackRGBD(const cv::Mat &im, const cv::Mat &depthmap, const double &timestamp); // Proccess the given monocular frame // Input images: RGB (CV_8UC3) or grayscale (CV_8U). RGB is converted to grayscale. // Returns the camera pose (empty if tracking fails). // 對單目的圖片進行追蹤 cv::Mat TrackMonocular(const cv::Mat &im, const double &timestamp); // This stops local mapping thread (map building) and performs only camera tracking. // 暫停局部地圖的構建,只進行追蹤,這個名字很有迷惑性 void ActivateLocalizationMode(); // This resumes local mapping thread and performs SLAM again. // 重新開啟局部地圖的線程 // 在這里使用的是mutex信號量的多線程編程 void DeactivateLocalizationMode(); // Reset the system (clear map) // 復位清楚地圖 void Reset(); // All threads will be requested to finish. // It waits until all threads have finished. // This function must be called before saving the trajectory. // 等到所有線程結束任務的時候關閉每個線程 void Shutdown(); // Save camera trajectory in the TUM RGB-D dataset format. // Call first Shutdown() // See format details at: http://vision.in.tum.de/data/datasets/rgbd-dataset void SaveTrajectoryTUM(const string &filename); // Save keyframe poses in the TUM RGB-D dataset format. // Use this function in the monocular case. // Call first Shutdown() // See format details at: http://vision.in.tum.de/data/datasets/rgbd-dataset void SaveKeyFrameTrajectoryTUM(const string &filename); // Save camera trajectory in the KITTI dataset format. // Call first Shutdown() // See format details at: http://www.cvlibs.net/datasets/kitti/eval_odometry.php // kitti數據集的保存位姿的方法 void SaveTrajectoryKITTI(const string &filename); // TODO: Save/Load functions // SaveMap(const string &filename); // LoadMap(const string &filename);private: // Input sensor // 輸入的傳感器類型 eSensor mSensor; // 用于特征匹配和閉環檢測的字典 // ORB vocabulary used for place recognition and feature matching. ORBVocabulary* mpVocabulary; // KeyFrame database for place recognition (relocalization and loop detection). // 關鍵幀存儲的地方 KeyFrameDatabase* mpKeyFrameDatabase; // Map structure that stores the pointers to all KeyFrames and MapPoints. // 所有的關鍵幀和點云存儲的地方 Map* mpMap; // Tracker. It receives a frame and computes the associated camera pose. // It also decides when to insert a new keyframe, create some new MapPoints and // performs relocalization if tracking fails. // 追蹤器。接受一幀并且計算相機位姿,并決定何時插入關鍵幀,關鍵點。 // 當追蹤失敗以后進行重定位 Tracking* mpTracker; // Local Mapper. It manages the local map and performs local bundle adjustment. // 構建局部地圖并對局部地圖使用BA。 LocalMapping* mpLocalMapper; // Loop Closer. It searches loops with every new keyframe. If there is a loop it performs // a pose graph optimization and full bundle adjustment (in a new thread) afterwards. // 閉環檢測,每插入一個關鍵幀就計算是否有閉環并且進行全局的BA。 LoopClosing* mpLoopCloser; // The viewer draws the map and the current camera pose. It uses Pangolin. // 使用Pangolin庫看地圖和相機位姿。 Viewer* mpViewer; FrameDrawer* mpFrameDrawer; MapDrawer* mpMapDrawer; // System threads: Local Mapping, Loop Closing, Viewer. // The Tracking thread "lives" in the main execution thread that creates the System object. // 追蹤這個線程是在main函數里面,這里另外開了局部地圖、局部閉環檢測、顯示地圖三個線程 std::thread* mptLocalMapping; std::thread* mptLoopClosing; std::thread* mptViewer; // Reset flag std::mutex mMutexReset; bool mbReset; // Change mode flags std::mutex mMutexMode; bool mbActivateLocalizationMode; bool mbDeactivateLocalizationMode;};}// namespace ORB_SLAM#endif // SYSTEM_H

這樣對于ORB-SLAM我們有了一個大致的認識。

接下來我們看System::System(const string &strVocFile, const string &strSettingsFile, const eSensor sensor, const bool bUseViewer).

system.c的System::System

使用understand的control flow,一劍封喉,直接看到各個部分的聯系。流程圖出來了,感覺看起來很爽。 這里寫圖片描述

在這個基礎上,我再對整個流程進行注釋。

System::System(const string &strVocFile, const string &strSettingsFile, const eSensor sensor, const bool bUseViewer):mSensor(sensor),mbReset(false),mbActivateLocalizationMode(false), mbDeactivateLocalizationMode(false){ // Output welcome message cout << endl << "ORB-SLAM2 Copyright (C) 2014-2016 Raul Mur-Artal, University of Zaragoza." << endl << "This program comes with ABSOLUTELY NO WARRANTY;" << endl << "This is free software, and you are welcome to redistribute it" << endl << "under certain conditions. See LICENSE.txt." << endl << endl; cout << "Input sensor was set to: "; // 判斷什么類型的傳感器 if(mSensor==MONOCULAR) cout << "Monocular" << endl; else if(mSensor==STEREO) cout << "Stereo" << endl; else if(mSensor==RGBD) cout << "RGB-D" << endl; //Check settings file // 檢查配置文件是否存在 // cv::FileStorage對xml/YML的配置文件進行操作,讀取配置文件 // yml的配置文件已經讀入fsSettings了 cv::FileStorage fsSettings(strSettingsFile.c_str(), cv::FileStorage::READ); if(!fsSettings.isOpened()) { cerr << "Failed to open settings file at: " << strSettingsFile << endl; exit(-1); } // 加載ORB的字典 //Load ORB Vocabulary cout << endl << "Loading ORB Vocabulary. This could take a while..." << endl; // 加載字典到mpVocabulary mpVocabulary = new ORBVocabulary(); bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile); if(!bVocLoad) { cerr << "Wrong path to vocabulary. " << endl; cerr << "Falied to open at: " << strVocFile << endl; exit(-1); } cout << "Vocabulary loaded!" << endl << endl; //Create KeyFrame Database // 創建關鍵幀的數據庫 mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary); //Create the Map // 創建地圖 mpMap = new Map(); //Create Drawers. These are used by the Viewer // 創建視圖 mpFrameDrawer = new FrameDrawer(mpMap); // 創建畫圖器 mpMapDrawer = new MapDrawer(mpMap, strSettingsFile); //Initialize the Tracking thread //(it will live in the main thread of execution, the one that called this constructor) mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer, mpMap, mpKeyFrameDatabase, strSettingsFile, mSensor); //Initialize the Local Mapping thread and launch mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR); mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper); //Initialize the Loop Closing thread and launch // 初始化局部圖線程 mpLoopCloser = new LoopClosing(mpMap, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR); mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser); //Initialize the Viewer thread and launch // 初始化顯示線程 mpViewer = new Viewer(this, mpFrameDrawer,mpMapDrawer,mpTracker,strSettingsFile); if(bUseViewer) mptViewer = new thread(&Viewer::Run, mpViewer); mpTracker->SetViewer(mpViewer); //Set pointers between threads mpTracker->SetLocalMapper(mpLocalMapper); mpTracker->SetLoopClosing(mpLoopCloser); mpLocalMapper->SetTracker(mpTracker); mpLocalMapper->SetLoopCloser(mpLoopCloser); mpLoopCloser->SetTracker(mpTracker); mpLoopCloser->SetLocalMapper(mpLocalMapper);}

接下來對每個類看一下初始化的效果。從字典類,關鍵幀類,地圖類,局部圖類等等看看它們如何進行初始化。

參考鏈接: 【1】mutex: http://www.cplusplus.com/reference/mutex/ 【2】thread: http://www.cplusplus.com/reference/thread/thread/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久人人97超碰精品888| 91精品视频免费看| 国产精品mp4| 欧美洲成人男女午夜视频| 久久久国产一区二区三区| 精品女同一区二区三区在线播放| 日韩美女主播视频| 成人欧美一区二区三区在线湿哒哒| 日本精品一区二区三区在线| 麻豆一区二区在线观看| 日韩大陆毛片av| 国产精品电影观看| 国产欧美婷婷中文| 久久综合伊人77777| 久久久伊人欧美| 日本高清+成人网在线观看| 91视频国产一区| 最近2019中文免费高清视频观看www99| 精品国产91久久久久久| 成人黄色大片在线免费观看| 国产日韩亚洲欧美| 日韩电影大全免费观看2023年上| 久久久免费精品视频| 97涩涩爰在线观看亚洲| 成人国产亚洲精品a区天堂华泰| 亚洲第一网站男人都懂| 青草青草久热精品视频在线网站| 亚洲第一免费网站| 性欧美视频videos6一9| 国产亚洲精品久久久久动| 欧美成人自拍视频| 2018国产精品视频| 亚洲香蕉伊综合在人在线视看| 国产日韩精品在线观看| 亚洲人成在线观看网站高清| 91久久精品国产91性色| 日本精品久久久久久久| 久久久久久久久国产精品| 亚洲精品成人久久| 成人免费福利在线| 国产精品久久一| 中文字幕亚洲国产| 色视频www在线播放国产成人| 国产日韩专区在线| 欧美精品18videos性欧| 欧美日韩亚洲高清| 久久久久久久91| 日韩风俗一区 二区| 欧美福利视频在线| 色妞久久福利网| 欧美成人免费va影院高清| 国产精品自产拍在线观| 欧美一级淫片aaaaaaa视频| 亚洲欧美成人在线| 亚洲免费福利视频| 米奇精品一区二区三区在线观看| 欧美理论电影在线观看| 亚洲国产一区二区三区四区| 久久噜噜噜精品国产亚洲综合| 国内精品国产三级国产在线专| 欧美精品videosex牲欧美| 日韩亚洲欧美中文在线| 国产精品www| 国产精品偷伦视频免费观看国产| 久久免费国产精品1| 国产精品日韩在线| 亚洲嫩模很污视频| 亚洲国产成人精品久久久国产成人一区| 日韩在线欧美在线国产在线| 日韩不卡在线观看| 日韩视频在线观看免费| 777777777亚洲妇女| 一区二区亚洲精品国产| 亚洲欧洲自拍偷拍| 亚洲自拍偷拍第一页| 欧美精品亚州精品| 日韩av男人的天堂| 在线精品91av| 亚洲精品wwww| 国产精品久久色| 欧美小视频在线观看| 国模精品一区二区三区色天香| 欧美激情综合色综合啪啪五月| 亚洲精品美女久久久久| www.欧美精品一二三区| 91亚洲永久免费精品| 97在线视频免费看| 国产成人综合一区二区三区| 欧美成人午夜影院| 欧美老女人www| 北条麻妃一区二区三区中文字幕| 国产国语刺激对白av不卡| 亚洲国产另类 国产精品国产免费| 久久黄色av网站| 国产婷婷成人久久av免费高清| 97超碰色婷婷| 国自产精品手机在线观看视频| 日韩成人久久久| 久久精品在线播放| 久久久女人电视剧免费播放下载| 91视频免费网站| 国产精品午夜视频| 亚洲精品suv精品一区二区| 亚洲欧美一区二区三区在线| 在线观看日韩www视频免费| 欧美中文字幕视频在线观看| 夜夜嗨av色一区二区不卡| 日韩国产欧美精品在线| 国产精品看片资源| 91久久精品日日躁夜夜躁国产| 亚洲精品日产aⅴ| 久久精品99无色码中文字幕| 久久久久久综合网天天| 日日骚av一区| 精品成人69xx.xyz| 九九视频这里只有精品| 国产精品露脸av在线| 国产精品爽爽爽爽爽爽在线观看| 91av视频在线免费观看| 搡老女人一区二区三区视频tv| 91大神在线播放精品| 成人欧美一区二区三区在线湿哒哒| 欧美专区国产专区| 亚洲国产又黄又爽女人高潮的| 97视频在线观看网址| 亚洲天堂免费视频| 精品久久久久久国产91| 国产黑人绿帽在线第一区| 国产日韩欧美一二三区| 热99精品里视频精品| 久久久日本电影| 久久久久久久久久久久av| 视频在线观看一区二区| 欧洲成人在线视频| 欧美精品18videos性欧| 国产精品影片在线观看| 欧美大片在线看| 午夜精品久久久久久99热| 国产精品2018| 欧美日韩国产一区二区| 精品久久中文字幕久久av| 成人网在线免费看| 亚洲精品免费一区二区三区| 狠狠色狠狠色综合日日小说| 日韩精品在线视频| 97精品国产91久久久久久| 久久综合久中文字幕青草| 日本精品免费观看| 欧美日韩亚洲激情| 成人女保姆的销魂服务| 91老司机精品视频| 国产精品自拍偷拍视频| 国产视频精品一区二区三区| 国产经典一区二区| 国产精品91久久久| 一区二区亚洲欧洲国产日韩| 亚洲人成在线观看网站高清| 亚洲一区亚洲二区亚洲三区| 中文字幕日韩欧美精品在线观看| 国产香蕉精品视频一区二区三区| 97精品视频在线播放| 日韩欧美高清视频| 亚洲专区中文字幕| 亚洲成人精品视频在线观看|