2016年6月8日水曜日

[Google I/O 2016] ProjectTangoについて、セッション内容まとめ



「Project Tango」とは、MotionTracking、DepthSensing、VisionProcessingを組み合わせて対象物との距離を正確に把握し、リアルタイムで目の前の空間を3DキャプチャするというGoogleの開発プロジェクトです。今回Keynoteでは大きく発表されなかったProjectTangoですが、GoogleI/O会場では、デモ用のスペースが用意されたり、セッションも多く行われプロジェクトに対するGoogleの意気込みを感じました。

本記事では、ProjectTangoについてのセッションの内容をご紹介したいと思います。

セッションの動画は、以下のサイトから閲覧可能です。
What's new ProjectTango
Introducing Project Tango Area Learning

また以下からサンプルコードをダウンロードすることが可能です。
https://github.com/googlesamples/tango-examples-java


[HardWare]

ProjectTangoを実現するデバイスには、3つの必要不可欠な要素があります。
  • デプスセンサ
    • 通常のカメラの他に赤外線センサを使用し、対象物との距離を測ります。
  • 3Dカメラ
    • 実世界の3D-geometryを検出します。
  • ビジョンプロセッサ
    • デプスセンサと3Dカメラで認識した情報を高速で処理し、3Dマッピングを行います。


[Features]

ProjectTangoには、重要な機能が3つあり、それらにより快適なAR空間を実現しています。


-- MotionTracking --




モーショントラッキングは、エリア内をデバイスが移動すると、その動きを理解することができます。プロジェクトタンゴのAPIでは、デバイスの位置と6DoFの方向(直交座標系の3軸とそれらの回転)を取得することが出来ます。
位置及び向きの組み合わせをプロジェクトタンゴでは、デバイスのポーズと呼ばれています。ポーズを取得するためのAPIはコールバックとポーリングの2種類が用意されています。どちらを使用する場合も取得する座標の起点となるベースのフレームと取得するターゲットのフレームを設定する必要があります。モーショントラッキングの場合、ベースにサービス開始位置(TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE)、
ターゲットにデバイス自身(TangoPoseData.COORDINATE_FRAME_DEVICE)を定義します。

それぞれの方法での取得例を以下に示します。


・セットアップ
// Tango Serviceの初期化
// ActivityContextと初期化終了後に実行されるRunnableを渡す
Tango mTango = new Tango(SampleActivity.this, new Runnable() {
            @Override
            public void run() {
                // Configの設定
                TangoConfig config = new TangoConfig();
                config = tango.getConfig(config.CONFIG_TYPE_DEFAULT);
                // MotionTrackingを有効
                config.putBoolean(TangoConfig.KEY_BOOLEAN_MOTIONTRACKING, true);

                // リスナーの初期化、もしくはポーリングを開始する

                // Tango Serviceに接続
                try {
                    mTango.connect(config);
                } catch (TangoOutOfDateException e) {
                    Log.e(TAG, getString(R.string.exception_out_of_date), e);
                } catch (TangoErrorException e) {
                    Log.e(TAG, getString(R.string.exception_tango_error), e);
                }
            }
        });


・コールバック
private void setTangoListeners() {
    // 取得したいフレームペアを定義
    final ArrayList framePairs = new ArrayList();
    framePairs.add(new TangoCoordinateFramePair(
        TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
        TangoPoseData.COORDINATE_FRAME_DEVICE));

        // リスナーを定義
        mTango.connectListener(framePairs, new OnTangoUpdateListener() {

        @Override
        public void onPoseAvailable(final TangoPoseData pose) {
            // 取得したポーズを処理する
        }
    });
}

・ポーリング
// 取得したいフレームペアを定義
TangoCoordinateFramePair frames_of_reference;
frames_of_reference.baseFrame = TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE;
frames_of_reference.targetFrame = TangoPoseData.COORDINATE_FRAME_DEVICE;

