控制 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 狀態