Table of Contents

控制 Mega Go 跟踪过程

本文介绍了如何控制 Mega Go 跟踪过程中的各项功能和参数,以满足不同应用场景的需求。

开始之前

tracker 的工作流程

tracker 的工作流程如下:

flowchart LR
  subgraph startup_graph[启动]
    direction TB
    sstart((session 启动))
    create[原生创建]
    load(加载 target)
    verify[试用校验]
    init_g[[初始化]]
  end
  
  subgraph init_graph[初始化]
    direction TB
    init_{6DoF 初始化成功<br>或非 6DoF}
    init[[本地跟踪初始化过程]]
    detecting[[检测]]
    tracking_g[[跟踪]]
  end

  subgraph tracking_graph[跟踪]
    direction TB
    tracking[[持续跟踪]]
  end

  subgraph stopping_graph[停止]
    direction TB
    unload(卸载 target)
    dispose[原生销毁]
    sstop([session 停止])
  end

  sstart --> create --> load --> verify --> init_g
  init --> init_ --> |Yes| detecting --> tracking_g
  unload --> dispose --> sstop
  init_ --> |No| init

  startup_graph --> init_graph
  init_graph --> tracking_graph
  tracking_graph --> stopping_graph

流程大致分为几个阶段:

  • 启动:
    • 在 session 启动后,原生层的 tracker 会被创建。
    • target 自身 Start() 之后会被加载到对应 tracker 中。
    • 对于试用数据,需要联网验证试用资格,验证成功后才会进入后续阶段。
  • 初始化:
    • 使用 6DoF frame source 时,会进入本地跟踪初始化过程。
      • 本地跟踪初始化可能会花费一些时间,与场景复杂度和设备性能能力相关,且通常会与 frame source 底层使用的算法有关。
    • 使用非 6DoF frame source 时,本地跟踪初始化阶段会被跳过,直接开始检测。
    • 检测过程可能会花费一些时间,取决于场景易定位程度和数据采集建图质量。
    • 默认配置下,这个阶段内容不会显示,可以通过 ActiveController 组件选项来控制这个行为。
  • 跟踪:
    • tracker 会持续跟踪当前 block。
    • 默认配置下,这个阶段只有处于跟踪状态(TargetController.IsTracked == true)的 target 节点下的内容会显示,可以通过 ActiveController 组件选项来控制这个行为。
  • 停止:
    • 在 session 停止后,target 被卸载,原生层的 tracker 会被销毁。

调整设备支持等级

MegaGoTrackerFrameFilterMegaGoTrackerFrameFilter.MinInputFrameLevel 属性用于指定 Mega 支持的最低设备等级。

alt text

Mega Go 可以在几乎所有类型的帧数据源上运行,但不同的帧数据源对跟踪效果有不同的影响。

默认情况下,Mega 会选择设备支持的最高等级的帧数据源进行跟踪。默认配置下的支持 Mega Go 的 session 已经配置了支持 6DoF 和 5DoF 的帧数据源。

在 Mega 运行时要支持某个等级的帧数据源需要满足两个条件:

比如,要在默认 session 中支持 3DoF 跟踪,需要:

又比如,要在默认 session 中删除 5DoF 跟踪支持,需要:

在没有满足条件的帧数据源可用时,session 组装会失败。

了解当前系统状态

在默认 session 配置下,UI 消息 会显示在屏幕上,其中包含了 Mega Go 状态信息。

Tracker 状态会显示在 Mega Go: 旁边,比如 TrackingVerifyingTrial 等。在检测和跟踪过程中,下方还会显示定位更新。

alt text

当前加载的 block 的跟踪状态会显示在 Mega Go: 下方,显示为 Block (<trackingStatus>): <name> (<id>)。其中 <name> 是 block 的名称,<id> 是 block 的 ID。trackingStatus 可能为 TrackingNotTracking,分别表示当前 block 是否被跟踪中。

alt text

使用 MegaGoTrackerFrameFilter.Status 属性可以获取当前状态,从而了解跟踪器的运行情况。在出现错误状态时,可以通过 MegaGoTrackerFrameFilter.Error 来获取错误状态,并进行相应的处理。

以下代码展示了如何使用这些属性,以及常见的需要应用关注的异常状态的处理方法:

void HandleTrackerStatus()
{
    if (tracker.Status == MegaGoTrackerStatus.Error)
    {
        if (tracker.Error == MegaGoTrackerError.ServiceVerificationFailed)
        {
            // 服务校验未通过,建议检查数据是否到期或失效(测试版转成正式版之后,测试版数据会失效)。
        }
        else if (tracker.Error == MegaGoTrackerError.LocalVerificationFailed)
        {
            // 本地校验未通过,建议检查 target 文件是否完整。
        }
        else
        {
            // 其它错误。
        }
    }
    else if (tracker.Status == MegaGoTrackerStatus.VerifyingTrial)
    {
        // 试用 target 校验中。如果长时间无法完成验证,建议检查网络连接。
    }
    else if (tracker.Status == MegaGoTrackerStatus.VIOInitializing)
    {
        // VIO 输入初始化中。如果长时间无法完成初始化,建议提示用户优化使用方法。
        // 比如:“请尝试摄像头朝向斜前方,携带设备身体左右大幅移动 5 次。”
    }
}

使用 MegaGoTrackerFrameFilter.LocalizationRespond 事件可以获取定位更新。

暂停和继续

设置 MegaGoTrackerFrameFilter.enabled 为 false 可以暂停跟踪。

默认在跟踪暂停后,所有 block 节点下的内容都会隐藏。

相关主题