版权声明:本文为博主原创文章,未经博主允许不得转载。

  本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构。

  PTAM[1]是视觉SLAM领域里程碑式的项目。在此之前,MonoSLAM[2]为代表的基于卡尔曼滤波的算法架构是主流,它用单个线程逐帧更新相机位置姿态和地图。地图更新的计算复杂度很高,为了做到实时处理(30Hz),MonoSLAM每帧图片只能用滤波的方法处理约10~12个最稳定的特征点。PTAM最大的贡献是提出了tracking、mapping双线程的架构,tracking线程只需要逐帧更新相机位置姿态,可以很容易实现实时计算;而mapping线程并不需要逐帧更新,有更长的处理时间,原来只能用在离线SfM(Structure from Motion)的BA(Bundle Adjustment)也可以用起来。这种基于优化的算法比滤波法在单位计算时间可以得到更高的精度[3]。这种多线程的处理方式也更顺应现代CPU的发展趋势。之后的视觉SLAM算法几乎全部沿用了这一思想。

  在tracking线程,地图(由地图点和关键帧组成)是已知且固定的。对图片构造金字塔的目的有两个:1)加快匹配;2)提高地图点相对于相机远近变化时的鲁棒性。FAST是常用的特征点,优点是快,缺点是不鲁棒。通常会先提取出大量的(成百上千个)FAST特征,然后用各种约束剔除误匹配。基于运动模型(PTAM选用减速模型,一般匀速模型更常见)假定当前帧的初始位置姿态,把地图点投影到当前帧,建立起当前帧和关键帧(每个地图点会关联第一次观察到它的关键帧)的联系。随后在匹配点附近找一块小区域(这就是所谓的patch),通过比较当前帧和关键帧的patch的相似度(计算SSD),可以剔除误匹配(值得注意的是,这里的patch匹配和直接法里的光流跟踪是不同的,这里只是单纯为了剔除误匹配,两帧的相对位置姿态是通过最小化重投影误差得到的)。为了去除观测位置姿态不同的影响,会在匹配前对patch做仿射变换,直观的解释是:正方形从另一个角度看是平行四边形。Patch匹配的另一个用处是提高匹配点的精度,可以用插值得到亚像素级别的坐标,这对于金字塔高层图片上的匹配点帮助很大。找到一系列匹配点之后,就可以优化求解当前帧的位置姿态,优化通常是在李群求解。PTAM为了加速计算,设计了从粗到细两轮求解过程,粗测阶段只考虑金字塔最高层图片上的少量匹配点(50个),优化出的位置姿态作为精测阶段的初值,精测阶段会纳入更多匹配点(1000个)和金字塔所有层。从粗到细两轮求解的缺点是会增加抖动(jitter),改进的办法是在接近静止的状态下跳过粗测直接进入精测阶段。PTAM用三个级别评判tracking质量:好、不好、丢失。只会在“好”的状态下插入新关键帧和地图点,如果“丢失”,会有简单的重定位功能(在所有关键帧中找相似的)。

  在mapping线程,优化对象是地图点位置和关键帧位置姿态,不再考虑当前帧的位置姿态。先利用两帧图片初始化,具体方法是先五点法加RANSAC求出初值,然后所有匹配点(约1000个)BA优化。由于是单目,所以尺度是未知的,当做常数固定下来。首先从以下几个角度判断当前帧是否是关键帧:1)tracking效果好;2)距离上一个关键帧至少20帧图片;3)距离最近的地图点大于一个阈值,这是为了保证baseline足够大。如果当前帧不是关键帧,则做BA优化。PTAM把BA优化分为局部和全局两部分,这和tracking线程从粗到细两轮求解是一个思路,都是为了降低计算复杂度,加速求解。在局部BA阶段,只考虑滑动窗内的关键帧(5帧),以及它们能观测到的所有地图点。额外的约束是能观测到这些地图点的其他关键帧,这些关键帧固定不动,并不是优化对象。全局BA阶段,优化对象纳入所有的关键帧和地图点。在闲暇时间mapping线程可以利用旧的关键帧改善地图,要么从旧的关键帧观察新添加的地图点,要么重新测量之前被剔除的外点,如果被成功观测并收敛,则作为新的地图点插入地图。如果当前帧是关键帧,则做两件事情:1)把所有地图点投影到这个新的关键帧(tracking线程处于计算量的考虑只投影了一部分地图点),为之后的BA做准备;2)生成新的地图点,会对新关键帧的特征点做非极大值抑制,并筛选出最显著(Shi-Tomasi分数)的一批特征点,然后在最近的关键帧上沿极线搜索匹配点,只要能找到匹配点,就三角化出地图点。

参考文献:

[1] Klein G, Murray D. Parallel tracking and mapping for small AR workspaces[C]//Mixed and Augmented Reality, 2007. ISMAR 2007. 6th IEEE and ACM International Symposium on. IEEE, 2007: 225-234.

