iOS ARKit介绍以及实现原理

903 阅读7分钟

简介

  增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。

  ARKit是2017年6月6日苹果发布iOS11系统所新增框架,它能够帮助我们以最简单快捷的方式实现AR技术功能。ARKit框架提供了两种AR技术,一种是基于3D场景(SceneKit)实现的增强现实,一种是基于2D场景(SpriktKit)实现的增强现实。

核心功能

ARKit主要由三部分组成:追踪,场景理解和渲染。

追踪是ARKit的核心功能也就是可以实时追踪设备。

  世界追踪(world tracking)可以提供设备在物理环境中的相对位置。借助视觉惯性里程计Visual–Inertial Odometry(VIO),可以提供设备所在位置的精确视图以及设备朝向,视觉惯性里程计使用了相机图像和设备的运动数据。更重要的是不需要外设,不需要提前了解所处的环境,也不需要另外的传感器。

场景理解,即确定设备周围环境的属性或特征。

  它会提供诸如平面检测(plane detection)等功能。平面检测能够确定物理环境中的表面或平面。例如地板或桌子。为了放置虚拟物体,Apple 还提供了命中测试功能。此功能可获得与真实世界拓扑的相交点,以便在物理世界中放置虚拟物体。最后,场景理解可以进行光线估算。光线估算用于正确光照你的虚拟几何体,使其与物理世界相匹配。结合使用上述功能,可以将虚拟内容无缝整合进物理环境。

Apple 让我们可以轻易整合任意渲染程序。

  他们提供的持续相机图像流、追踪信息以及场景理解都可以被导入任意渲染程序中。对于使用SceneKit或 SpriteKit的人,Apple 提供了自定义AR view,替你完成了大部分的渲染。所以真的很容易上手。同时对于做自定义渲染的人,Apple通过Xcode提供了一个metal模板,可以把ARKit整合进你的自定义渲染器。

ARKit与SceneKit的关系

ARKit与SceneKit的关系如下图: image.png     ARKit框架中中显示3D虚拟增强现实的视图ARSCNView继承于SceneKit框架中的SCNView,而SCNView又继承于UIKit框架中的UIView。UIView的作用是将视图显示在iOS设备的window中,SCNView的作用是显示一个3D场景,ARScnView的作用也是显示一个3D场景,只不过这个3D场景是由摄像头捕捉到的现实世界图像构成的。

  ARSCNView只是一个视图容器,它的作用是管理一个ARSession。

  在一个完整的虚拟增强现实体验中,ARKit框架只负责将真实世界画面转变为一个3D场景,这一个转变的过程主要分为两个环节:由ARCamera负责捕捉摄像头画面,由ARSession负责搭建3D场景。

  在一个完整的虚拟增强现实体验中,将虚拟物体显示在3D场景中是由SceneKit框架来完成:每一个虚拟的物体都是一个节点SCNNode,每一个节点构成了一个场景SCNScene,无数个场景构成了3D世界。

  ARSCNView与ARCamera两者之间并没有直接的关系,它们之间是通过AR会话,也就是ARKit框架中非常重量级的一个类ARSession来搭建沟通桥梁的。要想运行一个ARSession会话,你必须要指定一个称之为会话追踪配置的对象:ARSessionConfiguration,ARSessionConfiguration的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大。

  ARSessionConfiguration是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类ARWorldTrackingSessionConfiguration。ARWorldTrackingConfiguration的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。它的内部实现了一系列非常庞大的算法计算以及调用了你的 iPhone 必要的传感器来检测手机的移动及旋转甚至是翻滚。 

  当 ARWorldTrackingConfiguration 计算出相机在 3D 世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给 ARSession 去管理,而相机的位置数据对应的类就是ARFrame。ARSession类有一个属性叫做 currentFrame ,维护的就是 ARFrame 这个对象。

  ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它决定了我们看物体的视野。他们三者之间的关系看起来如下图:

image.png

ARKit工作流程

  ARKit大概的工作流程是这样的:

  1. 打开应用,开启摄像头,通过ARSCNView来加载AR 3D场景SCNScene。
  2. SCNScene通过ARCamera捕捉场景。
  3. 捕捉场景后,ARCamera会将视频帧传到ARSession,然后再传到ARSCNView展示场景。
  4. ARSCNView将场景数据交给ARSession。
  5. ARSession通过管理ARConfiguration实现场景的追踪并返回一个ARFrame。
  6. 在ARSCNView的场景中添加3D模型(即ARSCNNode)。 image.png

设备追踪

  设备追踪确保了虚拟物体的位置不受设备移动的影响。在启动ARSession时需要传入一个ARSessionConfiguration的子类对象,以区别三种追踪模式:ARFaceTrackingConfiguration、ARWorldTrackingConfiguration和AROrientationTrackingConfiguration。

  ARSession的底层如何进行世界追踪的呢?首先,ARSession底层使用了 AVCaputreSession来获取摄像机拍摄的视频(一帧一帧的图像序列)。其次,ARSession 底层使用了CMMotionManager 来获取设备的运动信息(比如旋转角度、移动距离等)。最后,ARSession根据获取的图像序列以及设备的运动信息进行分析,最后输出ARFrame,ARFrame中就包含有渲染虚拟世界所需的所有信息。

  AR-World 的坐标系如下,当我们运行ARSession时设备所在的位置就是 AR-World的坐标系原点。

image.png

  在这个 AR-World 坐标系中,ARKit 会追踪以下几个信息:

  • 追踪设备的位置以及旋转,这里的两个信息均是相对于设备起始时的信息。
  • 追踪物理距离(以“米”为单位),例如 ARKit 检测到一个平面,我们希望知道这个平面有多大。
  • 追踪我们手动添加的希望追踪的点,例如我们手动添加的一个虚拟物体。

  ARWorldTrackingConfiguration 提供6DoF(Six Degree of Freedom)的设备追踪。包括三个姿态角 Yaw(偏航角)、Pitch(俯仰角)和 Roll(翻滚角),以及沿笛卡尔坐标系中 X、Y 和 Z 三轴的偏移量。   image.png

  不仅如此,ARKit还使用了视觉惯性里程计Visual–Inertial Odometry(VIO)来提高设备运动追踪的精度。在使用惯性测量单元(IMU)检测运动轨迹的同时,对运动过程中摄像头拍摄到的图片进行图像处理。将图像中的一些特征点的变化轨迹与传感器的结果进行比对后,输出最终的高精度结果。