これちのPost-it

技術ネタをペラペラと

AppleのARKitについて調べてみた

はじめに

AppleのARKitに最近興味がわいたので、今回調べてみました。
Appleの公式ドキュメントを読んでまとめつつ、補足をつけたりしています。
アプリの制作方法は次の記事でまとめたいと思います。

ARKit とは

OSデバイスのカメラとモーション機能を統合することで、iアプリやゲーム内で拡張現実体験を提供するフレームワークです。
具体的には、デバイスのモーション機能、カメラによるシーンのキャプチャ、高度なシーン処理、便利さの表示を組み合わせて、AR体験の構築を単純化しています。

ARKitを使ったデモ例

こちらはARKitとUnityを使ってロボットが部屋の中で踊るデモです。
床の上を綺麗に動き回っているのが特徴的です。他にも様々なサンプルアプリが世に出回っているみたいです。

ARKitを利用するには(デバイス側)

A9以降のプロセッサを搭載した、iOS11以降のOSがインストールされたデバイスが必要です。

  • A9: iPhone6s, 6sPlus, SE, iPad(第5世代)
  • A9X: iPad Pro
  • A10: iPhone7, 7Plus

ARKitを利用するためには(アプリ側)

ARKitをサポートしたデバイスのみでアプリを動作させるには、アプリのInfo.plistUIReauiredDeviceCapabilitiesセクションの中でarkitキーを使用してください。
もし、AR機能がアプリにとって二次的な機能ならisSupportedプロパティを使用してください。

ワールドトラッキングの仕組み

現実世界と仮想空間の間の対応関係を構築するために、visual-inertial odometryという技術を使用しています。

visual-inertial odometryとは

iOSバイスのモーションセンサーとカメラから見えた映像の分析結果を結合するプロセス。
ARKitはシーン画像内の特徴点を認識し、その特徴点からのずれを追跡し、モーションセンサーからのデータと比較することで、高い精度でデバイスの位置と動きを得ることができます。

ARKitができること

  • 平面検知
    • ARHitTestResultクラスを使えば、カメラ画像内にある平面(現実世界における)を検知
    • planeDetectionをenableにすることで、ARKitはカメラ内の平面を検知し、その位置とサイズを知らせてくれる
  • それ以外はできないのかな?(まだよく分かっていませんが)
    • Tangoは平面だけでなく壁や特徴点の3次元座標を取得可能だったがARKitは平面検知しか行えないっぽい
    • Tangoは学習した現実空間の座標情報をADFファイルとして保存し、アプリ起動時に読み込むことで以前に学習した空間とのマッチングを行うことができたが、ARKitにその機能はついていないみたいです

ARKitを使用するコツ

  • 明るい環境での使用を促す
    • ワールドトラッキングはカメラ画像をもとに行われるため、暗い場所や細部が見えない環境では精度が落ちてしまいます。
  • ラッキングがうまくいっているかユーザにその都度知らせる
    • ARKitはデバイスが動いているほどシーンを理解できる。しかし、あまりに早く動かしたり、遠くからトラッキングをしてしまうと検知がうまくいかない場合があります。そこで、ARCameraクラスを使うことで、ユーザにトラッキングの情報を教え、トラッキングがうまくできていない時にもどうすれば良いかユーザに伝えるUIを作ることができます。
  • 時間をかけて平面検知を行い、必要とする平面が検知されたらそれ以降は平面検知をしないようにする
    • 平面検知の結果は時間とともに変化する。なぜなら、ARKitはシーン内の情報を常に更新し、その情報をもとに平面の情報を上書きし続けるからです。(これはつまり、一番最初に検知した平面は不正確な場合があるということです)

様々なクラス

ARKitのAR機能を使うためにいくつかのクラスが用意されています。

ARSessionクラス

  • 拡張現実体験に必要なデバイスカメラとモーション処理を管理する共有オブジェクト
  • ARKitが拡張現実感を作成するために実行する主要なプロセスを調整
    • このプロセスにはデバイスのモーションセンシングハードウェアからのデータの読み取り、デバイスの内蔵カメラの制御、キャプチャされたカメライメージのイメージ分析の実行が含まれる
  • AR機能を使うためには、このARSessionオブジェクトが必要
    • ARSCNViewやARSKViewオブジェクトを使用する場合はARSessionオブジェクトが生成されているが、自分でARコンテンツを自作する場合は、ARSessionオブジェクトを生成し、扱う必要がある

ARWorldTrackingConfigurationクラス

  • バイスの動きを6軸自由度(6DOF)を使ってトラッキングする設定
    • 3つの回転軸(roll, pitch, yaw)
    • 3つの平行移動軸(x, y, zの移動)
    • これらの情報とカメラ画像を組み合わせることで、仮想の物体を現実空間に配置することができる f:id:korechi:20170815194141p:plain:h300

AROrientationTrackingConfigurationクラス

  • バイスの向き(3軸)のみを使ってトラッキングする設定
  • ARWorldTrackingConfigurationクラスを使うことが推奨されているっぽい(当然か)

ARConfigurationクラス

  • 抽象クラス
  • 具象クラスとしてARWorldTrackingConfigurationクラスとAROrientationTrackingConfigurationクラスが存在

まとめ

  • ARKitは現実空間にARオブジェクトを配置する技術
  • カメラ画像とモーションセンサーのデータを使ってそれを実現
  • 現在、カメラ画像内の平面検知が行えるため、平面の上に物を置いたりすることができるみたい
  • iPhone6s以降に発売された端末で利用できる