自力でImmersal REST APIによる位置合わせをする in Unity
Immersalを使うのに毎回Immersal公式サンプルを使っているので、思い切って自力でSDKを使わずに位置合わせをしたい
ただ別に自力でアルゴリズム構築するとかではなく、用意されているREST APIを使うだけだけど......
あとImmersalSDKがunitypackage形式の配布だし、developer portalから取得する形だし、OSSじゃないのでちょっと使いづらいなぁとか思っていた
この思考が成功して余力があったらgitからPackage Manager経由でインポートできるライブラリにしたいかなぁって思う
たぶん前にWebARでやった時ほどの修羅の道じゃないと思う
Unityを使うのでARFoundationやtransform系のAPIの恩恵を得られる
最悪SDKを参考にすることもできるし
Immersal REST APIで位置合わせを行うためには、
- mapID配列
- base64エンコされた画像
- 光学中心
- 焦点距離
- トークン
などの情報が必要。
ARFoundationでは2.1くらい?からカメラの内部パラメータを取得できるAPIを提供している。
また、カメラ画像の取得はUnityのAPIからでもARFoundationからでも可能になっている
どっちがいいのかわからないけど、なんとなくARFoundationを使いたい感じがする
ARFoundationから取得したカメラ画像データはテクスチャデータに変換でき、
テクスチャデータからbase64円越された文字列を得るには以下のリンクを参考にしたい
ここまででおそらくリクエスト自体は飛ばせるはず
とりあえずUnity 2020.3.11を使ってサクッとURP+ARFoundasion+ARCoreのシーンをセットアップ
実機でも動作確認done
点群のデータが欲しいと思い、Keijiro/Pcxをインポートしてみた
これでImmersalのply点群をインポートしたところ、いい感じにいなった
準備はできたので、ARFoundasionの情報を使ってImmersalにリクエストを送ってみるまでやって見よう
Immersalの情報はScriptableObjectにまとめておく方式でやりたい
Unityから試しにImmersalにlocalizeのリクを飛ばしてみたが、なぜか
{
error: "map count"
}
から無限に脱出できない
上記の問題がC#やUnityによるものなのかわからないので、いったんWebクライアントからもやってみる
Webからは前に成功しているので、たぶんやり方は分かるはず
ん-なんとなくUnityのせいではない気がしてきた
というのも、なぜかWeb側でやっても400 Bad Reqが飛んでくるので
自分の理解不足なのだろうか......
いやでも前はできたんだけどな
公式のPythonのサンプル試したらやっぱりmap countでエラーになった
これ自分が悪くないやつだな?
あれからいろいろあって、ARFoundationの恩恵を十分に受けながら位置合わせのリクエストを送り、
なんとか成功した。
ん-でも精度が悪い気がする
作業ログを取るのをすっかり忘れてたんだけど、
昨日はImmersalのレスポンスをシリアライズして、そのデータからマップの姿勢を計算したりしたが
ちょっと変な結果になってしまった
Immersalの位置合わせは成功していて、結構同じような結果が返ってきているので
あとは自分の計算の聖な気がする
位置合わせの姿勢計算が失敗している図
quaternionの生成の仕方が間違ってるのかな
ちょっとこのgistに載ってる方法でも試してみたい
もしくはアフィン変換行列を生成してMapを変形させるとか
WebARのときはその実装だった気がする
ちょっと不安定だけど、何回かImmersalによる位置合わせができた!ということでひと段落......
あれから色々リファクタリングとかをして、GitHubにプロジェクトを公開した
TryAcquireLatestCpuImageはなぜか所定回実行するとできなくなってしまう問題があるのだが、
それ以外はまぁまぁ動いていると思う
本当はライブラリ化もしたかったけど、不安定な部分があったり
環境の制約(C#8の使用&UniTask)があるため、いったん保留
これにてスクラップはクローズです
本当はライブラリ化もしたかったけど、不安定な部分があったり
このバグを修正してリファクタをした
結構キレイにできたしよく動作してくれているので
ライブラリ化してみたいなぁと思うなど
このリポジトリをimportによって別のライブラリ用のリポジトリにして、
そこでgit経由で配布したいな
別のリポジトリにインポートして、asmdef切ったりテスト書いたりciでテスト構築したりしていた
なんとかカスタムパッケージとして公開できた
使い方の部分、ドキュメントが追い付いていないんでwikiにまとめたいっすね