🎥

ARCore Geospatial APIを使ったセッションをRecording and Playback APIを使って記録・再生する

2022/06/12に公開

はじめに

TL;DR

Geospatial API を Recording and Playback API で使用するには、
セッション記録時に Geospatial API が有効でなければいけない。

背景と記事概要

2022 年の 5 月 11 日・12 日に開かれた Google の開発者向けカンファレンスである Google I/O にて、ARCore の新機能である ARCore Geospatial API が発表されました。
詳細は後述しますが、ロケーションベース AR 開発を支援する機能として界隈ではかなり注目されたのではないでしょうか。
https://io.google/2022/intl/ja/

本記事では、Unity を使用して Geosspatial API と ARCore Recording and Playback API を併用し、
現地に行かずロケーションベース AR のデバッグを行うまでを解説します。

対象読者

  • AR 開発者または AR 開発に興味がある
  • Unity を使っている
  • ARCore Geospatial API について知っている
  • ARCore 対応 Android 端末での開発に興味がある
  • ロケーションベース AR 開発を楽にしたい

検証環境

  • Windows 10 Home(開発機)
  • Pixel 4a 5G Android 12(デバッグ機)
  • Unity 2021.3.2
  • ARFoundation 4.2.3
  • ARCore Extensions 1.31.0

特に今回扱う ARCore Recording and Playback API は
ARCore をサポートした Android 端末でしか動作しないため、注意が必要です。

事前知識

ARCore Geospatial API とは

ARCore Geospatial API(以下 Geospatial API)は、前述のとおり Google I/O 2022 で発表された ARCore の新機能です。

https://www.youtube.com/watch?v=udoSz_UBUdc

Geospatial API は、Google が提供する VPS ソリューションであり、
現実空間とワールド空間の位置合わせを行います。
VPS は他にも Immersal, Pretia, Vuforia Are Target などがあります。

Geospatial API では、位置合わせで使用する 3D マップをストリートビューや Google Earth などのデータを用いて作成しています。
そのため従来の VPS のように事前に空間スキャンをして 3D マップを作成する必要がなく、
しかも世界中で位置合わせできます。

Geospatial API でできることは主に次の 2 つです。

  • 緯度・経度・高さ・方向の高精度な測位
  • 世界測地系における姿勢から XYZ 直交座標系における姿勢への変換計算

繰り返しになりますが、これらの機能によって開発者は
地球規模ロケーションベース AR事前のスキャン無し
で扱えるようになります。
これは何気にすごいことです。

https://developers.google.com/ar/develop/geospatial

ARCore Recording and Playback API とは

ARCore Recording and Playback API(以下 Playback API)は、
名前の通り AR セッションを記録・再生できる機能です。
Playback API のメソッドを呼び出すと、今動いている AR セッション情報を
MP4 ファイルとしてローカルストレージに保存できます。
そして、保存した MP4 ファイルのパスを指定してセッションを再生すると、
記録された AR セッションを復元し、実機上で動作させます。

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

AR セッションを記録・再生することで、
ロケーションベース AR のような特定の場所でしか実行できないコンテンツを
現地へ行かずにデバッグできます。
具体的には事前に現地で AR セッションを記録しておくことで、
「いつでも」「どこでも」AR セッションを復元し、デバッグできます。

自分は以前、Immersal という VPS で Playback API との併用を試したことがありますが、
とても便利でした。

https://zenn.dev/drumath2237/scraps/8ad4731e55d693

また、Immersal と Playback API の併用については次の記事がとても分かりやすいです。

https://zenn.dev/tkada/articles/e1a74baf722586

Geospatial API と Playback API の併用

本記事のテーマである、Geospatial API と Playback API の併用について解説していきます。

Geospatial API と Playback API を使用する

Geospatial API の使用方法

Geospatial API の使用方法は次の記事がとても分かりやすいので、そちらを参照してください。
(Geospatial Sample シーンのインポートは必要ありません)

https://zenn.dev/tkada/articles/04b44474149130

簡単にまとめると次のような手順を踏みます。

  1. GCP プロジェクトを作成し API トークンを取得
  2. Unity で ARFoundation を使う設定をする
  3. ARCore Extensions をインポート
  4. Geospatial API の設定をする

