【備忘録】Geospatial API のサンプルを動かすまで

# ARCore Geospatial API 使うためのメモ

Geospatial APIを試したくてGoogle CloudやUnity 上で設定とサンプルをとりあえず動かすまでの手順の備忘録。
基本的には以下を参照した。

https://developers.google.com/ar/develop/unity-arf/geospatial/developer-guide-android

## 環境

* Unity 2021.3.4f1
* ARCore Extensions 1.31.0
* ARCore XR Plugin 4.2.3
* XR Plugin Management 4.2.1

サンプルはARCore ExtentionsのGeospatial Sampleを手元にあったAndroidでとりあえず試す。

## 手順

手順は基本的に上記のサイトベースで実施

1. [Google Cloud プロジェクトを設定する](https://developers.google.com/ar/develop/unity-arf/geospatial/developer-guide-android#set_up_a_google_cloud_project)
1. Unityで空プロジェクトを用意してARCore,ARCore Extensionの設定
1. [認可設定](https://developers.google.com/ar/develop/unity-arf/geospatial/developer-guide-android#set_up_authorization)<BR>認可設定はkeyless認証で設定（Androidはこちらが推奨）

### 1.Google Cloud プロジェクトを設定する

Google Cloud Platformにアクセスして[新しいプロジェクト](https://console.cloud.google.com/projectcreate)を作成する（すでに作っていれば、それを利用してもOK）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/1cb59476-5275-9642-b56d-0d6df3ec1314.png)

先のプロジェクトを選択しメニューから[APIとサービス]-[ライブラリ]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/dbf534ef-2949-a423-365d-22fc6b059a2b.png)

ARCore APIを検索して有効にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/e224c09f-040b-8b00-6f0d-3c7719c94e73.png)

### 2. Unityで空プロジェクトを用意してARCore,ARCore Extensionの設定

Unity Hubを開き、新しいプロジェクトを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/8aa08e73-5827-f46d-df97-d8af3f1de7dd.png)

[File]-[Build Settings]でビルド設定を開き、プラットフォームをAndroidに設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/554f281d-0e94-32ed-d7a2-6b8aad583659.png)

[Build Settings]の左下にある[Player Settings]を押して設定を開く。
[Other Settings]-[Rendering]の設定を変更。

* Auto Graphics APIのチェックを外す
* Graphics APIsからValkunを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/a6fa4941-fb48-e13d-e5c5-62b95aaac417.png)

更に[Identification],[Configuration]も変更。デプロイするAndroidに合わせてアーキテクチャを変更しておく。

* Minimum APi LevelをAPI Level 25以上に設定
* Scripting BackendをIL2CPPに変更
* Target ArchitecturesをARM64に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/1d42be8a-797a-d017-b4bf-685c1bc85900.png)

[Player Settings]-[XR Plugin Management]を選択し[Install XR Plugin Management]を押してパッケージをインポートする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/1d7c5904-d8d6-94fd-29ca-9c59b999752d.png)

[Android]タブが選択上になっていることを確認し[ARCore]にチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/6202a7b9-d5f4-6947-955d-dc8a488c5142.png)

メニューから[Window]-[Package Manager]を開く
左上の[＋]ボタン押してメニューから[Add package from git URL...]を選択
URLにARCore ExtensionのGitHubのURLを入力する。

* https://github.com/google-ar/arcore-unity-extensions.git

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c90d5f6f-2147-9323-f7a6-682ae35f70fb.png)

追加された[ARCore Extensions]を選択しSampleからGeospatial Sampleをインポートする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/6cdbf4ce-6485-4584-df69-0d1c89a7434d.png)

最後に、[Build Settings]の[Scene In Build]に[Samples/ARCore Extensions/1.31.0/Geospatial Sample/Scenes/Geospatial.unity]を追加する。

これでパッケージの設定はいったん完了

### 3. 認可設定

ARCore APIは普通にAPIKeyでも利用可能ですが、最近はKeylessで設定するのが推奨されているらしい（Androidの場合）。
[Project Settings]-[XR Plug-in Management]-[ARCore Extentions]を選択し、[Android Authenication Strategy]を[Keyless(recommended)]に変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/a0ea61f3-5703-436a-f3f2-1250771e8cea.png)

