原文:Why is ARKit better than the alternatives?
作者:Matt Miesnieks
翻译:陈冬
审校:苏宓
苹果在今年的 WWDC 上发布的 ARKit 对增强现实领域(Augmented Reality)产生了巨大的影响。开发者首次发现,一款强大并广泛可用的 AR SDK“恰好”适用于他们的 App。它不需要对标记、初始化、深度摄像机和专用的创建工具进行修改。不出所料,这引发了一阵 Demo 热潮。但是大部分开发者都不知道 ARKit 的工作原理,也不了解其优于其他 SDK 的具体原因。揭开 ARKit 背后的原理有助于发现如今 ARKit 的局限之处、完善内容、以及帮助我们预测 Android 和头显(VR 或 AR)等设备何时会有类似的功能出现。
本文笔者已经从事 AR 行业九年了,曾经也搭建过与 ARKit 完全一样的技术(但不幸的是当时并没有与之相对应的硬件支持)。关于 AR 系统是如何搭建的以及为何这样搭建,作为一名业内人士,我也有着自己的看法。
这篇博客是为那些掌握一些科学技术但不是计算机视觉工程师的人而写的。从科学的角度看,我知道我所做的一些简化不是百分百的准确,但也希望能够帮助人们在已有的基础上有更深一层地理解。
ARKit 是基于什么样的技术进行搭建的?
从技术角度来看,ARKit 是一种具有简单的 2D 平面检测功能的视觉惯性测距系统(Visual Inertial Odometry,简称 VIO)。VIO 意味着可以通过软件实时追踪用户的空间位置(用户在空间上的 6dof 姿势),即在每帧刷新之间重新计算用户的位置,速度为每秒 30 次及以上。这些计算是并行完成两次。通过视觉(摄像)系统将现实世界中的一个点与摄像机传感器上的一帧像素相匹配,从而追踪用户的姿势。惯性导航系统也可以追踪用户的姿势(用户的加速度计和陀螺仪跟踪统称为惯性测量单元,或者叫 IMU)。接下来,卡尔曼滤波器结合两个系统的输出结果,决定哪一个系统提供的估测更接近用户的“真实”位置(地面实况)并通过 ARKit SDK 更新位置。VIO 系统追踪用户的 iPhone 在六维空间里的移动,好比用户汽车里的里程表测量车的行驶距离一样。6 维是指 xyz 方向上的三维运动(移动)加上俯仰/偏转/滚动(旋转)。
VIO 带来的最大好处是 IMU 的读数大约为 1000 每秒并且基于加速度(用户的移动)。曾经使用的航位推算法用于测量 IMU 读数之间的设备运动,但这种方法推算是一种猜测,就像如果我让你向前走一步,然后猜测走了多远一样,此时会用航位推算法来估计距离。稍后我会介绍如何准确地进行猜测。惯导系统中的误差会随时间累积,所以 IMU 帧率越长,惯导系统从视觉系统中复位后的时间越长,追踪位置距离真实位置偏差就越多。
视觉/光学测量使用摄像机的帧率,通常为 30fps 并且依赖距离(不同的场景帧率也有所不同)。光学系统通常随着距离的增大误差也不断的增大(时间也会有轻度影响),所以用户运动得越远,误差就越大。
好消息是每个系统的优点都抵消了另一个系统的缺点。
所以视觉和惯性跟踪系统是基于完全不同的测量系统,,没有相互依赖。这意味着可以盖住摄像机或者只看到一个具有很少光学特征的场景(比如白墙),而惯性系统可以为一些帧中“携带载荷”。或者设备在完全静止的条件下,视觉系统可以呈现出一个比惯性系统更加稳定的姿态。Kalman 波器不断地选择最佳姿态,从而实现稳定跟踪。
到目前为止一切顺利,但有趣的是 VIO 系统已经存在很多年并在业界广泛认可,并且在应用市场已经有相当一部分应用。所以苹果使用 VIO 并不代表 VIO 本身怎样。我们要关注的是苹果系统为何如此健壮。
ARKit 的第二个关键点是简单的平面检测。有了“地面”你才能在上面建立内容,否则就会像在太空中一样乱浮动。“地面”是从光学系统检测到的特征(就是你在演示中看到的小点),而任意三点构成一个平面,通过算法将这些平面平均化,通过足够多的平面就可以估计出真实的平面位置。另外,这些点通常被称为“点云”,这是一个很容易混淆的术语。这些点都是用于光学跟踪的稀疏点云。稀疏的点云花费更少的内存和 CPU 时间来追踪,并且在惯导系统的支持下,光学系统追踪所需的点数量很少。这是一种不同于密集点云的点云,它看起来也接近真实。(注意一些追踪器使用密集点云来进行追踪, 所以这就更加混乱)
关于一些误解的说明
顺便说一下,我见过有人将 ARKit 比做 SLAM,或用 SLAM 来指代追踪。需要澄清的是,SLAM 是一个像“多媒体”一样非常宽泛的术语。追踪本身则是一个更加通用的术语而里程计则是更加具体的。但在 AR 相关的实际使用过程中可以通用,这很