new Thread(new Runnable() {
    final int pollingUpdatePeriodMilliseconds = 66;

    @Override
    public void run() {
        while (true) {
            try {
                 Thread.sleep(pollingUpdatePeriodMilliseconds);
            } catch (InterruptedException e) {
                 e.printStackTrace();
            }
            try {
                // ポーズを取得
                // 第1引数はタイムスタンプを設定
                // 最新のポーズを取得したい場合は、0.0を設定する
                final TangoPoseData queryPoseStartDevice =
                    mTango.getPoseAtTime(0.0, frames_of_reference);
            } catch (TangoErrorException e) {
                e.printStackTrace();
            }
        }
    }
}).start();


-- DepthPerception --




デプスパーセプションにより、デバイスから実世界の物体までの距離を把握することができます。これにより、実際の壁や他のオブジェクトをバーチャル世界の一部として扱うことが可能です。またモーショントラッキングと組み合わせることにより、オブジェクト間の距離を測定することができます。現在のデバイスは、屋内の中程度の距離(0.5〜4メートル)で最適に動作するように設計されています。 
ProjectTangoAPIでは、ポイントクラウドの形で深度データを取得することが可能です。
以下に座標の取得方法を示します。


・DepthPerceptionを有効にする
try {
    TangoConfig config = new TangoConfig();
    config = mTango.getConfig(TangoConfig.CONFIG_TYPE_CURRENT);
    config.putBoolean(TangoConfig.KEY_BOOLEAN_LEARNINGMODE, true);
} catch (TangoErrorException e) {
    // handle exception
}

・測位結果の取得
mTango.connectListener(framePairs, new OnTangoUpdateListener() {

    @Override
    public void onXyzIjAvailable(TangoXyzIjData arg0) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("Point count: " + arg0.xyzCount);
        stringBuilder.append(". Average depth (m): " + calculateAveragedDepth(arg0.xyz));
        Log.i(TAG, stringBuilder.toString());
    }
});


-- AreaLearning --




モーショントラッキングを使用し、その動きや向きを追跡することで、デバイスがどこに存在するか把握することができますが、見たものをメモリに保存することはしていません。エリアラーニングは、スペース、エッジ、コーナーなどの特徴点を記憶することで、
後で再びその領域を認識することができるようになります。それにより、以下の図のように時間の経過とともに実軌道から離れた推定軌道をドリフト補正により、
より正しい軌道に調整することができます。
(引用:https://developers.google.com/project-tango/overview/area-learning#how_it_works)

また、取得した特徴点をADF(AreaDescriptionFile)として保存することができ、
ADFを共有することでマルチプレーヤーで同じ場所を共有したり、目的の場所までナビゲーションを行うことができます。
それぞれの使用方法を以下に示します。

・AreaLearningを有効にする
try {
    TangoConfig config = new TangoConfig();
    config = mTango.getConfig(TangoConfig.CONFIG_TYPE_CURRENT);
    config.putBoolean(TangoConfig.KEY_BOOLEAN_LEARNINGMODE, true);
} catch (TangoErrorException e) {
    // handle exception
}

・ADFのセーブとロード
// セーブ
String uuid = mTango.saveAreaDescription();
// ロード
try {
    mConfig.putString(TangoConfig.KEY_STRING_AREADESCRIPTION, uuid);
} catch (TangoErrorException e) {
    // handle exception
}

・AreaLearningMode時のポーズ取得
@Override
public void onPoseAvailable(TangoPoseData pose) {

if (pose.baseFrame == TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION
        && pose.targetFrame == TangoPoseData.COORDINATE_FRAME_DEVICE) {
    // 補正後のポーズを取得
}
else if (pose.baseFrame == TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION
        && pose.targetFrame == TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE) {
    // ADFをロードした場合、このセットが呼ばれる
    // ロード後は、ロードされたADFの値が原点になる
}


[まとめ]

ProjectTangoは現時点では、まだまだ発展途上ですが、それにもかかわらず、すでにパフォーマンスを発揮していることが、セッションやデモから感じました。今後発表されていくProjectTangoのアップデートやデバイスにも注目していきたいと思います。



140 180 Google I/O , ProjectTango

記載されている会社名、および商品名等は、各社の商標または登録商標です。

0 コメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...