Closed33

ARCore Geospatial APIとPlayback APIを組み合わせる試行

にー兄さんにー兄さん

なぜか手元で「UnityEditorにiOS名前空間が無いよ」と怒られたので、
仕方なくiOSビルドサポートを導入したけど、これなんだろうな

にー兄さんにー兄さん

試したのが深夜だったので外には出られないけど、
普通にストリートビューを映した画面を移したらローカライズに成功

にー兄さんにー兄さん

playback動画を仕込んでPlaybackしようと思ったところ、
なぜか

Session::SetPlaybackDataset returning ArStatusErrorSpace::AR_ERROR_SESSION_UNSUPPORTED:

というエラーがlogcatい出力された
Playback自体はarcoreも対応しているので???となっている

にー兄さんにー兄さん

Geospatial APIの処理を覗いて、シーンでplaybackだけを実行したところ、
普通にセッションが再生された
つまりGeospatialAPIが起動する前にセッション再生をしておかなくてはいけない?

このような挙動はこの方の記事でも見かけたことがある
https://zenn.dev/tkada/articles/e1a74baf722586

にー兄さんにー兄さん

そういえば、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が返ってくる

にー兄さんにー兄さん

GeospatialAPIのサンプルのママだと、
APIが無効と判断された時点でアプリが落ちてしまう

にー兄さんにー兄さん

Playbackに関して、
PARFoundation-Samplesの方法とは別でplaybackしている例がGoogle公式docsにあった
https://developers.google.com/ar/develop/unity-arf/recording-and-playback/developer-guide

にー兄さんにー兄さん
  1. GeospatialAPIを先に有効にしておく
  2. arsession.active = false
  3. playback
  4. arsession.active = true

という順序でやってみたい
もしかしたらarsessionが消えた瞬間GeospatialControllerがエラーを吐くかもしれないので
そこは良しなに調整したい

とその前にまずはPlayback単体でこの要領で再生できるか試す

にー兄さんにー兄さん

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ができるのかというところ

にー兄さんにー兄さん

一応自前で記録・再生のロジックを実装できたので
GeospatialAPIと併用して記録できるか検証する

にー兄さんにー兄さん

ARCore Extensionsをインストールし、
ARCoreExtensionsをシーンに配置し、GeospatialMode=enabledにした状態でRecordとPlaybackを確認した
普通にできてしまった
GeospatialAPI有効になってるのかな......?

にー兄さんにー兄さん

Playbackなのだが、Geospatial APIでローカライゼーション実行中に再生できないと思っていたが
サンプルのGeospatialControllerが動作している状態でPlaybackしても普通に動いた

このスクラップは2022/05/20にクローズされました