🌏

Geospatial APIを用いたロケーションベースARのイテレーションを効率的に回す方法

2022/08/19に公開

KeyVisual

概要

2022年5月に行われたGoogle I/Oにて、「Geospatial API」というVPS(Visual Positioning Service/System)が発表されました。これまでのVPSとは異なり、事前スキャンの必要がなく、さらに精度も高いことから一躍脚光を浴びる存在となっています。

そんなGeospatial APIによって盛り上がりを見せているVPSですが、位置に紐づくという性質上デバッグのイテレーションが回しづらいという問題があります。そこでこの記事では、Geospatial APIと同じARCoreから提供されているRecording & Playback APIを用いて、2回目以降現地に行かずにロケーションベースARのデバッグを行う方法を紹介します。

Recording & Playback APIとは

Recording & Playback APIを使ってロケーションベースARの開発をすると、現地でのカメラ画像やセンサデータを記録し、再生することで2回目以降現地に行かずともデバッグができてしまいます。録画処理を担当するRecording API は、カメラの動画ストリーム、IMU データ(3次元の角速度と加速度)、その他任意のカスタムメタデータをMP4ファイルに保存するAPIです。つまり、環境認識や自己位置推定に必要とされているリアルタイムデータをまるっと保存してくれる機能といえます。
そして、これらの録画されたビデオを Playback API 経由で ARCore に供給すると、MP4 を通常のライブセッションのフィードと同様に扱ってくれます。

https://developers.google.com/ar/develop/recording-and-playback

今回やること

Geospatial APIとRecording & Playback APIを用いて、本来現地に行って確認する必要のあるデバッグ作業を自宅で体験します。今回想定するデバッグは、出現させる3Dモデルの変更と位置の修正です。ぜひ現地に行かずにデバッグが完了することを確認してください!

準備するものリスト

準備するものは以下です。

  • Geospatial API対応のスマートフォン(詳しくはARCore公式ページをご確認ください)
  • Unity 2021.3.0f1
  • AR Foundation 4.2.3
  • ARCore XR Plugin 4.2.3
  • ARKit XR Plugin 4.2.3
  • ARCore Extensions 1.31.0

大まかなフロー

以下の開発・デバッグのフローで進めていきます。

  • Geospatial APIの環境構築
  • デバッグの準備
  • 現地での録画
  • Unity上でのデバッグ
  • 実機ビルドと録画したセッションの再生

Geospatial × Recording & Playback APIを用いた開発

Geospatial APIの環境構築

まず初めに、Geospatial APIの環境構築をします。下記の記事で丁寧に解説されているので、手順に沿って環境構築を完了させてください。
https://zenn.dev/tkada/articles/04b44474149130
環境構築が完了したら、Geospatialシーンを開き、次のステップに進んでください。

デバッグの準備

Recording & Playback APIの組み込み

次に、今回のメイン機能であるRecording & Playback APIの組み込みを行います。
まず、ARCoreSessionRecorderという名前でスクリプトを作成します。
次に、以下リンク先にあるコードをコピーし、作成したARCoreSessionRecorderスクリプトにペーストします。
https://github.com/Unity-Technologies/arfoundation-samples/blob/main/Assets/Scenes/ARCore/ARCoreSessionRecorder.cs
ARCoreSessionRecorder
ARCoreSessionRecorderスクリプトを保存し、ARSessionゲームオブジェクトにアタッチします。以上でRecording & Playback APIの組み込みは完了です。標準ではOnGUIメソッドで録画や再生操作のUIが定義されています。
ARSession

モデルを生成する位置を定義

標準サンプルでは、自己位置にモデルが出現するようになっていますが、お近くのランドマークとなる位置に変更します。Geospatialでは、緯度経度高度を用いて位置を定義するため、ランドマークの緯度経度を調べます。

DefaultPlacement
自己位置を中心にモデルが出現している標準サンプルの様子

GoogleMapでランドマークの緯度経度を取得

緯度経度の取得には、GoogleMapを用いるのが手軽です。
お近くのランドマークにカーソルを合わせて右クリックをし、緯度経度の数値をクリックするとコピーされます。今回の例ではオフィス前の交差点上の緯度経度を取得します。
少しでも正確な位置でクリックできるように、左下のレイヤ → 詳細 → 航空写真をクリックし、マップの種類を変更することをお勧めします。

GoogleMap

ランドマークの緯度経度を割り当てる

