ARcore资料
-
ARcore 设备支持:
https://developers.google.cn/ar/discover/supported-devices
-
ARcore 基本概念:
https://developers.google.cn/ar/discover/concepts
-
ARcore sdk:
https://github.com/google-ar
-
ARcore service:
https://github.com/google-ar/arcore-android-sdk/releases
-
API文档:
https://developers.google.cn/ar/reference/
前言
ARCore 是 Google 的增强现实体验构建平台。 ARCore 利用不同的 API 让您的手机能够感知其环境、了解现实世界并与信息进行交互。借助 ARCore 对现实世界的理解,我们能够以一种与现实世界无缝整合的方式添加物体、注释或其他信息。
很多场景,我们需要完成经纬度世界在ARcore世界中的映射,随心所欲的在AR世界中的添加现实世界的信息。就是说真实世界中的建筑物、其他信息,都是基于真实的地理位置的(经纬度坐标),而AR世界是基于理解真实世界的基础上对真实画面的增强,我们需要将真实世界的经纬度经转化到AR世界中来,才能实现无缝添加物体、注释或其他信息。
坐标系转化,首先需要理解坐标系的定义,以及各个坐标系之间的关系。
右手坐标系:
在空间直角坐标系中,让右手拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,则称这个坐标系为右手直角坐标系。
——摘自百度百科
世界坐标系
由于摄像机可安放在环境中的任意位置,在环境中选择一个基准坐标系来描述摄像机的位置,并用它描述环境中任何物体的位置,该坐标系称为世界坐标系。
——摘自百度百科
ARcore坐标系理解
我们可以看官方ARcore API 里对坐标系的说明:
World Coordinate Space
Coordinate system is right-handed. Pose like OpenGL conventions.
Translation units are meters. As ARCore’s understanding of the environment changes, it adjusts its model of the world to keep things consistent. When this happens, the numerical location (coordinates) of the camera and Anchors can change significantly to maintain appropriate relative positions of the physical locations they represent.
These changes mean that every frame should be considered to be in a completely unique world coordinate space. The numerical coordinates of anchors and the camera should never be used outside the rendering frame during which they were retrieved. If a position needs to be considered beyond the scope of a single rendering frame, either an anchor should be created or a position relative to a nearby existing anchor should be used.
这里对ARcore的世界坐标系做了说明,我们可以理解为ARcore坐标系为右手坐标系,单位为米。这个坐标系可以描述任何物体的位置。随着ARCore对环境的理解发生变化,世界坐标系模型也会相应调整以保持和物理世界一致。当发生这种情况时,摄像机和Anchors 的坐标随之改变,以保持它们所代表的物体的相对物理位置。这些变化意味着应该将每个帧视为完全唯一的世界坐标空间。
我们自然会想到如何确定初始化时的世界坐标系?因为之后,随着手机状态的改变,ARcore中的世界坐标系模型会进行相应的调整,保证和现实世界的一致性。所以,我们需要建立最初的世界坐标系,并确定物体在当前世界坐标系中的坐标。
在一定范围下,只考虑物体的经度、纬度,我们可以把各个物体视为近似在同一水平面上。我们以当前手机的位置为原点O,过O作地球球面的切面M,过O做经过O点经线的切线O->N,这个切线指向正北方向,过O做切面M的垂线O->M,该垂线指向地心。
首先我们以O为坐标系的原点,定义右手坐标系。以O->N的相反方向N->O作为X轴,X轴指向南,以O->M的相反方向M->O作为Z轴,Z轴反向指向地心,那么根据右手坐标系的定义,Y轴就指向东。
这还不是我们最终的世界坐标系,因为我们的手机的方向并不总是指向正北也就是我们上面定义的坐标系中的O->N方向,他有自己的方位角Azimuth angle(可以通过传感器获取),即手机与正北方向的夹角。所以,我们需要对XY轴的方向根据手机的状态进行调整,根据方位角,以Z轴为旋转轴进行旋转,使得旋转后的X轴指向与手机朝向相反。
注意世界坐标系的顶一把与手机的姿态有关。用户初始状态的位置将影响我们坐标系原点的定义,用户手机的方位角将影响XY轴的方向。当然,用户在移动的过程中,随着手机姿态改变,不仅原点会改变,XYZ三轴的方向也会随之变化,每一帧的世界坐标系都不同。那我们需不需要在移动的过程中去更新坐标系的原点和方向呢,当然不需要,因为ARcore帮我们完成了,用户在状态改变的同时,ARcore对获取到的每帧进行调整以适应现实世界空间更新,相应地更新物体的姿态,也就是位置和方向。这和前面的说明也相同。
那么我们的ARcore坐标系可以定义为:
- 原点: 当前手机的位置
- 方向:X Y Z三轴符合右手坐标系。每一帧有独立的世界坐标系。
- 单位:米
那么在不考虑高度的(Z轴)情况下,我们将问题简化为平面上的坐标问题。
XOY为我们定义的世界坐标系。
SOE为正南正东坐标系,是不考虑手机方位角的未旋转坐标系。
定义XOY坐标系,是对SOE坐标系旋转手机方位角值后的坐标系,通过物体A在SOE坐标系的坐标,旋转计算XOY坐标系中A坐标,及世界坐标系中物体的初始化坐标。
坐标转化过程:
- 确定手机方向角: 手机传感器获取,通过重力传感器和加速度传感器获取。
-
确定经纬度方位角和距离: 可以计算得到。
经纬度相关计算可参考博文:
https://blog.csdn.net/luoguopeng/article/details/76322348
-
根据坐标旋转公式计算坐标。
坐标旋转变换可以学习博文:
https://blog.csdn.net/csxiaoshui/article/details/65446125
- 根据坐标定义Pose,在ARcore添加锚点即可。
重要的几个概念
锚点Anchor:为了保持物理空间的固定位置,这个位置的数字描述信息将随着ARCore对空间的理解的不断改进而更新。(创建锚点,基于当前摄像头的姿势Pose)
姿势Pose:使用能够描述锚点相对于当前帧现实世界估算的位置和方向的姿态创建锚点。根据ARCore API的提供,Pose总是描述从对象的局部坐标空间到世界坐标空间的转换。随着ARCore对环境的了解不断变化,它将调整坐标系模式以便与真实世界保持一致。
相机camera:提供有关用于捕获图像的摄像头的信息,在捕获当前相机纹理时,返回用户设备在世界坐标系中的姿势。
锚点说明
锚点和摄像机的数值坐标不应在渲染帧之外使用。如果需要考虑位置超出单个渲染帧的范围,则应创建锚点。
创建锚点时,请使用能够描述锚点相对于当前帧现实世界估算的位置和方向的姿态。
我们可以将一个或多个物体连接到此锚点。 随着锚点姿态在每个帧中进行调整以适应现实世界空间更新,锚点将相应地更新物体的姿态,确保这些物体能够保持它们的相对位置和方向。