版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。
在前述文章中,我们对AR技术原理进行过简单学习了解,ARKit运动跟踪所采用的技术与其他移动端AR SDK一样,也是采用VIO与IMU结合的方式进行SLAM定位跟踪。本节我们将更加深入的学习ARKit运动跟踪原理,通过学习就会很自然的理解ARKit在运动跟踪方面的优劣势,并在开发中尽量避免劣势或者采取更加友好的方式扬长避短。
实现虚实融合最基本的要求是实时跟踪用户(设备)的运动,始终保持虚拟摄像机与设备摄像头的对齐,并依据运动跟踪结果实时的更新虚拟元素状态,才能在现实世界与虚拟世界之间建立稳定精准的联系。运动跟踪的精度与质量直接影响AR整体效果,任何延时、误差都会造成虚拟元素抖动或者漂移,从而破坏AR的真实感和沉浸性。
在进一步学习运动跟踪之前,我们先了解一下ARKit空间坐标系,在不了解AR坐标系的情况下,阅读或者实现代码可能会感到困惑。ARKit采用右手坐标系(包括世界坐标系、摄像机坐标系、投影坐标系,这里的摄像机指渲染虚拟元素的摄像机),如下图所示。右手坐标系Y轴正向朝上,Z轴正向指向观察者自己,X轴正向指向观察者右侧。
ARKit运动跟踪分为3DOF和6DOF两种运动跟踪模式,3DOF只跟踪设备的旋转,因此是一种受限的运动跟踪方式,通常,我们不会使用这种运动跟踪方式,但在一些特定场合或者6DOF跟踪失效的情况下,也有可能会使用到。
DOF(Degree Of Freedom,自由度)与刚体在空间内的运动相关,可以解释为“刚体运动的不同基本方式”。在客观世界或者虚拟世界中,我们都采用三维坐标系来精确定位一个物体的位置。
假如一个有尺寸的刚体放置在坐标系的原点,那么这个物体的运动整体上可以分为平移与旋转两类(刚体不考虑缩放),同时,平移又可以分为3个度:前后(沿Z轴移动)、左右(沿X轴移动)、上下(沿Y轴移动);旋转也可以分3个度:俯仰(围绕X轴旋转)、偏航(围绕Y轴旋转)、翻滚(围绕Z轴旋转)。通过分析计算,刚体的任何运动方式均可由这6个基本运动方式来表达,即6DOF的刚体可以完成所有的运动方式,具有6DOF的刚体物体在空间中的运动是不受限的。
具有6DOF的刚体可以到达三维坐标系的任何位置并且可以朝向任何方向。平移相对来说比较好理解,即刚体沿XYZ 3个轴之一运动,旋转其实也是以XYZ 3个轴之一为旋转轴进行旋转。在计算机图形学中,我们常用一些术语来表示特定的运动,这些术语如下表所示。
术语 | 描述 |
---|---|
Down | 向下 |
Up | 向上 |
Strafe | 左右 |
Walk | 前进后退 |
Picth | 围绕X轴旋转,即上下打量,也叫俯仰角 |
Rotate | 围绕Y轴旋转,即左右打量,也叫偏航角(yaw) |
Roll | 围绕Z轴旋转,即翻滚,也叫翻滚角 |
在AR中跟踪物体的位置和方向时经常使用姿态这个术语,姿态的数学表示为矩阵,既可以用矩阵来表示物体平移,也可以用矩阵来表示物体的旋转。为了更好的平滑及优化内存使用,通常还会使用四元数来操作旋转,四元数允许我们以简单的形式定义3D旋转的所有方面。
1.方向跟踪
在ARKit中,使用AROrientationTrackingConfiguration类配置ARSession可以实现3DOF运动跟踪,即只跟踪设备在X、Y、Z轴上的旋转运动,如下图所示,表现出来的效果类似于站立在某个点上下左右观察周围环境。由于缺少位置信息,无法从后面去观察放置在地面上的桌子,方向跟踪只跟踪方向变化而不跟踪设备位置变化,因此这是一种受限的运动跟踪方式。在AR中采用这种跟踪方式时虚拟元素会一直漂浮在摄像头图像之上,即不能固定于现实世界中。
采用3DOF进行运动跟踪时,无法使用平面检测功能,也无法使用射线检测功能。
2.世界跟踪
在ARKit中,使用ARWorldTrackingConfiguration类配置ARSession可实现6DOF运动跟踪,既跟踪设备在X、Y、Z轴上的旋转运动,也跟踪设备在X、Y、Z轴上的平移运动,能实现对设备姿态的完全跟踪,如下图所示。
6DOF的运动跟踪方式(世界跟踪)可以营造完全真实的AR体验,通过世界跟踪,能从不同距离、方向、角度观察虚拟物体,就好像虚拟物体真正的存在于现实世界中一样。在ARKit中,我们通常通过世界跟踪方式创建AR应用。
在ARKit中使用世界跟踪时,支持平面检测、射线检测,还支持检测识摄像头采集图像中的2D图像、3D物体,如:
使用planeDetection可以检测识别水平和垂直平面,在检测到平面后会以ARPlaneAnchor的形式将其添加到ARSession中。
使用detectionImages可以检测识别2D图像,在检测到预定义图像后会以ARImageAnchor的形式将其添加到ARSession中。
使用detectionObjects可以检测识别3D物体,在检测到预定义3D物体后会以ARObjectAnchor的形式将期添加到ARSession中。
使用ARFrame、ARSCNView、ARView提供的射线检测(Ray Casting)方法检测虚拟元素、平面、特征点。
ARKit使用VIO(Visual Inertial Odometry,视觉惯性里程计)和IO(Inertial Odometry,惯性里程计)进行运动跟踪。在技术上,AVCaptureSession负责处理VIO相关信息,CMMotionManager负责处理IO信息,如下图所示。
IO的数据来自IMU(Inertial Measurement Unit,惯性测量单元),IMU包括加速度计与陀螺仪两种运动传感器,分别用于测量设备的实时加速度与角速度,运动传感器非常灵敏,每秒可进行1000次以上的数据检测,能在短时间跨度内提供非常及时准确的运动信息。但是,运动传感器也存在测量误差,由于检测速度快,这种误差累积效应就会非常明显(微小的误差以每秒1000次的速度累积会迅速变大),因此,在较长的时间跨度后,跟踪就会变得完全失效。
ARKit为了消除IO存在的误差累积漂移,还采用VIO的方式进行跟踪,VIO基于计算机视觉计算,该技术可以提供非常高的计算精度,但付出的代价是计算资源与计算时间。ARKit为提高VIO精度采用了机器学习方法,因此,VIO处理速度相对于IMU要慢得多,另外,计算机视觉处理对图像质量要求非常高,对相机运行速度非常敏感,因为快速的相机运动会导致采集的图像模糊。
ARKit充分吸收利用了VIO与IO各自的优势,利用IO的高更新率和高精度进行较小时间跨度的跟踪,利用VIO对较长时间跨度的IO跟踪进行补偿,融合跟踪数据向上提供运动跟踪服务。
IO信息来自运动传感器的读数,精度取决于传感器本身。VIO信息来自于计算机视觉处理结果,因此精度受到较多因素的影响,下面主要讨论VIO,VIO进行空间计算的原理如下图所示。
在AR应用启动后,ARKit会不间断的捕获从设备摄像头采集的图像信息,并从图像中提取出视觉差异点(特征点),ARKit会标记每一个特征点(每一个特征点都有ID),并会持续的跟踪这些特征点,当设备从另一个角度观察同一空间时时(即设备移动了位置或者进行了旋转),特征点就会在两张图像中呈现视差,如上图所示,利用这些视差信息和设备姿态偏移量就可以构建三角测量,从而计算出特征点缺失的深度信息,换而言之,可以通过从图像中提取的二维特征进行三维重建,进而实现跟踪用户设备的目的。
从VIO工作原理可以看到,如果从设备摄像头采集的图像不能提供足够的视差信息,则无法进行空间三角计算,从而无法解算出空间信息。因此,若要在AR应用中使用VIO,则设备必须要移动位置(X、Y、Z方向均可),无法仅仅通过旋转达到目的。
在通过空间三角计算后,特征点的位置信息被解算出来,这些位置信息会存储到这些特征点上。随着用户在现实世界中探索的进行,一些不稳定的特征点被剔除,一些新的特征点会加入,并逐渐形成稳定的特征点集合,这个特征点集合在ARKit中被称为世界地图(World Map),世界地图的坐标原点为ARKit初始化时的设备位置,世界地图就是现实世界在ARKit中的数字表示。
VIO跟踪的流图如下图所示,从流图可以看到,为了优化性能,计算机视觉计算并不是每帧都执行。VIO跟踪主要用于校正补偿IO在时间跨度较长时存在的误差累积,每帧执行视觉计算不仅会消耗大量计算资源,而且没有必要。
VIO也存在误差,这种误差随着时间的积累也会变得很明显,表现出来就是放置在现实空间中的虚拟元素会出现一定的漂移。为抑制这种漂移,ARKit会实时的对设备摄像头采集的图像进行匹配计算(在SLAM中称为回环检测),如果发现当前采集的图像与之前某个时间点采集的图像匹配(即用户在同一位置以同一视角再次观察现实世界时),ARKit就会对特征点的信息进行修正,从而优化跟踪。
ARKit综合了VIO与IO各自的优势,提供了非常稳定的运动跟踪能力,也正是因为稳定的运动跟踪使得利用ARKit制作的AR应用体验非常好。
通过对ARKit运动跟踪原理的学习,我们现在可以很容易的理解第1章中所列的ARKit不足。因此,为了得到更好的跟踪质量,需要注意以下事项。
(1)运动跟踪依赖于不间断输入的图像数据流与传感器数据流,某一种方式短暂的受到干扰不会对跟踪造成太大的影响,如用手偶尔遮挡摄像头图像采集不会导致跟踪失效,但如果中断时间过长,跟踪就会变得很困难。
(2)VIO跟踪精度依赖于采集图像的质量,低质量的图像(如光照不足、纹理不丰富、模糊)会影响特征点的提取,进而影响跟踪质量。
(3)VIO数据与IO数据不一致时会导致跟踪问题,如视觉信息不变而运动传感器数据变化(如在运动的电梯里),或者视觉信息变化而运动传感器数据不变(如摄像头对准波光粼粼的湖面),这都会导致数据融合障碍,进而影响跟踪效果。
开发人员很容易理解以上内容,但这些信息,使用者在进行AR体验时可能并不清楚,因此,必须实时的给予引导和反馈,不然会让使用者困惑。ARKit为辅助开发人员了解AR运动跟踪状态提供了实时的状态监视,将运动跟踪状态分为受限、正常、不可用(limited、normal、notAvailable)3种,分别指示运动跟踪状态质量不佳、正常、当前不可用3种情况,并在跟踪受限时给出原因。这些状态信息可以通过ARCamera.TrackingState获取到,为提升用户的使用体验,应当在跟踪受限或者不可用时给出明确的原因和操作建议,引导使用者提高运动跟踪的精度和稳定性。
1、Understanding World Tracking Understanding World Tracking