空间大头针

要解决的问题

比例错误

虽然将全息影像与现实世界特征对齐的传统空间定位点方法在小范围时效果很好,但随着范围扩大到超过 1 米左右时,就会遇到困难。

头部跟踪空间的比例误差意味着,即使空间定位点使虚拟物体(只有几米长)的一端与现实世界的特征保持完美对齐,另一端也可能未与现实世界的相应特征对齐。 这种定位错误是因为穿过头部跟踪空间的距离往往不同于穿过物理空间的距离,误差范围为 +-10%。 实际错误通常较少(取决于许多环境和设备特性),但通常会很严重,并且随着项目规模的增长而无限增长。

换句话说,如果用户佩戴 HoloLens 在现实世界中行走 10 米,那么根据头部跟踪器的报告,其在虚拟空间中行走的距离将为 9-11 米。 如果用户行走 50 米,误差将增长到 +-5 米。 用户行走的距离越远,误差增长就越大。

因此,若(建模空间中)一个 10 米长光束的一端与实际空间中一个卷尺的零端完美对齐,则该光束的另一端对应于卷尺上 9-11 米之间的某个位置。

出于相同的原因,多个对象(每个对象都使用空间定位点锁定)在虚拟空间中的间距将不同于其在实际空间中的间距。

任意坐标系

还有一个问题。 HoloLens 中的 Unity 坐标系是不确定的。 它仅基于应用程序启动时的头部姿势。

对于许多任务来说,这种任意性不是问题。 如果目标是将射线投射到房间的空间映射中,然后将全息影像放在命中位置,则命中位置的数字值无关紧要。

同样,在用户周围弹出 UX 元素时,放置 UX 元素的绝对坐标并不重要,只有相对于用户的坐标才重要。

然而,更复杂的场景可能会因不可预测的坐标系而变得难以处理。 将大型对象集合(例如用户的桌面或整个办公室)加载到与物理空间有固定关系的虚拟空间中需要一些补偿转换,以将建模空间对象与基于头部的坐标框架对齐。

这种补偿通常通过将所有对象附加到单个 Unity 转换,然后调整该转换,使虚拟对象的位置和方向与现实世界保持一致来实现。

同样地,相机层次结构中的单个转换可用于重新对齐相机,以便当用户看到真实世界的参考点时,具有所需建模坐标的虚拟对象覆盖在该特征上。

解决方案

空间固定功能同时解决了这两个问题。 它利用 World Locking Tools 全局空间的世界锁定性质以及该空间的任意性来做到这一点。

将 Unity 空间与现实世界对齐

World Locking Tools 的核心提供一个稳定的世界锁定坐标系。 一个放置在世界锁定空间中的虚拟对象在与现实世界特征对齐后,将持续保持与现实世界特征对齐。

但是,有无限数量的空间可以满足该目标。 事实上,给定一个世界锁定空间,按任意位置和旋转转换它会产生另一个同样有效的世界锁定空间。

空间大头针功能应用了另一个约束,该约束消除了世界锁定转换的不确定性。

该约束是,当“接近”空间大头针时,该空间大头针在世界锁定空间中的姿势与建模空间中空间大头针的姿势相同。

假设以全局坐标 (0, 0, 1) 建模的 Unity 场景中有一个立方体。 将场景加载到 HoloLens 中时,该立方体将在初始头部姿势前方 1 米处显示。 根据初始头部姿势,它可能位于物理房间中的任何位置。

通过空间大头针,可将该立方体锁定到房间中的真实世界特征,例如特定桌子的角落。 与使用空间定位点锁定立方体不同,空间大头针会移动整个 Unity 空间,使立方体与桌角对齐。 例如,在 Unity 中相对于立方体建模的其他桌面项将适当地分散在真实桌面上。

解决比例错误

尽管单个空间大头针消除了虚拟坐标与现实世界之间的关系的不确定性,但它并未解决比例错误。

也就是说,虽然它可能已将原点移动到与物理世界对齐的位置和方向,但在现实世界中行走 10 米可能仍只能将用户在虚拟空间中移动 9 米。

为此,使用多个空间大头针可提供完整的解决方案。 当用户位于任何特定空间大头针附近时,世界将按照该空间大头针对齐。 其他空间大头针将不会对齐,但其距离较远,这通常被证明是可以接受的,并且通常难以察觉。

用户在空间大头针之间移动时,平滑内插可最大程度地减少任何给定空间点的比例误差。 使用足够密集的空间大头针作为参考点,现实世界和虚拟特征的错位可减少到头部跟踪器误差的数量级。

虽然所需的空间大头针的密度取决于环境支持的跟踪质量和应用程序的精度要求,但此处的一些数字可帮助设定预期。 在办公室环境中,若有足够的照明和可跟踪的可见特征,空间大头针之间 10 米的间距可将误差从 10 米范围内累计误差 10-20 厘米减少到毫米级(最大误差 l.t 0.5 厘米,端点误差 0.0 厘米)。

持久性

空间大头针与 World Locking Tools 的其他持久性协同工作。 从脚本调用保存和加载都有手动调用,每个会话都有自动保存和加载标志。

启用 World Locking Tools Manager 上的自动保存/自动加载功能后,可在后续会话中还原虚拟世界与现实世界之间的完全空间对齐。

