ORBSLAM2 系统构造函数

本次的目的主要是讲解ORBSLAM2中SLAM系统的构造函数System::System,这里主要进行了字典文件加载及相关线程的初始化。
首先是构造函数的参数

System::System(const string &strVocFile,					    //词典文件路径
			   const string &strSettingsFile,				    //配置文件路径
			   const eSensor sensor,						    //传感器类型
               const bool bUseViewer):						    //是否使用可视化界面
					 mSensor(sensor), 							//初始化传感器类型
					 mpViewer(static_cast<Viewer*>(NULL)),		//对指针赋予默认值,避免野指针的存在
					 mbReset(false),							//无复位标志
					 mbActivateLocalizationMode(false),			//没有这个模式转换标志
        			 mbDeactivateLocalizationMode(false)		//没有这个模式转换标志

在构造函数中主要进行了以下处理:

  • 输出欢迎信息及使用的传感器信息

        //输出欢迎信息
        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;
    
  • 创建一个opencv提供的yaml文件读取类用于读取配置文件中的参数

        //创建一个yaml文件读取类
    cv::FileStorage fsSettings(strSettingsFile.c_str(), 	//将配置文件名转换成为字符串
    						   cv::FileStorage::READ);		//只读
    
    //如果打开失败,就输出调试信息
    if(!fsSettings.isOpened())
    {
       cerr << "Failed to open settings file at: " << strSettingsFile << endl;
       //然后退出
       exit(-1);
    }
    
  • 使用DBOW2提供的词袋类来载入词袋文件

        cout << endl << "Loading ORB Vocabulary. This could take a while..." << endl;
    
    //建立一个新的ORB字典
    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;
    
  • 创建相关的线程并设置线程之间的数据指针

        //创建关键帧数据库
    mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);
    
    //创建地图
    mpMap = new Map();
    
    
    //这里的帧绘制器和地图绘制器将会被可视化的Viewer所使用
    mpFrameDrawer = new FrameDrawer(mpMap);
    mpMapDrawer = new MapDrawer(mpMap, strSettingsFile);
    
    //在主进程中初始化追踪线程
    mpTracker = new Tracking(this,						        //将系统对象传递给追踪线程
    						 mpVocabulary,				        //字典
    						 mpFrameDrawer, 			        //帧绘制器
    						 mpMapDrawer,				        //地图绘制器
                             mpMap, 					        //地图
                             mpKeyFrameDatabase, 		        //关键帧数据库
                             strSettingsFile, 			        //配置文件路径
                             mSensor);					        //传感器类型
    
    //初始化局部建图线程并运行
    mpLocalMapper = new LocalMapping(mpMap, 				    //地图
    								 mSensor==MONOCULAR);	    // ? 为什么这个要设置成为MONOCULAR???
    //运行这个局部建图线程
    mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,	//这个线程会调用的函数
    							 mpLocalMapper);				//这个调用函数的参数
    
    //初始化闭环检测线程并运行
    mpLoopCloser = new LoopClosing(mpMap, 						//地图
    							   mpKeyFrameDatabase, 			//关键帧数据库
    							   mpVocabulary, 				//ORB字典
    							   mSensor!=MONOCULAR);			//当前的传感器是否是单目
    //创建回环检测线程
    mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run,	//线程的主函数
    							mpLoopCloser);					//该函数的参数
    
    //创建可视化线程并运行
    if(bUseViewer)
    {
    	//如果指定了,程序的运行过程中需要运行可视化部分
    	//新建viewer
        mpViewer = new Viewer(this, 			//又是这个
        					  mpFrameDrawer,	//帧绘制器
        					  mpMapDrawer,		//地图绘制器
        					  mpTracker,		//追踪器
        					  strSettingsFile);	//配置文件的访问路径
        //新建viewer线程
        mptViewer = new thread(&Viewer::Run, mpViewer);
        //给运动追踪器设置其查看器
        mpTracker->SetViewer(mpViewer);
    }
    
    //设置线程间的指针
    mpTracker->SetLocalMapper(mpLocalMapper);
    mpTracker->SetLoopClosing(mpLoopCloser);
    
    mpLocalMapper->SetTracker(mpTracker);
    mpLocalMapper->SetLoopCloser(mpLoopCloser);
    
    mpLoopCloser->SetTracker(mpTracker);
    mpLoopCloser->SetLocalMapper(mpLocalMapper);
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ORB SLAM2是一种用于单目、立体声和RGB-D相机的开源SLAM系统,用于实时定位和建图。它的基本思想是通过提取和匹配特征点来跟踪相机运动,并根据相机的运动和观测到的特征点来构建三维地图。 在建图过程中,ORB SLAM2首先会对输入的图像进行特征提取和描述符计算,然后使用RANSAC算法进行特征点匹配和相机位姿估计。接下来,它会根据相机的运动和观测到的特征点来进行地图点的三角化,并使用优化算法对地图进行更新。最后,ORB SLAM2会根据地图和相机的运动来估计相机的位置,并实时地进行地图的拼接和更新。 与基本的ORB SLAM2相比,高翔博士扩展了该系统,实现了稠密的点云地图的构建。他的工作是为每个关键帧构造相应的点云,然后将所有的点云根据从ORB SLAM2获取的关键帧位置信息进行拼接,形成一个全局点云地图。这个扩展可以提供更加详细和真实的环境建模。 因此,ORB SLAM2可以用于实时定位和建图,通过提取和匹配特征点,并根据相机的运动和观测到的特征点来构建三维地图。高翔博士扩展了ORB SLAM2,实现了稠密的点云地图的建立。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ORBSLAM2构建稠密点云图及小觅相机的使用](https://blog.csdn.net/qq_43603142/article/details/110471084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [osmap:保存并加载orb-slam2地图](https://download.csdn.net/download/weixin_42099151/19010806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值