Google Tangoの機能の1つである、Motion Trackingを試してみました。

Motion Trackingとは

3次元空間において、デバイス自体の動きや向きをトラッキングする機能。
GPSは地球上のどこにいるかを認識することに用いられますが、Motion Trackingはカメラで撮影されている世界(?)において、デバイスがどこでどのような傾きになっていたかを認識しています。
カメラで撮影されている世界の座標系は、特定のタイミング(例: Motion Tracking開始時)に居た場所を基準としています。

使用するAPI

クラス名称メソッド名称概要
Tango.PoseProviderGetPoseAtTime Poseデータの取得を実施。タイムスタンプを指定しない場合は最新、指定している場合はそれに最も近い時刻のPoseデータが取得できます。

Motion Trackingにおいて設定可能なCoordinate Pairは以下のものとなります。
No.Base frameTarget frame概要
1COORDINATE_FRAME_START_OF_SERVICECOORDINATE_FRAME_DEVICETangoサービスが初期化されたときか、ResetMotionTracking()により初期化されたときを起点としたデバイスの位置などを返却します。
2COORDINATE_FRAME_AREA_DESCRIPTIONCOORDINATE_FRAME_DEVICE保存されている領域学習の結果から起点を抽出し、それに合った位置などを返却します。領域学習の結果が存在しないときは、No.1と同じ動作になります。
3COORDINATE_FRAME_AREA_DESCRIPTIONCOORDINATE_FRAME_START_OF_SERVICEローカライゼーションイベントまたはドリフト補正が行われた場合にのみ更新が返却される(らしい)。こちらも領域学習との絡みになります。

今回は未だ領域学習はやっていなかったので、No.1のペアを使用しています。

結果

屋内

屋内では場所が狭いことが影響しているのか、Tracking・空間認識に失敗しやすかったです。
以下のスクリーンショットは弊社屋内でMotion Trackingを行い、移動した経路にパンを配置してみたものになります。
※ パンを表示した理由は、「ヘンゼルとグレーテル」からですが、よくよく考えたら、パン(くず)を置いていくと家に帰れなくなりお菓子の家に行ってしまいますね
※ "パン"は"Low Poly RPG Pack"を使用させて頂きました。無料公開有難う御座います。

左側のスクリーンショットの奥の扉から廊下に出て、右側のスクリーンショットの廊下へ移動したところまでを取得しています。
残念ながら左側のスクリーンショットの青枠で括られている部分が、廊下を移動しているときのものなので、表示されてほしくなかったものになります。

屋外

弊社の入っている建物の周りでMotion Trackingを行い、移動した経路にパンを配置してみたものになります。

通ったルートは以下の赤線のルートのようになり、弊社オフィスを半周した軌跡になります。

このときの結果が以下のようになります。
※ 図の⑤~①に歩いた際にMotion Trackingを取得し、帰りに①~⑤の順番で戻る際にTrackingされたものを確認したものとなります。

②は方向的には③~⑤で表示されてるパンも見える方向ではありますが、空間を認識しているために、それらが表示されていないとなります。
また、⑤で画像左側に⑥で表示されているものが表示されていないことから、同様に空間を認識していると思われます。

精度から見ると、屋内での使用だと少し誤判断もありそうですが、屋外においては十分期待できそうでした。
今回作成したサンプルアプリはこちらに置いておきました。Tango SDKや"Low Poly RPG Pack"は除いているので、試してみたい方はそれらをimportとしてください。
ただし、 Tango SDKは最新バージョンの"Ikariotikos"ではカメラで撮影したものが表示されなくなってしまったので、"Hopak"を使用してください。

参考文献:
Frames of Reference

コメントの投稿