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 物體,修改 Service 下的選項可以調整連接的定位庫。該選項需要在 session 啓動前設置。

默認配置下,Access SourceGlobal Config,服務配置使用全局配置,服務參數可以在 Project Settings 中的 EasyAR > Sense > Mega > Mega Block 中進行修改,該配置會影響所有使用該全局配置的 session。

alt text

提示

服務配置可以從 EasyAR 開發中心獲取。
Mega Config Detail

如果需要在不同的 session 中使用不同的定位庫,可以將 Access Source 設置爲 API Key,然後在下方修改服務參數。

alt text

在腳本中,可以修改 MegaTrackerFrameFilter.ServiceAccessSourceMegaTrackerFrameFilter.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 不會中斷。

相關主題