取得した緯度経度を、3Dモデルの出現位置に割り当てます。Inspectorから緯度経度を入力できるようメンバ変数を定義し、GeospatialControllerスクリプト内のPlaceGeospatialAnchorメソッドを以下のように変更します。

[SerializeField] private float _latitude;
[SerializeField] private float _longitude;


private bool PlaceGeospatialAnchor(GeospatialAnchorHistory history)
{
    Quaternion quaternion =
        Quaternion.AngleAxis(180f - (float)history.Heading, Vector3.up);
    var anchor = AnchorManager.AddAnchor(
        _latitude, _longitude, history.Altitude, quaternion);
    if (anchor != null)
    {
        GameObject anchorGO = Instantiate(GeospatialPrefab, anchor.transform);
        _anchorObjects.Add(anchorGO);
        return true;
    }

    return false;
}

今回の例では、端末と同じ高度でモデルを出現させますが、任意の高度を指定したい場合はAnchorManager.AddAnchorの第三引数に任意の数値を入力してください。

次にGoogleMapで取得した数値をInspectorにペーストして割り当てます。また、表示させるモデルを変更したい場合、Geospatial Prefabにアタッチしてください。
GeospatialPrefab

ここまで完了したら、スマホにビルドしてください。

現地での録画

挙動確認

先ほどGoogleMapで緯度経度を取得した場所に行き、スマホをかざしてローカライズを行います。完了すると、画面下部にSET ANCHORという青いボタンが表示されるので、押して辺りを見渡してください。上手くいくと、狙った位置にモデルが出現することが確認できます。
Test

録画

次に、録画をしていきます。録画時にローカライズが完了することを確認できるように、一度アプリをキルして再度ローカライズを行います。
起動後、左上のStart recordingを押し録画を始めます。録画時のポイントとして、将来の自分が見たいであろう場所は正確にわからないため、満遍なくゆっくりと撮影することをお勧めします。(下記の動画は、動画容量の都合上早く短い映像となっています。)
ローカライズが完了し、十分に撮影ができたらStop recordingを押し録画を終えます。

Record

Unity上でのデバッグ

現地での検証と録画を終え、開発環境に戻ってきました。実際に3Dモデルを表示させ、モデルと出現位置に違和感を覚えたためデバッグを行います。

モデルの変更

出現させるモデルを変更するため、GeospatialControllerスクリプトのGeospatialPrefabに好きな3Dモデルをアタッチしてください。今回の例では赤色の球体のモデルに変更します。
RedAnchor

出現位置の修正

モデルの出現位置の修正は、GoogleMapでランドマークの緯度経度を取得と同様の方法で緯度経度を取得し直し、Inspectorにペーストします。
一回目で正確な位置に表示できた場合は、あえて少しずれた位置の緯度経度を割り当て、変化を確認しましょう。今回の例ではもう片方の横断歩道の上に位置を修正します。

GoogleMap

ここまで完了したら、スマホにビルドしてください。

実機ビルドと録画したセッションの再生

変更点が期待通りに反映されているか検証します。今回は現地に行く必要はありません。
アプリを起動したら、早速Start playbackを押してみましょう。現地で録画した映像が再生され、出現するモデルと位置の修正がされていれば成功です!!

Playback

まとめ

Geospatial APIとRecording & Playback APIを用いて、2回目以降現地に行かずにロケーションベースARのデバッグを行う方法を紹介しました。Recording & Playback APIは、とても便利で手軽に組み込める機能の割に、あまり使われていないように思えます。今回は、近くのランドマークでの検証でしたが、遠くなればなるほどこの機能の効果が発揮されると思います。ぜひみなさんもこの機能を活用し、面白いロケーションベースARコンテンツを作っていきましょう!

エンジニア絶賛募集中!

MESONではUnityエンジニアを絶賛募集中です! XRのプロジェクトに関わってみたい! 開発したい! という方はぜひご応募ください!

MESONのメンバーページからご応募いただくか、TwitterのDMなどでご連絡ください。

書いた人

おかたく

岡 拓也(あだな:おかたく)
ヒューマンコンピュータインタラクションに関する研究を行っている大学院生。
空間コンピューティングのインタラクションデザインに興味があり、MESONにインターンとしてJoin。
Twitter

MESON Works

MESONの制作実績一覧もあります。ご興味ある方はぜひ見てみてください。

MESON Works

Discussion