マーカーシンクを使ってローカライズする

このドキュメントでは、ARDKを使用して、共有環境で複数のユーザーをローカライズするために、ユーザーにビジュアルマーカー(QRコードなど)をスキャンしてもらう方法について説明します。

ARDKで可能なその他のARローカライゼーションには環境中のオブジェクトのスキャンが含まれますが、これはユーザーにとって難しい状況となる場合があります。環境内のオブジェクトではなく、マーカーをスキャンした方が楽な場合が多く、この方法は、スキャンに適したオブジェクトが見つからない場合や取り込めない場合にも便利です。さらに、マーカーにはセッション情報を含めることもできるため、クライアントはマーカーをスキャンして特定の共有ARセッションに参加するだけでなく、そのセッションとの同期を行うことができます。

一般的に、マーカーを使用した同期では、環境を使用した同期よりも精度が低く、ピアの位置や方向がずれる場合があります。屋外など、スキャン可能なオブジェクトや特徴が少ない空間では、マーカーシンクを使用してください。

マーカーを使用して同期を行う

マーカーを使った同期は次のように行います。

  • ホストでマーカーデータを生成する

  • ホストでARNetworking.InitializeForMarkerScanningを呼び出し、マーカーを画面に表示する

  • 非ホストのクライアントはARNetworking.ScanForMarkerを使用し、ホストデバイスに表示されているマーカーをスキャンします。クライアントは結果をもとに、セッションへの参加や、共有セッションでのローカライゼーションを行います。クライアントのPeerStateが安定状態の場合は、クライアントがmarkersyncを使用して共有環境で正常にローカライゼーションを行ったことを意味します。

次のフローチャートは、基本フローと必要なAPIコールを示します。点線のボックスは、開発者が行う手順、実線のボックスは、ユーザーやプレイヤーが行う手順を示します。灰色部分は、同時に行われる手順を示します。

../../../_images/marker_sync_flowchart.png

マーカーの生成

IARNetworking.InitializeForMarkerScanningメソッドで必要なのは、マーカーの点の位置のみです。つまり、マーカーの生成や表示、解析、スキャンは、任意の方法で行うことができます。ただし、次の点に注意する必要があります。

  • マーカーが少なくとも4つの識別可能な点(例: QRコードの3つの位置点と1つのアライメント点)で構成されている

  • マーカーの点は、表示中は画面上で静止している

  • IMarkerScanner の実装によって、世界をスキャンしてマーカーを検出できる

    • 必要に応じて、IARNetworking.ScanForMarkerを呼び出して渡します。

    • 何も渡されない場合は、QRコードをスキャンするデフォルトの実装(ARFrameMarkerScanner)が使用されます。

  • IMarkerParser の実装によって、 IMarkerScanner で指定されたピクセル配列から MarkerMetadatabyte[] としてシリアライズ)を抽出できます。

    • ARFrameMarkerScanner を構築する際に必要に応じて渡します。

    • IMarkerScanner をカスタム実装する場合は必須です。

    • 何も渡されない場合、またはデフォルトの IMarkerScanner を使用する場合は、デフォルトの実装( ZXingBarcodeParser )が使用されます。これはマーカーがQRコードの場合のみ使用できます。

  • IMarkerParser と同様に実装することで、ホストから IARNetworking.InitializeForMarkerScanning を呼び出して登録される4点以上のマーカーの点を識別できます

  • IMetadataSerializer の実装によって、IMarkerParser から MarkerMetadata にバイトをデシリアライズできます。

    • 必要に応じて IARNetworking.ScanForMarker を呼び出して渡します。

    • 何も渡さない場合は、デフォルトの実装(BasicMetadataSerializer)が使用されます。

QRコードを利用して、複数のプレイヤーをマルチプレイヤーARセッションに素早く参加して同期を行うサンプルシーンは、 Assets/ARDKExamples/MarkerSyncARDKの使用例 プロジェクトを参照してください。

ヘルパー

  • ZXingMarkerGeneratorは、 MarkerMetadata でバーコードを生成し、IARNetworking.InitializeForMarkerScanning の呼び出しに必要な位置を計算する方法の例です。

  • BarcodeDisplayは、 ZXingMarkerGenerator で生成されたバーコードを表示するためにシーンに配置できるヘルパーコンポーネントです。

ベストプラクティス

  • デバイスのARトラッキング状態が最適化されたら、IARNetworking.ScanForMarkerを呼び出します。

    • トラッキング精度は、ARSessionの CurrentFrame.Camera.TrackingState で確認できます。一番高い精度は TrackingState.Normal です。

  • マーカーとの同期が完了しても、全プレイヤーが PeerState から Stable になるまで、プレイヤーは同じエリアを探し続けさせるようにしてください(マップを見つけて同期する可能性が高まります)。

    • マーカーシンクでは、ほぼ瞬時にプレイヤー間の同期を行うことができますが、ARDKの従来の同期方法のようにドリフト補正が有効ではありません。

    • マーカーシンクによって移行した状態 PeerState.Stabilizing でもプレイには問題ありませんが、高い信頼性で同期を行うには、マップを使用して PeerState.Stable に移行することをお勧めします。

マーカーシンクと共有環境のローカライゼーションを同時に使用する

なお、ARDKでは、環境同期とマーカーシンクの両方の同期情報を同時に収集できます。現在、ARDKではマーカー同期中もバックグラウンドで環境マッピングデータを収集しています。そのため、まずマーカーシンクですべてのクライアントの同期を迅速に行ってから、環境の同期を行うことで、精度を高めることができます。

これを行うには、まずマーカーシンクを行い、すべてのクライアントのPeerStateが安定状態になるようにします。その後、プレイヤーに環境をスキャンし、適度な時間、ローカライズを行うように指示します。ホストが安定状態に移行したら、環境がスキャンされたことを意味します。すべてのクライアントが安定状態に移行した場合は、その環境を使用してローカライズが完了したことを意味します。ホストまたはクライアントが適切な時間内に安定状態に移行しない場合は、デバイスはマーカーシンクを使用してすでに同期されているため、そのまま体験を続行できます。