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 節點下的內容都會隱藏。

相關主題