Table of Contents

Unity AR の入口 - AR Session

AR セッションはすべての 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: 物理カメラ画像とセンサーデータを提供するコンポーネントです。場合によってはモーショントラッキングデータも提供します。たとえば CameraDeviceFrameSourceMotionTrackerFrameSource です。
  • frame filter(s): ImageTrackerFrameFilter のような特定の AR 機能を提供するコンポーネントです。
  • camera: シーン内の仮想カメラオブジェクトです。
  • origin: モーショントラッキングの原点オブジェクトです。
注記

AR Foundation の概念では、モーショントラッキングは必須機能として扱われるため、常に origin が提供されます。
一方、EasyAR のシステムではモーショントラッキングは任意機能なので、origin も任意です。

[任意] session のデータフロー

EasyAR Sense の中核概念の 1 つが データフロー です。これは 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 機能を同時に有効化したりできます。これについては次の節で詳しく説明します。

session の流れ

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

  • 初期化
    初期化は、license key を使って EasyAR Sense を起動する処理です。初期化前に使える EasyAR Sense のインターフェースはごく一部だけです。初期化後に AR 機能が有効になります。

  • 組み立て(Assembling)
    組み立て処理は、組み立てオプションの設定に基づいてシーンから適切なコンポーネントを選び、それらを 1 つのまとまった作業単位として接続します。通常は起動時に自動で完了しますが、起動前に手動で組み立てインターフェースを呼び出して行うこともできます。組み立て完了後は、組み立て済みの session を起動することで組み立て段階を省略でき、起動を速くできます。
    組み立て処理には、AR コンポーネントと入力ソースの利用可能性を判定し、候補の入力から最適な入力ソースを選ぶ重要な役割もあります。この手順は、現在の session が今のデバイスで実行できるかどうかを判定するためにも使えます。

    組み立て処理は 2 段階に分かれます。

    1. 第 1 段階では、デバイスサポートリストの更新を開始し、設定された固定待機時間の後に組み立てを開始します。第 1 段階の待機中にデバイスサポートリストの更新が完了していれば、その時点で組み立ては終了します。
    2. そうでない場合は、第 2 段階に進み、デバイスサポートリストの更新完了後に実行されます。この段階で、利用可能な frame source が第 1 段階では利用不可だった状態から利用可能なものありに変わり、かつ session が第 1 段階後の起動に失敗していた場合は、session の再起動を試みます。

    第 1 段階でデバイス一覧の更新が完了したかどうかにかかわらず、session は第 1 段階完了後に後続処理を続行します。

  • 起動
    起動は AR 機能の実行を開始する処理です。起動前は AR 機能コンポーネントはデータを処理しません。正常に起動すると、session はシーン内の一部オブジェクトの移動を制御し、一部の入力ソースでは物理カメラ画像の描画も制御します。

  • 更新
    更新処理は Unity の描画ループの各フレームで実行されます。更新処理は、現在使われている AR 機能の結果に基づいて、毎フレーム仮想カメラ(一部の入力ソース)、原点、追跡ターゲットの transform を変更します。デバイスによって実行タイミングは異なりますが、必ず描画の前に実行されます。

  • 停止
    停止は AR 機能の実行を終了します。シーン内のオブジェクトは session による制御を受けなくなり、入力ソースのデータも処理されません。

  • 反初期化
    反初期化は一部のグローバルリソースを解放します(動的ライブラリはアンロードしません)。反初期化後は 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[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 は次のタイミングで自動実行されます。

session の状態

ARSession.State は session の状態を表します。session には次の状態があります。

状態 説明
None 初期状態。session は未起動または未組み立てです。
Broken 組み立て失敗などの理由で session が破損しています。
Assembling 組み立て中です。通常、この状態は数フレーム続くことがあります。
Assembled 組み立ては成功しましたが、まだ起動していません。
Ready session の起動に成功しました。この状態は 1 フレームしか続きません。
Running session が実行中です。
Paused session が一時停止しています。

通常、session の状態は起動や停止などのインターフェースを呼び出したときに変化します。実行中に重大なエラーが起きると、session は Broken 状態に入ることもあります。Broken 状態の session は復旧できないため、停止してから再起動する必要があります。

session の状態を見ることで、その session が使用可能な状態かどうかを判断できます。ほとんどの機能は Ready または Running のときにのみ使えます。

モーショントラッキング状態

ARSession.TrackingStatus は session のモーショントラッキング状態を表し、デバイスのモーショントラッキング品質を示します。状態は次のとおりです。

状態 説明
Optional<MotionTrackingStatus>.Empty モーショントラッキング機能が有効ではないか、session が実行中ではありません。
NotTracking モーショントラッキング結果が利用できません。初期化中、追跡ロスト、または再ローカライズ中の可能性があります。
Limited モーショントラッキングは有効ですが、結果はあまり良くありません。シーンのテクスチャが弱い、または動きが速すぎることが原因かもしれません。
Tracking モーショントラッキング品質は良好です。
注記

AR Foundation の概念では、モーショントラッキングは必須機能として扱われるため、その追跡状態は session の状態と統合されています。
一方、EasyAR のシステムではモーショントラッキングは任意機能なので、追跡状態は独立して存在し、空であることもあります。

他の AR 機能の追跡状態はどこにあるか

AR 機能は複数のオブジェクトを同時に追跡することがあるため、画像トラッキング状態や他の AR 機能の追跡状態は session にはなく、追跡ターゲットコンポーネント側にあります。

TargetController.IsTracked を使えば、追跡ターゲットが追跡状態にあるかどうかを確認できます。また、TargetController.TargetFoundTargetController.TargetLost イベントを使えば、追跡状態の変化に応じてアプリケーションの内容ロジックを調整できます。

後続手順

作成

実行の制御

コンポーネントと結果へのアクセス

コンポーネントリファレンス

  • ARSession コンポーネントリファレンス