1. 初始化

当获取第一帧图像与深度图后,首先设置第一帧位姿为4*4单位矩阵,然后为整个map添加关键帧与地图点。且更新地图点与关键帧的联系,例如地图点被哪个关键帧观测到,而此关键帧又包含哪些地图点。而且不得不为ORB的处理细节感动,每个地图点因为对应着不同关键帧的特征点,需要择优选取地图点最合适的描述子,pNewMP->ComputeDistinctiveDescriptors()。然后为localmapping线程添加关键帧,以及其他一些准备工作。

2. 正常定位建图模式

后续的定位工作,主要由四个函数完成,首先如果有速度信息,就会采取TrackWithMotionModel,没有速度信息或者重定位后的第一帧就会采用TrackReferenceKeyFrame(),当运动速度快,或者其他原因导致定位失败,会一直采用重定位方法。在跟踪当前帧成功后,还要在TrackLocalMap里继续对局部地图做跟踪以及优化位姿。这个localmap局部地图很有迷惑性,跟localMapping感觉很相似。但是两者有很大不同,localmap有两部分组成,一个是局部关键帧,一个是局部地图点。局部关键帧由与当前关键帧有共同观测点的其他关键帧组成,且包括其自身。如果localkeyframes不到80帧,则继续添加每个localkeyframes内的邻居关键帧,孩子与父关键帧。localMapping 则是根据传来的关键帧,经过计算,往整体的map中添加数据。localPoints就很容易理解了,把局部关键帧内所有的看到的地图点都添加进去。重定位函数Relocalization,就是在关键帧库里搜索能匹配上的关键帧,做相对位姿计算。

3. 只定位不建图模式

这种模式下,首先会进行重定位,然后根据mbVO 参数判断是进行正常的跟踪定位操作还是要结合重定位信息。mbVO为真表示当前图像和上一帧地图点匹配数目小于10,有可能是运动过快的原因。

  1. 假如上次定位显示,mbVO为0,则进行正常的定位跟踪,但是发现跟踪后mbVO在TrackWithMotionModel里被设置为1了,且定位是成功的,则进行正常的更新速度以及显示操作,如果mbVO仍然为0,则要先跟局部地图进行匹配跟踪,优化位姿,再进行后续操作。因为如果mbVO为1时,也就是跟上一帧地图点匹配较少时,可能得不到有效的局部地图信息。
  2. 在下次定位时,如果mbVO为1,则先进行TrackWithMotionModel跟踪,再进行重定位,为的是保证定位不会轻易丢失。但是如果运动速度仍然过快,mbVO 仍然为1,则下次任然重复步骤2。直到TrackWithMotionModel里设置mbVO为0,或者重定位成功把mbVO设置为0。

4. 结尾处理

此处有两个点比较难理解:

  1. 为什么会存在观测值小于1的地图点?
             // Clean VO matches
for(int i=0; i<mCurrentFrame.N; i++)
{
MapPoint* pMP = mCurrentFrame.mvpMapPoints[i];
if(pMP)
if(pMP->Observations()<1)
{
mCurrentFrame.mvbOutlier[i] = false;
mCurrentFrame.mvpMapPoints[i]=static_cast<MapPoint*>(NULL);
}
}

梳理之后发现,在localMapping中,会对局部地图进行优化,会对地图点和关键帧的关系做出调整,有些地图点就会删掉某些observation。所以这里需要处理。

  1. 要删去一些临时地图点,这些点从哪里来的?
            // Delete temporal MapPoints
for(list<MapPoint*>::iterator lit = mlpTemporalPoints.begin(), lend = mlpTemporalPoints.end(); lit!=lend; lit++)
{
MapPoint* pMP = *lit;
delete pMP;
}
mlpTemporalPoints.clear()

