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

相關主題