Mega トラッキングプロセスの制御
本文では、Mega トラッキングプロセスのさまざまな機能とパラメータを制御し、さまざまなアプリケーションシーンのニーズを満たす方法について説明します。
開始する前に
- 私のローカライズライブラリは使用可能ですか? を確認してください。
Trackerのワークフロー
trackerのワークフローは以下の通りです:
flowchart LR
subgraph startup_graph[起動]
direction TB
sstart((session起動))
create[ネイティブ作成]
load(ターゲットの読み込み)
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_{ブロックに位置決めされ、<br>ブロックが読み込まれた}
tracking_g[[トラッキング]]
end
subgraph tracking_graph[トラッキング]
direction TB
tracking[[継続的なトラッキング]]
localizet_{位置決めが有効で<br>要求間隔を超えた}
localize2[クラウド位置決め]
localize2_{ブロックに位置決めされ、<br>ブロックが読み込まれた}
localization_g2[[初期位置決め]]
end
subgraph stopping_graph[停止]
direction TB
unload(ターゲットのアンロード)
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が作成されます。
- ターゲット自身の Start() の後、対応するtrackerに読み込まれます。
- 初期化:
- 6DoFフレームソースを使用する場合、ローカルトラッキングの初期化プロセスに入ります。
- 非6DoFフレームソースを使用する場合、初期化段階はスキップされ、直接初期位置決め段階に入ります。
- このプロセスには時間がかかる場合があり、シーンの複雑さとデバイスの性能に関係し、通常はフレームソースの底層で使用されるアルゴリズムに関係します。
- デフォルト設定では、この段階の内容は表示されませんが、ActiveController コンポーネントのオプションでこの動作を制御できます。
- 初期位置決め:
- 位置決めが有効で要求間隔を超えた場合、trackerはクラウドに位置決め要求を送信します。
- 位置決めに成功した場合、位置決めサービスが返すIDに対応するブロックが読み込まれていれば、トラッキング段階に入ります。ブロックが読み込まれていない場合は、ブロックの読み込みが完了するのを待ち、次の位置決め要求を待ちます。
- 位置決めに失敗した場合、trackerは次の位置決め要求を待ちます。
- このプロセスには時間がかかる場合があり、シーンの位置決めのしやすさとネットワーク状況に依存します。
- デフォルト設定では、この段階の内容は表示されませんが、ActiveController コンポーネントのオプションでこの動作を制御できます。
- 位置決めが有効で要求間隔を超えた場合、trackerはクラウドに位置決め要求を送信します。
- トラッキング:
- trackerは現在のブロックを継続的にトラッキングします。
- 位置決めが有効で要求間隔を超えた場合、trackerはクラウドに位置決め要求を送信します。
- 位置決めに成功した場合、位置決めサービスが返すIDが変化しなければ、トラッキングを続けます。IDが変化し、ブロックが読み込まれていれば、新しいブロックに切り替えてトラッキングを続けます。IDが変化し、ブロックが読み込まれていない場合は、ブロックの読み込みが完了するのを待ち、次の位置決め要求を待ちます。
- 位置決めに失敗した場合、trackerは現在のブロックを引き続きトラッキングし、次の位置決め要求を待ちます。
- デフォルト設定では、この段階ではトラッキング状態(TargetController.IsTracked ==
true)のターゲットノード以下の内容のみが表示されますが、ActiveController コンポーネントのオプションでこの動作を制御できます。
- 停止:
- sessionが停止した後、ターゲットがアンロードされ、ネイティブ層のtrackerが破棄されます。
デバイスサポートレベルの調整
MegaTrackerFrameFilter の MegaTrackerFrameFilter.MinInputFrameLevel プロパティは、Mega がサポートする最低のデバイスレベルを指定するために使用されます。
![]()
Mega はほぼすべてのタイプのフレームデータソースで動作できますが、異なるフレームデータソースはトラッキング効果に異なる影響を与えます。
デフォルトでは、Mega はデバイスがサポートする最高レベルのフレームデータソースを選択してトラッキングを行います。デフォルト設定でのMegaをサポートするセッション は、6DoF と 5DoF をサポートするフレームデータソースがすでに設定されています。
Mega の実行時に特定のレベルのフレームデータソースをサポートするには、2つの条件を満たす必要があります。
- 必要なフレームデータソースがセッションの選択可能なフレームデータソースグループに含まれていること。
- MegaTrackerFrameFilter.MinInputFrameLevel が必要なフレームデータソースの CameraTransformType レベル以上であること。
たとえば、デフォルトのセッションで 3DoF トラッキングをサポートするには、以下が必要です。
- ThreeDofCameraDeviceFrameSource をセッションのフレームデータソースグループに追加する。
- MegaTrackerFrameFilter.MinInputFrameLevel を ThreeDof に変更する。
また、たとえば、デフォルトのセッションで 5DoF トラッキングのサポートを削除するには、以下が必要です。
- InertialCameraDeviceFrameSource をセッションのフレームデータソースグループから削除する。
- MegaTrackerFrameFilter.MinInputFrameLevel を SixDof に変更する(変更しなくても、5DoF のフレームデータソースがないため、5DoF は使用されません)。
条件を満たすフレームデータソースが利用できない場合、セッションの組み立てに失敗します。
現在のシステム状態を理解する
デフォルトのセッション設定では、UI メッセージ が画面に表示され、そこには Mega の追跡状態に関する情報が含まれています。
位置特定に成功すると、Mega サービス情報に Found という状態の文字が含まれます。位置特定に失敗すると、Mega サービス情報に NotFound という状態の文字が含まれます。
読み込まれたブロックは Block [scnObj=<objName>] (<trackingStatus>): <name> (<id>) として表示されます。ここで <objName> はブロックに対応するシーンオブジェクト名、<name> はブロックの名前、<id> はブロックの ID です。trackingStatus は Tracking または NotTracking のいずれかで、それぞれ現在のブロックが追跡中かどうかを表します。
![]()
位置特定に成功すると、位置特定されたが読み込まれていないブロックの情報は 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) を取得することはできません。
実際、アプリケーション開発において位置特定の結果として返される姿勢は必要ありません。EasyAR は位置特定の結果を受け取った後、ローカルアルゴリズムを使用してより正確な姿勢を計算し、開発者に提供します。この姿勢はブロックの transform に反映されており、セッションの実行結果の取得 を参照してください。
一時停止と再開
Megaの追跡と位置特定機能は、それぞれ一時停止と再開ができます。
トラッキングの一時停止
MegaTrackerFrameFilter.enabled を false に設定すると、トラッキングを一時停止できます。
デフォルトでは、トラッキングが一時停止されると、すべての block ノード下の内容が非表示になります。
位置決定の一時停止
MegaTrackerFrameFilter.EnableLocalization を false に設定することで、位置決定を一時停止できます。
警告
位置決定を一時停止するとトラッキングの効果に影響を与えるため、一般的には変更を推奨しません。EasyAR の技術サポートの指導のもとで使用してください。
アプリの実行中に位置決定が一時停止された場合、EasyAR に問題をフィードバックする際に必ずこの点を明記してください。
サービスとリクエスト制御
MegaTrackerFrameFilter コンポーネントのパラメータを変更することで、サービスへのリクエストの動作を制御できます。
リクエスト間隔とタイムアウト
session 下の Mega Tracker オブジェクトを選択し、Request Time Parameters 下のオプションを変更することで、サービスへのリクエストの時間間隔とタイムアウト時間を調整できます。
![]()
スクリプトでは、MegaTrackerFrameFilter.RequestTimeParameters を変更することで同じ効果を得ることができます。
警告
リクエスト間隔を変更するとトラッキングの効果に影響を与えるため、一般的には変更をおすすめしません。EasyAR の技術サポートの指導の下で使用してください。
アプリケーションの実行中にリクエスト間隔が変更された場合、EasyAR に問題をフィードバックする際に必ずこの点を明記してください。
位置決めライブラリの切り替え
MegaTrackerFrameFilter.SwitchEndPoint を使用すると、実行時に位置決めライブラリを切り替えることができます。このインターフェイスを使用するとき、カメラ画面とセッションは中断されません。
関連主題
- Mega 用の AR Session のベストプラクティス は、Mega 用の AR Session を作成および構成する方法を紹介しています。
- Mega トラッキングターゲットの追加 は、Mega のトラッキングターゲットブロックを追加する方法と、開発を支援するために Unity エディターでブロックモデルを読み込む方法を紹介しています。
- 一連のフレームデータソースの追加 は、セッションのフレームデータソースグループを変更する方法を紹介しています。
- セッションの実行結果の取得 は、セッションコンポーネントのトラッキング結果を取得する方法を紹介しています。
- UI メッセージ は、セッションの状態を表示するために UI メッセージを使用する方法を紹介しています。