文章

管理会话生命周期并追踪质量

让用户能够清楚了解当前会话状态并在中断后恢复。

概览

现实场景追踪增强现实 (AR) 会话采用一种称为“视觉惯性里程计”的技术。这一过程将动作传感器数据和摄像头影像的计算机视觉分析相结合,从而追踪设备在现实世界中的位置和方向 (也称为位姿,用 ARCamera (英文) transform (英文) 属性表示)。为了获得最佳结果,现实场景追踪需要持续不断的传感器数据和具有视觉复杂性或可辨别特征的摄像头影像。

当你启动会话时,ARKit 需要一些时间来收集足够的数据,从而精确地为设备位姿建模。在会话期间,影响现实场景追踪质量的条件可能会发生变化。ARSessionObserver (英文) 委托方法和 ARCamera (英文) 属性可用来追踪这些变化。

增强现实会话的基本生命周期

下图显示了开始运行增强现实会话后追踪状态的变化情况。

ARKit 追踪状态顺序图,状态从不可用到受限 (正在初始化) 再到正常。

刚运行新会话时,给定帧的追踪状态为 ARCamera.TrackingState.notAvailable (英文),表示 ARKit 尚未收集到足够的信息来预估设备的位姿。

数帧过后,追踪状态变为 ARCamera.TrackingState.limited(_:) (英文),表示设备位姿已经可用,但准确性尚不确定。受限状态始终会包含追踪质量下降的原因;在这个例子中,会话仍处于 ARCamera.TrackingState.Reason.initializing (英文) 状态。

经过短暂的时间后,追踪状态变为 ARCamera.TrackingState.normal (英文),表示设备位姿准确,并且所有 ARKit 功能均可用。

针对追踪质量变化提供反馈

下图显示了用户互动或环境变化可能引起的追踪状态变化。

ARKit 追踪状态顺序图,状态从正常到受限 (特征不足) 再回到正常。

当追踪质量为 ARCamera.TrackingState.limited(_:) (英文) 时,依靠 ARKit 映射用户局部环境的功能无法使用:

  • 平面检测不会增加或更新平面锚点

  • 命中检测方法不提供任何结果

根据用户局部环境的变化或用户移动设备的情况,会话可能会随时进入 ARCamera.TrackingState.limited(_:) (英文) 追踪状态。例如,如果用户将设备指向一面空白墙壁,或者房间内的灯光熄灭,追踪质量可能会因为 ARCamera.TrackingState.Reason.insufficientFeatures (英文) 而下降。

这时可以使用关联的 ARCamera.TrackingState.Reason (英文) 值来提供反馈,指导用户解决这种情况,以便追踪状态可以恢复为 ARCamera.TrackingState.normal (英文)

从会话中断恢复

必须有正在运行的 ARSession (英文),ARKit 才能追踪设备位姿。默认情况下,如果会话中断 (例如,切换到另一个 App 时),这个会话中的虚拟内容有可能会相对于现实环境发生错位。

你可以使用“重定位”尝试从中断恢复。如果 sessionShouldAttemptRelocalization(_:) (英文) 方法返回 true,ARKit 会尝试使用当前的摄像头和传感器数据来协调中断前对用户环境的认知。在这个过程中,追踪状态为 ARCamera.TrackingState.limited(_:) (英文) (原因为 ARCamera.TrackingState.Reason.relocalizing (英文))。如果成功,追踪状态会很快恢复为 ARCamera.TrackingState.normal (英文)

追踪状态顺序图,会话中断前状态为正常,发生中断后状态从不可用到受限 (正在初始化) 再到受限 (正在重定位) 最后到正常。

要成功完成重定位,设备必须恢复为会话中断时它所在的大致位置和方向。如果不能满足这些条件 (例如,设备已经移到了完全不同的环境),会话会无限期保持 ARCamera.TrackingState.Reason.relocalizing (英文) 状态。

打造持续的增强现实体验

在 iOS 12.0 及更高版本中,ARWorldMap (英文) 类会储存 ARKit 用来恢复会话的信息。通过将现实场景地图存储到文件,便可以使用同一重定位流程来从短暂中断恢复,或者从之前的某个会话恢复,即使 App 已经重新启动过也不受影响。现实场景地图包含锚点,因此你还可以重新放置虚拟内容,以便与之前的会话保持一致。

追踪状态顺序图,先为正常,而后在 App 关闭前存储现实场景地图。在重新启动 App 并加载存储的地图时,追踪状态会从不可用到受限 (正在初始化) 再到受限 (正在重定位)。

为了让用户在退出 App 后能够回到同一个增强现实会话,你可以在用户进行某项操作时明确地存储现实场景地图,或者在 applicationDidEnterBackground(_:) (英文) 中自动存储。仅当增强现实会话具有值得存储的状态时,才应存储现实场景地图;例如,用户放置了虚拟物体,你想要记住这些物体的位置,并且会话处于 ARFrame.WorldMappingStatus.mapped (英文) 状态 (或在会话期间至少曾有过一次这样的状态)。

要重定位到存储的现实场景地图,应在运行会话时使用 initialWorldMap (英文) 属性。就像从中断恢复一样,会话以 ARCamera.TrackingState.limited(_:) (英文) (ARCamera.TrackingState.Reason.relocalizing (英文)) 追踪状态启动。如果 ARKit 能够协调现实场景地图与当前环境,追踪状态会很快变为 ARCamera.TrackingState.normal (英文),表示会话与录制的现实场景地图一致。

从现实场景地图恢复的会话包含对应现实场景地图中存储的所有锚点。如果你使用 name (英文) 属性来标识放置了锚点的虚拟物体,可以在恢复的会话中参考锚点来重现相应的虚拟内容。为确保正确放置这类内容,请仅在会话追踪状态变为 ARCamera.TrackingState.normal (英文) 后显示它们。

如果 ARKit 不能协调录制的现实场景地图和当前环境 (例如,如果设备进入了与录制现实场景地图时所在环境完全不同的地方),会话会无限期保持 ARCamera.TrackingState.Reason.relocalizing (英文) 状态。请向用户提供一种方法,供他们在无法恢复时重新启动会话。要放弃现实场景地图重定位,请在会话上再次调用 run(_:options:) (英文),并使用 resetTracking (英文) 选项和 initialWorldMap (英文)nil 的配置。

另请参阅

基础知识

选择要增强的摄像头源

通过前置或后置摄像头对用户的环境进行增补。

验证设备支持和用户权限

检查你的 App 是否能使用 ARKit 并在运行时尊重用户隐私。

class ARSession (英文)

用于控制增强现实体验的主要对象。

class ARConfiguration (英文)

这个对象用于定义给定时间在会话中启用的特定 ARKit 功能。

class ARAnchor (英文)

关注对象在物理环境中的位置和方向。