熟悉AR的朋友大多听说过苹果的ARKit和谷歌的ARCore,它们在AR体验中起到了什么作用?为什么很多AR应用都要求只有获得认证的手机才能够安装使用。今天就一起来看看ARKit和ARCore背后的运行原理,解开心中的困惑。
ARKit和ARCore 从技术上讲是一个视觉惯性里程计 (VIO) 系统。VIO意味着软件算法会实时跟踪您在空间中的位置(您的 6dof 姿态),即您的姿态会在显示屏上的每帧画面刷新之间进行重新计算,大约每秒 30 次或更高频率。
视觉惯性里程计 (VIO)
这些计算需要并行进行两次计算。您的姿态是通过视觉相机系统跟踪的,每帧将现实世界中的一个点与相机传感器上的一个像素进行匹配。您的姿态也由惯性系统(加速度计和陀螺仪组成 - 统称为惯性测量单元或 IMU)进行跟踪。
然后通过卡尔曼滤波器组合这两个系统的输出,该滤波器确定两个系统中的哪一个提供对您的“真实”位置的最佳估计,并通过SDK对外部程序发布该姿态更新数据。
卡尔曼滤波运用
就像汽车里程表能够跟踪记录汽车行驶的距离一样,VIO 系统跟踪手机设备在空间中行驶的距离和朝向,包含沿空间坐标系x、y、z三个坐标轴的平移运动和旋转运动,简称6 dof(自由度)运动。
6 dof图示
AR应用中6自由度应用效果
VIO 带来的最大优势一是 IMU 读数频率大约每秒 1000 次,二是基于加速度(用户运动)进行计算。航位推算用于测量 IMU 读数之间的设备移动。航位推算差不多是一种猜测估计,就像我让你走一步并猜测那一步是多少米远,你会使用航位推算来估计距离。
航位推算
当然,如何使这个猜测估计变得高度准确需要很多算法上的推敲优化。惯性系统中的误差会随着时间的推移而累积,因此 IMU 帧之间的时间越长,或者惯性系统在没有从视觉系统获得“重置校正”的情况下运行的时间越长,跟踪偏离真实情况的时间程度就越高。
视觉光学测量以相机帧速率进行,因此通常为 30帧/秒,并且与帧之间的距离有关(帧之间的场景变化)。光学系统通常会更高程度在距离上累积误差(在时间维度误差累积相对小),因此您走得越远,误差就越大。
两种方式比较
不过幸运的是,光学系统和惯性系统联合起来能够相辅相成,在发挥出各自优势的同时抵消了劣势。
因此,视觉和惯性跟踪系统是基于完全不同的测量系统,没有相互依赖关系。这意味着相机可以被短时间遮盖或可能查看具有少量光学特征(例如白墙)的场景,此时惯性系统可以短时间“承载”几帧。或者在设备保持静止的状态下,视觉系统可以提供比惯性系统更稳定的姿态。卡尔曼滤波器不断选择质量最好的姿态,结果是稳定的跟踪。
平面检测能力
ARKit和ARCore都有的一个主要功能是简单平面检测,这是必要的能力,因此您才有“地面”能够放置您的内容,否则它漂浮不定的悬空中,看起来不够真实。这是根据光学系统检测到的特征(您在图中看到的那些小点)计算得出的,算法只是将它们平均起来,因为任何 3 个点定义了一个平面,如果您这样做足够多次消除误差,您可以估计真正的地面在哪里。
稀疏点云
这些点通常被称为“点云”,这是另一个令人困惑的术语。这些点共同构成一个稀疏点云,用于光学跟踪。稀疏点云使用更少的内存和 CPU 时间来实现跟踪,并且在惯性系统的支持下,光学系统可以在跟踪少量点的情况下就能工作得不错。这是一种与密集点云不同类型的点云,密集点云看起来接近真实感,有一些跟踪器可以使用密集点云进行跟踪,但通常需要更高的算力。
密集点云
几个常见问题
我见过人们将 ARKit 或ARCore称为 SLAM,或者使用术语 SLAM 来指代跟踪。为了澄清起见,将 SLAM 视为一个非常广泛的术语,例如“多媒体”。 跟踪本身是一个更通用的术语,其中里程计更具体,但它们在实践中与 AR 足够接近。这可能会令人困惑。做 SLAM 的方法有很多种,而跟踪只是一个完整 SLAM 系统的一个组成部分。我认为 ARKit或ARCore是一个轻量级或简单的 SLAM 系统。
完整SLAM流程
ARKit或ARCore让很多人困惑的的两个“谜团”是 - “如何从单个相机镜头构建出3D地图?” 、“如何获得对象真实尺度大小(就像AR尺子测量功能应用中演示的一样)?”。这里的秘诀是“真正”好的 IMU 错误消除(即使航位推算猜测高度准确)。当你能做到这一点时,会发生以下情况:
单个相机通过移动构建3D地图
要获得 3D,您需要拥有来自不同位置的场景的 2 个视图,以便利用三角测距原理对您的位置进行立体计算。这就是我们的眼睛在3D世界中查看对象的方式,也是一些跟踪器依赖立体摄像头的原因。如果你有2个摄像头这很容易计算,因为您知道它们之间的距离,并且帧是同时捕获的。当使用一台相机时,您可以捕捉一帧,然后移动,然后捕捉第二帧。使用 IMU 航位推算,您可以计算两帧之间移动的距离,然后照常进行立体计算(实际上,您可能会从超过 2 帧进行计算以获得更高的精度)。 如果 IMU 精度足够高,那么这 2 帧之间的“运动”仅通过您试图保持手机静止不动的微小肌肉运动就能检测出来!
为了获得对象真实尺度大小,该系统依赖于来自 IMU 的准确航位推算。从 IMU 给出的加速度和时间测量值,您可以反向积分以计算出速度,并再次积分以获取 IMU 帧之间的移动距离。数学公式不是很难,难的是从 IMU 中消除误差以获得近乎完美的加速度测量。一个微小的误差(在您移动手机的几秒钟内每秒累积 1000 次)可能意味着 30% 或者更多的尺度比例误差。ARKit和ARCore厉害的地方就是能够将误差率降至个位数,远远优于那些开源的SLAM算法。
很小的误差累积1000次后就无法应用
好了,关于ARKit和ARCore的介绍就到这里,大家有什么想法或什么问题,欢迎在评论区发表探讨。
AR更多相关文章:
AR和VR当前面临的技术挑战和未来展望 为什么说人机交互的终点是AR空间界面交互?
兵马未动,粮草先行,AR、VR之前的3D流水线都干了什么活?
什么是增强现实(AR)与虚拟现实(VR)?它们是通往元宇宙的入口吗?
距离AR普及应用还有多远?关于增强现实的几点思考
北京冬奥会闭幕式上的数字AR中国结技术实现解析
空战中飞行员如何瞄准目标?谈谈AR头盔的应用
AR和IoT之间是什么关系?相爱相杀?相辅相成?
增强现实(AR)为什么可以无中生有?看一看魔镜背后发生的事情
,