Table of Contents

Ar データフロー

この文書では、EasyAR Sense におけるデータフローについて説明します。EasyAR Sense ではコンポーネント化された API を使用し、コンポーネント間はデータフローで接続されます。

入力出力データ

fundamentals dataflow input output

InputFrame:入力フレーム。画像、カメラパラメータ、タイムスタンプ、ワールド座標系に対するカメラの変換、トラッキング状態を含みます。カメラパラメータ、タイムスタンプ、変換、トラッキング状態はオプションですが、特定のアルゴリズムコンポーネントは入力に特定の要件を持ちます。

OutputFrame:出力フレーム。入力フレームと同期処理コンポーネントの出力結果を含みます。

FeedbackFrame:フィードバックフレーム。入力フレームと過去の出力フレームを含み、ImageTracker などのフィードバック式同期処理コンポーネントで使用されます。

カメラコンポーネント

CameraDevice:Windows、Mac、iOS、Android 上のデフォルトカメラ。

ARKitCameraDevice:iOS 上の ARKit デフォルト実装。

ARCoreCameraDevice:Android 上の ARCore デフォルト実装。

MotionTrackerCameraDevice:モーション追跡を実装し、マルチセンサーフュージョンによりデバイスの 6DoF 座標を計算します(Android のみサポート)。

ThreeDofCameraDevice:デフォルトカメラに 3DoF の方向を追加します。

InertialCameraDevice:デフォルトカメラに 3DoF の方向と慣性推定に基づく平面の並進を追加します。

custom camera device:カスタムカメラ実装。

アルゴリズムコンポーネント

フィードバック式同期処理コンポーネント:カメラ画像ごとに結果を出力する必要があり、相互干渉を避けるために前フレームの処理結果を必要とします。

  • ImageTracker:平面画像の検出とトラッキングを実現します。

  • ObjectTracker:3D物体の検出とトラッキングを実現します。

同期処理コンポーネント:カメラ画像のフレームごとに結果を出力する必要があります。

  • SurfaceTracker:環境表面のトラッキングを実現します。

  • SparseSpatialMap:スパース空間マップを実現し、物理空間をスキャンしながら点群マップを生成し、リアルタイム位置推定を行う機能を提供します。

  • MegaTracker:Mega空間位置推定を実現します。

非同期処理コンポーネント:カメラ画像のフレームごとに結果を出力する必要はありません。

  • CloudRecognizer:クラウド認識を実現します。

  • DenseSpatialMap:密空間マップを実現し、衝突やオクルージョンなどの効果の実装に使用できます。

コンポーネントの可用性チェック

すべてのコンポーネントには isAvailable 関数があり、コンポーネントが使用可能か判断するために使用できます。

コンポーネントが利用できない状況:

  • 現在の OS で実装されていない
  • コンポーネントに必要な依存関係(ARKit、ARCore など)が存在しない
  • 現在のバージョン(variant)でコンポーネントが存在しない(例: 一部機能が存在しない軽量版)
  • 現在のライセンスでコンポーネントが利用不可

コンポーネント使用前には必ず可用性を判断し、適切な代替手段(fallback)や通知を行ってください。

データフロー

コンポーネントの接続方法を下図に示します。

fundamentals dataflow

フィードバックフレームを入力とする特殊な使用法を下図に示します。

fundamentals dataflow feedback

データフロー補助クラス

データフローの送信ポートと受信ポート。各コンポーネントはこれらのポートを含む必要があります。

データフローの分岐とマージ

  • InputFrameFork:1つの InputFrame を複数に分岐し、並列に発信。

  • OutputFrameFork:1つの OutputFrame を複数に分岐し、並列に発信。

  • OutputFrameJoin:複数の OutputFrame を1つにマージし、全ての結果を Results に結合。複数の入力接続は、データが流入している最中に行うべきではないことに注意(出力不能状態に陥る可能性あり)。(カメラ起動前にデータフロー接続を完了することを推奨。)

  • FeedbackFrameFork:1つの FeedbackFrame を複数に分岐し、並列に発信。

データフローのスロットリングとバッファリング

データフローの変換

InputFrame 数の制限

CameraDevice は bufferCapacity を設定でき、これは発行する InputFrame の最大数を表します。現在のデフォルト値は 8 です。

カスタムカメラは BufferPool を使用して実装できます。

各コンポーネントが必要とする InputFrame の数は、各コンポーネントの API ドキュメントを参照してください。

InputFrame の数が不足すると、データフローが詰まり、レンダリングが停止する可能性があります。

InputFrame が不足すると、初回起動時はレンダリングが停止しなくても、バックグラウンドへの切り替えやコンポーネントの一時停止/再開後にレンダリングが停止する場合があるため、テスト時にはこのケースをカバーする必要があります。

接続と切断

データフロー実行中の接続と切断は推奨されません。

実行中に接続と切断を行う必要がある場合は、切断可能なのは「橋渡しエッジ」(このエッジを削除するとデータフローが2つに分離する)のみであり、「ループエッジ」(データフローを無向グラフと見なした場合のループを構成するエッジ)、OutputFrameJoin の入力、または InputFrameThrottler の sideInput 上では行わないでください。そうしないと、OutputFrameJoinInputFrameThrottler などのノードでデータフローが詰まり出力できない状態になる可能性があります。

アルゴリズムコンポーネントには start/stop 機能があり、stop 時にはフレームは処理されませんが、結果なしでコンポーネントから出力されます。

典型的な使用法

以下は単一の ImageTracker の使用法で、非繰り返し平面認識画像の認識・追跡に使用できます。

fundamentals dataflow single ImageTracker

以下は単一の ImageTracker の使用法で、繰り返し平面認識画像の認識・追跡に使用できます。

fundamentals dataflow multiple ImageTracker

以下は SparseSpatialMap の使用法で、疎空間マップの構築・位置特定・追跡に使用できます。

fundamentals dataflow SparseSpatialMap

以下は SparseSpatialMapDenseSpatialMap の同時使用法で、疎空間マップの構築・位置特定・追跡と密空間マップの生成に使用できます。

fundamentals dataflow Sparse-DenseSpatialMap