ARKit3でObject Trackingする With Unity

2020.02.14

はじめに

今回は、iOS向けのARのフレームワークであるARKitがバージョン3になって 機能が追加され、Unityからの開発方法が少し変わったみたいなので、色々試してみたいと思います。
前回ARKitとARCoreを比較した際にARKit特有の機能の一つであるObject Trackingというのが色々できそうだったので、試して行きたいと思います。

開発環境

以下の環境でテストしています。

  • OSX Catalina
  • Xcode 11.3
  • Unity3.1f1
  • iOS13.2
  • ARFoundation 3.1.0
  • ARSubsystem 3.1.0
  • ARKit XR Plugin 3.1.0

Oject Trackingについて

ARKit3で提供されているObject Trackingは、実空間の物体を登録するとマーカーとして利用できるというものです。
いわゆる物体認識です。
理論的には実空間のいろいろなものをマーカーとして登録して利用することができるはず???です

とはいえ、解析させる対象によって形状やテクスチャによって座標取得の難易度は変わりそうです。

物体認識させたいモノの解析は、専用のスキャンアプリがアップルデベロッパーページから提供されているので、そちらを利用していきます。

スキャンアプリ

Scaning and Detectiong 3D Objectsからダウンロードできます。

※デベロッパーアカウントが必要です!

ダウンロードが完了したら、
XCodeプロジェクトを開いて、
Signing & Capabitiesのタブでbundle indentifierを任意のものに変更して、
実機をつないで
コンパイルして
実機ビルドします。

スキャン上の注意点が公式のRead.meにありました。

  1. 250 ~ 400 lux程度で全ての側面が十分明るくなるようにする
  2. 6500Kelvin(D65)程度の色温度が推奨値(日光と同様)暖かい光源は避ける
  3. マットで中間灰色の背景にオブジェクトを設置するのが推奨

※中間灰色(Middle Gray)はRGBでいうと(119,119,199)だそうです[wikipedia 参照]

実機ビルドできたら、アプリで早速スキャンしていきましょう!

基本的にはアプリ上に表示されるUIに沿ってスキャン作業は進められると思いますが、
一応、スキャンは以下のステップで行うようです。

  1. オブジェクトにカメラを向ける ・・・ 見つけたらNextボタンを押す。
  2. Bunding Boxの定義 ・・・ デバイスを動かすか、タッチ操作で調整しながら定義する。
  3. スキャン ・・・ 異なるアングルからスキャンする。
  4. 軸の調整 ・・・ スキャンされた軸を微調整する。
  5. テスト ・・・ スキャンしたモデルを元に物体認識をテストして精度を確認する。
  6. エクスポート ・・・ ShareボタンからAirdropでMacに送信。

※「.arobject」 という拡張子のファイルを出力できます。

物体をスキャンする

スキャンアプリのインストールと使い方が理解できたら、実空間の物体をスキャンしていきましょう。

周りのものを何か探して、スキャンしてみてください!
私は、オフィスの机にあったMoogシンセサイザーマグカップをスキャンしてみました。


スキャンが完了したら、ShareボタンからAirDropでScanしたモデルをMacに送信します。
その「xxxxx.arobjet」ファイルは後ほど使います。

Unity側の操作

AR Kit2までは、公式の出しているAR Kit Pluginを利用してきましたが、
ARKit3からは、Unity TechnologyからリリースされているパッケージARKit XR Pluginを
Windows > Package Managerからインストールできます。

UnityでAR関連の開発を行うには、
ARFoundationという公式パッケージを利用することになります。

ARFoundationの基本はこちらにまとまっています。
Unity Manual | About AR Foundation

 

サンプルを試す

ARKit3をUnityから使うためのサンプルがあるので、
そちらをダウンロードしていきます。

/arfoundation-samples

プロジェクトをダウンロードしたら、
Unity Hubからプロジェクトを開いていきます。

リストに追加でUnityから開けます。

 

プロジェクトを開いたら、
サンプルシーンがあるので、そちらを使って初めていきましょう。

Assets > Scenes > Object Tracking から「ObjectTracking」というシーンを開いてください。

 

HierarchビューのAR Session Originを選択すると、Inspectorビューに「AR Tracked Object Manager」というScriptがあることが確認できると思います。

こちらの「Reference Library」を設定することで、任意の物体を認識できるようになります。

認識させたい物体の登録

ReferenceObjectLibraryを作成します。

Assets > Create >XR > Reference Object Libraryで作成します。

作成したら、任意の名称をつけてあげます。

ここではReferenceObjectLibraryを「MyReferenceObjectLibrary」としました。

作成したReferenceObjectLibraryのInspectorビューを確認すると「Add Reference Object」というボタンが確認できると思います。

ボタンを押すと新しい項目が出てきます。

Reference Object Assetsという項目に先ほどスキャンした「xxx.arobject」を設定できます。

ドラッグ&ドロップなどで追加してください。

ここでは「Scanxxxx.arobject」を名称変更して「MoogMug.arobject」として、追加し、Nameの項目にもMoogMugという名前を設定してみました。

次に、こちらで作成したReferenceObjectLibraryを、
AR Session OriginのInspectorビューのAR Tracked Object ManagerのReference Libraryに設定してあげます。

これで物体認識ができるようになったはずです!

実機テスト

物体認識の基本的な設定は終了したので、ビルドしていきます。

※Project Settings設定は、任意で行ってください。

File > Build Setting からScenes In BuildからSecenes / Object Tracking/ObjectTrackingにチェックを入れて、ビルドします。

 

ビルドが完了するとXcodeのプロジェクトが生成されますので、

プロジェクトを開いてください。

Signing & Capabilities > Signing > Teamで任意のBundle Identifierを登録したら、実機をUSBでつないで実行ボタンを押してビルドしていきます。

実機でテストした結果が↓です。

 

サンプルなので、3次元軸が表示されるだけですが、しっかり検出できることが分かりました。

ちなみにサンプルでは、AR Tracked Object ManagerのTracked Object Prefabにゲームオブジェクトを入れてあげればマーカー上に仮想オブジェクトを表示することができます。

また、オーディオもPrefab化して、設定してあげれば、きちんと再生することができました。
これでminiMoogのModel Dのマグカップから、実際のMiniMoogの音を出せるARシンセサイザーみたいな遊びもできそうですね。

まとめ

今回は、ARKit3とUnityを使って物体認識を試してみました。
Appleが公式で出してくれているスキャンアプリを使うことでめちゃくちゃ簡単に物体認識を試すことができました。

これで理論的には、実空間のありとあらゆるものをマーカーとして読み取ることができますし、2D画像認識ベースものよりも証明や歪みといった環境の影響を受けにくいのが魅力的です。