详解iOS之ARkit为何碾压对手(一)

1,445 阅读8分钟

在这篇文章中,我们能学习到

1,ARKit简介与基本了解

2,ARKit的基本技术原理,平面检测

3,ARKit的两大神秘之处:单目摄像机3D成像、计量尺度获取

明天小编会更新第二篇,

1,ARKit、Tango、Hololens技术对比

2,开发人员如何使用ARKit

说到 AR,大家可能会想到 Pokemon Go 这款风靡一时的游戏,也可能会对 AR 在技术上如何实现做一些思考。今年,苹果公司在 WWDC 大会上发布的 ARKit 在整个 AR 生态中引起巨大轰动。开发者发现,这是他们第一次能将一款强大的 AR SDK 广泛使用于自己的应用,不再需要什么标记点、初始化、深度摄像头,甚至是专门的创作工具。毫不意外,ARKit 让开发者们集体开启各种 AR demo 秀。但是,很多开发者不清楚 ARKit 如何工作,也不了解为什么 ARKit 比于其他 SDK 更好。从底层技术看ARKit,可以帮助大家了解当前版本 ARKit 能做什么,了解 ARKit 需要改进的地方以及为什么需要改进,那么今天小编将会为你揭开ARkit的神秘面纱。
这是小编的一个iOS学习交流群659170228,欢迎大家的入驻,一起交流成长!

ARKit 简要介绍

WWDC 的一段视频对 ARKit 做了一个整体的概述,我看过后,最简单的概括总结起来就是这样 — ARKit 不仅是简单的在摄像头屏幕上显示一些增强内容,它还提供你了一整套追踪和定位能力,比如你在 AR 场景中放置一个虚拟桌子,它不仅能将这个桌子显示在你的屏幕上,还能够随着你手机的移动,显示桌子的各个角度,如下所示:


对 ARKit 进行了一些基本了解后,确实刷新了我对 AR 的观念。首先, ARKit 不是简单的摄像头贴片,把一些 2D 或者 3D 的模型贴到你的摄像头屏幕上。如果让我用一句话来描述,它更像是对两个空间的拟合。一个是你所处的真实空间,另一个是 AR 的虚拟空间。ARKit 通过对手机上各个传感器的追踪分析,让这两个空间从逻辑上高度整合,然后再通过手机屏幕展现到你面前。


ARKit 主要用到的类其实并不多,如下:

ARSession:这是 ARKit 核心组件,所有的 AR 过程都是基于一个 ARSession,包括虚拟空间的计算,利用手机传感器和现实空间进行拟合等操作,都在这里面进行。

ARSessionConfiguration:这个是咱们上面提到过的,用于配置 ARSession 的交互方式。

ARSCNView 和 ARSKView: 用于将 ARSession 渲染出来的内容展现出来,应该不难理解。

ARAnchor:用于标识现实空间的锚点,这些锚点在整个 ARSession 期间都有效。如果你开启了 Plane Detection(用于检测真实场景中的物理表面),则会自动填充这些锚点。

这样列出来 ARkit 类的介绍,第一时间不能完全理解清除很正常,这里只给大家做一个初步印象,在实践中遇到它们时再去深入了解。

ARKit 的使用需要一定的软硬件设施:

软件:

Xcode9

iOS11

MacOS 10.12.4 及以上版本(为了支持 Xcode9)

硬件:

处理器为 A9 及以上的 iPhone 或 iPad 设备(iPhone 6s 为 A9 处理器)

ARKit 基于什么样的技术?

技术上,ARKit 配备视觉惯性测量(VIO)系统,带有简单的 2D 平面检测。具体来说,VIO 系统会实时追踪你在空间中的位置,也就是 6 自由度(DoF)动作,比如说,屏幕每帧画面刷新之间,你的动作会被重新计算,画面的刷新率为每秒 30fps 或以上,而且这些计算会同时进行两次。

第一次是,通过将现实世界中的点与摄像头传感器每帧画面像素点相匹配,你的动作会被视觉系统追踪,进行一次计算。第二次是你的动作被惯性系统追踪,主要通过加速度计和陀螺仪两个惯性测量单元(IMU)实现。

