Google ARCore域模型示例

时间:2017-09-03 09:58:29

标签: computer-vision augmented-reality arcore android-sdk-2.3 android-augmented-reality

我正在尝试阅读并理解Google ARCore的域模型,尤其是Android SDK包。目前,此SDK处于“预览”模式,因此没有关于如何使用此API的教程,博客,文章等。即使谷歌本身也建议只阅读源代码,源代码注释和Javadocs以了解如何使用API​​。问题是:如果你还不是计算机视觉专家,那么域名模型会感觉有点陌生。你不熟悉。

具体而言,我有兴趣了解以下类别之间的根本区别和正确用法:

根据Anchor的javadoc:

  

描述现实世界中固定的位置和方向。为了保持在物理空间中的固定位置,这个位置的数字描述将随着ARCore对空间的理解的改进而更新。使用getPose()获取此锚点的当前数字位置。此位置可能会随时更改update(),但永远不会自发更改。

所以主播姿势。听起来像是“将一个Anchor ”放到相机中可见的东西上,然后ARCore跟踪Anchor并不断更新其Pose以反映其屏幕坐标的性质?

来自Pose的javadoc:

  

表示从一个坐标系到另一个坐标系的不可变刚性变换。如所有ARCore API所提供的,Poses总是描述从对象的局部坐标系到世界坐标系的转换(见下文)......这些变化意味着每个帧都应该被认为是在一个完全唯一的世界坐标系中。

所以声音就像Pose一样,只对相机的“当前帧”是唯一的,并且每次更新帧时都是如此,所有锚点的所有姿势都可能重新计算?如果没有,那么锚点,它的姿势,当前帧和世界坐标系之间的关系是什么?什么是姿势真的,反正呢? “姿势”只是存储矩阵/点数据的一种方式,以便您可以将锚点从当前帧转换为世界帧吗?或其他什么?

最后,我看到Frames,Poses和Anchors之间存在很强的相关性,但后来却有PointCloud。我在com.google.ar.core内可以看到的唯一使用这些类的是FramePointClouds似乎是(x,y,z) - 与第4个属性协调,表示对于x / y / z组件实际上正确的ARCore“置信度”。因此,如果一个Anchor有一个Pose,我会想象一个Pose也会有一个PointCloud代表Anchor的坐标&对那些坐标的信心。但是Pose 没有拥有PointCloud,所以我必须完全误解这两个类建模的概念。

问题

我在上面提出了几个不同的问题,但它们都归结为一个简洁,可回答的问题:

Frame,Anchor,Pose和PointCloud背后的概念有何不同?您何时使用它们(以及用于何种用途)?

2 个答案:

答案 0 :(得分:7)

Pose是结构化转型。它是从一个坐标系(通常是对象本地)到另一个坐标系(通常是世界)的固定数值转换。

Anchor表示世界上物理上固定的位置。随着对世界的理解发生变化,它的getPose()将会更新。例如,假设您有一个建筑物,外面有走廊。如果你一直走在那个走廊上,传感器漂移会导致你不能在你开始的同一坐标处收拾。但是,ARCore可以检测(使用视觉特征)它在启动它的同一空间。当发生这种情况时,它会扭曲世界,使您当前的位置和原始位置对齐。作为这种扭曲的一部分,锚点的位置也会被调整,以便它们保持在同一个物理位置。

由于这种失真,相对于世界的Pose应该被认为仅在返回它的帧的持续时间内有效。一旦你下次打电话给update(),世界可能已经重塑了那个姿势可能毫无用处。如果您需要保留比框架更长的位​​置,请创建Anchor。只需确保您不再使用removeAnchors()个锚点,因为每个活动锚点都有持续成本。

Frame会立即捕获当前状态,并在两次调用update()之间发生变化。

PointCloud是世界上检测到的3D视觉特征点集。它们位于自己的本地坐标系中,可以从Frame.getPointCloudPose()访问。希望拥有比平面检测更好的空间理解的开发人员可以尝试使用点云来了解有关3D世界结构的更多信息。

这有帮助吗?

答案 1 :(得分:0)

  

使用以下链接,您可以找到并回答关于 FrameAnchorPose的问题

ARCore – Session, Frame, Camera and Pose

此外,这是有关 Point Cloud是什么的信息:

Point Cloud是世界空间中通常为黄色的点的可视云,这些点代表在真实对象上进行3D跟踪的点的可靠位置 。点云看起来像这样:

enter image description here

这就是Google对点云的评价:

  

PointCloud包含一组观察到的3D点和置信度值。此类实现Closeable,通常应在Java try-with-resources或Kotlin use块中使用,例如:

要获取PointCloud,请使用以下代码:

Frame frame = session.update();

try (PointCloud pointCloud = frame.acquirePointCloud()) {
    // Accessing point cloud data.......
}