ARCore Geospatial APIとPlayback APIを組み合わせる試行
先日のGoogleIO 2022で発表されたGoogleの新しいVPSシステムであるGeospatial APIを試したり、
触って遊んだりしたい
arcoreのdocsはこちら
すでにZennにも記事になっている
基本的にこちらを参考にしている
Unityプロジェクト自体は3Dコアテンプレートから自力でarcoreの設定をした
最終的な環境は以下の通り。基本記事と同じ
- unity 2021.3.2f1
- ARFoundation 4.2.3
- ar core xr plgin 4.2.3
- AR Core ARFoundation Extensions 1.31
GCPは普段全然使わないけど、記事通りに普通に動いた
なぜか手元で「UnityEditorにiOS名前空間が無いよ」と怒られたので、
仕方なくiOSビルドサポートを導入したけど、これなんだろうな
試したのが深夜だったので外には出られないけど、
普通にストリートビューを映した画面を移したらローカライズに成功
geospatial apiを試せたので、次はPlayback APIと併用したい
playback動画を仕込んでPlaybackしようと思ったところ、
なぜか
Session::SetPlaybackDataset returning ArStatusErrorSpace::AR_ERROR_SESSION_UNSUPPORTED:
というエラーがlogcatい出力された
Playback自体はarcoreも対応しているので???となっている
Geospatial APIの処理を覗いて、シーンでplaybackだけを実行したところ、
普通にセッションが再生された
つまりGeospatialAPIが起動する前にセッション再生をしておかなくてはいけない?
このような挙動はこの方の記事でも見かけたことがある
そういえば、GeospatialAPIは緯度経度高さの地球楕円体球面座標系を扱うので
それをxyz直交座標系に変換するのどうすればいいんだろうと思ってたけど
サンプルプロジェクトでは実際にアンカーを配置してそれを復元しているので
そこの座標系変換ロジックが実装されているはずなので、
調査したい気持ちになった
GoespatialAPIとPlaybackAPIの併用について調査を続けている
まず昨日のARSESSION_UNSUPPORTEDは、
字のごとくsubsystem.StartPlaybackを実行した時に、
そもそもPlaybackできる状態ではなかったということを意味している
サンプルに入っているGeospatialControllerをまずdisableにして、
Playbackが行われてからGeospatialAPIを有効化するようにしてみるが、
なぜかGeospatialAPIがUnsupportedだよと言われる
エラーの挙動がAssets/Samples/ARCore Extensions/1.31.0/Geospatial Sample/Configurations/GeospatialConfig.asset
にある
コンフィグによって変わってくる
これが
Geospatial modeがdisableの場合Playbackが起動するが
GeospatialAPIがunsupportedとなる
逆にenableの場合はGeospatialを有効にする前にPlayback処理をはさんでいるが
その時点でAR_SESSION_UNSUPPORTEDが返ってくる
Playback開始から5秒後とかにしてみても
GeospatialAPIは有効にならない
GeospatialAPIのサンプルのママだと、
APIが無効と判断された時点でアプリが落ちてしまう
Playbackに関して、
PARFoundation-Samplesの方法とは別でplaybackしている例がGoogle公式docsにあった
- GeospatialAPIを先に有効にしておく
- arsession.active = false
- playback
- arsession.active = true
という順序でやってみたい
もしかしたらarsessionが消えた瞬間GeospatialControllerがエラーを吐くかもしれないので
そこは良しなに調整したい
とその前にまずはPlayback単体でこの要領で再生できるか試す
ar playback managerを使った方法
雑だけどこんな感じに実装してみる
ん-なぜかSetPlaybackDatasetUriでSessionNotReadyが返ってきます
Playback API単体のテストをするときに、
Geospatial API COnfigのGeospatial modeをdiablesdにするのを忘れないように仕様
挙動まとめ
現在は【GeospatialAPIとPlaybackAPIどっちが先か】×【Geospatial ConfigのGeospatialModeがenabledか】
の4パターンで挙動が変わる
GeospatialAPIを先に実行しておく場合
一番検証が簡単
サンプルシーンにボタンを配置してPlaybackをするという手法
geospatial mode = disabled
geospatial apiは実行可能。
Playbackすると、AR_SESSION_UNSUPPORTEDが出る
geospatial mode = enabled
自分の環境ではなぜか実行した瞬間にアプリが落ちる始末
PlaybackAPIを先に実行しておく場合
まずGeospatialController を非アクティブ状態にして、
Playbackしたあと少し間をあけてGeospatialController をアクティブにする
geospatial mode = disabled
Playbackは動く。
しかしGeospatialAPIがunsupportedだという判定になってアプリが落ちる
geospatial mode = enabled
playback がAR_SESSION_UNSUPPORTEDになって動かない
それをすり抜けて普通にGeospatialAPIが動いてローカライズを始める
Playback⇒Geospatialの順に実行してたら、こんなログが出てた
これで思ったのが、Playbackするセッションでは
そもそもGeospatialAPIは有効になっていないようなと
つまりRecordするときにGeospatialModeをenableにすることで
Plabackするときにも使えるのではないかと
ここで一つ心配なのが、Recordが果たしてGeospatialAPIと併用できるか
検証しなくては
仮説:「PlaybackするSessionでGeospatialModeがenabledになっていることで再生できるのではないか」
を検証するために、新しくARRecorderというプロジェクトを作っている
一番心配なのが、そもそもGeospatialAPIを有効な状態にしてRecordができるのかというところ
SwitchPlatformは早めにやっとけ
一応自前で記録・再生のロジックを実装できたので
GeospatialAPIと併用して記録できるか検証する
ARCore Extensionsをインストールし、
ARCoreExtensionsをシーンに配置し、GeospatialMode=enabledにした状態でRecordとPlaybackを確認した
普通にできてしまった
GeospatialAPI有効になってるのかな......?
logcatにはいろんなログが流れてビビったけど、
ひとまずGeospatialAPIとPlaybackAPIの併用が可能になった
GeospatialModeはenabled(recordした時の値と同じ)
Playbackして0.5秒後にGeospatialController をActiveにした
YouTubeのvideoIDが不正です
ローカライズも成功
これでとりあえずやりたいことはできた感
アキバに行ったので駅前でGeospatial modeが有効なセッションをRecordして
家に帰ってGeospatialAPIをPlaybackで動かしてみた
結果はかなり大成功
実際に出てきた緯度経度の値をGoogleMapに入れるとちゃんとあってる
ツイーヨ
Playbackなのだが、Geospatial APIでローカライゼーション実行中に再生できないと思っていたが
サンプルのGeospatialControllerが動作している状態でPlaybackしても普通に動いた