Google Tangoの機能の1つである、Area Learning(領域学習)を試してみました。

Area Learning(領域学習)とは

過去に投稿したMotion Trackingは、サービス開始時点の座標を原点とした座標系を構築していますが、 これではサービスを開始する毎に毎回座標系が異なることになります。 そのため、前回のサービス時にイベントが発生した座標を覚えておいても、 次回のサービス開始時の場所が異なる場合に、覚えておいた座標は意図した場所を示さなくなってしまいます。 これを解消するために、空間と座標を連動して覚えておくことで次回起動したときに同一の座標系を使えるようにすることを目指した機能となります。
Area Learning未使用時Area Learning使用時
サービス1の開始時の原点(上図左側の緑丸)を起点としたイベント発生位置(上図の赤星)は座標(x, y, z)となる場合、サービス2開始時の原点(上図右側の緑丸)を起点としたイベント発生座標(x, y, z)は別の位置(上図の青枠星)になってしまう サービス1、サービス2の座標系を統一することで、サービス2開始時の座標は原点でなくなり、原点はサービス1開始時点の位置(上図の左側の緑丸)となる。そのためイベント発生座標(x, y, z)はサービス2においても同じ位置を示すことになる

動作モード

Area Learningは主に以下の2つの動作モードがあります。
モード名称概要
LearningArea Learningを行うモード
Load Existing既に存在するArea Learningの結果を展開するモード

各モードに設定するには、TangoApplicationインスタンスの以下のメンバ変数を変更することで可能です。
条件略称条件名称概要
条件1 m_enableMotionTracking
m_motionTrackingAutoReset
m_enableMotionTrackingはArea LearningのベースとなるMotion Trackingが必要なため、常にON。
m_motionTrackingAutoResetも常にONにしているが、必要に応じてOFFでも可のはず。
条件2 m_enableAreaDescription Area Descriptionを使用するか否かを指示するフラグ
条件3 m_AreaDescriptionLearningMode Area Learningを実施する否かを指示するフラグ
条件4 TangoApplication.Startupで
AreaDescriptionインスタンスを指定有無
使用するArea Descriptionを指示
条件1 条件2 条件3 条件4 動作モード
設定値 ON ON ON 設定あり Motion Trackingとして動作
設定なし Learningモードとして動作
OFF 設定あり Load Existingモードとして動作
設定なし Motion Trackingとして動作
OFF ON 設定あり Motion Trackingとして動作
設定なし Motion Trackingとして動作
OFF 設定あり Motion Trackingとして動作
設定なし Motion Trackingとして動作

実験

弊社オフィス周辺で試しにArea Learningを実施したときの結果を纏めました。
使用したアプリの概要と手順は以下のようになります。

アプリの概要

  • LearningモードとLoad Existingモードのそれぞれで起動するシーンを持つ
  • Learningモードで起動しているときは、Tango Coreから通知されたPoseデータをファイルに保存し、且つ該当箇所に"パン"を表示
  • Learningモード終了時にADFにArea Learningの結果を保存
  • Load Existingモードで起動すると、最新のADFを展開して前回の座標系を引き継ぐ。また、Poseデータが保存されているファイルが存在すれば、それを読み込み該当箇所に"リンゴ"を表示

実施手順

  1. サービス1開始地点にて、Learningモードで起動し、弊社オフィスの周りを歩く(経路は下記参照)
  2. 途中、地点①②で来た道を振り返り、スクリーンショットを取得
  3. 経路の終端まで移動した後、Learningモードを終了(サービス1終了)
  4. サービス2開始地点にて、Load Existingモードで起動し、来た道を戻る
  5. 途中、地点①②で先ほどと同じようにスクリーンショットを取得
  6. 来た道を戻りつつ、行きでスクリーンショットを取得した同じポイントで再度取得
  7. サービス1開始地点まで戻った段階でLoad Existingモードを終了(サービス2終了)
Area Learningを
実施した経路
スクリーンショット
取得地点
サービス1

Learningモードを
実施していたとき
サービス2

Learning結果を
展開したとき
(Load Existingモード)
座標系が異なるとリンゴはパンとは全く異なる場所に表示されるのですが、Area Learningにより座標系が引き継がれるため、(ほぼ)同じ場所に表示されています。
ADFはAreaDescription.ExportToFileメソッドでファイルにアウトプットでき、またAreaDescription.ImportFromFileメソッドでインプットできるので、これらのメソッドを使用することで他端末とも座標系を共有することもできるようです。

実装概要

スクリプト概要
Assets/Scripts/BaseALMainController.cs Area Learningを実現する上でのMonoBehaviourを継承した基底クラス。
TangoApplication、TangoPoseController、TangoPointCloudなどのTango用のインスタンスの管理や、アプリで保存するPoseデータを管理するPoseDataManagerインスタンスなどを管理。また、権限確認などを実施。
ただし、TangoApplicationへのLearning / Load Existingモード設定などはInspectorにて実施済みの前提。
Assets/Scripts/ALMainControllerForLearning.cs Learningモード用のBaseALMainControllerを継承したクラス。
起動時にLearningモードで動作するために、TangoApplication.Startupコール時にArea Descriptionを指定しなくなっている。
また終了時にAreaDescription.SaveCurrentとPoseDataManager.Saveを実行して、Area Learningと取得したPoseデータを保存。
Assets/Scripts/ALMainControllerForLoadExisting.cs Load Existingモード用のBaseALMainControllerを継承したクラス。
起動時にLoad Existingモードで動作するために、TangoApplication.Startupコール時に最後に生成したArea Descriptionを指定している。
また終了時にAreaDescription.SaveCurrentとPoseDataManager.Saveを実行して、Area Learningと取得したPoseデータを保存。
Assets/Scripts/PoseData.cs TangoPoseDataをJSONに格納するために展開したクラス
Assets/Scripts/PoseDataManager.cs PoseDataをファイルに保存したり、それをRAM上に展開するためのクラス
上記サンプルアプリはこちらにアップしているので、興味がありましたら、参照してみてください。

コメントの投稿