Playback API の使用方法

Playback API は ARCore XR Plugin をインポートしていれば使用できます。
セッションの記録はARCoreSessionSubsystem.StartRecording()
再生はARCoreSessionSubsystem.StartPlayback()というメソッドを呼ぶことで実現できます。

セッションの記録・再生の実装例を次に示します。

Recording Session
public void StartRecording()
{
#if UNITY_ANDROID
    // ARCore Session Subsystemを取得
    if (arSession.subsystem is not ARCoreSessionSubsystem subsystem)
    {
        return;
    }

    // セッション記録の設定
    // 20220611165503のようなタイムスタンプ付きで保存するように
    using var recordingConfig = new ArRecordingConfig(subsystem.session);
    mp4path = Path.Combine(Application.persistentDataPath, $"arcore-session{DateTime.Now:yyyyMMddHHHmmss}.mp4");
    recordingConfig.SetMp4DatasetFilePath(subsystem.session, mp4path);

    var screenRotation = Screen.orientation switch
    {
        ScreenOrientation.Portrait => 0,
        ScreenOrientation.LandscapeLeft => 90,
        ScreenOrientation.PortraitUpsideDown => 180,
        ScreenOrientation.LandscapeRight => 270,
        _ => 0
    };
    recordingConfig.SetRecordingRotation(subsystem.session, screenRotation);

    subsystem.StartRecording(recordingConfig);
#endif
}
Playback Session
public void StartPlayback()
{
#if UNITY_ANDROID
    // ARCore Session Subsystemを取得
    if (arSession.subsystem is not ARCoreSessionSubsystem subsystem)
    {
        return;
    }

    if (subsystem.playbackStatus.Playing())
    {
        subsystem.StopPlayback();
        return;
    }

    if (subsystem.playbackStatus == ArPlaybackStatus.Finished)
    {
        subsystem.StopPlayback();
        return;
    }

    if (!File.Exists(mp4path))
    {
        return;
    }

    subsystem.StartPlayback(mp4path);
#endif
}

AR セッションの記録

結論から言うと、
2 つの API を併用するためには記録する際にも Geospatial API を使用しておく必要があります。
自分はここに行きつくまでに少し時間がかかりました。

Playback API の公式ドキュメントに、記録される情報について説明がありますので引用します。

  • データセットの形式のバージョン
  • ARCore SDK バージョン
  • Google Play 開発者サービス(AR 版)
  • デバイスのフィンガープリント(adb shell getprop ro.build.fingerprint の出力)
  • AR トラッキングに使用するセンサーに関する追加情報
  • ARCore Geospatial API を使用する場合、デバイスの位置情報、磁力計、コンパスの測定値

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

一番下に書かれている通り、Geospatial API を使用する場合は位置情報を記録します。
逆に、Geospatial API を使ったアプリケーションで再生する場合にもこれらの情報が必要になるため、記録する際も Geospatial API を使う必要があるということです。

上記を実装し、Geospatial API を使用してセッションを記録するサンプルを GitHub に公開したので、
こちらも合わせてごらんください。

https://github.com/drumath2237/ARGeoRecorder

AR セッションの再生

セッションの再生は、通常通りの方法で行えます。
前述した kada さんの記事では Immersal のローカライズ中に Playback を行うと
クラッシュしてしまう現象が確認されていましたが、
Geospatial API ではそのようなことはなさそうです。

おわりに

まとめ

本記事では Geospatial API と Playback API の併用について解説しました。
最近 Google, Niantic, Apple が立て続けにロケーションベース AR ソリューションを発表しており、
界隈全体の注目度が高くなってきましたね。
ロケーションベース AR は現実を相手にする分少しハードルが上がるように感じているので、
もしこの記事の内容がそのハードルを低くするのに役立てば光栄です。

参考文献

https://github.com/drumath2237/ARGeoRecorder

https://zenn.dev/tkada/articles/04b44474149130

https://developers.google.com/ar/develop/geospatial

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

GitHubで編集を提案

Discussion