控制 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 会向云端发起定位请求。
- 跟踪:
- tracker 会持续跟踪当前 block。
- 如果定位开启且超过请求间隔,tracker 会向云端发起定位请求。
- 定位成功后,如果定位服务返回的 id 未发生变化,则继续跟踪;如果 id 发生了变化且 block 已加载,则切换到新的 block 并继续跟踪;如果 id 发生了变化且 block 未加载,则继续等待 block 加载完成并等待下一次定位请求。
- 定位失败后,tracker 会继续跟踪当前 block,并等待下一次定位请求。
- 默认配置下,这个阶段只有处于跟踪状态(TargetController.IsTracked ==
true)的 target 节点下的内容会显示,可以通过 ActiveController 组件选项来控制这个行为。
- 停止:
- 在 session 停止后,target 被卸载,原生层的 tracker 会被销毁。
调整设备支持等级
MegaTrackerFrameFilter 的 MegaTrackerFrameFilter.MinInputFrameLevel 属性用于指定 Mega 支持的最低设备等级。
![]()
Mega 可以在几乎所有类型的帧数据源上运行,但不同的帧数据源对跟踪效果有不同的影响。
默认情况下,Mega 会选择设备支持的最高等级的帧数据源进行跟踪。默认配置下的支持 Mega 的 session 已经配置了支持 6DoF 和 5DoF 的帧数据源。
在 Mega 运行时要支持某个等级的帧数据源需要满足两个条件:
- 所需的帧数据源在 session 的可选帧数据源组中。
- MegaTrackerFrameFilter.MinInputFrameLevel 大于或等于所需的帧数据源的 CameraTransformType 等级。
比如,要在默认 session 中支持 3DoF 跟踪,需要:
- 添加 ThreeDofCameraDeviceFrameSource 到 session 的帧数据源组中。
- 修改 MegaTrackerFrameFilter.MinInputFrameLevel 为 ThreeDof。
又比如,要在默认 session 中删除 5DoF 跟踪支持,需要:
- 从 session 的帧数据源组中删除 InertialCameraDeviceFrameSource。
- 修改 MegaTrackerFrameFilter.MinInputFrameLevel 为 SixDof(即使不修改,由于没有 5DoF 帧数据源,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 是否被跟踪中。
![]()
在定位成功时,被定位到但未加载的 block 信息会显示成 Block [scnObj=?]: <name> (<id>)。
![]()
提示
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 下的选项可以调整请求服务的时间间隔和超时时间。
![]()
在脚本中,可以修改 MegaTrackerFrameFilter.RequestTimeParameters 来达到同样的效果。
警告
修改请求间隔会影响跟踪效果,一般不建议修改。请在 EasyAR 技术支持的指导下使用。
如果应用执行过程中请求间隔被修改过,向 EasyAR 反馈问题时请务必说明这一点。
切换定位库
使用 MegaTrackerFrameFilter.SwitchEndPoint 可以在运行时切换定位库。使用这个接口时相机画面及 session 不会中断。
相关主题
- 适用于 Mega 的 AR Session 最佳实践 介绍了如何创建和配置适用于 Mega 的 AR Session
- 添加 Mega 跟踪目标 介绍了如何添加 Mega 的跟踪目标 block 以及如何在 Unity 编辑器中加载 block 模型以辅助开发
- 添加一组帧数据源 介绍了如何修改 session 的帧数据源组
- 获取 session 的运行结果 介绍了如何获取 session 组件的跟踪结果
- UI 消息 介绍了如何使用 UI 消息来显示 session 状态