然后,卡尔曼滤波器(Kalman Filter)将 VIO 系统和惯性系统的输出进行整合,从而预测出你的最佳“真实”位置(称为Ground Truth),并且由 ARKit SDK 发布你的最新定位。就像汽车的里程表显示车辆的驾驶距离一样,VIO 系统记录 iPhone 手机在 6 DoF 空间中经过的距离。6 DoF 表示沿着 xyz 三个方向的平动,加上绕三个轴的俯仰、偏转及滚动。

VIO 系统已经出现很多年了,在行业中的认可度很高,并且市场上不少设备也配备了 VIO 系统。所以苹果 ARKit 使用 VIO 系统并不意味着创新。那么到底是什么技术让 ARKit 变得如此强大呢?

ARKit 的第二个关键点是配备简单的平面检测。这个技术十分必要,你需要地面作为参照物来表示位置信息,否则物体会漂浮在空中。任何 3 个点可以定义一个平面,根据光学系统检测到的特征点(demos 中看到的点),通过算法将特征点平均化,便得到了参照平面。

ARKit 可以检测水平面(我猜测 ARKit 未来能够检测更复杂的 3D 几何体,但应该要等到深度感应摄像头的发布,也许就是 iPhone 8 吧…)。

至于平面检测,就是在获得一定数量的 3D 特征点后,尝试在这些点中安装一些平面,然后根据尺度、方向和位置找出最匹配的那个。ARKit 会不断分析 3D 特征点并在代码中报告找到的平面

所以一定要注意 ARKit 需要看向能检测出许多有用特征点的内容。可能检测不出特征点的情况如下:

1,光线差——没有足够的光或光线过强的镜面反光。尝试避免这些光线差的环境。

2,缺少纹理——如果摄像头指向一面白墙,那也没法获得特征,ARKit 也去无法找到并追踪用户。尝试避免看向纯色、反光表面等地方。

3,快速移动——通常情况下检测和估算 3D 姿态只会借助图片,如果摄像头移动太快图片就会糊,从而导致追踪失败。但 ARKit 会利用视觉惯性里程计,综合图片信息和设备运动传感器来估计用户转向的位置。因此 ARKit 在追踪方面非常强大。


ARKit的两大“神秘之处”

有人会把 ARKit 称为 SLAM ,或者使用术语 SLAM 来指位置跟踪。在此澄清一下,SLAM 是一个相当广泛的术语,就像“多媒体”这个术语一样。“追踪”本身就是一个通用的术语,使用“测距”更具体,但在 AR 领域,使用“追踪”来表达即可。有很多方法可以实现 SLAM,追踪踪只是 SLAM 系统的一个组成部分。 我认为 ARKit 是一个轻型或简单的 SLAM 系统。Tango 或 Hololens 的 SLAM 系统除了距离测量外,还有其他很多其他特征。

ARKit 存在两大“神秘之处”:一是,如何通过单目镜头获得 3D 效果;二是,如何获得计量尺度(像那个卷尺测量 demo 一样)。答案在于“非常好地”移除 IMU 产生的误差,即让航位推算法实现高精度地预测。当实现这点后,便会发生以下的效果:

为获得 3D 效果,需要从不同角度获得 2 个场景视图,进而通过立体计算得到你所在的空间位置。这就是双眼如何看到 3D 图像,以及为什么一些跟踪器要要依靠立体摄像机。如果有两台摄像机,可以容易计算摄像机之间的距离,同时捕获帧画面。ARKit 为什么仅仅使用了一个摄像头便获得了 3D 效果呢?是因为一个摄像头可以捕获一帧画面,而后摄像头移动捕获第二帧画面。

使用 IMU 航位推算法计算,便可计算出两帧画面之间的移动距离,然后正常计算出立体画面。实际上,你可能捕捉更多的帧画面进行计算,从而获得更高的精确度。如果 IMU 足够准确,两帧画面间产生的“移动”可以仅仅通过手握拳后手臂微小肌肉群的运动来检测,这看起来像魔术一样神奇。

系统需要依赖于 IMU 航位推算法来获得计量尺度。通过 IMU 给出的加速度和时间测量值,可以计算出速率并获得 IMU 每帧画面之间的距离。数学运算并不难,困难的是消除 IMU 误差,以获得近似完美的加速度测量值。一个微小的错误,在画面每秒刷新 1000 次的情况下,持续几秒钟后可能会导致 30% 甚至更大的计量尺度误差。令人惊讶的是,苹果 ARKit 已经把误差下降到 10% 以下。