在实践中,持久性意味着可以使用单个或少量的初步会话来建立对物理环境的充分扫描,并将该物理环境与 Unity 的建模坐标空间对齐。 然后,后续会话将加载与现实世界正确对齐的虚拟环境,而无需进一步的用户操作。

内插和外推

内插和外推都是在没有进行直接测量的情况下估计数据值的技术。 到目前为止所讨论的空间大头针是进行测量的位置。 虚拟坐标是所需的坐标,而物理坐标是我们希望这些虚拟坐标出现的测量坐标。

系统执行内插,但不进行外推,如下所述。 通常,内插比外推更安全、更稳定。 提供的分段线性内插可满足大多数应用程序的需求。 外推不太安全,其理想实现通常需要应用程序级别的知识。 因此,留给应用程序处理外推,如下所述。

如果应用程序不添加外插大头针,则在大头针边界外部,空间仅由最接近的边界处的值固定。 如果只有两个大头针 A 和 B,则当用户从 A 移动到 B 时,固定点位于 A 指定的对齐点与 B 指定的对齐点之间(内插)。 但是,当用户经过 B 时,固定点正好锁定到 B 指定的位置(常量扩展)。

内插

在大头针之间的 2D 区域中,空间定位是线性内插的。 如果准确放置空间大头针,并且跟踪错误均匀分布在区域中,则空间大头针之间应用的校正完全正确。

此处需要强调的是,等误差分布的假设是完全不正确的。 但是,作为近似值,线性模型提供了出色的校正结果。

外推

系统在空间大头针的凸包外使用常数值扩展,不提供内置外推服务。 这当然时错误的,这种近似相当于假设在应用程序提供的空间大头针外部没有比例误差。

但是,如果应用程序了解误差分布,或者对估计值感到满意,则其可以通过在外围添加更多空间大头针来创建所需的任何外推。

外推示例

考虑有一个包含四个空间大头针的场景,放置在一个边长为 4 米的正方形中。

现在,假设用户将在一个 12 米 x 12 米的实际空间中移动,物理标记对应于围绕空间中心的四个大头针。

如果应用程序对常量误差近似值感到满意,则其具有添加四个或更多空间大头针以覆盖整个 12x12 米空间所需的全部信息。

我们将按这个 4x4 正方形的基本方向(NE、NW、SW 和 SE)来标记其角落的大头针。 我们还将标记每个点的虚拟位置(virtualNE 等),以及每个点的物理位置(physicalNE 等)。

Four space pins

一种策略是添加外部基点,通过再添加四个基点(outerNE、outerNW、outerSW 和 outerSE)在内部正方形外围创建一个 12 米 x 12 米的正方形。 其中每个点的虚拟位置和物理位置都很容易计算。 以 outerNE 为例:

virtualOuterNE = virtualNE + (virtualNE - virtualSW);
physicalOuterNE = physicalNE + (physicalNE - virtualSW);

Eight space pins

创建 20x20 米的外推空间只会更改应用的增量比例:

scale = (outerSize - innerSize) / innerSize / 2;
virtualOuterNE = virtualNE + (virtualNE - virtualSW) * scale;
physicalOuterNE = physicalNE + (physicalNE - virtualSW) * scale;

如果 outerSize 为 20 米,innerSize 为 4 米,则比例为 2。

一种替代策略可能是除了角之外再添加 8 个点,如下所示。 基于现有的大头针位置计算新的大头针位置与上述方法完全相同。 请注意,虽然添加更多大头针通常可以提高稳定性,但不一定提高准确性。

Twelve space pins

对齐场景的子集

到目前为止,讨论涉及由 WorldLockingManager.GetInstance() 拥有和管理的全局 AlignmentManager。 如前所述,这将整个全局 Unity 坐标空间固定到战略参考点的物理特征上。

但是,有时会将同一概念应用于场景的子集。

例如,假设要加载两辆汽车的批注。 无法提前知道这两辆实体汽车的确切位置,因为它可能因不同经销商的布局而异。 但是,部署其中一辆实体车辆后,所有零部件相对于该部署姿势的位置是已知的。

在这种情况下,可以使用空间大头针来独立地固定每辆车的虚拟底盘和注释。 每辆车的整个虚拟表示形式可以在 Unity 中进行设置,然后在运行时映射到实体汽车。 这种对齐可以使用 MRTK UX 手动执行,也可以使用 QR 码或任何其他策略自动执行。 无论虚拟和物理参考点之间的对应数据如何确定,一旦这些数据通过空间固定 API 馈送到 WLT,WLT 就将以感知优化的方式使虚拟和物理对象保持对齐。

在对齐全局坐标空间的情况下,通过操纵调整节点(通常为相机的父级的父级)来进行对齐。 应将该节点视为保留供 WLT 使用。 任何其他对该转换的篡改都将导致未定义的行为。

同样,在对齐子树时,对齐需要在要对齐的子树的(子)根处拥有一个转换。 任何对该转换的外部篡改都将导致未定义的行为。

固定独立的空间之前,它们将随着固定全局空间而被拖动。 但是,一旦固定独立空间,就会将其视为固定到物理世界,因此后续修改全局空间到物理世界的固定不会对其产生影响。

另请参阅

另请参阅