「ZenFone AR」試作機レビュー(後編) Unity向けSDKでTangoアプリ開発を試す

LINEで送る
Pocket

先日の前編では一般ユーザー向けのレビューをお届けしたが、この後編ではTangoの機能を用いたアプリ開発者視点でのレビューをお届けする。「Tango SDK for Unity」の動作確認が中心で、ZenFone ARというよりはTangoそのものにフォーカスした内容になっていることはご容赦を。

なお、Tangoの技術的な特徴については、昨年あるしおうねさんが寄稿した「Google Tangoで踊ろう! ARアプリ開発のコツまとめ【ティーポットの独り言】」が非常にわかりやすいのでそちらを参照のこと。「ZenFone ARを購入してTangoを入門しようかな……」といった開発者には、本エントリを含めてぜひ読んでおいてほしい。

 
 

Tangoのおさらい

簡単ではあるが、これ以降とくにことわりなく用語を使うため、Tangoの基本3機能について簡単に述べておく。

1.Motion Tracking:日本語でもモーショントラッキングと呼ばれるが、Tangoデバイスそのものがどのような向きを向いているか、どのような方向にどれだけ移動したかをトラッキングできる。

2.Area Learning:日本語訳は領域学習となるが、RGB魚眼カメラで撮影した画から現実世界の特徴点を記録することができる。これにより、モーショントラッキングのずれ(ドリフト)を補正したり、過去のAreaLearning結果と現在の状態を照合することで現在位置を特定できる。

3.Depth Perception:直訳すると奥行きの検知となるが、赤外ToFセンサにてPoint Cloud(点群)と呼ばれる現実空間上の3次元座標の集合を得られる。

Tangoはこれらの機能を組み合わせることで、外界とTangoデバイスの空間上の位置、その照合をトータルで行うことができるシステムとなっている。

 

Tangoの開発者向け公式サイトの「Download the Tango SDK」からUnity向け、Java向け、C(NDK)向けのSDKがダウンロードできる。April 2017リリースのVersion 1.52、コードネーム「Gankino」が最新となっているが、「Release Note」を確認すると概ね一月に1回、アップデートが続けられており、deprecated表記や赤いWarning表記など、いくつかのbreaking changesを含む、積極的な開発が続いていることが読み取れる。

 
 

Tango SDK for Unityのサンプルデモを試す

Tango SDK for Unityをダウンロードしてインポートすると、TangoSDK/Examples/Scenes以下に12個のデモシーンが入っている。その中の一つ「DetectTangoCore」に各シーンを切り替える機能が含まれているため、これを最初に起動するSceneとしてUnityをビルドしよう。

すべてのシーンが含まれていなかったり、ZenFone ARの高い解像度に対してボタンが小さかったりするため、TangoSDK/Examples/Common/Scripts/SceneSwitcher.csを修正して全部のSceneが含まれるようにすると各シーンの動作確認がしやすくなる。また、シーンによってはボタンが被ってタップできなくなったりするのでそのあたりは適時スクリプトを修正しながら試すことになる。

以下に含まれるシーンの一覧と、簡単な説明、特徴的でわかりやすいサンプルについてはスクリーンショットと説明をお届けする。

 
AreaDescriptionManagement:AreaLearning結果であるADF(Area Description File)の管理サンプル

 
AreaLearning:AreaLearningの実行サンプル

 
AugmentedReality:地面や壁にマーカーを立てる

 
DetectTangoCore:Tango機能が有効かどうかを判定する。シーン切り替えUIも提供する

 
ExperimentalFloorFinding:地面を検出し、デバイスの初期位置の高さを測定する。これは「地面にオブジェクトやキャラクターを配置する」ことに応用できる。

 
ExperimentalMeshBuilderWithColor:認識した外界を頂点色を含むMeshとして生成する。objフォーマットでのexportもできる。前編で紹介したMatterport Scenesアプリの様に点群データではないため解像度は十分ではないが、MeshLab等のアプリで色付きのMeshデータとして確認することができる。

 
ExperimentalMeshBuilderWithPhysics:認識した外界を物理特性(Collider)をもったMeshとして生成する。タップでボールを投げることができ、ボールは検出したMeshにあわせてぶつかったりはねたり転がったりする。

 
ExperimentalMeshOcclusion:Meshの学習・セーブ・ロードとそれを用いてマーカーを立てるサンプル。

 
MotionTracking:単純なMotionTracking。デバイスを前後に動かすことでロゴの表示された立方体に近づいたり遠ざかったりすることでモーショントラッキングの動作が確認できる。