在TrackWithMotionModel里有一个UpdateLastFFrame函数,在纯定位模式下,会根据深度图新增一些临时地图点,为的是增加匹配点数,使位姿更准确。所以后面要把这些临时的地图点删去。

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

  1. 重读ORB_SLAM之LocalMapping线程难点

    1. 认清几个锁与布尔参数 线程的通信与相互影响在ORB比较复杂,需要好好缕清思路. 1.1 mbStopRequested,由RequestStop函数设定,主要是在回环线程里,在运行全局优化时,以 ...

  2. 重读ORB_SLAM之LoopClosing线程难点

    1. DetectLoop 这里有个ConsistenGroup概念,比较难懂.这里是最让人迷惑的地方.一旦vbConsistentGroup为真,其他帧的spCanditateGroup就进不来了. ...

  3. ORB-SLAM2 论文&代码学习 ——Tracking 线程

    本文要点: ORB-SLAM2 Tracking 线程 论文内容介绍 ORB-SLAM2 Tracking 线程 代码结构介绍 写在前面 上一篇文章中我们已经对 ORB-SLAM2 系统有了一个概览性 ...

  4. ORB-SLAM (四)tracking跟踪解析

    初始化完成后,对于相机获取当前图像mCurrentFrame,通过跟踪匹配上一帧mLastFrame特征点的方式,可以获取一个相机位姿的初始值:为了兼顾计算量和跟踪鲁棒性,处理了三种模型: 1. Tr ...

  5. ORB-SLAM 代码笔记(三)tracking原理

    ORB视觉里程计主体在tracking线程中

  6. 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势

    SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...

  7. ORB-SLAM2 论文&代码学习 —— LocalMapping 线程

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12360913.html 本文要点: ORB-SLAM2 Local ...

  8. ORB-SLAM2 论文&代码学习 —— LoopClosing 线程

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12369339.html 本文要点: ORB-SLAM2 LoopC ...

  9. ORB-SLAM2-tracking线程

    tracking线程 Tracking线程的主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧 ...

随机推荐

  1. nginx部署静态资源

    第一步.推荐使用EditPlus中ftp工具 安装,然后点击File->FTP->FTPUPLOAD->Settings->add.然后进行配置: 这样只是为了方便编辑Linu ...

  2. pwn的一些技巧与总结

    原文地址:https://github.com/Naetw/CTF-pwn-tips 目录 溢出 在gdb中寻找字符串 二进制服务 找到libc中特定函数的偏移地址 Find '/bin/sh' or ...

  3. svnkit 异常:Exception in thread "main" org.tmatesoft.svn.core.SVNException: svn: E200030: SQLite error

    https://stackoverflow.com/questions/16063105/org-tmatesoft-sqljet-core-sqljetexception-busy-error-co ...

  4. python的转义字符,以及字符串输出转义字符

    Python的转义字符及其含义     符    号     说     明       \'   单引号       \"   双引号       \a   发出系统响铃声       \ ...

  5. hdu 4619 Warm up 2 (二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4619 题意: 平面上有一些1×2的骨牌,每张骨牌要么水平放置,要么竖直放置,并且保证同方向放置的骨牌不 ...

  6. SecureCRT 多窗口 批量操作Linux

    1.打开多个窗口 2.Window --> Tile Verically将窗口并列展开 3.右击空白部分选择弹出下方的命令窗口 4.右击命令行窗口,选择发送命令至所有窗口 5.完成

  7. python使用bs4爬取boss静态页面

    思路: 1.将需要查询城市列表,通过城市接口转换成相应的code码 2.遍历城市.职位生成url 3.通过url获取列表页面信息,遍历列表页面信息 4.再根据列表页面信息的job_link获取详情页面 ...

  8. python学习笔记(五)文件操作和集合

    文件基本操作: 现有文件file.txt f=open('file.txt','r')#以只读方式打开一个文件,获取文件的句柄,如果是读的话,r可以不写,默认就是只读:文件不存在时,会报错 first ...

  9. 分别在javascript和JSP中动态设置下拉列表默认值

    一.JavaScript中动态设置select标签中<option>选项的默认值: 比如,要完成下边这个下拉列表的动态显示,并且当进行前后翻页时,下拉列表中的值自动更新为当前页码: 图1 ...

  10. ueditor 图片粘贴上传,实现图文粘贴,图片自动上传

    如何做到 ueditor批量上传word图片? 1.前端引用代码 <!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN& ...