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 不會中斷。

相關主題