PointCloud:PointCloudの取得結果を表示する

 
PointToPoint:2点間の距離を測定する

 
SimpleAugmentedReality:地球の回りを月が回る。デフォルトではオクルージョンが有効になっていないが、Tango CameraオブジェクトのTango AR Screenコンポーネントの「Enable Occlusion」のチェックとTango Point Cloudプレハブを追加し、「Update Points Mesh」をチェック、伴って現れるアラートに従いTango ManagerオブジェクトのEnable Depthをチェックすることで、リアルタイムに外界を認識し、オクルージョンが動作することを確認できる。

 
なお、過去のTango対応デバイスやSDKは不安定という話を聞いたことがあったが、今回確認したZenFone AR + Tango SDK for Unity「Gankino (Version 1.52, April 2017)」の組み合わせではすべてのシーンが正常に動作し、安定性についても異常終了はほぼ発生せず、Androidデバイスの再起動が必要に…といったことは一度も発生しなかった。Tangoのみを目的としてもオススメできる機種といえる。

 
 

Tango + VRの夢は見られるのか?

最後に、ARとVRを同時に扱う、いわゆるHoloLensのようなMR的な使い方は可能なのか、少し追いかけてみた。公式にはTangoとDaydreamは同時に動かないとなっているが、それならばTango + Cardboardとしてはどうなのか。

Tangoの公式サイトには「Tango with Cardboard」というページがあるが、これは少々情報が古く、そのまま参考にはできない。

Unity 5.6から対応したネイティブでのVR対応と、Tango SDKが同居できるかどうか、Unityのバージョンなどを変更しつつ組み合わせ確認を行った。

Daydream・Cardboardどちらのプラットフォーム向けにも実質的※1には必須であるGoogle VR SDKがAndroidとしてtargetSdkVersion=24(Android 7.0に対応)を要求する。Daydreamの要件としてAndroid 7.0が含まれるため、これ自体は特に不自然なことはない。ところが、Tango側のシステムがライブラリを動的にリンクしていると推測されるが、「Android 7.0で追加されたプラットフォーム ライブラリにリンクしたNDKアプリへの制限」により、ランタイムエラーとなってしまう。

※1 Unity Editor上でのPlayや、Daydreamコントローラー、あるいはSpatial AudioといったUtilitiesライブラリとして実質Google VR SDKが必要となる。

あまり詳細はわかっていないが、少々特殊なUnityでGoogle VR SDKを追加でimportしない状態であれば(targetSdkVersionは23となる)、VRモード(樽型歪み補正のついた二眼のビューとヘッドトラッキング)+Tangoが同時に動作することが確認できた。

このことより、将来Tango SDKがきちんとAndroid 7.0に対応することで少なくともTango + Cardboardであれば問題なく動作するであろうことが、また、場合によっては公式には保証外ながら、Tango + Daydreamが動くという白昼夢が現実になることも期待できるのではないか、と考えられる。

 
 
●関連リンク
製品情報
ASUS

LINEで送る
Pocket

のじゃロリLINE公式スタンプにじさんじLINE公式スタンプ猫宮ひなたLINE公式スタンプにじさんじ2期生LINE公式スタンプときのそらLINE公式スタンプ

youten

Twitter @youten_redo

        
バーチャルYouTuber
のじゃロリLINE公式スタンプ
にじさんじLINE公式スタンプ
猫宮ひなたLINE公式スタンプ