我正在尝试阅读并理解 Google ARCore 的域模型,特别是安卓软件开发工具包包。目前该SDK位于“preview“模式,因此没有任何教程、博客、文章等可以帮助您了解如何使用该 API。甚至 Google 本身也建议仅阅读源代码、源代码注释和 Javadocs 来了解如何使用该 API。问题是:如果您还不是计算机视觉专家,域模型对您来说会感觉有点陌生和陌生。
具体来说,我有兴趣了解以下类之间的根本区别和正确用法:
- Frame
- Anchor
- Pose
- PointCloud
根据Anchor
的javadoc:
"描述现实世界中的固定位置和方向。为了保持在物理空间中的固定位置,该位置的数字描述将随着 ARCore 对空间的理解的提高而更新。使用 getPose() 获取该锚点的当前数字位置。该位置可能会在调用 update() 时随时更改,但永远不会自发更改。"
So Anchors have a Pose。听起来像你”放下一个锚”到相机中可见的物体上,然后 ARCore 跟踪该 Anchor 并不断更新其Pose
也许是为了反映其屏幕坐标的性质?
并从Pose
的javadoc:
"表示从一个坐标系到另一个坐标系的不可变刚性变换。正如所有 ARCore API 所提供的,姿势总是描述从对象的局部坐标系到世界坐标系的转换(见下文)...这些变化意味着每个帧都应被视为位于完全唯一的世界坐标系中。"
So it sounds like a Pose
是只有“当前帧”并且每次更新帧时,所有锚点的所有姿势都可能会重新计算?如果不是,那么锚点、其姿势、当前帧和世界坐标系之间的关系是什么?什么是姿势really, 无论如何? “姿势”只是存储矩阵/点数据的一种方式,以便您可以将锚点从当前帧转换为世界帧吗?或者是其他东西?
最后,我发现框架、姿势和锚点之间存在很强的相关性,但是还有PointCloud
。我唯一能看到里面的班级com.google.ar.core
使用这些的是Frame
. PointClouds
看起来是(x,y,z)- 与代表 ARCore 对 x/y/z 分量实际上正确的“置信度”的第四个属性进行协调。因此,如果锚点有一个姿势,我会想象一个姿势也会有一个代表锚点坐标和对这些坐标的置信度的点云。但姿势does not有一个点云,所以我一定完全误解了这两个类建模的概念。
问题
我在上面提出了几个不同的问题,但它们都归结为一个简单、简洁、可回答的问题:
Frame、Anchor、Pose 和 PointCloud 背后的概念有什么区别?您何时使用它们(以及用于什么目的)?
A Pose
是一个结构化的转变。它是从一个坐标系(通常是对象局部坐标系)到另一个坐标系(通常是世界坐标系)的固定数值变换。
An Anchor
代表世界上物理上固定的位置。它是getPose()
会随着对世界的理解的变化而更新。例如,假设您有一栋建筑物,外面有一条走廊。如果您沿着走廊一直走,传感器漂移会导致您无法到达开始时的相同坐标。但是,ARCore 可以(使用视觉特征)检测到它位于启动它的同一空间中。当这种情况发生时,它会扭曲世界,使您当前的位置和原始位置对齐。作为这种扭曲的一部分,锚点的位置也将被调整,以便它们保持在相同的物理位置。
由于这种扭曲,Pose
相对于世界的值应仅在返回的帧的持续时间内被视为有效。只要你打电话update()
下一次,世界可能会以这种姿势重塑,但可能毫无用处。如果您需要保留比框架更长的位置,请创建一个Anchor
。只要确保removeAnchors()
您不再使用的锚点,因为每个实时锚点都有持续的费用。
A Frame
捕获瞬间的当前状态以及两次调用之间的变化update()
.
PointCloud
s 是在世界中检测到的 3D 视觉特征点集。它们位于自己的局部坐标系中,可以从Frame.getPointCloudPose()
。希望比平面检测提供更好的空间理解的开发人员可以尝试使用点云来了解有关 3D 世界结构的更多信息。
这有帮助吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)