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 会被销毁。

调整设备支持等级

MegaTrackerFrameFilter 的 MegaTrackerFrameFilter.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 可能为 Tracking 或 NotTracking,分别表示当前 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 物体,修改 Service 下的选项可以调整连接的定位库。该选项需要在 session 启动前设置。

默认配置下,Access Source 是 Global Config,服务配置使用全局配置,服务参数可以在 Project Settings 中的 EasyAR > Sense > Mega > Mega Block 中进行修改,该配置会影响所有使用该全局配置的 session。

alt text

提示

服务配置可以从 EasyAR 开发中心获取。
Mega Config Detail

如果需要在不同的 session 中使用不同的定位库,可以将 Access Source 设置为 API Key,然后在下方修改服务参数。

alt text

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

比如,下面的代码展示了如何在 session 启动前配置 tracker 使用运行时参数连接服务:

megaTracker.ServiceType = easyar.MegaApiType.Block;
megaTracker.ServiceAccessSource = easyar.MegaServiceAccessSourceType.APIKey;
megaTracker.ServiceAccessData = new easyar.APIKeyAccessData
{
    ServerAddress = serverAddress,
    APIKey = apiKey,
    APISecret = apiSecret,
    AppID = appID
};

请求间隔和超时

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

alt text

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

警告

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

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

切换定位库

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

相关主题