Immersal と ARCore Geospatial API と Lightship VPS と ARKit Location Anchors の比較

VPS (Visual Positioning System) を4つ試したので比較する。

# Immersal

フィンランド製。

https://immersal.com/

日本での大規模導入事例。

https://robotstart.info/2021/11/13/rakuten-kobe-ar.html

## 対応プラットフォーム

- Unity (iOS, Android, Nreal, Magic Leap, Huawei AR Engine)
- iOS native

## 費用

問い合わせないとわからない。けど Free Commercial License でかなりのことが無料でできてしまう。

> - Spatial Mapping capacity
>   - up to 300 images / Spatial Map
>   - up to 1000 Spatial Maps / month
> - Visual Positioning capacity
>   - up to 300,000 on-server Visual Positioning (localization) requests / month
>   - up to 100,000 Spatial Map downloads / month

## 使い方

1. Immersal Mapper という専用アプリでトラッキングしたい対象を静止画で撮影する。（Photogrammetry の要領で対象物に対していろんな角度で複数枚撮影。）
1. 撮影したデータは Immersal のサーバーに送信されて独自の特徴点データが生成される。同時に対象物のテクスチャ付きメッシュデータも生成される。
1. メッシュデータを各種 3D ツールに読み込んで AR コンテンツの位置合わせを行う。
1. SDK を組み込んであらかじめ生成しておいた特徴点データを読み込ませる。
1. 適当なタイミングでカメラ映像を SDK に投げると AR フレームワーク上の現在のカメラ位置に対する特徴点の姿勢行列が得られるので、適切にその行列を適用すれば AR 表示ができる。（コード見たほうが早い

## いいところ

- 自分でトラッキング対象をスキャンするのでどこでも対象にできる。
    - スタジアムスケールからデスクまわりの小さいとこまでどこでもだいたいいける。
- Immersal SDK は画像から姿勢行列を求めるだけのシンプルなものなので簡単。
    - 基本的には Unity 前提っぽいけど iOS ネイティブのサンプルコードもあり。（実際ライブラリファイル自体は Unity プロジェクト内からとってくる必要がある
    - Android ネイティブはないけど↑のように Unity プロジェクトから Android 用のをひっぱってくればいけるはず
- localization はオンデバイスで完結できる。（サーバー不要
- アプリが必要な権限はカメラアクセスのみ。
- ちょっとしたビルのトラッキングぐらいなら無料でできちゃう。

## 悪いところ

- 自分でトラッキング対象をスキャンしないといけない。
    - 特徴点データを public にすることも可能だけど public な利用可能なものはほぼない。
- スキャン対象にもよるけど特徴点データが 1MB〜数MB ぐらいになることもあってその分だけアプリサイズが大きくなる。（単なるバイナリなのでアプリ起動後にダウンロードすることも可能
- めっちゃピッタンコって感じにするのは難しい（特徴点データの作り方が悪い？

## 所感

- Immersal サーバーで生成されるメッシュモデルはちょっと荒いので厳密な位置合わせをするためには実際に AR 表示させて微調整する必要あり。
- Metashape などの Photogrammetry アプリで解析したカメラ位置データをアップロードして特徴点データを生成することができる。（Immersal Mapper も内部では同じ API を使ってる。）が、それで生成したデータは Immersal Mapper で生成したものと比べるとちょっと精度が悪い。（作り方が悪い？


# ARCore Geospatial API

Google 製。ARCore に含まれる機能のひとつ。

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

## 対応プラットフォーム

- Unity (iOS, Android)
- Android native (Kotlin, Java, NDK)
- iOS native

## 費用

どこにも書いてないけど請求先アカウントを要求されるし、API の Quota はあるけど無料？（よくわからない。怖…

## 使い方

1. 緯度経度高度を指定してアンカー作る。
1. カメラ画像が更新されるたびにアンカーの姿勢行列も更新されるので AR 側をそれに同期させる。

## いいところ

- 無料？
- ストリートビューが存在する場所ならどこでもできる。（屋内とかでも
- 特徴点データを自分でつくらなくていい。
- 緯度経度高度を指定するだけでそこにオブジェクトが置けちゃう。
- しかも精度がよい。（場所によると思うけど

## 悪いところ

- ストリートビューが存在する場所しかできない。
- 正確な緯度経度高度がわからないと既存の建物とかにピッタンコにできない。（Immersal みたいな事前生成の特徴点群に位置合わせしておくみたいなことができない
- アプリに必要な権限がカメラだけじゃなくって位置情報も。
- （なぜか iOS のサンプルコードが Objective-C…

## 所感

- ストリートビューがあるとこならどこでもできちゃうのはすごいお手軽だし精度もすばらしい。
- それでも既存の建物やオブジェクトにぴったり位置合わせして AR コンテンツをのっけるは難しい。AR しながら位置合わせの微調整ができるようなアプリを作る必要ある。


