【问题标题】:Google ARCore Domain Model by ExampleGoogle ARCore 领域模型示例
【发布时间】:2025-12-17 03:25:05
【问题描述】:

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

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

根据Anchor的javadoc:

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

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

来自Pose的javadoc:

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

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

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


问题

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    由于这种失真,相对于世界的Pose 应被视为仅在返回它的帧期间有效。只要你下次打电话给update(),世界可能已经在那个姿势下重塑了,可能没用。如果您需要将位置保留得比框架长,请创建一个Anchor。只需确保removeAnchors()您不再使用的主播,因为每个直播主播都有持续的费用。

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

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

    这有帮助吗?

    【讨论】:

    • 这对伊恩(+1)肯定有很大帮助!但如果你不介意的话,我确实有一些后续问题。 (1) 当您说“A Pose 是一种结构化转换。它是从一个坐标系(通常是对象本地)到另一个坐标系(通常是世界)的固定数值转换...... ”你能给我一个简单的例子来说明你所说的“数值转换”是什么意思吗?您的意思是某物的本地 (x,y,z) 坐标可能是 (50,45,100),但它的世界坐标可能是 (2000,600,3000)。所以从本地 -> 世界翻译“姿势”可能是(1950,555,2900)?
    • @smeeb 1. 考虑在世界上的某个位置绘制一个 3D 模型。该模型有自己的局部坐标系,其中定义了多边形模型的 3D 顶点,模型可能居中/位于 0,0,0 并面向其中一个轴。要在世界中渲染它,您需要更改它所面对的方向(围绕原点旋转)并将其移动到虚拟对象的位置(平移)。 Pose 包含该信息。
    • @smeeb 2. 我提到的更改是getUpdatedAnchors()getUpdatedPlanes()isDisplayRotationChanged()。这些每个都捕获自上一个 update() 以来发生更改的项目或发生的更改事件。
    • @smeeb 3. ARCore 返回的每个Pose 描述了从某个局部坐标系到当前世界坐标系的转换。 Frame.getPose() 将相机坐标(0,0 在相机,-Z 沿着相机看的方向,+X 和 +Y 分别是显示右和显示向上)到当前世界坐标系(+Y 向上惯性) . getPointCloudPose() 而是返回从点云坐标系(无约束)到同一当前世界坐标系的变换。这告诉您如何将点云点转换为世界空间。
    • 非常感谢@Ian M(为所有 3 人 +1)。如果你能容忍我的话,我在这里有一个最后的(我承诺)后续问题:虽然我正在关注你在回答 # 时所说的大部分上面的3,我仍然没有看到“森林穿过树木”。您是否有机会给我 3 个简单的具体(现实世界)用例,以供何时使用:Frame#getPointCloud()Frame#getPose()Frame#getPointCloudPose()?再次感谢这里的所有帮助!
    【解决方案2】:

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

    ARCore – Session, Frame, Camera and Pose.

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

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

    以下是 Google 对 Point Cloud 的评价:

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

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

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

    【讨论】: