Google ARCore域模型示例

问题描述 投票:4回答:2

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

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

根据Anchor的javadoc:

“描述现实世界中的固定位置和方向。为了保持在物理空间中的固定位置,当ARCore对空间的理解得到改善时,该位置的数字描述将更新。使用getPose()获取当前数字位置任何时候调用update()都会改变这个位置,但永远不会自发地改变。“

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

来自Pose的javadoc:

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

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

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


The question

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

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

computer-vision augmented-reality arcore android-sdk-2.3 android-augmented-reality
2个回答
7
投票

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

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

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

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

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

这有帮助吗?


0
投票

使用以下链接,您可以找到并回答有关FrameAnchorPose的信息:

ARCore – Session, Frame, Camera and Pose

另外,这里是关于什么是Point Cloud的信息:

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

enter image description here

以下是谷歌关于Point Cloud的说法:

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

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

Frame frame = session.update();

try (PointCloud pointCloud = frame.acquirePointCloud()) {
    // Accessing point cloud data.......
}
© www.soinside.com 2019 - 2024. All rights reserved.