ARKit原理

前言

 之前一直做AR总是一知半解,只会用却不知道AR的实现原理。

今天看了许多大大的文章后将其做了一番整理。附加上一些原文的链接地址:

AR的基本原理科普

ARKit何以从同类技术中胜出?

什么是AR?

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

 

AR的基本原理

典型的AR系统结构

ARKit原理_第1张图片

 

上图是一个典型的AR系统结构,由虚拟场景生成单元以及显示器和头盔等交互设备构成。其中虚拟场景生成单元负责虚拟场景的建模、管理、绘制和其它外设的管理;显示器负责显示虚拟和现实融合后的信号;头部跟踪设备跟踪用户视线变化;交互设备用于实现感官信号及环境控制操作信号的输入输出。
首先摄像头和传感器采集真实场景的视频或者图像,传入后台的处理单元对其进行分析和重构,并结合头部跟踪设备的数据来分析虚拟场景和真实场景的相对位置,实现坐标系的对齐并进行虚拟场景的融合计算;交互设备采集外部控制信号,实现对虚实结合场景的交互操作。系统融合后的信息会实时地显示在显示器中,展现在人的视野中。

为了保持现实和虚拟的对准,跟踪和识别的技术就显得尤为重要。

跟踪定位技术则分为基于硬件的定位技术和基于视觉的定位技术2点。其中基于视觉的跟踪定位技术最核心的技术,也是主流技术。基于视觉的三维配准包含了这3个发展阶段。

ARKit原理_第2张图片

二维图片定位
二维图片定位是指基于平面物体的识别和定位,比如现在市场上很常见的一些AR技术图书,又或则是APP应用。这种技术是将现实世界的一张图片作为定位的锚点,计算机生成的虚拟物体会围绕这个定位点,融入现实环境中。目前基于图片定位的AR是最为成熟的技术,广泛运用在各个地方。目前用在儿童教育图书方面,会比较多。

 

三维物体定位
一些简单的规则三维物体,比如圆柱状可乐罐,同样可以作为虚实结合的载体。对于一些特定的非规则物体,比如人脸,由于有多年的研究积累和海量的数据支持,已经有很多算法可以进行实时精准对齐。

基于SLAM的三维环境定位
对于三维环境的动态的实时的理解是当前AR在技术研究方面最活跃的问题。其核心就是最近火热的“即时定位与地图构建”(SLAM,SimultaneouslyLocalization And Mapping),在无人车,无人机和机器人等领域也起着核心作用。AR中的SLAM比其他领域中一般难度要大很多,主要是因为AR赖以依存的移动端的计算能力和资源比起其他领域来说要弱很多。目前在AR中还是以视觉SLAM为主,其他传感器为辅的局面,尽管这个情况正在改变。

标准的视觉SLAM问题可以这么描述为:把你空投到一个陌生的环境中,你要解决“我在哪”的问题。这里的“我”基本上等同于相机或者眼睛(因为单目,即单相机,请把自己想象成独眼龙),“在”就是要定位(就是localization),“哪”需要一张本来不存在的需要你来构建的地图(就是mapping)。你带着一只眼睛一边走,一边对周边环境进行理解(建图),一边确定在所建地图中的位置(定位),这就是SLAM了。换句话说,在走的过程中,一方面把所见到(相机拍到)的地方连起来成地图,另一方面把走的轨迹在地图上找到。 

ARKit的实现原理

ARKit原理_第3张图片

初始化ARKit时会生成一个三维的世界坐标系(AR坐标系),将ARKit摄像机初始位置定义为原点(0,0,0)。其他虚拟的物体空间坐标点都可以参考此为世界坐标原点进行规划。