SHA-1 フィンガープリント署名鍵の作成としてサービスに登録する。
[Project Settings]-[Publishing　Settings]-[Keys store Manager]を押してKeystore Managerを開く
一番の上のプルダウンから[Create New]-[Anywhere]を選択し、任意のKeystoreを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/561bdc3b-3574-55f8-4e70-f707a8879076.png)

以下の値を設定してキーを作成する

* [Password]
* [Confirm password]
* [New key values]-[Alias]
* [New key values]-[Password]
* [New key values]-[Confirm password]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/54624771-6f29-d8e6-a91c-7bb6a01a0d89.png)

コマンドプロンプトを開き以下のコマンドを使う。コマンドを入力するとパスワードを聞かれるので先ほど設定したkeystoreのパスワードを入力するとフィンガープリントが表示される。コマンドにはJDKが必要だが、わざわざ入れなくてもUnity Editorのインストール時に入れていれば、それをそのまま使える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/6b2d3fca-99e6-fbe1-e1df-dbf0df89155d.png)

コマンドを入力すると次のような感じになる。

```powershell
PS D:\WorkSpaces\HogeHoge> C:\Unity\Editor\2021.3.4f1\Editor\Data\PlaybackEngines\AndroidPlayer\OpenJDK\bin\keytool -list -keystore [先ほど作ったkeystoreファイル]
PS D:\WorkSpaces\HogeHoge> C:\Unity\Editor\2021.3.4f1\Editor\Data\PlaybackEngines\AndroidPlayer\OpenJDK\bin\keytool -list -keystore hogehoge.keystore
キーストアのパスワードを入力してください:
キーストアのタイプ: jks
キーストア・プロバイダ: SUN

キーストアには1エントリが含まれます

geospatialapi,2022/06/19, PrivateKeyEntry,
証明書のフィンガプリント(SHA1): XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
```

このフィンガープリントと[Project Settings]-[Player]-[Other Settins]-[Package Name]をコピーしておく。

Google Cloud Platformに戻って、先ほど作ったプロジェクトを選択し、[APIとサービス]-[認証情報]を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/f0f1622d-edac-fa16-09ff-ccc20ab1802b.png)

メニューから[認証情報の作成]-[OAuth クライアントID]を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/64d6a15f-f2bd-01bd-0dd5-690fee58c1e5.png)

アプリケーションの種類をAndroidに変更し、必要な情報を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/6868a3b7-e473-d2c1-75e0-934b644ff262.png)

これでデプロイして実行すると、現実空間にアンカーを設置しその位置にマーカーが設置される。サンプルではこういったオブジェクトが表示されるようになっているが、これを何かに別の物体に置き換えるだけでも、現実空間に装飾して遊ぶアプリ作れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/ef520cda-b1c8-447c-9fe6-db7fd040c9e0.png)

## 唐突に思い出したAzure Spatial Anchorsとの違い

そういえばAzure Spatial Anchorsにも[coarse relocation](https://docs.microsoft.com/ja-jp/azure/spatial-anchors/concepts/coarse-reloc)という機能があったことをふと思い出した。あの機能もGPSは利用可能で、現実空間の中にアンカーを置いてデジタル情報を出すという観点では両者がやっていること自体はそこまで大きな違いはない気がするけどデータの管理方法や精度に差がありそう。
仕組みが違うからそらそうだろうという面もありそうですが。。。

Geospatial APIも他のVPSのサービスも基本的には方角や位置を特定するために照合するデータは**サービス側が持っていて**位置合わせする。
一方、Azure Spatial Anchorsはデバイスでスキャンした空間の特徴とアンカーを**サービスに登録して**位置合わせをする。
ImmersalはVPSできるけど、利用者がサービスに登録する点はASAと同じ。ただ、デバイスのスキャン精度は専用機使えばASAよりあげられるからちょうど中間っぽい位置にいてるのかも。
プラットフォーマーが照合データを用意していない場所についてはVPS使えないというのは実際あるので、このあたりがサービスの使い分けの１つになるのかもしれない。