重读ORB_SLAM之LocalMapping线程难点】的更多相关文章

1. 认清几个锁与布尔参数 线程的通信与相互影响在ORB比较复杂,需要好好缕清思路. 1.1 mbStopRequested,由RequestStop函数设定,主要是在回环线程里,在运行全局优化时,以及检测后,调整Loop时,localMapping需要暂停. 1.2 mbStopped:由stop()函数设定.mbNotStop: 由SetNotStop()设定. 这两个真是把人搞得头大.在Tracking线程,如果mapping线程被要求暂停,也就是mpLocalMapper->isStop…
1. 初始化 当获取第一帧图像与深度图后,首先设置第一帧位姿为4*4单位矩阵,然后为整个map添加关键帧与地图点.且更新地图点与关键帧的联系,例如地图点被哪个关键帧观测到,而此关键帧又包含哪些地图点.而且不得不为ORB的处理细节感动,每个地图点因为对应着不同关键帧的特征点,需要择优选取地图点最合适的描述子,pNewMP->ComputeDistinctiveDescriptors().然后为localmapping线程添加关键帧,以及其他一些准备工作. 2. 正常定位建图模式 后续的定位工作,主…
1. DetectLoop 这里有个ConsistenGroup概念,比较难懂.这里是最让人迷惑的地方.一旦vbConsistentGroup为真,其他帧的spCanditateGroup就进不来了. if(!vbConsistentGroup[iG]) { ConsistentGroup cg = make_pair(spCandidateGroup,nCurrentConsistency); vCurrentConsistentGroups.push_back(cg); vbConsiste…
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12360913.html 本文要点: ORB-SLAM2 LocalMapping 线程 论文内容介绍 ORB-SLAM2 LocalMapping 线程 代码结构介绍 写在前面 之前的 ORB-SLAM2 系列文章中,我们已经对 Tracking 线程和其中的单目初始化部分进行了介绍.我们将在本文中,对 ORB-SLAM2 系统的 LocalMapping 线程进…
本文要点: ORB-SLAM2 Tracking 线程 论文内容介绍 ORB-SLAM2 Tracking 线程 代码结构介绍 写在前面 上一篇文章中我们已经对 ORB-SLAM2 系统有了一个概览性的了解.通过我绘制的详细的思维导图形式的程序导图,我们也可以很清晰地看出各个线程之间的关系,以及它们是如何和论文中的 System Overview 图对应上的. 依旧祭出该图,方便查看: 也再次献上我绘制的程序导图全图:ORB-SLAM2 程序导图 从这篇文章开始,我们将会进入 ORB-SLAM2…
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12369339.html 本文要点: ORB-SLAM2 LoopClosing 线程 论文内容介绍 ORB-SLAM2 LoopClosing 线程 代码结构介绍 写在前面 之前的 ORB-SLAM2 系列文章中,我们已经对 Tracking 线程和 LocalMapping 进行了介绍.我们将在本文中,对 ORB-SLAM2 系统的 LoopClosing 线程…
tracking线程 Tracking线程的主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧,将这些关键帧送给localmapping线程 1. 基本流程 首先从主线程system中的GrabImageMonocular()函数开始,进行图像的预处理和Frame的构造,Frame构造完成后真正进入Tracking. ↓↓↓主要看下面这张图↓↓↓↑↑↑主要看上面这张图↑↑↑ 2. 各部分详解…
参考资料: DBow2的理解 单目跑TUM数据集的运行和函数调用过程 跑数据集不需要ros和相机标定,进入ORB_SLAM目录,执行以下命令: ./Examples/Monocluar/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml Examples/rgbd_dataset_freiburg1_xyz 需要等一会,加载ORB词袋,然后会尝试初始化,再过一会儿就可以看到运行效果了,最后的轨迹会输出到KeyFrameTraje…
ORB-SLAM中优化使用g2o库,先复习一下g2o的用法,上类图 其中SparseOptimizer就是我们需要维护的优化求解器,他是一个优化图,也是一个超图(包含若干顶点和一元二元多元边),怎样定义图的顶点(优化变量_estimate)和边(误差项_error)是用户需要考虑的问题,可以从g2o/types查找是否已经有定义好的顶点或边,若没有,需要自己去实现. 自己实现的时候注意,基本都是去继承BaseVertex<D,T>; BaseUnaryEdge<D,E,VertexXi&…
初始化完成后,对于相机获取当前图像mCurrentFrame,通过跟踪匹配上一帧mLastFrame特征点的方式,可以获取一个相机位姿的初始值:为了兼顾计算量和跟踪鲁棒性,处理了三种模型: 1. TrackWithMotionModel 2. TrackReferenceKeyFrame 3. Relocalization 这三种跟踪模型都是为了获取相机位姿一个粗略的初值,后面会通过跟踪局部地图TrackLocalMap对位姿进行BundleAdjustment(捆集调整),进一步优化位姿. 优…
java基础 全是基础不用多说肯定考的多,尤其是招银 OOP特性/java语言特性:封装.继承.多态 多态具体的表现:多态应用举例.如何调用父类方法(super).重写和重载(重写父类方法的规则.构造方法能否重写..) 类.抽象类.接口:抽象类和接口的区别.引用传递和值传递.java只有值传递 泛型 反射:class类的意义 StringBuffer.StringBuilder.String区别:String常用方法 static关键字在那个内存区域 java常用包有哪些 final关键字 创建…
今天主要是梳理一下ORB-SLAM2源码的逻辑关系,GitHub和泡泡机器人上有很好的注释版本(吴博),大神请(轻)板砖. 一.文件 如图所示,Examples里面存放的分别是基于单目.双目.RGBD的实例程序,一般都是基于TUM等数据库,还有一个ROS版本的ORB-SLAM2,以及一个应用与AR的Demo程序: include文件夹存放的是头文件,ORB-SLAM2可以被当作一个库来使用,很多函数都可以直接调用: src文件夹存放的是和include对应的源文件,包括主要的Tracking.L…
转载请注明出处,谢谢 原创作者:MingruiYU 原创链接:https://www.cnblogs.com/MingruiYu/p/12347171.html *** 本文要点: ORB-SLAM2 简介 ORB-SLAM2 实体对象之间的关系 ORB-SLAM2 系统概览 (参考论文 + 代码) 以思维导图形式绘制的 ORB-SLAM2 程序导图 写在前面 最近准备开始做本科毕业设计,准备对 SLAM 系统中的回环检测模块下手.因为新冠疫情不知道什么时候才能返校,这次放假回家就带了个 mat…
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD…
在main中创建线程,我们称main线程为主线程,新建线程为子线程(其实没有什么主线程和子线程的父子概念,它们是平行的,为了好理解这样称呼),如果子线程内部执行相对比较耗时的操作,主线程执行的快,而且没有等待子线程执行完毕,此时主线程退出,进程被销毁,就会导致子线程无法执行完毕: 可以采用如下方式确保子线程执行完毕: 1. 主线程中采用pthread_join阻塞等待子线程结束,并回收资源: man手册对于该函数的描述: The pthread_join() function waits for…
前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪/可运行状态(Runnable).阻塞(Blocked)和等待(Wait).时间等待(Time_wait).终止状态(Terminate)六种状态.尤其是当线程启动以后,它不能一直"霸占"着…
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填一次. 思路:大概看了线程相关的一些知识,对线程的运行机制,同步机制,以及整个系统都做一个全面的了解.在深入每一个部分去看一下线程及其相关包的源码做深入了解. 目标:线程,并发包(线程池,并发的数据结构,锁,原子类). 通过一些资料的查看最终把目标定位在线程和并发包上,线程是核心,并发包是辅助工具,…
篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblogs.com/baiboy/p/wpf1.html 篇三:批量处理后的txt文件入库处理:http://www.cnblogs.com/baiboy/p/wpf2.html 篇四:关于OneNote入库处理以及审核:http://www.cnblogs.com/baiboy/p/wpf3.html […
Java线程:线程的同步-同步方法   线程的同步是保证多线程安全访问竞争资源的一种手段. 线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题?   在本文之前,请参阅<Java线程:线程的同步与锁>,本文是在此基础上所写的.   对于同步,在具体的Java代码中需要完成一下两个操作: 把竞争访问的资源标识为private: 同步哪些修改变量的代码…
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列. 注:什么叫线程安全?这个首先要明确.线程安全的类 ,指的是类内共享的全局变量的访问必须保证是不受多线程形式影响的.如果由于多线程的访问(比如修改.遍历.查看)而使这些变量结构被破坏…
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav…
1.目录略览      线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程.      线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型,线程间的通信,java ThreadLocal类,线程信号      死锁相关,资源竞争相关:死锁,如何避免死锁,饥饿和公平,嵌套管程锁死,Slipped conditions(从一个线程检查某一特定条件到该线程操作此条件期间,这个条件已经被其它线程改变,导致第一个线程在该条件上执行了错误的操作)…
为什么要使用ACE_Task来管理线程 从C#转到C++后,感觉到C++比C#最难的地方,就是在系统编程时,C#中有对应的类库,我接触到一个类后,就可以通过这个类,知道很多相关的功能.而在C++中,必须使用Windows API,但是Windows API的缺点反而是不系统.比如,想要创建一个线程时,C#中可以通过新建一个Thread类,我得到这个类后,就可以通过帮助或者MSDN了解到这个类中有哪些方法,如何管理线程等.但是C++中,创建一个线程,需要调用CreateThread,但因为它是一个…
(一).java并发之原子性与可见性 原子性 原子是世界上的最小单位,具有不可分割性.比如 a=0:(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作.再比如:a++: 这个操作实际是a = a + 1:是可分割的,所以他不是一个原子操作.非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作.一个操作是原子操作,那么我们称它具有原子性.Java的concurrent包下提供了一些原子类,我们可以通过阅读API来了…
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav…
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于实现多线程的意义,"从业四年看并发"一文已经讲述,而本篇主要讲一下常用的设计模式和对象介绍,关于底层,请查看"Java高级之内存模型分析". 通常情况下,狭义上来说,实现了变量或对象的原子性,即可以实现线程安全.什么叫线程的原子性,即执行read-load-assign-use-store-write这6个步骤,其一执行,则其他必执行完,因此来保证数据的同步.一般…
引用:http://community.csdn.net/Expert/TopicView3.asp?id=4374496linux下进程间通信的几种主要手段简介: 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身…
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同步. 初始化锁.在Linux下,线程的互斥量数据类型是pthread_mutex_t.在使用前,要对它进行初始化.静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;动态分配:int pthread_mutex_init(pthread_m…
第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN&en=utf&hpp=20&dws=cndw&lo=zh 概述 Spring 最成功,最吸引人的地方莫过于轻量级的声明式事务管理,仅此一点,它就宣告了重量级 EJB 容器的覆灭.Spring 声明式事务管理将开发者从繁复的事务管理代码中解脱出来,专注于业务逻辑的开发上,这是一件…
多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美.这篇文章主要从线程创建与启动.线程的同步与锁.线程的交互.线程池等等四个方面简单的讲解一下iphone中的多线程编程.   一.线程创建与启动   线程创建主要有二种方式:   当然,还有一种比较特殊,就是使用所谓的convenient method,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责.这个方法的接口是:    + (void)d…