SLAM的主要分类及在实际中的应用
大小:0.3 MB 人气: 2017-10-10 需要积分:1
标签:SLAM(31452)
SLAM刚刚开始的未来2016-07-07 14:39作者:张哲,纽约州立大学机器人方向博士,清华大学自动化系本科。研发方向:地图重建、位置跟踪、机器人自主避障导航、设备端和云端的算法优化。2009-2014年在微软,2014-2016年初在Magic Leap工作。
责编:周建丁(zhoujd@csdn.net)
本文为《程序员》原创文章,未经允许不得转载,更多内容请订阅2016年《程序员》
SLAM技术随着最近几年机器人、VR、AR的火爆而为人所知,在传感器、算法、软件、硬件等方向都有不同的进展。本文简要解释了SLAM的定义和分类,具体分析了当前VR、AR、机器人等各种应用需要什么类别的SLAM,探讨了在实际应用中实现SLAM的一些工程细节,并展望了SLAM刚刚开始的未来。
什么是SLAM
SLAM是什么?根据Wikipedia的介绍:“Simultaneous Localization and Mapping (SLAM) is the computational problem of constructing or updating a map of an unknown environment while simultaneously keeping track of an agent’s location within it.”最简单而又直指本质的理解,SLAM指的是当某种设备(如机器人、VR设备等)来到一个完全陌生的环境时,它需要精准地建立时间和空间的对应关系,并能完美地回答以下一系列问题:我刚才在哪里,现在在哪里?我看到了什么,现在看到的和之前看到的有哪些异同?我过去的行走轨迹是什么?我现在看到的世界是什么样子,和过去相比有怎样的变化?我的轨迹抖吗,我的位置飘吗?我还能跟踪到自己的轨迹吗,如果我丢了应该怎么办?我过去建立的对世界的认识还有用吗?我能在已有世界的抽象里快速对我现在的位置进行定位吗?
SLAM的主要分类
robotic SLAM
从最早期军事用途的雏形到后来的机器人应用,业界对SLAM有了进一步的研究。robotic SLAM主要包括卡尔曼滤波和粒子滤波。卡尔曼滤波在很多工程领域中都有应用,最早期用于机器人的卡尔曼滤波,默认系统是线性的且带高斯分布的噪音,经典的卡尔曼滤波可以直接给出最优解,但现实比这复杂太多,所以有了卡尔曼滤波的很多变种。而如果不是线性系统或噪音不是高斯分布,那么粒子滤波算法生成很多粒子,并且每个粒子是模型状态的一种可能,再根据观察和更新得到粒子群的状态趋于一致的收敛结果。当然粒子滤波也有实际的问题,比如经典的粒子衰减问题(particle depletion),和工程上如何控制准确性和收敛速度很好平衡的问题。
PTAM
PTAM(Parallel Tracking and Mapping)架构更多的是系统上的设计,姿态跟踪(Tracking)和建立地图(Mapping)两个线程是并行的,这实质上是一种针对SLAM的多线程设计。PTAM在当前SLAM领域看来是小儿科,但在当时是一个创举,第一次让大家觉得对地图的优化可以整合到实时计算中,并且整个系统可以跑起来。具体而言,姿态跟踪线程不修改地图,只是利用已知地图来快速跟踪;而在建立地图线程专注于地图的建立、维护和更新。即使建立地图线程耗时稍长,姿态跟踪线程仍然有地图可以跟踪(如果设备还在已建成的地图范围内)。这是两个事情并行来做的一个好处,但很现实的问题是如果地图建立或优化过慢,跟踪线程很容易会因为没有最新的地图或者没有优化过的地图而跟丢。另外比较实际的工程问题是地图线程的最新地图数据应该lock还是copy data between threads以及threading的实现质量。
sparse SLAM
现在常说的sparse SLAM从架构上主要分为两大类:filter based和keyframe based。这里的滤波比早年的robotic SLAM的滤波已经复杂很多,比较有代表性的是EKF SLAM,核心的思想是对非线性系统进行线性近似。最简单的例子,如果是一个变量,那么就用当前模型值和导数来表达;如果多个变量,那么表达就是Jacobian Matrix。filter based的full scale SLAM需要注意filter state和计算时间的平衡,以及实际工程实现里面的矩阵分块更新(高维度的稀疏矩阵取逆直接就爆了)。keyframe based SLAM的核心思想是关键帧(keyframe)的概念——因为每一张图都用来建立或更新地图计算量太大,从image stream里面选择一些好的关键帧来建立并更新地图——PTAM里的地图建立就是从关键帧生成地图。这种思路已经被业内普遍接受。但关键帧的提取本身就是一门很大的学问,伴随而来的还有局部地图和全局地图的维护、更新和效率平衡。
dense SLAM
dense SLAM是另外一大类SLAM。这里说的sparse或dense指的是地图点的稀疏或稠密程度。举个简单的例子,sparse map都是通过三角测量法算出来的,在一个卧室里有一千个点足够了;但dense map一般是某种主动光源的深度传感器(depth sensor,如英特尔的RealSense里面是ASIC)产生的,假设depth sensor每一帧的分辨率是640x480,即使有2/3的invalid depth,仍然有十万个3D点,所以通常所说的sparse map和dense map相比至少差了两个数量级。因为dense SLAM有足够多的地图信息,所以很适合用来做精细的3D重建。而如果dense SLAM要实时地从0到1边建地图边跟踪,就要把每一帧的可用像素的深度数据全部用来贡献到建立地图和跟踪上。dense SLAM的代表是Kinect Fusion,到目前已经有很多变种和进化,如ElasticFusion和DynamicFusion等。
近年来的SLAM“变种人”
DTAM - Dense Tracking and Mapping
DTAM继承了关键帧的架构,但对关键帧的处理和传统的特征点提取有很大的不同。相比传统方法对每一帧进行很稀疏的特征点提取,DTAM的direct method在默认环境亮度不变(brightness consistancy assumption)的前提下,对每一个像素的深度数据进行inverse depth的提取和不断优化来建立稠密地图并实现稳定的位置跟踪。用比较直观的数字对比来说明DTAM和PTAM的区别:DTAM的一个关键帧有30万个像素的深度估计,而PTAM一般的做法是最多一千个。DTAM的优缺点很明显(具体对比见图1):准、稳,但速度是问题,每一个像素都计算,确实容易通过GPU并行计算,但功耗和产品化的难度也都随之升高。
图1 两种关键帧处理方式的比较
(图片来自Jakob Engel在ICCV 2015的PPT)
Semi-Dense LSD SLAM - Semi-Dense Large Scale Direct SLAM
这里要特别说明,LSD SLAM里semi的是像素数量,也就是说,只估计“有信息”的区域,而不是像DTAM那样每个像素都估计,更简单形象(但不是100%学术严谨)地说,只估计“有纹理”的地方,不估计令每一个做SLAM的人都害怕的终极大魔头——“大白墙”部分。参见图2,右上是semi-dense, 左下是sparse approach,右下是dense approach。估计深度的部分在原理上也是direct method,和DTAM类似,这里不做过多描述。速度上,semi-dense在一台只有酷睿i7处理器的电脑上是可以做到实时的。
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%