# Lightship VPS

Niantic 製。Lightship に含まれる機能のひとつ。

https://lightship.dev/

## 対応プラットフォーム

- Unity (iOS, Android)

## 費用

無料？（[マルチプレイヤー関連は有料？](https://storage.googleapis.com/nianticweb-media/lightship/lightship-pricing.png)

## 使い方

1. 開発者ページ内の Test Flight リンクから Niantic Wayfarer アプリをインストール。
1. 対象物のまわり（直径 10m 範囲内ぐらい）をアプリで撮影・アップロード。
1. しばし待つ。（ドキュメントには4時間以内とか書いてあったけど実際は15分ぐらい？たぶんサーバーの混雑具合による
1. メッシュができたら認識可能になる。
1. ARDK Examples のなかの WaypointAnchors シーンをビルドして動かす。
1. スキャンしたあたりをぐるぐる見回すとそのうち "localized" 表示になる。

## いいところ

- 数cmの精度。（ってことになってるけど実感するとこまでテストできてない
- スキャンしたメッシュの精度が高い。（細かい

## 悪いところ

- 認識対象範囲がせまい。
    - スタジアムとかビルとかは無理。ビルの入口だけとかならできる。
- 認識対象（wayspot）を公開するには Niantic の審査が必要？
    - 公開しないままアプリ公開するのができるならいいけど、private waypoint は development only みたいに書いてあってよくわからん。
- スキャンしたメッシュの座標系がぜんぜんわからん。
    - メッシュに対して AR コンテンツを位置合わせしようとしても waypoint anchor との関係性もよくわらかない。

## 所感

- もうちょい情報出てくるまで待ち。（例の Summit では出てたのかも？
- 汎用性は低そう？
- 認識範囲がせまかったり Niantic の審査が必要だったりするところが使い勝手悪そう。
- Ingress, Pokemon GO みたいなゲーム・アプリ内で VPS な AR するならこういう仕様でもいいんだろうか？

# ARKit Location Anchors (2022/6/7 追記

Apple 製。ARKit の機能の一部。公開当初はアメリカの一部都市だけだったが WWDC 2022 で Location Anchors の対応都市に東京が追加された、と思ったら[もうちょい前から使えるようになってた](https://atadistance.net/2022/05/28/apple-maps-step-by-step-walking-guidance-in-augmented-reality-comes-to-tokyo/)っぽい。

https://developer.apple.com/documentation/arkit/content_anchors/tracking_geographic_locations_in_ar

## 対応プラットフォーム

- iOS native

## 費用

iOS 組み込み機能なので無料。

## 使い方

1. ARGeoTrackingConfiguration を使って ARSeesion を run する。
1. 緯度経度海抜を指定して ARGeoAnchor をつくって ARSession に add する。
1. ARView 使ってるなら `func session(_ session: ARSession, didAdd anchors: [ARAnchor])`、ARSCNView なら `func renderer(SCNSceneRenderer, didAdd: SCNNode, for: ARAnchor)` とかの delegate メソッドでそのアンカーに対するオブジェクトをくっつける。

## いいところ

- 意外と精度がよい。（Geospatial API より多少落ちる感じ？
- 使うのが簡単。行列とか transform とかいじらなくていい。
- iOS/ARKit に組み込まれてるので新たにいろいろ追加しなくていい。
    - のでアプリサイズが小さくできる。

## 悪いところ

- Geospatial API よりは精度落ちるか？（場所によるかも？
- 一部の都市でしか使えない。
    - [Fukuoka, Hiroshima, Kyoto, Nagoya, Osaka, Tokyo, Yokohama](https://developer.apple.com/documentation/arkit/argeotrackingconfiguration)
- iOS でしか使えない。
- Unity でも使えない？

## 所感

- ようやく日本でも使えるようになったけどまだ使える場所が限定的なのがちょっと使いづらい。
- iOS だけだし現在はまだ Unity からも使えない？ので RealityKit か SceneKit とかつかってネイティブでゴリゴリ作らないといけない。Reality Composer 使えばあんまりコード書かなくてもコンテンツ作れるかな？
- 意外と精度はいいので使い所がはまれば悪くはない。

# まとめ

- 街中でストリートビューデータが存在する場所なら Geospatial API。
- それ以外のスタジアムの中とかプライベートスペースとかなら Immersal。
- iOS で Apple 信者なら？ Location Anchors？
- Lightship VPS の使い所がいまいちよくわからない。Geospatial API がなければもうちょい出番あったか？ ARDK の他の機能と組み合わせると？（でも使用場所が限定されすぎ…

# その他の VPS

https://azure.microsoft.com/ja-jp/services/spatial-anchors/

https://library.vuforia.com/environments/area-targets

https://arway.app/