Table of Contents

控制 Mega 跟踪过程

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

开始之前

tracker 的工作流程

tracker 的工作流程如下:

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

  subgraph localization_graph[初始定位]
    direction TB
    localize__{定位开启且<br>超过请求间隔}
    localize[云端定位]
    localize_{定位到 block 且<br>block 已加载}
    tracking_g[[跟踪]]
  end
  
  subgraph tracking_graph[跟踪]
    direction TB
    tracking[[持续跟踪]]
  
    localizet_{定位开启且<br>超过请求间隔}
    localize2[云端定位]
    localize2_{定位到 block 且<br>block 已加载}
    localization_g2[[初始定位]]
  end

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

  sstart --> create --> load --> init_g
  init --> init_ --> |Yes| localization_g
  localize --> localize_ --> |Yes| tracking_g
  localize_ --> |No| localize__ --> |Yes| localize
  unload --> dispose --> sstop
  init_ --> |No| init

  tracking --> localizet_ --> |Yes| localize2 --> localize2_ --> |Yes| tracking
  localizet_ --> |No| tracking
  localize2_ --> |No| localization_g2

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

流程大致分为几个阶段:

  • 启动:
    • 在 session 启动后,原生层的 tracker 会被创建。
    • target 自身 Start() 之后会被加载到对应 tracker 中。
  • 初始化:
    • 使用 6DoF frame source 时,会进入本地跟踪初始化过程。
    • 使用非 6DoF frame source 时,初始化阶段会被跳过,直接进入初始定位阶段。
    • 这个过程可能会花费一些时间,与场景复杂度和设备性能能力相关,且通常会与 frame source 底层使用的算法有关。
    • 默认配置下,这个阶段内容不会显示,可以通过 ActiveController 组件选项来控制这个行为。
  • 初始定位:
    • 如果定位开启且超过请求间隔,tracker 会向云端发起定位请求。
      • 定位成功后,如果定位服务返回的 id 所对应的 block 已加载,则进入跟踪阶段;如果 block 未加载,则继续等待 block 加载完成并等待下一次定位请求。
      • 定位失败后,tracker 会继续等待下一次定位请求。
    • 这个过程可能会花费一些时间,取决于场景易定位程度和网络状况。
    • 默认配置下,这个阶段内容不会显示,可以通过 ActiveController 组件选项来控制这个行为。
  • 跟踪:
    • tracker 会持续跟踪当前 block。
    • 如果定位开启且超过请求间隔,tracker 会向云端发起定位请求。
      • 定位成功后,如果定位服务返回的 id 未发生变化,则继续跟踪;如果 id 发生了变化且 block 已加载,则切换到新的 block 并继续跟踪;如果 id 发生了变化且 block 未加载,则继续等待 block 加载完成并等待下一次定位请求。
      • 定位失败后,tracker 会继续跟踪当前 block,并等待下一次定位请求。
    • 默认配置下,这个阶段只有处于跟踪状态(TargetController.IsTracked == true)的 target 节点下的内容会显示,可以通过 ActiveController 组件选项来控制这个行为。
  • 停止:
    • 在 session 停止后,target 被卸载,原生层的 tracker 会被销毁。

调整设备支持等级

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

alt text

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

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

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

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

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

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

了解当前系统状态

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

在定位成功时,Mega 服务信息下会包含 Found 状态文字;定位失败时,Mega 服务信息下会包含 NotFound 状态文字。

已经加载的 block 会显示为 Block [scnObj=<objName>] (<trackingStatus>): <name> (<id>)。其中 <objName> 是 block 对应的场景物体名称,<name> 是 block 的名称,<id> 是 block 的 ID。trackingStatus 可能为 TrackingNotTracking,分别表示当前 block 是否被跟踪中。

alt text alt text

在定位成功时,被定位到但未加载的 block 信息会显示成 Block [scnObj=?]: <name> (<id>)

alt text

提示

NotFound 是正常状态,在 Mega 工作的整个过程中经常会出现该状态,出现该状态时跟踪仍然在继续。通常应用开发中不需要对 NotFound 状态进行特殊处理。

使用 MegaTrackerFrameFilter.LocalizationRespond 事件可以获取当前的定位状态,从而了解系统当前是否找到了跟踪目标。

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

private void Awake()
{
    megaTracker.LocalizationRespond += HandleLocalizationStatusChange;
}
        
private void HandleLocalizationStatusChange(MegaLocalizationResponse response)
{
    var status = response.Status;
    wakingUpCount = status == MegaTrackerLocalizationStatus.WakingUp ? wakingUpCount + 1 : 0;
    if (wakingUpCount >= 5)
    {
        // 服务正在唤醒中,需要让终端用户等待
    }

    if (status == MegaTrackerLocalizationStatus.QpsLimitExceeded)
    {
        // QPS 超限,会随机有终端用户定位失败(总体跟踪质量下降)
        // 这时一般需要付费提升 QPS 上限以保障当前用户量下的跟踪质量
    }

    if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
    {
        // Token过期,这只会出现在使用 Token 接口访问服务时
        // 接近该问题需要应用请求自己的后台获取 Token,并调用 MegaTrackerFrameFilter.UpdateToken 进行更新
    }
}

如果应用经常遇到 MegaTrackerLocalizationStatus.RequestTimeout 状态,通常说明设备连接服务的网络状况不佳,建议优化网络环境以提升跟踪质量。在网络状况无法改善的场景下,可以考虑增加请求超时时间。

注意

无法通过该事件获取定位返回的 pose。

事实上,定位返回的 pose 在应用开发中是不需要的,EasyAR 会在定位返回后通过本地算法计算出更准确的 pose 并返回给开发者使用,而该 pose 已经体现在 block 的 transform 中,可以参考 获取 session 的运行结果

暂停和继续

Mega 的跟踪和定位功能可以分别暂停和继续。

暂停跟踪

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

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

暂停定位

设置 MegaTrackerFrameFilter.EnableLocalization 为 false 可以暂停定位。

警告

暂停定位会影响跟踪效果,一般不建议修改。请在 EasyAR 技术支持的指导下使用。

如果应用执行过程中定位被暂停过,向 EasyAR 反馈问题时请务必说明这一点。

服务和请求控制

可以通过修改 MegaTrackerFrameFilter 组件的参数来控制请求服务的行为。

请求间隔和超时

选中 session 下的 Mega Tracker 物体,修改 Request Time Parameters 下的选项可以调整请求服务的时间间隔和超时时间。

alt text

在脚本中,可以修改 MegaTrackerFrameFilter.RequestTimeParameters 来达到同样的效果。

警告

修改请求间隔会影响跟踪效果,一般不建议修改。请在 EasyAR 技术支持的指导下使用。

如果应用执行过程中请求间隔被修改过,向 EasyAR 反馈问题时请务必说明这一点。

切换定位库

使用 MegaTrackerFrameFilter.SwitchEndPoint 可以在运行时切换定位库。使用这个接口时相机画面及 session 不会中断。

相关主题