本文最初发布于Matt Miesnieks的博客,经原作者授权由 InfoQ 中文站翻译并分享。阅读英文原文:Why is ARKit better than the alternatives?
\\Apple今年WWDC上公布的ARKit在扩增现实(Augmented Reality)领域造成了巨大的影响。开发者们首次发现,自己的应用竟然获得了一个健壮、(在iOS 11配合下)广泛可用,并且“能用”的AR SDK。终于不再需要纠结识别标签(Marker)、初始化、深度摄像头(Depth camera),或者各种专有的创作工具等概念。毫无疑问,这项技术的横空出世催生了层出不穷的演示(可通过Twitter关注@madewitharkit了解最新演示),然而大部分开发者并不知道ARKit的工作原理,也不知道这项技术比其他SDK更出色的原因所在。了解ARKit的技术原理有助于理解ARKit目前存在的局限,未来的完善方向和原因,并帮助我们预测类似的能力何时会出现在Android和抬头显示器(VR或AR)上。
\\我在AR领域的相关工作已经持续九年了,过去曾开发过与ARKit一模一样的技术(可惜当时的硬件无法很好地支持这种技术)。我对这类系统的构建方式,以及使用这种方式进行构建的原因有着自己的理解。
\\(点击放大图像)
\\ \\本文试图向略懂技术的人解释这项技术,但并非面向计算机视觉工程师。文中为了简化而进行的阐述可能未必绝对完美,但希望这样的简化至少可以帮助大家获得更深入的理解。
\\ARKit是基于哪些技术构建的?
\\(点击放大图像)
\\ \\从技术角度说,ARKit是一种具备简单2D平面检测(Plane detection)能力的视觉惯性里程计(Visual Inertial Odometry,VIO)系统。VIO意味着可以通过软件实时追踪用户在空间中的位置(用户的6dof姿态),例如在屏幕每刷新一帧的过程中重新计算用户姿态,这种操作每秒钟大约进行30次或更高频率。这种计算工作会并行进行两次。用户姿态可通过视觉(摄像头)系统进行追踪,为此需要将现实世界中的点与相机传感器拍摄的每一帧画面上的一个像素进行匹配。此外还需要通过惯性系统(加速计和陀螺仪,统称为惯性测量装置[Inertial Measurement Unit],即IMU)追踪用户姿态。随后这些系统的输出结果会通过Kalman Filter合并,进而确定其中哪个系统能对用户的“实际”位置(也叫做地表实况[Ground Truth])提供最佳估测,并通过ARKit SDK发布位置更新。与汽车中统计行驶距离的里程表类似,VIO系统会追踪iPhone在6D空间中的移动距离,6D代表3D世界中的xyz移动(转换),外加俯仰(Pitch)/偏航(Yaw)/翻滚(Roll)的3D移动(旋转)。(译注:关于后者的形象说明与演示,可参阅:http://blog.csdn.net/yuzhongchun/article/details/22749521)
\\VIO最大的优势在于,IMU的读数每秒可更新大约1000次,其数值完全基于加速度(用户的移动)。以往主要使用航位推算(Dead Reckoning)技术测量设备在两个IMU读数之间的移动,但这种技术只能进行猜测(!),就比如我让你迈出一步,随后猜测你的一步有多长距离一样,此时只能用航位推算技术来估测距离。下文将介绍这种技术提高精确度的具体做法。惯性系统的误差会逐渐累积,因此两个IMU帧之间的时间间隔越长,或者惯性系统不通过视觉系统进行“重置”一直使用的时间越长,追踪结果与地表实况之间的误差就越大。
\\视觉/光学测量的频率可与摄像头的帧率保持一致,通常为30fps,并且完全基于距离(两个帧之间的场景变化)。光学系统的误差通常会随着距离而累积(时间的影响反而比较小),因此移动的距离越长,误差就会越大。
\\好在两种系统固有的优势结合在一起可以相互弥补劣势。
\\视觉和惯性追踪系统基于截然不同的测量系统,相互之间不存在依赖性。这意味着就算摄像头被遮挡或只能看到光学特征极为有限的场景(例如白色墙壁),惯性系统依然可以在少数几帧的范围内继续测量。或者设备可能处于静止状态,此时视觉系统可以提供比惯性系统更稳定的姿态检测。Kalman过滤器始终会选择最佳质量的姿态,进而实现最稳定的追踪。
\\看起来挺不错的,而有趣的地方在于,VIO系统已诞生多年,整个业界对此已经极为了解,市面上已经有不少具体的实现。因此Apple选择VIO也不足为奇,但我们更好奇的是为何他们的系统会更为健壮。
\\ARKit的第二个主要功能是平面检测。正是因为有了这个功能,我们才有了用于放置内容的“表面”,否则所有内容只能悬浮在空间里,挺可怕的。平面是由光学系统检测到的特征计算而来的(也就是演示里看到的那些小点),算法通过取平均值,即可用任意三个点定义一个平面,如果将这个操作执行多次,即可估算出现实中的平面到底在哪里。另外,这些点通常也被称之为“点云(Point cloud)”,这个概念也经常会被人混淆。所有这些点结合在一起可以形成一个稀疏点云,进而可用于光学追踪。通过稀疏点云进行追踪需要的内存和CPU运算量都比较少,同时辅以惯性系统的支持,光学系统即可在只需要很少量追踪点的情况下有效运作。这种点云与类似于照相写实主义(Photorealism)那样的密集点云是截然不同的类型(一些正在研究中的追踪系统可以使用密集点云进行追踪……更困惑了吧)。
\\一些误解
\\补充说明一下,我看到很多人将ARKit理解为SLAM(Simultaneous Localization and Mapping,即时定位与地图构建),或使用SLAM这个词来称呼追踪技术。需要澄清的是,SLAM是一个很宽泛的术语,类似我们说的“多媒体”。追踪这个词本身也是一个宽泛的称呼,如果使用“量距(Odometry)”就具体多了,但在AR方面这两个词实际上意思比较接近。这一点可能会让人混淆。SLAM的实现方法有很多,追踪仅仅是整个SLAM系统所包含的组件之一。我觉得ARKit可以看作一种轻量级的简单SLAM系统。Tango或Hololens的SLAM系统可提供量距之外的更多功能。
\\关于ARKit,最大的两个“误解”是:“如