4

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

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

根据Anchor's javadoc:

"描述现实世界中的一个固定位置和方向。要停留在物理空间中的一个固定位置,这个位置的数值描述会随着 ARCore 对空间的理解的提高而更新。使用 getPose() 来获取这个当前的数值位置锚点。这个位置可能会在任何时候 update() 被调用时改变,但永远不会自发改变。

所以Anchors有一个Pose。听起来你“将 Anchor ”放在相机中可见的东西上,然后 ARCore 会跟踪该 Anchor 并不断更新它Pose以反映其屏幕坐标的性质?

并来自Pose的javadoc:

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

所以听起来aPose只是相机的“当前帧”独有的东西,并且每次更新帧时,所有锚的所有姿势都会重新计算?如果不是,那么 Anchor、它的 Pose、当前帧和世界坐标系之间的关系是什么?究竟什么是姿势?“姿势”是否只是一种存储矩阵/点数据的方式,以便您可以将锚点从当前帧转换为世界帧?或者是其他东西?

最后,我看到帧、姿势和锚点之间存在很强的相关性,但是还有PointCloud. 我可以在里面看到的唯一com.google.ar.core使用这些的类是Frame. PointClouds似乎是(x,y,z) -坐标与第四个属性表示 ARCore 对 x/y/z 分量实际上是正确的“信心”。因此,如果 Anchor 有一个 Pose,我会想象一个 Pose 也会有一个 PointCloud 代表 Anchor 的坐标和对这些坐标的信心。但是 Pose没有PointCloud,所以我一定完全误解了这两个类模型的概念。


问题

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

Frame、Anchor、Pose 和 PointCloud 背后的概念有什么区别?你什么时候使用它们(以及用于什么目的)?

4

2 回答 2

8

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

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

由于这种扭曲,一个Pose相对于世界的相对应被认为仅在它返回的帧的持续时间内有效。一旦你update()下次打电话,世界可能已经在那个姿势下重新塑造可能没用。如果您需要保持位置比框架长,请创建一个Anchor. 只需确保removeAnchors()您不再使用的主播,因为每个直播主播都有持续的成本。

AFrame在瞬间捕获当前状态,并在两次调用之间切换update()

PointClouds 是在世界中检测到的一组 3D 视觉特征点。它们位于自己的本地坐标系中,可以从Frame.getPointCloudPose(). 希望比平面检测提供更好的空间理解的开发人员可以尝试使用点云来更多地了解 3D 世界的结构。

这有帮助吗?

于 2017-09-03T17:46:45.030 回答
0

使用以下链接,您可以找到并回答关于 Frame,AnchorPose:

ARCore – 会话、帧、相机和姿势

此外,这里有关于What a Point Cloudis的信息:

Point Cloud是世界空间中的点(通常为黄色)的视觉云,它们表示用于对真实世界对象进行 3D 跟踪的点的可靠位置。点云看起来像这样:

在此处输入图像描述

以下是谷歌对点云的评价:

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

PointCloud使用以下代码:

Frame frame = session.update();

try (PointCloud pointCloud = frame.acquirePointCloud()) {
    // Accessing point cloud data.......
}
于 2019-04-17T18:03:24.387 回答