ARのテストでAR位置合わせの精度検証を行ったときの話

こんにちは、uechanです。

[ソフトウェアテスト Advent Calendar 2024](https://qiita.com/advent-calendar/2024/softwaretesting) 9日目の記事です。

今回は私がQAエンジニアとして働いているSTYLYで行ったARの位置合わせの精度検証についてお話します

## ARの位置合わせって？
AR(Augmented Reality)は**すごい感単にいうと**以下の画像のように現実に対して3Dオブジェクトを配置することができる機能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/fd370d39-ca99-aeec-66e5-031bd14b48ab.png)

ぞうさんの遊具に対して**青い炎**という3Dのエフェクトを配置しています

つまりこの時、**ぞうさんの遊具**を目印に3Dエフェクトを出しているんです

この、目印を何にするか？≒ARの位置合わせをどのようにおこなうか？を
弊社[「STYLY」](https://gallery.styly.cc/business/ja)にでは以下の5機能出しています
* 平面検知
    * 1番オーソドックスな機能です
    * 平面(床など)を自動検知して、平面の好きな場所に置くというものです
        * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/3e621c7f-e8d0-8ad6-fc8b-4e7b1643c6a7.png)
    * ただしこれではどこでも体験できる反面、場所やものに紐づいた体験は作ることは難しいです
* AR on City (都市テンプレート)
    * 特定の都市の特定の場所に対してARオブジェクトを配置することのできる機能です
    * 対応都市は増えており、2024年12月の時点で日本国内の12都市に対応してます
        * 詳しくはこちらの記事にあります

https://styly.cc/ja/manual/manual-for-sky-segmentation/

https://styly.cc/ja/manual/city-anchor-business-enterprise/

* AR on Sky
    * 空を自動で検知し、空のみに3Dオブジェクトを映し出す機能です

https://styly.cc/ja/manual/manual-for-sky-segmentation/

* immersal
    * 特定のものを3Dスキャンの容量でマップ(目印)とし、3Dオブジェクトを出す機能です

https://styly.cc/ja/manual/ar-immersal-starter-guide/

* ロケーションマーカー
    * これが今回の記事で検証した機能です
    * **古くからある機能**でSTYLYマーカーと呼ばれる画像を目印に3Dオブジェクトを出す機能です
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/105bdf35-a277-ebf5-ac61-502e566b15f1.png)


https://styly.cc/ja/manual/how-to-create-a-location-marker/


## 事の始まり
社内のクリエイターおよび、取引先からの連絡で
以下の問い合わせが度々来るようになりました。

2年前にくらべて**ロケーションマーカー機能の位置合わせの精度が悪い！**

もともとUIリニューアルを行う2022年より前からある機能であり、度重なるリニューアル時にも
計算ロジックをほぼ変えないようにしてアップデートをしてきた機能だったので精度が悪くなったのがとても不思議でした

## じゃあ検証しましょう！
具体的にどのぐらいの精度で位置合わせができているのか？
それを検証する話が社内で持ち上がりました

ちなみに**ロケーションマーカー**の機能は画像認識がメインで使われています

STYLYアプリ内で画像認識の目安に使っている画像はこちら
![{6C2B1FCD-EF3F-478B-8C97-E834276B3E77}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/dd83878d-b709-dd9a-496e-92591a084676.png)

実際に使われる時は**真ん中の白い部分にQRコードが入ります**
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/775a9899-8a06-f63f-ff86-a624f3695946.png">

中身は適当ですがこんな感じ↑

### これ、真ん中のQRコードが画像検知の邪魔して精度が悪いんじゃね？？

検証していきましょう

### 検証手順

![{73E260AD-D6E4-4073-930D-9F9BAF16D348}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/29fbfff2-635b-34bd-7eac-cfd0d1596999.png)
真ん中のQRコードを変えたデータを用意しました

ロケーションマーカーを再生すると配置された3Dオブジェクトが何°傾いているのか？を測定してくれるデータが入っています

これを使って各色をiPhone 14 ProとPixel 7で各10回ずつ計測し、誤差の範囲を測定しました

結果は以下のようになりました

3Dオブジェクトの傾き(平均値)
| 機種名 | 通常 | 薄い灰色 | 黄緑色 | 水色 |
|:-:|:-:|:-:|:-:|:-:|
| iPhone 14 Pro  |  2.24° | 2.15°  | 1.67°  | 1.36°  |
| Pixel 7  | 36.85°  | 59.55° | 70.13° | 51.75° |

### Androidはなかなかひどいですね

ただ、QRコードが邪魔しているわけではなさそうということがわかりました

### 検証側ではなんもわからんということで。。。
エンジニアの[はむさん](https://x.com/hammmm)に依頼し、なぜAndroidがより精度が悪いのか？
向上する手立てはないのか？を調査してもらいました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/e2463a1c-b80a-1988-eb7e-aaa21ea7c8ba.png)

### 結果が届き、検証用の新たなビルドが届きました
早速上記と同じ検証をしてみました

3Dオブジェクトの傾き(平均値)
| 機種名 | 通常マーカー |
|:-:|:-:|
| iPhone 14 Pro  | **1.66°**  |
| (参考)iPhone 14 Proの従来版  |  2.42° |
|  Pixel 7 |  **2.15°** |
|  (参考)Pixel 7 の従来版 | 36.85° |

### Androidでの位置合わせの誤差がめちゃくちゃ改善された！
もちろんiPhoneでも改善してますね

### 何をおこなったのか
以下のような変更が入っているはずです

以下の条件を満たした場合に低精度として扱い
低精度状態の時はある程度状況が改善されるまで待ってからマーカーの画像検知を行いARの再生に移行する
* マーカーとカメラの距離が一定より遠い場合(マーカーをはっきりと認識するため)
* 自己位置推定が完了していない場合
* マーカートラッキングの内部状態がlimitedだった場合
* マーカーのY軸とグローバルY軸方向との角度差分をモニタし、変化が大きい場合

### つまり、ARが安定して再生できる準備が整うまで待ってから位置合わせを行うようにしたってｺﾄ！

今までARの準備が整っているかを確認せずに再生していたので精度が悪かった
特にAndroidは**ARの準備が整うまでに時間がかかる**のでより大きい誤差が出ていた！

iOSとAndroidのAR性能については結構差分があるのでこういうことになっていたみたいです
(この辺は別記事にしますが)

## まとめ
結果として、内部実装が悪かったという結果でしたが
画像検知の特性を加味してARの精度検証を行うのは意外と珍しいのでは？
ということで記事にしてみました

AR話っぽい感じになってしまいましたがテストアドカレに出してます、、、(苦情来たら書き換えます)