这篇文章来自"Why is ARKit better than the alternatives",作者是Matt Miesnieks。
通过这篇文章,我们能了解到:
* ARKit的基本技术原理:视觉惯性测量(VIO)系统、平面检测
* ARKit的两大神秘之处:单目摄像机3D成像、计量尺度获取
* ARKit、Tango、Hololens技术对比
* 开发人员如何使用ARKit
ARKit 基于什么样的技术?
技术上,ARKit 配备视觉惯性测量(Visual Inertial Odometry)系统,带有简单的 2D 平面检测。具体来说,VIO 系统会实时追踪你在空间中的位置,也就是6自由度(degree of freedom)动作,比如说,屏幕每帧画面刷新之间,你的动作会被重新计算,画面的刷新率为每秒 30fps 或以上,而且这些计算会同时进行两次。
第一次是,通过将现实世界中的点与摄像头传感器每帧画面像素点相匹配,你的动作会被视觉系统追踪,进行一次计算。
第二次是你的动作被惯性系统追踪,主要通过加速度计和陀螺仪两个惯性测量单元(IMU)实现。
然后,卡尔曼滤波器(Kalman Filter)将VIO系统和惯性系统的输出进行整合,从而预测出你的最佳”真实位置“(称为Ground Truth),并且由ARKit SDK 发布你的最新定位。就像汽车的里程表显示车辆的驾驶距离一样,VIO系统记录iPhone手机在6自由度空间中经过的距离。6自由度表示沿着 xyz 三个方向的平动,加上绕三个轴的俯仰、偏转及滚动。
VIO系统最大的优势就是,即使用户动作加速的情况下,IMU 依旧可以每秒读数 1000 次。IMU每次读数之间,航位推算法被用来计算设备的运动。航位推算法是在知道当前时刻位置的条件下,通过测量移动的距离和方位,推算下一时刻位置的方法。
这时,航位推算法更像是一种猜测,就像是,我让你往前买一步,然后猜猜这个步子有多大,你便会用航位推算法来预测步子的距离。惯性系统产生的误差会随时间累积,所以,IMU每帧画面所间隔的时间越长或者惯性系统使用时间越长,而且还没有VIO系统配合的时候,动作的追踪也将越来越偏离实际的动作情况。
视觉/光学测量以相机画面帧速率进行,通常为 30fps,并且基于每帧场景变化的距离。光学系统通常会随着距离的增加,而不断积累误差,时间也会一定程度上影响光学系统的准确性。所以你行动的距离越远,时间越久,误差越大。好在两种系统固有的优势结合在一起可以相互弥补劣势。
视觉和惯性追踪系统基于截然不同的测量系统,相互之间不存在依赖性。这意味着就算摄像头被遮挡或只能看到光学特征极为有限的场景(例如白色墙壁),惯性系统依然可以在少数几帧的范围内继续测量。或者设备可能处于静止状态,此时视觉系统可以提供比惯性系统更稳定的姿态检测。Kalman过滤器始终会选择最佳质量的姿态,进而实现最稳定的追踪。
ARKit的第二个关键点是配备简单的平面检测。这个技术十分必要,你需要地面作为参照物来表示位置信息,否则物体会漂浮在空中。任何 3 个点可以定义一个平面,根据光学系统检测到的特征点(demos中看到的点),通过算法将特征点平均化,便得到了参照平面。
如果光学系统选取的特征点足够多的话,你便能预测到真实的平面。这些特征点通常被称为“点云”,所有的特征点形成稀疏的点云,用于光学跟踪。稀疏点云仅仅需要少量的存储内存、短暂地使用 CPU。在惯性系统的支持下,光学系统即使检测少量的特征点,也可以正常工作。这类点云和密集点云是不同的,密集点云看起来更加接近真实感(目前有人正在研究的使用密集点云进行跟踪,这更复杂)。
ARKit 的两大“神秘之处”
有人会把 ARKit 称为 SLAM ,或者使用术语 SLAM 来指位置跟踪。在此澄清一下,SLAM 是一个相当广泛的术语,就像“多媒体”这个术语一样。
SLAM: Simultaneous Localization and Mapping
“追踪”本身就是一个通用的术语,使用“测距”(Odometry)更具体,在 AR 领域,这两个词实际上意思比较接近。这一点可能会让人混淆。有很多方法可以实现 SLAM,追踪踪只是 SLAM 系统的一个组成部分。 我认为 ARKit 是一个轻型或简单的 SLAM 系统。Tango 或 Hololens 的 SLAM 系统除了距离测量外,还有其他很多其他特征。
ARKit 存在两大“神秘之处”:
一是,如何通过单目镜头获得 3D 效果。
二是,如何获得计量尺度(像那个卷尺测量一样)。
答案在于“非常好地”移除 IMU 产生的误差,即让航位推算法实现高精度地预测。
当实现这点后,便会发生以下的效果:
为获得3D效果,需要从不同角度获得2个场景视图,进而通过立体计算得到你所在的空间位置。这就是双眼如何看到3D图像,以及为什么一些跟踪器要要依靠立体摄像机。如果有两台摄像机,可以容易计算摄像机之间的距离,同时捕获帧画面。
ARKit 为什么仅仅使用了一个摄像头便获得了3D效果呢?是因为一个摄像头可以捕获一帧画面,而后摄像头移动捕获第二帧画面。使用 IMU航位推算法计算,便可计算出两帧画面之间的移动距离,然后正常计算出立体画面。实际上,你可能捕捉更多的帧画面进行计算,从而获得更高的精确度。如果 IMU 足够准确,两帧画面间产生的“移动”可以仅仅通过手握拳后手臂微小肌肉群的运动来检测,这看起来像魔术一样神奇。
系统需要依赖于 IMU 航位推算法来获得计量尺度。通过 IMU 给出的加速度和时间测量值,可以计算出速率并获得 IMU 每帧画面之间的距离。数学运算并不难,困难的是消除IMU误差,以获得近似完美的加速度测量值。一个微小的错误,在画面每秒刷新1000次的情况下,持续几秒钟后可能会导致 30% 甚至更大的计量尺度误差。令人惊讶的是,苹果ARKit已经把误差下降到 10% 以下。
Tango,HoloLens,Vuforia的SDK比较
Tango 只是一个品牌名,而不是真正的产品。Tango 包括硬件参考设计(RGB,鱼眼镜头,深度相机和CPU / GPU规格),还包括 VIO(运动跟踪),稀疏映射(区域学习)和密集 3D 重建(深度感知)等软件模块。
HoloLens 具有完全相同的软件栈,另外包括一些 ASIC(微软称之为全息处理单元)优化 CPU / GPU 任务处理并减小电能消耗。
Vuforia 与 ARKit 几乎是一样的,只是 Vuforia 的硬件是独立的。
上述 SDK 均使用相同的VIO系统,而且,Tango 和 ARKit 使用的均为 FlyBy 最初发布的代码库。HoloLens 和 Tango 都不使用深度相机进行追踪。
那么到底是什么技术设备让ARKit大放异彩呢?
答案是 ARKit 并不比HoloLens好,我甚至认为HoloLens的跟踪系统是市场上最好的,但HoLolens的硬件普及并不广。
而Google公司不想为每家 OEM 都进行特定的传感器校准过程,而且每家 OEM 厂商生产的Tango版本都不一样,Google也不想在一些较大的 OEM 厂商(三星、华为等)中选择。所以,Google为OEM厂商提供了硬件的参考设计,OEM厂商可以自行选择“使用,或者不使用”。
随着Android智能手机硬件商品化,相机和传感器堆栈是Android手机最后实现差异化的地方,所以OEM厂商无法满足Google的要求。Google 认为,深度相机是手机的一部分,但是深度相机增加了手机成本,这也是OEM厂商拒绝Google的另一个原因。
自从 ARKit 发布以来,市场已经发生了变化。OEM 厂商要么寻找 Tango的替代系统,要么接受 Google 的硬件参考设计,然后实现平台控制。这也是有意思的变化。
总的来说,ARKit更好的原因在于:
苹果公司可以负担得起将 VIO 算法紧密耦合到传感器上,
并花费很多时间来校准VIO系统,以减少计算空间位置时产生的误差。
值得注意的是,大型OEM厂商有一些替代方案。可以选择其他的追踪方案,像 ORB Slam、OpenCV 等,但几乎都是光学追踪器,都配有单个RGB、立体声、深度相机,有些使用稀疏点云,有些使用密集点云。有许多创业公司正在研发追踪系统,研究增强像素也是一个很好的方向,但任何VIO系统最终的竞争都会集中到硬件模型和校准上。
VIO的发展历史
在二十世纪中期,VIO 系统最初由波士顿军事/工业供应商 Intersense使用。Leonid Naimark 是该技术的创始人之一,2011年时加入我创建的Dekko公司并担任首席科学家。由于传感器限制,Dekko证实了VIO无法在IPad 2上运行,Leonid重回军工行业,但Dekko公司的CTO Pierre Georgel 如今已成为Google Daydream团队的高级工程师。
我 在 Super Ventures 的合作伙伴 Ori Inbar 创立了 Ogmento。Ogmento 公司后改名为 FlyBy,FlyBy 团队成功地构建了基于 iOS 的VIO 系统,还增加了鱼眼相机。该代码库已经授权给 Google,成为 Tango 的 VIO 系统。苹果公司收购 FlyBy 之后,FlyBy 的 VIO 系统代码库成为 ARKit VIO 的核心。
FlyBy 公司的CTO Chris Broaddus 继续为 Daqri 公司研究追踪系统,现在他已经加入硅谷的神秘无人车初创公司 Zoox。2007 年,第一个移动 SLAM 系统由 Georg Klein 在 Oxford Active Computing lab(PTAM)开发,Georg Klein 和 David Nister 一同为 HoloLens 建立 VIO 系统,David 离开后还为特斯拉创建了自动驾驶系统。
Georg 带的博士生 Gerhard Reitmayr 主导了 Vuforia 的 VIO 系统的研发。 此前担任 Vuforia 公司副总裁的 Eitan Pilipski,现在是 Snap 公司的 AR 软件工程师。
牛津大学、剑桥大学和伦敦帝国学院研发团队的核心成员研发了 Kinect 追踪系统,现在也成为 Oculus 和 Magic Leap 追踪系统开发的负责人。
硬件与软件的集成
其实开发 VIO 系统并不难,而且 VIO 系统的算法已经公开了,还有不少的应用案例。但是,很难把 VIO 系统良好地运作起来。我指的是,惯性和光学系统完全融合创建立体地图,在低精确度时确定度量标度。
系统需要准确知道IMU读取的数据哪个对应开始画面,哪个对应结束画面。这对于两个系统的关联至关重要,这一点最近才得以实现,因为硬件OEM厂商认为没有必要投资于此方面。这就是Dekko公司花费了很长时间,才把基于iPad 2系统的硬软件融合的原因。第一个Tango手机是第一台实现精准时间同步的设备,并且是第一款具备良好追踪系统的消费级手机。
目前,追踪系统采用的来自Qualcom等公司的芯片都有一个同步的传感器集线器,适用于所有组件,这意味着VIO系统在大多数当前设备上可行,并配有相应的传感器校准。
由于密切依赖硬件和软件,在没有OEM厂商的深度支持下,软件开发人员几乎不可能构建一个优良的系统。Google投入了大量资金,让一些OEM厂商支持Tango的硬件规范, 微软、Magic Leap 等公司也正在努力创建自己的硬件。苹果之所以如此成功地发布ARKit,正是因为ARKit能够很好地集合硬软件。
光学校准
为了使软件精确地把摄像机的像素点与现实世界中的点相匹配,摄像机系统需要精确校准。存在有两种类型的光学校准:
第一种为几何校准:使用相机的针孔模型来校正镜头的视场和镜头效果。由于镜头透镜的影响,基本所有图像都会变形。大多数软件开发人员可以在没有OEM厂商的帮助下,通过使用基于标准棋盘格和基本公开摄像头参数校准。
第二种为光度校准:这种校准方式使用更多,通常需要 OEM 厂商参与图像传感器本身的细节优化及内部镜头涂层的使用。此校准用于处理颜色和强度映射。例如,拍摄星空的望远镜所连接的摄像机,需要知道传感器上光强度的轻微变化是否确定是星星,或者仅仅是传感器或透镜产生的误差。校准使得 AR 追踪器具有更高的确定性,因为传感器上的每个像素点都对应于真实世界的点,所以光学追踪更加精准,产生的误差更小。
惯性校准
对于 IMU 来说,测量加速度比测量距离或速率更加重要。IMU 的读取错误随着时间的推移不断累积,产生误差的速度非常快.校准和建模的目标是确保距离的测量在每秒钟X等分时间下的精度足够高。理想情况下,这个时间段要足够长,以减少当镜头被遮盖或场景中发生其他情况时,导致摄像机丢失对几帧画面的追踪。
使用IMU测量距离称为航位推算。这基本算是一个猜测,对IMU收集的数据进行建模,确定积累错误的方式,然后编写过滤器来减小误差。想象一下,如果你被要求迈出一步,然后猜测迈出的步子有多大。只猜测迈出一步的距离会产生很高的误差。但是,如果你反复迈出千步并猜测每一步的距离,所产生的误差便会非常小。因为你对于踏出哪只脚、地板的种类、鞋子的款式、移动速度的快慢、身体状态的好坏等等熟知,那么你最终的猜测便会非常准确。基本的 IMU 校准和建模便是这一原理。
数据有很多误差来源。厂商通常使用机器臂以完全相同的方式重复地移动设备,捕获 IMU 的输出并写入滤波器,直到来自IMU的输出与来自机器臂的移动精确匹配。为进一步减小额外的误差,Google、微软甚至在国际空间站(ISS)及“零重力飞机”在微型重力环境下进行校准。
AR技术的未来
VIO系统将一直是数百米范围内最好的追踪方法(对于更长距离的追踪,VIO 系统需要融合 GPS,重新定位地标识别)。优化VIO系统的原因是:即使其他光学系统像VIO一样准确,其他系统的 GPU 或摄像头仍然需要耗费电池,而这对头戴显示器影响很大。
所以,单目摄像头的VIO系统是精确度最高,能耗最低,成本最低的解决方案。
深度学习技术在追踪系统的研究者社区中产生了巨大影响力。目前,基于深度学习的系统误差约为10%左右,顶尖的VIO系统可实现个位数的误差率,但前者正在快速完善,进而改善室外的重新本地化过程。
深度摄像头能在各个方面优化VIO系统,其中对于特征点不明显的情况,精确测量地面实况和尺寸,以及边缘追踪都能得带很好的改善。但是耗电量大,需要以低帧率运行,并且每帧之间使用VIO。深度摄像头不适用于户外,因为摄像头工作时产生的红外线会被阳光生成的红外线所干扰。摄像头的工作范围也取决于功耗,这意味着手机的工作范围可能只有几米。深度摄像头的BOM成本很高,因此OEM厂商将避免在大批量生产的手机中安装深度摄像头。
双摄像头或鱼眼镜头有助于看到更大的场景,可以捕获更多的光学特征。例如:普通镜头可能只看到白色的墙壁,鱼眼镜头下可以看到天花板的图案和地毯,Tango 和 HoloLens 均采用了这种方案。而且,双摄像头或鱼眼镜头可获得深度信息,其运算成本要低于 VIO,但是 VIO 使用低成本的 Bom 和低功耗便能获得深度信息。
由于双摄像头手机的摄像头(即便是 HMD)所处位置很接近,所以摄像头的精确范围对于深度计算来说,非常有限。相隔几厘米的摄像头只能精确几米范围内的深度。
3D 重建系统,HoloLens称之为空间映射(Spatial Mapping),Tango称之为深度感知(Depth Perception)。3D 重建系统能够找出场景中真实物体的形状或结构。这个技术允许虚拟内容隐藏于现实世界后面。
AR其他技术的未来说起来太广泛,先谈谈要进一步发展的技术:
光学:视野范围、镜头尺寸、分辨率、亮度、焦深、聚光度等等都需要解决。
我们会看到一些“过渡性”的 HMD 设计,它们受制于一些关键参数,只试图解决一个问题,如社交性,或是追踪技术,或是企业用户案例,以及其他,之后我们才能看到最终的消费级产品方案。
渲染:使虚拟内容与现实世界融合。
确定真正的光源,将其与虚拟世界相匹配,使阴影和纹理看起来很合理。这个技术是好莱坞 SFX 多年来一直努力的方向。但是对于 AR 来说,需要在手机上实时完成,并且不会影响到真实世界的光或背景,即便是琐碎的事情也很重要。
输入:这方面还有很长的路要走。
研究表明,多模式输入系统效果最佳(有谣言说苹果正在做这方面的事情)。多模式意味着各种各样的输入“模式”,如手势、语音、计算机视觉、触感、眼睛跟踪等,为最好理解用户意图,AI 也应该一起考虑进去。