この記事は Akatsuki Advent Calendar 2017 の 12 日目の記事です。
はじめに
ARKit は内蔵カメラのみで AR 環境を提供してくれる素晴らしい機能です。
開発者も利用者も簡単に利用できるため、数多くのアプリがリリースされ、メディアを賑わせています。
私も流れに乗るべく Unity 環境で ARKit を使ったアプリケーション Measure をリリースしました。
今回は Measure を開発する中で ARKit について得た知見を共有したいと思います。
※ Measure がワンランク上のアプリだとは微塵も思っていません。改善の途中です。
2017.12.12 時点の ARKit にできないこと
開発を始める前に ARKit にできないことを知っておくことが重要です。
現実空間での絶対座標の取得できない
ARKit は空間認識を始めた場所からの相対座標で現実空間を認識しています。
なので、部屋の中で今どこにいるかを知ることは ARKit 単体ではできません。
マーカートラッキングできない
意外かもしれませんが、ARKit ではマーカートラッキングができません。
下記の項目にも関連しますが、マーカーを使って位置を補正したり、面を認識したりすることはできません。
事前に用意した情報を与えれない
ARKit では、事前に用意したデータ
や 以前アプリで取得したデータ
を受け渡すことができません。
なので、ARKit 自体の精度向上のために我々ができることはほとんどありません。
他人の空間情報を共有できない
これができたら最高に面白いと思うのですが、残念ながらできません。
1 人ずつ、完全に同じ場所で空間認識を始めれば、擬似的に共有することはできます(苦痛)。
動いているモノの位置を把握できない
画像から距離を推定しているので、モノ自体が動くと位置を把握することはできません。
それどころか、色々な情報に狂いが生じるのでその後まともに位置を把握できなくなります。
2017.12.12 時点の ARKit の限界
ARKit は内蔵カメラだけを使うにしては精度が高いといえます。
残念ながら、ユーザが納得の行くほどの精度ではありません。
任意の点の現実座標を取得する FeaturePoint の限界
様々なアプリを作る上で、FeaturePoint は便利な機能です。
実際に使ったことがあればわかると思いますが、結構ズレますよね?
そうなんです。結構ズレるんです。
FeaturePoint を取得しようとした場所の特徴量が少ない可能性もあるので、
付近の何点かを取得して補完すればいいじゃないか!!と皆さん思うでしょう。
残念ながら、FeaturePoint を複数取得しても大した補完はできません。
FeaturePoint 自体がなんらかのアルゴリズムによる推定値だからです。
私が色々試してみたことによる推測ですが、
FeaturePoint は取得したい点を頑張って補足しようとしているのではなく、
現状把握できている点群からの推定値になっています。
現実空間上の iPhone の位置捕捉の限界
ARKit でまず驚くのは、iPhone が動いても相当な精度で位置を補足できることです。
これによって、仮想空間上においたモノを現実空間で回り込んで見たりできます。
しかし、この位置捕捉にも限界があります。
過去の PointCloud を表示したままにしておくと、
時々ガクッと位置がズレて、また戻ることがあります。
これは iPhone の位置を反映しているカメラの位置が飛ぶことでそう見えています。
顕著にこの現象がわかるのが、iPhone を縦持ちから横持ちに変えたりする場合です。
開発者からすると、戻るからいっか!とか思いますが、
ガクッとずれる現象はユーザにとって非常によくない体験になります。
プレイ環境の限界
ARKit に向いていない環境はいくつかあります。
- 特徴量の少ない空間(真っ白な壁、真っ暗な部屋など)
- 半透明なガラスや反射率の高いモノが多い空間
- 加速度の変化が多い空間(車、電車、飛行機、船など)
この中でも加速度の変化が多い空間でまったく遊べないのは辛いです。
iPhone の位置捕捉にジャイロセンサーや加速度センサーを利用しているので、
空間そのものに加速度がかかっていると、モノが遠くへ消え去って行きます。
電車で初めて使ったときの悲しさを私は忘れません。
※微細な変化でも ARKit には大きな影響があるようです。
現実空間把握の限界
もちろんですが、PointCloud や PlaneDetect にも限界があります。
PointCloud は 1 フレームずつ丁寧に確認すると、ズレた点が結構あります。
PlaneDetect は上下に若干ズレていることが多いです。
検出平面にキャラクターを配置したりすると浮いていたり、よくみると突き刺さっていたりします。
ワンランク上の ARKit アプリを開発するには
以上のことを踏まえてワンランク上の ARKit アプリを作るための Tips を考えてみました。
- 1 人用アプリにする(オレオレ空間共有による体験の劣化を防ぐ)
- 家の中で遊ぶ想定にする(動くモノが少なく、加速度の影響もない)
- 特定の現実座標を利用しない(FeaturePoint を使わない)
- 現実空間と仮想空間の座標的な結びつきを弱くする(カメラのズレや移動による位置の影響を感じにくい)
- 検出平面より若干低めにオブジェクトを出す(めり込みより浮いているのが目立つため)
- オブジェクトを大味なモノにする(現実座標との些細なズレをごまかすため)
- オブジェクトをできるだけ動かす(同上)
- 高精度な空間認識が必要としない(そもそも精度に限界があるため)
アプリの幅が結構制限されているに感じますが、
新しいアプリを考えているとそれなりにアイデアは出てきます。
おまけ
アイデアだけでは差別化が難しいので、独自の面検出機能を実装しています。
現実空間の大まかな面を高速に取得して利用する予定です。
PointCloud の不要点棄却アルゴリズムや点群をメッシュ化するアルゴリズムを弄くり回しています。
※そのうち、別の記事を書くかも。
おまけ 2
特段重要ではないですが、気づいたことを書いておきます。
- 新しい iPhone の方が検出精度が高い
- 新しい iPhone の方が検出速度が早い
- CPU や GPU に高い負荷をかけると、空間把握がバグる