Google ARCore 域模型示例

Google ARCore Domain Model by Example

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

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

根据 Anchor 的 javadoc:

"Describes a fixed location and orientation in the real world. To stay at a fixed location in physical space, the numerical description of this position will update as ARCore's understanding of the space improves. Use getPose() to get the current numerical location of this anchor. This location may change any time update() is called, but will never spontaneously change."

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

并且来自 Pose 的 javadoc:

"Represents an immutable rigid transformation from one coordinate frame to another. As provided from all ARCore APIs, Poses always describe the transformation from object's local coordinate frame to the world coordinate frame (see below)...These changes mean that every frame should be considered to be in a completely unique world coordinate frame."

所以它听起来像一个Pose是只有相机的“当前帧”才有的东西并且每次更新框架时,可能会重新计算所有锚点的所有姿势?如果不是,那么Anchor、它的Pose、当前坐标系和世界坐标系之间是什么关系?无论如何,姿势 真的 是什么? "Pose" 只是一种存储 matrix/point 数据的方式,以便您可以将锚点从当前框架转换为世界框架吗?还是别的?

最后,我发现帧、姿势和锚点之间存在很强的相关性,但还有 PointCloud。我在 com.google.ar.core 中看到的唯一 class 是 FramePointClouds 似乎是 (x,y,z) 坐标,第 4 个 属性 代表 ARCore 的 "confidence",x/y/z 组件实际上是正确的。因此,如果一个锚点有一个姿势,我会想象一个姿势也会有一个点云,代表锚点的坐标和对这些坐标的置信度。但是 Pose 没有 点云,所以我一定是完全误解了这两个 classes 模型的概念。


问题

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

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

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

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

由于这种扭曲,相对于世界的 Pose 应被视为仅在返回帧的持续时间内有效。一旦你下次调用 update(),世界可能已经重塑在那个姿势可能是无用的。如果您需要保留一个比帧长的位置,请创建一个 Anchor。请确保 removeAnchors() 个您不再使用的锚点,因为每个实时锚点都需要持续付费。

A Frame 瞬间捕获当前状态,并在两次调用 update().

之间发生变化

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

有帮助吗?

Using the following link you can find and answer about Frame, Anchor and Pose:

.

此外,这里有一个关于什么是Point Cloud的信息

Point Cloud 是世界 Space 中的视觉点云(通常为黄色),代表 3D 跟踪点的可靠位置在真实世界的物体上。点云看起来像这样:

下面是 Google 关于点云的说法:

PointCloud contains a set of observed 3D points and confidence values. This class implements Closeable and usually should be used in a Java try-with-resources or Kotlin use block, for example:

要获得 PointCloud 使用以下代码:

Frame frame = session.update();

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