ARKit之路-ARSession生命周期管理与跟踪质量

版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。

  ARSession整合运动传感器数据与计算机视觉处理数据跟踪用户设备姿态,为得到更好的跟踪质量,ARSession需要持续的运动传感器数据和视觉计算数据。在启动ARSession后,ARKit需要一点时间来收集足够多的视觉特征点信息,在这个过程中,ARSession是不可用的。在AR应用运行过程中,由于一些异常情况(如摄像头被覆盖),ARSession的跟踪状态也会发生变化,可以使用ARSessionObserver代理方法和ARCamera类的属性捕捉到这些状态变化信息,在需要时进行必要的处理(如显示UI信息)。

(一)ARSession生命周期

  ARSession的基本生命周期如下图所示,在刚启动ARSession时,ARKit还未收集到足够多的特征点和运动传感器数据信息,无法计算设备的姿态,这时的跟踪状态是不可用状态。提供给帧(frame)的状态信息是ARCamera.TrackingState.notAvailable。
在这里插入图片描述

  在经过几帧之后,跟踪状态会变为受限状态ARCamera.TrackingState.limited(),这个状态表明设备姿态已可用但精确可能会有问题,同时,ARKit会提供状态受限的原因,在上图中的原因是ARCamera.TrackingState.Reason.initializing,说明设备正在进行初始化。
  再经过一段时间后,跟踪状态会变为正常状态ARCamera.TrackingState.normal,这时说明ARKit已准备好,所有的功能都可用了。

(二)提供跟踪质量的反馈

  在AR应用运行过程中,由于环境的变化或者其他异常情况,ARKit的跟踪状态会发生变化,如下图所示。
在这里插入图片描述

  在ARKit状态受限时,基于环境映射的功能将不可用,如平面检测、射线检测、场景几何等。在AR应用运行过程中,由于用户环境变化或者其他异常情况,ARKit可能在任何时间进入到跟踪受限状态,如当用户将摄像头对准一面白墙或者房间中的灯突然关闭,这时ARKit就会进入到跟踪受限状态,且受限原因为:ARCamera.TrackingState.Reason.insufficientFeatures。
我们可以通过使用ARCamera.TrackingState.Reason枚举获取到跟踪状态受限的原因,然后引导用户进行下一步操作,以便恢复到正常跟踪状态(ARCamera.TrackingState.normal)。

(三)中断恢复

  在AR应用运行过程中,ARSession也有可能会被迫中断,如在使用AR应用的过程中突然来电话,这时AR应用将被切换到后台。当ARSession被中断后,虚拟元素与现实世界将失去关联。在ARKit中,ARSessionDelegate协议定义了3个可选(optional)方法,如下表所示,利用这个3方法可以获知ARSession中断状态,并定义中断后执行的操作。

名称 描述
sessionWasInterrupted(_ session: ARSession) 通知代理ARSession暂时执行图像处理和设备跟踪
sessionInterruptionEnded(_ session: ARSession) 通知代理ARSession已重新开始执行图像处理和设备跟踪
sessionShouldAttemptRelocalization(_ session: ARSession) -> Bool 询问代理是否执行重定位操作

  在中断发生后,ARKit会通过ARSessionDelegate协议的sessionShouldAttemptRelocalization()方法询问用户是否尝试恢复AR体验,ARKit尝试恢复世界跟踪的过程称为重定位(Relocalization),重定位如果成功,虚拟元素与现实世界的关联关系会恢复到中断前的状态,包括虚拟元素的姿态及虚拟元素与现实世界之间的相互关系,如果重定位失败,则虚拟元素与现实世界的原有关联关系被破坏。
  ARSessionDelegate协议的sessionShouldAttemptRelocalization()方法是个可选方法,因此,该方法执行时有以下几种可能性:

  (1)如果开发者没有执行sessionShouldAttemptRelocalization()方法,ARKit将自动尝试重定位,如果在指定时间内未能重定位成功,则重启ARSession;

  (2)如果开发者执行了sessionShouldAttemptRelocalization()方法并返回false,ARKit立即重启ARSession而不尝试重定位;

  (3)如果开发者执行了sessionShouldAttemptRelocalization()方法并返回ture,ARKit执行重定位操作,如果重定位失败,ARKit也不会自动重启ARSession(即AR应用会卡在重定位状态),所以,在执行sessionShouldAttemptRelocalization()方法后,开发人员需要自行负责处理重定位失败后的操作,通常在重定位失败后,可以选择手动重启ARSession,方法是调用ARSession.run(_:options:)方法,并设置options为resetTracking。

  在重定位过程中,ARSession的运动跟踪状态保持为受限状态,而受限的原因为ARCamera.TrackingState.Reason.relocalizing。重定位成功的前提条件是使用者必须返回到ARSession中断前的环境中,如果使用者已经离开,则重定位永远也不会成功(环境无法匹配),重定位失败后,ARSession会一直处在ARCamera.TrackingState.Reason.relocalizing导致的受限状态中。整个过程如下图所示。
在这里插入图片描述

  需要注意的是:重定位是一件容易让使用者困惑的操作,特别是对不熟悉AR应用、没有AR应用使用经验的使用者而言,重定位会让他们感到迷茫,所以在进行重定位时,应当通过UI或者其他视觉信息告之使用者,并引导使用者完成重定位操作。

ARSession状态ARCamera.TrackingState枚举如下表所示。

枚举项 描述
notAvailable 跟踪不可用,设备姿态未知
limited 跟踪可用,但质量无法保证
normal 设备姿态跟踪正常,功能可用

当跟踪状态为受限时的理由(Reason)ARCamera.TrackingState.Reason枚举如下表所示。

枚举项 描述
initializing 设备跟踪正在进行初始化操作
relocalizing ARSession正在进行重定位
excessiveMotion 设备移动过快
insufficientFeatures 从设备摄像头采集的图像中特征点太少

你可能感兴趣的:(ARKit之路)