ARCore之路-运动跟踪之深入理解

版权声明:David Wang原创ARCore文章,仅供学习研究之用,不得用于任何商业目的,未经授权不得转载! https://blog.csdn.net/yolon3000/article/details/82527972

  在前面的章节中,我们已经可以让我们的虚拟物体放置在合适的位置了,代码也可以很好的工作,并且也对部分ARCore技术进行了比较深入的探讨,实事上到此我们反倒更愿意再深入一步,了解ARCore实现的技术细节以便我们更好的利用它来为我们服务。前面我们也讲过,ARCore最主要的三大功能:运动跟踪、 环境理解、光估计。那我们就从运动跟踪开始来深入的探究一下ARCore的技术细节。在本章中,我们将深入了解Arcore运动跟踪的工作原理并简单了解一下Arcore当前运动跟踪的局限性。

一、空间自由度

  在前面我们学过,ARCore使用视觉惯性测距系统(Visual Inertial Odometry,简称 VIO)的算法来实现运动跟踪。VIO将从设备的摄像机中识别图像特征与内部运动传感器结合起来,以跟踪设备的相对位置和方向。通过跟踪方位和位置,我们即可以获取到设备在6自由度(six Degrees of Freedom ,简称6DoF)范围内的位置,或者我们通常所说的设备/物体的姿态。
  自由度(DoF)与刚体在空间内的运动相关,可以解释为“物体移动的不同基本方式”。

这里写图片描述

  在客观世界或者虚拟世界中,我们都采用三维坐标系来精确定位一个物体的位置。在虚拟世界中, 我们采用如上图所示的坐标系来衡量世界坐标或者物体局部坐标。假如一个有大小的物体放置在坐标系的原点,那么这个物体的运动整体上可以分为平移与旋转两类,同时,平移又可以分为三个度:前后(沿Z轴移动),左右(沿X轴移动),上下(沿Y轴移动);旋转也可以分三个度:俯仰(围绕X轴旋转),偏航(围绕Y轴旋转),翻滚(围绕Z轴旋转)。通过计算,刚体物体的任何运动方式均可以由这六个基本运动方式来表达(刚体运动不包括物体的缩放)。即6DoF的刚体物体可以做到所有的运动方式,具有6DoF的刚体物体在空间中的运动是不受限的。

这里写图片描述

上图即是6DoF的图示

这里写图片描述

上图为旋转

在使用中,我们常用一些术语来表示特定的运动:
  Up:向上
  Down:向下
  Strafe:左右
  Picth:围绕X轴旋转,即上下打量,也叫俯仰角。
  Rotate:围绕Y轴旋转,即左右打量,也叫偏航角(yaw)。
  Walk:前进后退。
  Roll:围绕Z轴旋转,即翻滚,也叫翻滚角。

  我们在AR中跟踪物体的位置和方向时经常使用姿态这个术语,姿态的数学表示就是矩阵,我们可以用矩阵来表示物体平移,也可以用矩阵来表示物体的旋转。为了更好的平滑及优化内存使用,我们通常还会使用四元数来操作旋转。四元数允许我们以简单的形式定义3D旋转的所有方面。这里我们不用担心矩阵及四元数的使用,Unity已经为我们封装好了大部分的操作方法,用到了我们再说明。

二、投影矩阵

  在计算机渲染管线中,为了将虚拟的物体显示在投影平面上,我们需要将物体从自身局部空间(Local Space)变换到世界空间(World Space),然后再变换到视空间(View Space),再变换到齐次裁减空间(Homogeneous Clip Space),最后变换到规范设备空间(Normalized Device Space),这样物体顶点信息才最终被GPU处理。Unity隐藏的处理了所有的变换,但我们还是有必须了解一下虚拟物体是到底是如何投影到手机显示屏上的,具体的渲染管线介绍超出了本章的范围,我们只是了解一下关于投影矩阵的知识。
  在场景中ARCore Device Prefab下有个“First Person Camera”,这个摄像机代表的就是用户的眼睛,手机屏幕就是投影面,下图说明了我们是如何定义3D摄像机或投影:

这里写图片描述

这里写图片描述

  摄像机的主要任务是将3D虚拟物体投影成2D图像,然后显示在设备上。投影即是将物体从视空间变换到齐次裁减空间,变换可以用矩阵来表示,那么这个矩阵是如何得到的?
  通过数学分析,投影矩阵可以通过视场角(Field of View,即上图中的 α )、投影面宽高比(可以由设备显示屏的宽高比得到)、近平面(Clipping Planes Near)、远平面(Clipping Planes Far)这四个数据构建,在“First Person Camera”的Inspector面板中可以看到这其中的三个参数。

这里写图片描述

  近平面和远平面连同视场角构成了一个视平截头体,只有这个平截头体里的对象可以被渲染,非视平截头体内的对象将被剔除。在这个场景中,我们使用一个60度的视场角,这个角度大小与人眼视场角基本一致,用这个视场角场景看起来更自然。
  摄像机代表的是用户的眼睛,摄像机它也恰好代表了在AR应用程序中通过设备投射的视图,这样我们可以通过跟踪摄像机的位置来等效跟踪用户,跟踪摄像机可以通过IMU进行。我们在AppController的update()方法里添加如下代码:

var pos = FirstPersonCamera.transform.position;
var rot = FirstPersonCamera.transform.rotation;
Debug.Log("Device position (X:" + pos.x + ",Y:" + pos.y + ",Z:" + pos.z + ")");
Debug.Log("Device orientation (pitch:" + rot.x + ",yaw:" + rot.y + ",roll:" + rot.z + ")");

  在上面的代码中,我们将第一人称摄像机的位置和方向(旋转)提取到辅助变量中:pos和rot,然后,它用调试日志功能将值输出到控制台。如前所述,摄像机的位置就是用户的位置。使用Android Device Monitor可以截获到这些位置和方向信息。

这里写图片描述

三、ARCore运动跟踪的局限性

  至此,我们可以利用ARCore提供给我们功能方便的跟踪用户的位置,从ARCore使用的VIO跟踪技术可以很明显的看到,ARCore的跟踪在以下情况下会失效。

1、运动中做运动跟踪

  例如,如果用户是在火车上使用ARCore,这时IMU(Inertial Measurement Unit)获取的数据不仅包括用户的移动(实际是加速度),也包括火车的移动数据(实际是加速度),这样将导致跟踪失败。

2、跟踪动态的环境

  例如,如果用户对着波光粼粼的湖面,这时从摄像机获取到的图像信息是不稳定的,这将导致特征点提取出错进而导致跟踪失败。

3、热飘移

  相机与 IMU 都是对温度敏感的元器件,之前我们说过相机和IMU的OEM校准,但这个校准通常都会在某一个或者几个特定温度下进行,但在用户设备使用过程中,随着时长的延长会导致设备发热,发热就会影响到相机获取的图像的颜色信息和IMU测量的加速度信息准确性,表现出来就是跟踪的物体会飘移。

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/82527972