ORB_SLAM2捋思路

参考:http://www.cnblogs.com/mafuqiang/p/6904452.html
之前也看了很多其他的slam算法,但是一直没有深入看下去,原因自已也有,也有一些工作上的原因。最近静下心来想重新从ORB开始看,由于白天还要上班,所以一般也只能下班后看下。其实之前看orb相关的博客看了很多,网上关于orb的资料的确很多,主要参考的视频资料还是泡泡机器人的,非常感谢泡泡机器人。因为博客上虽然很多,有的博主也细讲了很多东西,但是看完很多博客后还是会发现总会缺点什么,比如有些写博客的博主觉得很简单很容易懂的东西他可能就省略了。然后耐着性子看完了orb相关的三个视频,最长的一个接近140分钟,做视频的泡泡机器人真良心啊,讲的非常详细。但是自己好像感觉还没搞清楚思路,所以写下博客帮助自己捋思路。
orb_slam2在orb_slam1的基础上增加了支持相机的类型,总共可以支持三种形式的相机工作,一种是rgbd,一种是双目,一种是单目。毕竟现在研究单目的人越来越多。orb其实总共有四个线程,一个主线程:跟踪(tracking),另外两个线程一个是局部建图(local mapping)、一个是回环检测(loop closing) 。还有一个就是显示线程(viewing)。此处应该插入一张非常好的图片。ORB_SLAM2捋思路_第1张图片
开始开始了,打开orb文件夹会下的examples文件夹会发现三个子文件夹分别对应单目、双目、rgbd相机的主程序。因为我想从最简单的开始看起,所以选择了rgbd,开始看。
主函数里面是先初始化一个ORB_SLAM2::System对象,启动构造函数,构造函数做了以下几件事:加载词典、创建数据集、创建地图。初始化跟踪线程,初始化局部建图线程并启动该线程,初始化回环检测线程并且启动该线程,初始化可视化线程并启动(多线程看的不太懂)。mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR);
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);

new 的时候有构造函数就初始化,但是第thread()函数带的第二个参数没有看明白,查资料说是传递的参数,但是run()函数没有参数呀,而且里面也没有用到mpLocalMapper,不懂不懂。
(其实我建议有时间也可以同时看三个线程,因为到跟踪的后面你会发现会不停的跟mappoint keyframe local(很多函数带有的一个单词)打交道)然后开始在线程之间设置指针。构造函数结束并返回函数。
然后在主函数中会调用SLAM对象的trackrRGBD()函数,每接受一个图像调用一次这个函数,正式进入跟踪线程。根据iembActivateLocalizationMode和mbDeactivateLocalizationMode判断是否设置为“只定位模式”或者“定位建图模式”,第一次调用默认都是false。之后会遇到这个函数GrabImageRGBD,它返回的是Tcw,相机相对于世界坐标系的转换。进入这个函数里面去看看,它最终会调用tracking类的track()函数,进入track()函数,首先是初始化,如果没有初始化就先初始化,单目会相对复杂点。我们先进入双目和rgbd的,判断特征点的数量书否大于500,满足就设置当前帧的位姿为单位位姿,创建关键帧,并将关键帧插入地图(map),接着创建地图点并且关联到关键帧上。有几个函数需要解释下pNewMP->AddObservation(pKFini,i);
pKFini->AddMapPoint(pNewMP,i);
pNewMP->ComputeDistinctiveDescriptors();
pNewMP->UpdateNormalAndDepth();
mpMap->AddMapPoint(pNewMP);

你可能感兴趣的:(SALM)