Google ARCore域模型示例

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

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

  • Frame
  • Anchor
  • Pose
  • PointCloud

根据Anchor的javadoc:

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

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

Pose的javadoc:

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

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

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


这个问题

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

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

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

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

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

Frame捕获当前状态,并在两次update()调用之间进行更改。

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

这有帮助吗?

Interesting Posts