ARKitとは何か (ARKit1〜3のまとめ)


# はじめに
こんにちは！
ARアドベントカレンダー1日目です。（いきなり忘れてました。すみません。。。）
カレンダーのいくつか日数が空いていたので、ARKitについては分けて記載していこうと思います。

まず今回は、ARKitの概要についてまとめます。
ARCoreとの比較や技術調査、これからARKitをはじめてみようと思う人向けの記事です。
とりあえず試してみたいと言う方は [こちらの記事(ARKitのはじめかた その1)](https://qiita.com/1901drama/items/c0eb01b16370c48f84cd)をどうぞ。

# ARKitとは
![ダウンロード.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222377/7abc7531-da40-32d6-bde8-99afd54ae516.jpeg)

今更ですが ARKitとは
・Apple社が提供するAppleデバイス用のAR開発ツール
・カメラ越しの画面で、現実に即した３D表現可能にする
・2017年にARKit(ARKit1)が発表され、2019年現在はARKit3がリリース です。


これまでのバージョンと機能は、

|  |Version  |機能  |
|---|---|---|
|2017.09  |ARKit(ARKit 1.0)  |ポジショントラッキング, 平面検出（床）, ポイントクラウド（3次元の点座標情報）取得, 周囲の明るさ推定, 現実空間への当たり判定（HitTest）, 現実空間とのスケール一致, 顔認識|
|2018.01  |ARKit 1.5  | マーカー検出, マーカートラッキング(追跡), 平面検出（垂直) |
|2018.09  |ARKit 2.0  |マーカートラッキング（２D複数・３D）, 取得した情報の再現（エクスポート/インポート）, 現実空間の位置との関連付け, 即時ユーザー共有, 顔認識（視線・舌）  |
|2019.09  |ARKit 3.0  |モーションキャプチャ, ピープルオクルージョン, 両面同時AR利用, ARKit2までの機能向上, （RealityKit・Reality Composer）  |

バージョンが上がることに より多くの現実の情報を判断出来るようになっており、ARKit2から他端末との共有や再現が出来るようになりました。
また、今年発表されたARKit3では人の判定が出来るようになってきたので、より現実に合わせた表現が可能になっています。
AR=拡張現実と言う意味では多くの人と認識出来るものこそ現実と言えるので、重要なアップデートが毎年続いています。

ただし、基本的には現実の何かの情報を検知する為のツールなので、
検知した後の表現には SceneKit, SpriteKit, MetalKitなど 別のツールとの組み合わせが必要です。
`※2019発表のRealityKitは表現にも一部対応しています。`


# 仕組み（検知する方法）
ARKitが "どのように"動いているか

カメラを使った視覚型ARでは「カメラに映ったものを判定すること」と、
「現実の位置とカメラ上の仮想オブジェクトを適合して表現すること」が重要ですが、
画像の解析だけではなく 端末位置との差分を割り出し、画面に反映させ続けるには高い計算機能が必要となります。
`※ARKitは、60FPSでカメラからの画像を取得し処理しています。`

ARKitでは これを実現する為に、SLAM(a)とVIO(b)を複合した「vSLAM」という技術が利用されています。
![https___media.springernature.com_lw785_springer-static_image_art%3A10.1007%2Fs40903-015-0032-7_MediaObjects_40903_2015_32_Fig1_HTML.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222377/093526a1-d7cf-0c65-ed89-27756b3d37a5.jpeg)

