SLAM刚刚开始的未来
编者按:本文来源《程序员》杂志 http://programmer.com.cn,授权36氪发布。
作者:张哲,纽约州立大学机器人方向博士,清华大学自动化系本科。研发方向:地图重建、位置跟踪、机器人自主避障导航、设备端和云端的算法优化。2009-2014年在微软,2014-2016年初在Magic Leap工作。
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处理器的电脑上是可以做到实时的。
图2 semi-dense的不同,图片来自Semi-Dense Visual Odometry for a Monocular Camera,Jakob Engel、Ju rgen Sturm和Daniel Cremers的ICCV 2013论文
VIO - Visual Inertial Odometry
VIO和之前的几种SLAM最大的不同在于两点:
首先,VIO在硬件上需要传感器的融合,包括相机和六轴陀螺仪,相机产生图片,六轴陀螺仪产生加速度和角速度。相机相对准但相对慢,六轴陀螺仪的原始加速度如果拿来直接积分会在很短的时间飘走(zero-drift),但六轴陀螺仪的频率很高,在手机上都有200Hz。
其次,VIO实现的是一种比较复杂而有效的卡尔曼滤波,比如MSCKF(Multi-State-Constraint-Kalman-Filter),侧重的是快速的姿态跟踪,而不花精力来维护全局地图,也不做keyframe based SLAM里面的针对地图的全局优化(bundle adjustment)。最著名的商业化实现就是Google的Project Tango和已经被苹果收购的Flyby Media,其中第二代Project Tango搭载了Nividia TK1并有主动光源的深度摄像头的平板电脑,这款硬件可谓每个做算法的小伙伴的梦幻搭档,具体在这里不多阐述。
在不同应用中用哪种SLAM
笔者一直以来的一个观点是SLAM技术和别的技术一样:一方面,从研究和开发的角度,技术需要达到一个较高的学术或工业标准;另一方面,技术本身必须落地到真正的产品中去,单纯的技术上要达到100分当然也有它的意义,但一味追求技术或数学上的“美”而完全无视工程实现和产品化要求就很可能误入歧途。在今天SLAM种类如此繁多细微细节如此复杂的情况下,微软、苹果、Google、Facebook等大公司凭借多年各方面积累和各种资源能够负担得起核心算法、软件的研发,但广大中小型公司或是之前没在这方面布局的大公司,在急需这项技术时,需要想好自己的产品规划和具体需求再做决策。以下为SLAM在几个不同方向或行业的应用:
VR产品:
VR的本质是让用户通过沉浸式的体验来感受一个完全不同的虚拟世界,而SLAM是对真实世界的感知和理解,如果VR产品需要SLAM,那一定是虚拟世界和真实世界的结合。目前市场上除了三大厂(Oculws、索尼和HTC)有自己的“outside-in tracking”,大部分没有“outside-in tracking”解决方案的VR产品只能通过六轴陀螺仪来跟踪用户的头部转动而不能跟踪用户的位移,但SLAM能解决六个自由度的跟踪问题。另外,对于VR产品是否需要SLAM中的地图(mapping)、什么形式什么场景有需要,也有待各方面进一步的思考。
AR产品:
AR的本质是虚拟元素在现实中的完美融合,相比于VR,AR产品无论算法、软件的复杂度还是硬件的复杂度或者量产难度都增大了很多很多。对于AR来说,SLAM不是“最好能拥有”而是“必须拥有”。更进一步地说,SLAM作为感知世界的技术仅仅是AR产品“必须拥有”的技术中的一项,对世界的学习和解读、显示的内容、光学显示的质量、硬件的舒适度以及硬件的量产能力等,也都是需要解决的,需要大量的人力物力财力能力和加班。
机器人产品:
比尔盖茨曾在2007年新年展望了“A Robot in Every Home”的愿景,如今已过去了将近十年,机器人已有太多种类,包括工业类、服务类、家庭类等等。但如果一款机器人需要自主性的探索,如定位、制作地图、跟随、监控、路径规划、识别和应对等,那么SLAM也是“必须拥有”的。具体的SLAM种类也随着机器人种类和应用的不同而千差万别。
行业应用:
不同行业有不同行业的具体需求,比如儿童玩具类,如果只是跟踪玩具卡片,那么marker-based tracking就应该能够满足基本的AR效果;比如一家房地产公司想实现VR看房,那么需要考虑给用户带来什么样的体验:360度高清全景图还是3D mesh?如果是一个房子里面几个位置的360度全景图,那么并不需要SLAM,但如果是真正3D重建(dense reconstruction)模型,那么必须要稠密的地图,而这种情况下需要考虑的是想让用户看的最低地图分辨率要求是多少,因为现有的放在手机或平板上的3D摄像头的分辨率一般也就是VGA(640x480),这种情况下重建出来的3D模型是没有photorealistic那种效果。而如果不考虑计算时间和成本,那么高精度高准确性校准好的高端LiDAR+高清相机系统应该可以满足非常好的体验。再比如一家游戏公司要做一款VR或AR游戏,需要对用户进行六个自由度的姿态跟踪,那他需要很精准的位置信息和地图信息,但这个地图只是为了定位,所以准确快速更新的稀疏地图就可以了。
SLAM在实际应用中的“爱恨情仇”
首先,SLAM对数学专业知识有一定的基本要求,包括矩阵、微积分、数值计算和空间几何等,同时对计算机视觉的基础知识也有一定的要求,包括特征点、地图、multi-view geometry、bundle adjustment、filter和camera model等。这些知识都需要一定的基础和积累,不过也不需要纯数学专业背景。SLAM编程一般使用C++,如果针对某个特殊指令集或平台进行优化,可能需要知道SSE、NEON、GPU的一些知识和经验,需要对系统设计有一定的经验和感觉,需要比较靠谱的动手能力及写代码的能力和意愿。总体而言,门槛就是一定的数学和工科背景、一定的计算机视觉的基础知识、一定的编程基础和经验以及最关键的踏踏实实写代码的意愿。
其次,SLAM强调实时和准确性。SLAM是一整套的大型系统,实时系统一般是多线程并发执行,资源的分配、读写的协调、地图数据的管理、优化和准确性、一些关键参数和变量的不确定性和高速度高精度的姿态跟踪(比如VR/AR应用必须要至少90fps才有可能解决眩晕和渲染效果)等,都是需要解决的挑战。
再次,SLAM难在适应硬件,更难在系统整合。SLAM的数据来源于传感器,而且越来越多的SLAM种类来源于多个传感器融合,那么传感器的质量对SLAM的效果影响很大。举个例子,如果一套SLAM系统用了某款相机,该相机在一动不动而且光照环境完全不变时图像噪点非常多,那么系统对稳定的姿态跟踪影响就非常不好,因为特征点提取会很不一致。另一个很实际的例子,如果用多个传感器(相机或六轴陀螺仪),如果时间戳不一致(至少毫秒级),也会很影响算法。多个传感器的分别校准和互相校准,乃至整个系统几十个上百个参数的调整,都是很实际很花时间的东西。
此外,在对数学有一定要求的同时,SLAM目前还有很多工程方面的问题,需要静下心来一块一块地至少走两遍踩各种坑并一一解决。如果只看已有代码就觉得数学和算法尽在掌握,而动手时要么眼高手低要么根本不去写代码,这对真正要做产品研发的团队而言是非常可怕的。当前多个领域因为硬件系统和产品应用之间差异很大,所以距离所有领域的SLAM都实现产品化还有很多的工作,但相信在不久的未来会有较大的突破。而由于SLAM的复杂特性和众多的算法及其产品化仍然需要在SLAM的基础上实现,可以预见和SLAM相关的产品研发在未来相当长一段时间内仍然需要大量人力和资源。
图3 SLAM的未来才刚刚开始
SLAM刚刚开始的未来
在过去的两年里,随着VR、AR、机器人资本市场和消费者市场热度的不断升级,在SLAM相关的传感器、算法、软件、硬件等方向,小公司在关键细分领域快速创新、大公司在各个关键方向布局并且频繁收购的趋势越来越明显。目前,软件公司往硬件做,硬件公司往算法做,大公司渴望拥有自己的技术和硬件,小公司希望反应快执行力强地快速推进,SLAM相关各个领域的产品化的努力日新月异,所以有志布局在SLAM的大中型公司需要尽快行动,而对于初创公司,专注SLAM研发、产品化、深耕某个应用或行业都是可行的思路。
由于产品和硬件高度差异化,而SLAM相关技术的整合和优化又很复杂,导致算法和软件高度碎片化,所以市场上目前还没有一套通用普适的解决方案,在短时间内也不会有。正如前文所述,SLAM技术是对世界的感知和理解,是撑起VR、AR、机器人的骨骼,但骨骼搭起后离最终完美的用户体验仍有大量工作来做,SLAM的未来才刚刚开始。另一方面,移动端硬件的计算能力还远远不够,所以SLAM相关技术可以而且正在从软件和算法层面向硬件推动,笔者相信在这个过程中一定会成就一批新的公司。
从个人职业发展来说,笔者非常鼓励志同道合的小伙伴们投入到VR、AR、机器人相关的计算机视觉和传感器等领域中,在做非常有意思又有挑战的事情的同时个人发展也随着整个大潮流一起向上走,是非常好的选择