[2] Davison A J, Reid I D, Molton N D, et al. MonoSLAM: Real-time single camera SLAM[J]. IEEE transactions on pattern analysis and machine intelligence, 2007, 29(6): 1052-1067.

[3] Strasdat H, Montiel J M M, Davison A J. Real-time monocular SLAM: Why filter?[C]//Robotics and Automation (ICRA), 2010 IEEE International Conference on. IEEE, 2010: 2657-2664.

视觉SLAM算法框架解析(1) PTAM的更多相关文章

  1. 视觉SLAM算法框架解析(3) SVO

    版权声明:本文为博主原创文章,未经博主允许不得转载. SVO(Semi-direct Visual Odometry)[1]顾名思义是一套视觉里程计(VO)算法.相比于ORB-SLAM,它省去了回环检 ...

  2. 视觉SLAM算法框架解析(2) ORB-SLAM

    版权声明:本文为博主原创文章,未经博主允许不得转载. ORB-SLAM[1]完全继承了PTAM(http://www.cnblogs.com/zonghaochen/p/8442699.html)的衣 ...

  3. SLAM学习笔记(2)SLAM算法

    SLAM算法分为三类:Kalman滤波.概率滤波.图优化 Kalman滤波方法包括EKF.EIF:概率滤波包括RBPF,FastSLAM是RBPF滤波器最为成功的实例, 也是应用最为广泛的SLAM方法 ...

  4. 视觉SLAM的主要功能模块分析

    视觉SLAM的主要功能模块分析 一.基本概念 SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and L ...

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

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

  6. 经典视觉SLAM框架

    经典视觉SLAM框架 整个视觉SLAM流程包括以下步骤: 1. 传感器信息读取.在视觉SLAM中主要为相机图像信息的读取和预处理. 2. 视觉里程计(Visual Odometry,VO).视觉里程计 ...

  7. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析

    原文地址:http://www.cnblogs.com/zjiaxing/p/5548265.html 在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/d ...

  8. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(1)

    在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只 ...

  9. TLD视觉跟踪算法(转)

    源:TLD视觉跟踪算法 TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总 ...

随机推荐

  1. E - Third-Party Software - 2 Gym - 102215E (贪心)

    Pavel is developing another game. To do that, he again needs functions available in a third-party li ...

  2. 学习spring的第一天

    1.首先在maven repository中找到Spring Context依赖添加进模块 2.配置xml,resources右键new→xml configuration file→Spring C ...

  3. 使用Map,统计字符串中每个字符出现的次数

    package seday13; import java.util.HashMap; import java.util.Map; /** * @author xingsir * 统计字符串中每个字符出 ...

  4. 吴裕雄--天生自然MySQL学习笔记:MySQL 选择数据库

    连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库. 从命令提示窗口中选择MySQL数据库 在 mysql> 提示窗口中可以很简单的选择特定的数据库.可以使 ...

  5. python刷LeetCode:2.两数相加

    难度等级:中等 题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返 ...

  6. JavaScript学习总结(三)

    在学习完了基本的内容之后,我们来学习一下JavaScript中的对象部分以及如何自定义对象的问题. String对象 创建字符串的方式共有两种: 方式1:new String("内容&quo ...

  7. iOS 内购相关

    iOS 内购相关 下面总结一下过往订阅和内购的项目的代码方面的实现细节和注意事项,特别是掉单方面的处理. 后台的协议.商品ID.银行卡.内购类型.沙盒账号测试人员都由运营或者产品在苹果后台中申请处理. ...

  8. 【论文笔记系列】AutoML:A Survey of State-of-the-art (下)

    [论文笔记系列]AutoML:A Survey of State-of-the-art (上) 上一篇文章介绍了Data preparation,Feature Engineering,Model S ...

  9. 十二星座 英文名:Aries 金牛座 (4/21 - 5/20)的英文名: Taurus 双子座 (5/21 - 6/21)的英文名: Gemini 巨蟹座 (6/22 - 7/22)的英文名: Cancer 狮子座 (7/23 - 8/22)的英文名: Leo 处女座/室女座 (8/23 - 9/22)的英文名: Virgo 天秤座 (9/2

    十二星座的具体顺序是:白羊座(Aries).金牛座(Taurus).双子座(Gemini).巨蟹座(Cancer).狮子座(Leo).处女座(Virgo).天秤座(Libra).天蝎座(Scorpio ...

  10. 计蒜客 蒜头君回家(有条件的BFS)

    蒜头君要回家,但是他家的钥匙在他的朋友花椰妹手里,他要先从花椰妹手里取得钥匙才能回到家.花椰妹告诉他:“你家的钥匙被我复制了很多个,分别放在不同的地方.” 蒜头君希望能尽快回到家中,他需要首先取得任意 ...