SLAM（Simultaneous Localization and Mapping）と VIO(visual inertial odometry)については、去年の[k-boyさんの記事](https://qiita.com/k-boy/items/1de8e9ed1260834d02af)がとてもわかりやすいです。

Wikitudeや6d.aiといったSLAMベースのARツールは他にもあるのですが、
vSLAMを利用することで、比較的古めの端末（2015発売のiPhone6s等）でも高品質なARを利用出来ています。

因みに6D.AIを使ってる時の画面はこんな感じです。
![6dai.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222377/fbb51e26-8d73-78f9-3d69-7da251d70653.gif)
SLAM（ジャイロセンサー無し）なので 移動中のバスでも位置がズレませんでした。



# トラッキングモード
では、"何を検知するか"

ARKitでは現実の情報を検知する為に、ARConfigurationという設定をします。
現在の設定は、全7種類です。
![SwiftでARKit3を使うには.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222377/ea6a410c-a4d3-daae-580a-aa648964fe4c.png)

| ARConfiguration | 設定の説明 | 備考 | 
|:--|:--|:--|
| ARWorldTrackingConfiguration | 最も汎用的なモードです。ARKitがデバイスのバックカメラを使用して検出および追跡する可能性のある空間、人物、または既知の画像やオブジェクトに対するデバイスの位置と方向を追跡します。 | 空間検知出来ます。 |
| ARBodyTrackingConfiguration | 人の動きを取得するのに相応しいモードです。デバイスの背面カメラを使用して、人物、平面、画像を追跡できます。 | 2Dと3Dのパターンがありますが、2Dの場合はARWorldTrackingConfigurationと併用出来ます。 |
| AROrientationTrackingConfiguration | バックカメラを使用してデバイスの向きのみを追跡します。| デバイスの向きはARWorldTrackingConfigurationでも適宜取得可能です。 |
| ARImageTrackingConfiguration | 動く画像の場所を取得し続けるのに相応しいモードです。デバイスのバックカメラを使用して既知の画像のみを追跡します。 | 理論値以下ですが、同時追跡は4,5枚が限界かもといった所感です。 |
| ARFaceTrackingConfiguration | 顔の表情を取得するのに相応しいモードです。動きや表情など、デバイスのセルフィーカメラの顔のみを追跡します。 | ARWorldTrackingConfigurationとの併用可能です。 |
| ARObjectScanningConfiguration | 開発者用です。オブジェクト検知の準備に利用します。バックカメラを使用して、後で実行時にアプリに認識させる特定のオブジェクトに関する忠実度の高いデータを収集します。 | 精度は微妙です。 |
| ARPositionalTrackingConfiguration | 3D空間でのデバイスの位置のみを追跡します。 | デバイスの位置はARWorldTrackingConfigurationでも適宜取得可能です。 |

ARFaceTrackingConfigurationはARKit3より同時利用が可能になりましたが、「両カメラの画像を同時に表示することは出来ない」「depthデータの取得は出来ない」という制限があります。
![SwiftでARKit3を使うには (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222377/3af2fb17-849e-d20f-8918-882e6bdca88d.png)
将来的に端末スペックが良くなれば多くの機能が併用可能になるでしょう。

# 対応端末と性能
利用出来る端末には制限があります。
以下の端末は最新バージョンのARKit3(iOS13)を利用出来ます。

| 端末 |chip(CPU)| World Tracking | Face Tracking | Body Tracking | People Occlusion | 
|:--|:--|:--|:--|:--|:--|
| iPhone 6s/6s Plus | A9 |◯ | - | - | - | 
| iPhone SE  | A9 | ◯ | - | - | - |
| iPhone 7/7 Plus | A10 | ◯ | - | - | - |
| iPhone 8/8 Plus | A11 | ◯ | - | - | - | 
| iPhone X | A11 | ◯ | ◯ | - | - |
| iPhone XS/XS Max | A12 | ◯ | ◯ | ◯ | ◯ | 
| iPhone XR | A12 | ◯ | ◯ | ◯ | ◯ | 
| iPhone 11 | A13 | ◯ | ◯ | ◯ | ◯ | 
| iPhone 11 Pro/Pro Max | A13 | ◯ | ◯ | ◯ | ◯ | 
 
Face Trackingにはインカメラ（trueDepthCamera）が必要な為、iPhone X以上の端末。
高い計算量が必要な Body Tracking / People Occlusion には、A12以上のchipを搭載したiPhone XS以上が必要です。
また、トラッキングモードに変化はありませんが、iPhoneXRなど、単眼バックカメラの端末は視差によるDepthの取得が出来ません。よって深度を利用した環境取得は難しいです。（フロントでは取得出来ます。）

#まとめ
ARKitについての振り返りでした。
発表から2年しか経っていないわりにアップデートが多いのですが、
どんどん簡単になってるので始めるハードルは低くなりました。
次回は、ARKitの各バージョンで変化してきた実装方法について書こうと思います。


以上です。ここまで読んで頂きありがとう御座いました！
次のアドベントカレンダーは、@KoukiNAGATA さんです。

# 参考・関連記事
- [ARConfiguration
](https://developer.apple.com/documentation/arkit/arconfiguration) 
- [An Overview to Visual Odometry and Visual SLAM: Applications to Mobile Robotics](https://link.springer.com/article/10.1007/s40903-015-0032-7) 
- [ARKitはどうやって自己位置推定と環境マッピングを行なっているのか](https://qiita.com/k-boy/items/1de8e9ed1260834d02af) 
- [ARKit/ARCore対応デバイス、対応機能一覧](https://www.jyuko49.com/entry/2019/06/06/224209)