ARKit之路-ARKit原理
版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。
ARKit提供如此出众AR体验的背后是苹果公司强大的软硬件整合能力和做到极致的用户体验,苹果公司的生态拥有其他企业无法比拟的优势,这不仅包括强大的硬件资源,还包括精细健壮的软件技术和追求完美的场景渲染。本节,我们主要学习了解ARKit的核心功能及ARSession、ARAnchor、ARFrame在AR应用发开中的关键作用,更具体的内容会在后续学习中进一步了解。
(一)ARKit三大基础能力
ARKit整合了SLAM、计算机视觉、机器学习、传感器融合、表面估计、光学校准、特征匹配、非线性优化等等大量的低层技术,提供给开发者简洁易用的程序界面。ARKit提供的能力总体可以分为三个部分:运动跟踪、场景理解、渲染,如下图所示,在这三大基础能力之上,构建了形形色色的附加功能。
(1)运动跟踪
运动跟踪实时跟踪用户设备在现实世界中的运动,是ARKit的核心功能之一,利用该功能可以实时获取到的用户设备姿态信息。在运动跟踪精度与消除误差积累方面,ARKit控制得非常好,表现在使用层面就是加载的虚拟元素不会出现漂移、抖动、闪烁。ARKit的运动跟踪整合了VIO和IMU,即图像视觉跟踪与运动传感器跟踪,提供6DOF(Degree Of Freedom)跟踪能力,不仅能跟踪设备位移,还能跟踪设备旋转。
更重要的是,ARKit运动跟踪没有任何设置要求,不需要对环境的先验知识,也没有额外的传感器要求,仅凭现有的移动设备就能满足ARKit运动跟踪的所有要求。
(2)场景理解
场景理解建立在运动跟踪、计算机视觉、机器学习等技术之上。场景理解提供了关于设备周边现实环境的属性相关信息,如平面检测功能,提供了在现实环境中物体表面(如地面、桌面等)检测平面的能力,如下图所示。技术上讲,ARKit通过检测特征点和平面来不断改进它对现实世界环境的理解。ARKit可以检测看起来位于常见水平或垂直表面(例如桌子或墙)上的成簇特征点,并允许将这些表面用作应用程序的工作平面,ARKit也可以确定每个平面的边界,并将该信息提供给应用,使用此信息将可以将虚拟物体放置于平坦的表面上而不超出平面的边界。场景理解是一个渐进的过程,随着设备探索的环境不断拓展而不断加深,并可随着探索的进展不断修正误差。
ARKit通过VIO检测特征点来识别平面,因此它无法正确检测像白墙一样没有纹理的平坦表面。 当加入LiDAR传感器后,ARKit对环境的感知能力得到大幅度提高,不仅可以检测平坦表面,也可以检测非平坦有起伏的表面,由于LiDAR的特性,其对弱纹理、光照不敏感,可以构建现实环境的高精度几何网格。
场景理解还提供了射线检测功能,利用该功能可以与场景中的虚拟对象、检测到的平面、特征点交互,如放置虚拟元素到指定位置、旋转移动虚拟物体等。场景理解还对现实环境中的光照信息进行评估,并利用这些光照估计信息修正场景中的虚拟元素光照。除此之外,场景理解还实现了反射现实物理环境以提供更具沉浸性的虚实融合体验。
(3)渲染
严格意义上讲,ARKit并不包含渲染功能,AR的渲染由第三方框架提供。但除提供场景理解能力之外,ARKit还提供连续的摄像头图像流,这些图像流可以方便的融合进任何第三方渲染框架,如RealityKit、SceneKit、SpriteKit、Metal,或者是自定义的渲染器。ARKit与渲染器之间的关系如下图所示。
运动跟踪、场景理解、渲染紧密协作,形成了稳定、健壮、智能的ARKit,在这三大基础能力之上,ARKit还提供了诸如2D图像识别跟踪、3D物体识别跟踪、物理仿真等实用功能。
在苹果公司的强力推动下,ARKit正处于快速发展中,更好的硬件和新算法的加入,提供了更好更快的检测速度(如平面检测、人脸检测、3D物体检测等等),更多更强的功能特性(如人形遮挡、人体运动捕捉、人脸BlendShape、场景几何等等)。ARKit适用的硬件范围也在拓展,可以预见,ARKit适用的硬件一定会拓展到苹果公司的AR眼镜产品。
(二)ARSession
ARSession(AR会话)是ARKit中最重要的概念之一,其主要的功能是管理AR应用的状态和整个生命周期,是ARKit API的主要入口。
ARSession整合了底层的所有技术为开发者提供程序界面,这些技术包括从设备运动传感器硬件中读取数据、捕获摄像头图像数据并进行分析、控制虚拟场景摄像机与硬件设备摄像头的对齐、执行Session空间与AR世界空间的转换等等。ARSession综合所有的这些信息,在设备所处的现实空间和虚拟空间之间建立联系。每一个ARKit应用都需要且仅需要一个ARSession,由其向上提供服务。
ARKit提供了非常多的功能特性,每一个功能特性对软硬件都有其独特的要求(如进行人脸检测的功能与进行2D图像检测识别的功能对硬件及前置需求均不一样),因此应用程序需要使用某项功能时应当在运行前进行配置。负责功能配置的为配置信息类(ARConfiguration),配置信息决定了ARKit如何跟踪设备、使用的硬件、可以使用的功能集以及更多其他细节。如ARWorldTrackingConfiguration允许用户使用后置摄像头以6DOF的模式开启运动跟踪,而ARFaceTrackingConfiguration则要求使用设备的前置摄像头检测跟踪人脸。
利用ARSession可以检测设备是否支持ARKit以及支持的功能子集,可以在运行时检测ARKit的运行跟踪状态,并可根据需要暂停、停止、重启Session进程。
(三)ARAnchor
ARAnchor(AR锚点)也是ARKit中最重要概念之一,任何需要锚定到现实空间、现实2D图像、现实3D物体、人体、人脸的虚拟对象都需要通过特定的锚点连接,另外,共享AR体验也必须通过ARAnchor才能实现。在后续的学习中,我们还会详细讲述ARAnchor,现在需要知道的是,不通过锚点就无法将虚拟元素、虚拟对象添加到场景中。
(1)锚点的工作原理
AR应用中,摄像头和虚拟物体在现实世界空间中的位置会在帧与帧之间更新,即虚拟物体在现实世界空间中的姿态每帧都会更新,由于陀螺仪传感器的误差积累,虚拟物体会出现飘移现象,为解决这个问题,我们需要使用一个锚点将虚拟对象固定在现实空间中。如前所述,这个锚点的姿态信息偏差必须要能用某种方式消除以确保锚点的姿态不会随着时间而发生变化。消除这个偏差的就是视觉校准技术,通过视觉校准能让锚点保持相同的位置与方向,这样,连接到该锚点的虚拟对象也就不会出现飘移。一个锚点上可以连接一个或多个虚拟对象,锚点和连接到它上面的物体看起来会待在它们在现实世界中的放置位置,随着锚点姿态在每帧中进行调整以适应现实世界空间更新,锚点也将相应的更新虚拟物体姿态,确保这些虚拟物体能够保持它们的相对位置和方向,即使在锚点姿态调整的情况下也能如此。
(2)使用锚点
一般来说,虚拟对象之间、虚拟对象与可跟踪对象之间、虚拟对象与现实世界空间之间存在相互位置关系时,我们可以将一个或多个物体连接到一个锚点以保持它们之前的相互位置关系。
有效使用锚点可以提升AR应用的真实性和沉浸感,连接到附近锚点的虚拟对象会在整个AR体验期间保持它们的位置和彼此之间的相对位置关系,而且借助于锚点有利于减少CPU开销。
使用锚点的注意事项:
(1)尽可能复用锚点。在大多数情况下,应当让多个相互靠近的虚拟物体使用同一个锚点,而不是为每个虚拟物体创建一个新锚点。如果虚拟物体需要保持与现实世界空间中的某个可跟踪对象或位置之间独特的空间关系,则需要为该物体创建新锚点。因为锚点将独立调整姿态以响应ARKit在每一帧中对现实世界空间的估算,如果场景中的每个虚拟物体都有自己的锚点则会带来很大的性能开销。另外,独立锚定的虚拟对象可以相对彼此平移或旋转,从而破坏虚拟物体的相对位置应保持不变的AR场景体验。
例如,假设AR应用可以让用户在房间内布置虚拟家具。当用户打开应用时,ARKit会以平面形式开始跟踪房间中的桌面和地板。用户在桌面上放置一盏虚拟台灯,然后在地板上放置一把虚拟椅子,在此情况下,应将一个锚点连接到桌面平面,将另一个锚点连接到地板平面。如果用户向桌面添加另一盏虚拟台灯,此时我们可以重用已经连接到桌面平面的锚点。这样,两个台灯看起来都粘在桌面平面上,并保持它们之间的相对空间关系,椅子也会保持它相对于地板平面的位置。
(2)保持物体靠近锚点。锚定物体时,最好让需要连接的虚拟对象尽量靠近锚点,避免将虚拟物体放置在离锚点几米远的地方,以防止由于ARKit更新世界空间坐标而产生意外的旋转运动。如果确实需要将虚拟物体放置在离现有锚点几米远的地方,应该创建一个更靠近此位置的新锚点,并将物体连接到新锚点。
(3)分离未使用的锚点。为提升应用的性能,通常需要将不再使用的锚点分离销毁。因为每个可跟踪对象都会产生一定的CPU开销,ARKit不会释放具有连接锚点的可跟踪对象,从而造成无谓的性能损失。
(3)锚点种类
为更好的表达锚点的性质及其附带信息,ARKit将ARAnchor分为9类,如下表所示,各类ARAnchor的具体使用将在后续的学习中进行详细介绍。
锚点种类 | 描述 |
---|---|
ARPlaneAnchor | ARKit检测到的物理环境中的平面Anchor。 |
ARImageAnchor | 在世界跟踪中检测到的2D图像Anchor,用以表示该2D图像的姿态。 |
ARObjectAnchor | 在世界跟踪中检测到的3D物体Anchor,用以表示该3D物体的姿态。 |
ARFaceAnchor | ARKit检测到的设备摄像头图像中的人脸Anchor,包含人脸姿态及表情信息。 |
ARBodyAnchor | ARKit检测到的设备摄像头图像中的3D人体Anchor。 |
ARParticeipantAnchor | 在多人共享的AR体验中表示其他参与方的Anchor。 |
AREnvironmentProbeAnchor | 用于表示环境光探头的Anchor,ARKit使用环境光探头进行环境反射。 |
ARMeshAnchor | 使用LiDAR重建场景后每一个场景几何网格的Anchor。 |
ARGeoAnchor | 用于表示地理位置信息的Anchor。 |
(四)ARFrame
运行中的ARSession会从设备摄像头中采集视频图像流,并利用这些视频图像流进行分析以评估用户设备的姿态和进行其他视觉计算,这些视频图像流会以帧(Frame)的形式进行更新,ARKit也以ARFrame的形式向用户提供这些信息。
ARFrame(AR帧)最直观的理解是摄像头获取的一帧图像,ARKit背景渲染的画面就来自摄像头获取的图像帧。但在ARKit中,ARFrame还包含更丰富的内容,它提供了某一个时刻的AR状态,这些状态包括:当前Frame中的环境光照信息(如在绘制内容的时候根据光照控制虚拟物体绘制的颜色,使其更真实);WorldMap状态;当前场景的参数;当前Frame中检测到的特征点云及其姿态;当前Frame中包含的Anchors和检测到的平面集合;手机设备当前的姿态、帧获取的时间戳、AR跟踪状态和摄像头的视矩阵等。
ARFrame也构成了AR应用使用者可见的场景,是ARKit与使用者交互的窗口。
参考资料
1、ARKit documents ARKit documents
ARKit之路-ARKit原理相关推荐
- ARKit之路-运动跟踪原理
版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载. 在前述文章中,我们对AR技术原理进行过简单学习了解,ARKit运动跟踪所采用的技术与其他移动端AR SDK一样,也是采 ...
- ARKit之路-平面检测
版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载. 平面检测是很多AR应用的基础,无论是ARKit.ARCore还是Huawei AREngine.SenseAR等SDK ...
- ARKit之路-ARKit概述之二
版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载. ARKit需要运行在iOS11以上的iPhone与iPad上.AR应用属于计算密集型应用,对计算硬件要求较高,就算在应 ...
- ARKit之路-LiDAR传感器(一)
版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载. 第4代iPad Pro和iPhone12高端机型中新增了LiDAR(Light Detection And Rangi ...
- ARKit之路-ARKit概述之一
2017年,在WWDC(World Wide Developers Conference,苹果全球开发者大会)上,苹果公司正式推出了增强现实开发套件ARKit.ARKit一推出即在科技圈引发极大关 ...
- ARKit之路-Depth API
版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载. 在配备LiDAR传感器的设备上,ARKit不仅可以进行场景几何重建,还向开发者开放了场景深度信息,利用这些深度信息,可 ...
- ARKit之路-ARSession生命周期管理与跟踪质量
版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载. ARSession整合运动传感器数据与计算机视觉处理数据跟踪用户设备姿态,为得到更好的跟踪质量,ARSession需要 ...
- ARKit之路-AR截屏
版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载. 截屏是移动手机用户经常使用的一项功能,也是一项特别方便用户保存.分享屏幕信息的方式.移动设备(包括iOS设备和Andr ...
- 电路结构原理_精密半波、全波整流电路结构原理图解
利用二极管(开关器件)的单向导电特性,和放大器的优良放大性能相结合,可做到对输入交变信号(尤其是小幅度的电压信号)进行精密的整流,由此构成精密半波整流电路.若由此再添加简单电路,即可构成精密全波整流电 ...
最新文章
- [Window] .MUS 0x80070422 Error
- 支付系统开发中可能遇到的问题
- Flask框架从入门到精通之参数配置(二)
- 为什么编程语言要从c语言学起,在那么多编程语言中,为什么推荐初学者学 C 语言?...
- Ubuntu下配置Apache的Worker模式
- C语言 提取字符串中的所有整数
- 软件测试——测试分类
- UIButton设置UIControlContentHorizontalAlignment调整文字对齐方式
- python如何获得列表中某个元素的index
- 英伟达显卡排名天梯图2022
- 请教点击按钮时获得文本框中的字符进行操作问题
- java.lang.IllegalStateException: The specified message queue synchronization barrier token has not
- 傅里叶变换对照表_实验室仪器中英文及缩写对照表
- 疫情推动下的云联络中心终于引起了销售行业的重视。
- Matlab中inv函数的使用
- 【网上教学】实现线上签到和收批作业的方法
- 计算几何入门 1.3:凸包的构造——增量构造法
- python抢票开发——设备预约助手实现
- 印象笔记android,Android
- 电脑快捷键全都在这了!电脑技巧收藏!