Unity ar のエントリーポイント —— ar session
AR セッション(session)はすべての AR 機能のエントリーポイントです。以下の内容を通じて、AR Session の基本概念、構成、実行フロー、そしてそれが Unity AR Foundation の AR Session とどのような関係にあるのかを理解します。また、Unity において、EasyAR Sense のデータフローが実際にどのように機能するのかについても知ることができます。
Ar session とは
全ての AR プロセス(例:物体追跡)はネイティブライブラリ、つまり EasyAR Sense 内部で実行されます。session は Unity における AR 機能の主要なエントリーポイントです。物理カメラやセンサーからのデータ読み取り、現実世界の分析、シーン内の仮想カメラやその他のオブジェクトの移動・レンダリングの制御など、AR システムの動作プロセスと状態を管理します。
flowchart LR
A((画像<br>その他データ))
B[Session]
C([Camera])
O([Origin])
T([Target])
A --> B
B -. transform .-> C
B -. transform .-> O
B -. transform .-> T
[オプション] EasyAR の session と AR Foundation の session
EasyAR の session は Unity で EasyAR を使用する際のコアコンポーネントであり、サードパーティやシステムの AR 機能に依存せず独立して動作します。一方、AR Foundation の session は Unity XR フレームワークの一部であり、Unity XR プラグイン(ARKit や ARCore など)が提供する機能のみを使用できます。
flowchart TD
A1[EasyAR<br>AR Session]
A2[EasyAR Sense]
A1 --> A2
B1[AR Foundation<br>AR Session]
B2[ARKit Plugin]
B3[ARCore Plugin]
B1 --> B2
B1 --> B3
EasyAR を使用する場合、通常は AR Foundation を同時にインストールして使用する必要はありません。画像トラッキング機能やモーション・トラッキング機能などは、すべて EasyAR Sense によって独立して提供されます。
特定の場合、AR Foundation が提供する追加機能(一部デバイスでの平面検出など)やインターフェースを活用するために、EasyAR Sense と AR Foundation を併用する必要があるかもしれません。この場合、EasyAR Sense は AR Foundation が提供するインターフェースを介して Unity エンジンと連携します。
ただし、EasyAR はシステム AR よりも多くの機能とより完全なデバイス対応を提供しているため、AR Foundation を単独で使用しても EasyAR と同等の効果を得ることは通常できません。
Sessionの組成
典型的なsessionは主に以下の部分から構成されます:
- frame source:物理カメラ画像とセンサーデータを提供するコンポーネント。これらのコンポーネントはモーション追跡データも提供することがあります。例:CameraDeviceFrameSource および MotionTrackerFrameSource
- frame filter(s):特定のAR機能を提供するコンポーネント。例:ImageTrackerFrameFilter
- camera:シーン内の仮想カメラオブジェクト
- origin:モーション追跡の原点オブジェクト
注記
AR Foundationの概念では、モーション追跡は必須機能として扱われるため、常にoriginを提供します。
EasyARシステムでは、モーション追跡はオプション機能であるため、originもオプションです。
[オプション] session のデータフロー
データフロー は EasyAR Sense のコアコンセプトの一つです。Unity で AR アプリケーションを開発する際には影響しません。session の動作原理をより深く理解したい場合に、このセクションを参照してください。
Unity では、session は通常 EasyAR Sense のデータフローを表現します。
flowchart LR
S[Frame Source]
R[Input Frame Recorder<br>Video Input Frame Recorder]
ift[iFrameThrottler]
iff[iFrameFork]
i2f[i2FAdapter]
fb[fbFrameFork]
i2o[i2OAdapter]
FOT[Object Tracker]
FIT[Image Tracker]
FMT[Mega Tracker]
FSSM[Sparse Spatial Map]
FST[Surface Tracker]
FDS[Dense Spatial Map]
FCR[Cloud Recognizer]
ofj[oFrameJoin]
off[oFrameFork]
ofb[oFrameBuffer]
O(( ))
ODS(( ))
OCR(( ))
S ==> R ==> ift ==> iff
iff --> i2f
i2f --> fb
fb -.-> FOT -.-> ofj
fb -.-> FIT -.-> ofj
iff ==> i2o ==> ofj ==> off ==> ofb ==> O
iff -.-> FMT -.-> ofj
iff -.-> FSSM -.-> ofj
iff -.-> FST -.-> ofj
iff -.-> FDS -.-> ODS
iff -.-> FCR -.-> OCR
off --> i2f
ofb --> ift
このデータフローは session 起動プロセスで構築され、太字のデータパスを除く接続の有無は、起動時に有効化された AR コンポーネントに依存します。
したがって、session で有効化するコンポーネントを変更することで、データフローの構造と機能を柔軟に変更したり、複数の AR 機能を同時に有効化したりできます。この方法については次の段落で詳しく説明します。
セッションの流れ
flowchart LR
i[初期化<br>Initialize]
a[アセンブル<br>Assemble]
starta["起動(アセンブル済み)<br>StartSession(Assembled)"]
start[起動<br>StartSession]
update((更新<br>update))
stop[停止<br>StopSession]
di[初期化解除<br>Deinitialize]
i --> a --> starta --> update --> stop --> di
i --> start --> update
初期化
初期化はライセンスキーを使用してEasyAR Senseを起動するプロセスです。初期化前にはEasyAR Senseのインターフェースのごく一部のみが利用可能です。初期化後、AR機能がアクティブになります。アセンブル
アセンブルプロセスは設定オプションに基づき、シーンから適切なコンポーネントを選択し統合された作業単位に接続します。通常は起動時に自動実行されますが、事前に手動でアセンブルインターフェースを呼び出すことも可能です。アセンブル完了後、アセンブル済みセッションを起動することでプロセスをスキップし起動を高速化できます。
アセンブルはARコンポーネントと入力ソースの可用性を評価し、最適な入力ソースを選択する役割も持ちます。これにより現在のデバイスでセッションが実行可能か判断できます。アセンブルは2段階で進行:
- 第1段階: デバイスサポートリストの更新を開始し、設定待機時間後にアセンブルを実行。この時点でデバイスリスト更新が完了していればプロセス終了
- 第2段階: デバイスリスト更新完了後に実行。第1段階で利用可能フレームソースが存在せず、セッション起動に失敗した場合にフレームソースが利用可能になれば再起動を試行
デバイスリストの更新状態に関わらず、セッションは第1段階完了後も後続ステップを継続します。
起動
AR機能の実行を開始するプロセスです。起動前はARコンポーネントがデータを処理しません。正常起動後、セッションはシーン内オブジェクトの移動制御を開始し、一部入力ソースでは物理カメラ画像のレンダリングを制御します。更新
Unityのレンダリングループでフレーム毎に実行。現在のAR機能の実行結果に基づき、仮想カメラ(一部入力ソース)、原点、追跡ターゲットのtransformをフレーム毎に更新します。デバイスにより実行タイミングは異なりますが、必ずレンダリング前に実施されます。停止
AR機能の実行を終了します。シーン内オブジェクトは制御対象外となり、入力ソースデータの処理も停止します。初期化解除
グローバルリソースの一部を解放します(ダイナミックライブラリはアンロードされません)。初期化解除後、AR機能コンポーネントは利用不可となります。
注記
すべてのAR機能はARSession.StartSessionの実行後にのみ利用可能です。
Session のデフォルトライフサイクル
flowchart LR
uload("BeforeSceneLoad")
ustart("MonoBehaviour.Start")
udestroy("MonoBehaviour.OnDestroy")
oi{Initialize<br>OnStartup}
ostart{AutoStart}
i[初期化<br>Initialize]
start[開始<br>StartSession]
update((更新<br>update))
stop[停止<br>StopSession]
uload -.-> ustart -.-> udestroy
uload --> oi -. true .-> i
ustart --> ostart -. true .-> start
udestroy --> stop
i --> start --> update --> stop
session のライフサイクルは通常、インターフェース呼び出しのタイミングによって決定されます。デフォルト設定では、session は以下のタイミングで自動的に実行されます:
初期化(EasyARSettings.InitializeOnStartup ==
true)
自動初期化は Unity の BeforeSceneLoad タイミングで実行されます。開始(ARSession.AutoStart ==
true)
自動開始は session の MonoBehaviour.Start() タイミングで実行されます。停止
自動停止は session の MonoBehaviour.OnDestroy() タイミングで実行されます。
Session状態
ARSession.Stateはセッションの状態を記述します。セッションには以下の状態があります:
| 状態 | 説明 |
|---|---|
| None | 初期状態、セッションは起動もアセンブルもされていない |
| Broken | アセンブル失敗などによりセッションが破損した |
| Assembling | アセンブル中、通常数フレーム続く可能性がある |
| Assembled | アセンブル成功、ただしまだ起動されていない |
| Ready | セッションの起動成功、この状態は1フレームのみ持続 |
| Running | セッション動作中 |
| Paused | セッション一時停止中 |
通常、セッションの状態は起動や停止などのインターフェースを呼び出す際に変化します。実行中に重大なエラーが発生した場合、セッションはBroken状態に移行することもあります。Broken状態になったセッションは実行を再開できず、停止を呼び出した後、再起動する必要があります。
セッションの状態を通じて、現在のセッションが利用可能な状態かどうかを把握できます。ほとんどの機能はReadyまたはRunning状態でのみ使用可能です。
運動追跡状態
ARSession.TrackingStatus はセッションのモーショントラッキング状態を表し、デバイスの運動追跡の品質を示します。以下の状態があります:
| 状態 | 説明 |
|---|---|
| Optional<MotionTrackingStatus>.Empty | モーショントラッキング機能が有効でない、またはセッションが実行されていない |
| NotTracking | モーショントラッキング結果が利用不可(初期化中、追跡ロスト、再位置推定中の可能性あり) |
| Limited | モーショントラッキングは有効だが精度が低い(テクスチャ不足領域や高速移動が原因) |
| Tracking | モーショントラッキング品質が良好 |
注記
AR Foundation ではモーショントラッキングは必須機能であるため、その追跡状態はセッション状態と統合されています。
EasyAR システムではモーショントラッキングはオプション機能であるため、追跡状態は独立して存在し、空になる可能性があります。
その他の AR 機能のトラッキング状態はどこにあるか
AR 機能は複数のオブジェクトを同時にトラッキングする可能性があるため、画像トラッキング状態やその他の AR 機能のトラッキング状態はセッション内にはなく、トラッキング対象コンポーネント内にあります。
TargetController.IsTracked を使用してトラッキング対象がトラッキング状態にあるかどうかを確認したり、TargetController.TargetFound および TargetController.TargetLost イベントを使用してトラッキング状態が変化した際にアプリケーションコンテンツのロジックを調整したりできます。
次のステップ
セッションの作成
- シーン内での セッションの作成 を試す
実行の制御
- 初期化 の方法と役割を理解する
- 可用性とデバイスサポートの判断 方法を学ぶ
- セッション実行の制御 方法を理解する
コンポーネントと結果へのアクセス
- AR機能コンポーネントへのアクセス を試す
- セッションの実行結果の取得 方法を学ぶ
コンポーネントリファレンス
- ARSession コンポーネントリファレンス