为了在真实空间和虚拟空间之间建立对应关系,ARKit使用了一种叫做视觉惯性里程计的技术(VIO)。这个过程是将来自iOS设备的运动传感器的信息与设备摄像头对可见场景的视觉分析结合起来计算。ARKit能够识别场景图像中的显著特征,跟踪这些特征在视频帧之间的位置差异,并将这些信息与运动传感器数据进行比较。构建出一个拥有高精度位置信息和运动信息的模型。

ARKit默认打开设备的摄像头,可以在展示现实场景的同时渲染展示虚拟物体,展示的现实场景与虚拟场景结合效果。并且摄像头会把当前实时画面数据传输到ARKit SDK中进行处理,SDK处理功能包括识别返回较小特征点(feature points)数据、识别返回平面数据、识别返回环境光数据,并且这些数据是实时更新获取的,根据这些数据和功能我们就可以与unity游戏相结合,实现AR产品和创意。

 

ARKit的具体运作过程

从技术角度说,ARKit是一种具备简单2D平面检测能力的视觉惯性里程计(Visual Inertial Odometry,VIO)系统。VIO意味着可以通过软件实时追踪用户在空间中的位置(用户的6dof姿态),例如在屏幕每刷新一帧的过程中重新计算用户姿态,这种操作每秒钟大约进行30次或更高频率。用户姿态可通过视觉(摄像头)系统进行追踪,为此需要将现实世界中的点与相机传感器拍摄的每一帧画面上的一个像素进行匹配。此外还需要通过惯性系统(加速计和陀螺仪,统称为惯性测量装置[Inertial Measurement Unit],即IMU,其实就是传感器)追踪用户姿态。随后这些系统的输出结果会通过Kalman Filter合并,进而确定其中哪个系统能对用户的“实际”位置提供最佳估测,并通过ARKit SDK发布位置更新。与汽车中统计行驶距离的里程表类似,VIO系统会追踪iPhone在6D空间中的移动距离,6D代表3D世界中的xyz移动(转换),外加俯仰(Pitch)/偏航(Yaw)/翻滚(Roll)的3D移动(旋转)。

视觉和惯性追踪系统基于截然不同的测量系统,相互之间不存在依赖性。这意味着就算摄像头被遮挡或只能看到光学特征极为有限的场景(例如白色墙壁),惯性系统依然可以在少数几帧的范围内继续测量。或者设备可能处于静止状态,此时视觉系统可以提供比惯性系统更稳定的姿态检测。Kalman过滤器始终会选择最佳质量的姿态,进而实现最稳定的追踪。

ARKit的第二个主要功能是平面检测。正是因为有了这个功能,我们才有了用于放置内容的“表面”。平面是由光学系统检测到的特征计算而来的(也就是演示里看到的那些小黄点),算法通过取平均值,即可用任意三个点定义一个平面。另外,这些点通常也被称之为“点云(Point cloud)”。所有这些点结合在一起可以形成一个稀疏点云,进而可用于光学追踪。通过稀疏点云进行追踪需要的内存和CPU运算量都比较少,同时辅以惯性系统的支持,光学系统即可在只需要很少量追踪点的情况下有效运作。

所谓特征点,就是图片中灰度变化比较剧烈的位置,所以想要更精准稳定的计算,就需要真实环境的颜色变化比较丰富。ARKit就是使用这种原理进行摄像机定位的。

总结

ARKit的实现原理有三部分组成:视觉追踪系统,惯性追踪系统,特征点组成。

利用IOS设备摄像机扫描周围环境,通过对比画面中灰度变化剧烈的位置生成特征点。所有这些点结合在一起可以形成一个稀疏点云(Point cloud)。当IOS设备位置发生变化时,画面中点云的位置也发生变化。

视觉追踪系统便是追踪上一帧与这一帧同个特征点的距离变化。

惯性追踪系统则是通过加速计,陀螺仪等传感器追踪IOS设备的姿态变化。

而VIO系统则是将视觉追踪系统与惯性追踪系统相结合,通过计算推断出IOS设备的“实际”位置信息。

你可能感兴趣的:(ARKit原理)