Lenovo Phab 2 Pro で Project Tango 入門3

本日はPointCloudのJavaサンプルを見てみましょう。
Android StudioのでInport projectを選択し、java_point_cloud_exampleを選択してOKボタンをクリックします。

ファイル構成は以下のようになっています。

PointCloudActivity.java Javaによる点群表示サンプル。メインアクティビティです。
PointCloudRajawaliRenderer.java 点群データのレンダラーです。
 TouchViewHandler.java  標準的なパン操作とズームタッチ操作の処理を含む、VR設定のトップダウンビューと3人称ビューを追加するヘルパークラスです。
 rajawali/FrustumAxes.java public class FrustumAxes extends Line3D
FrustumとAxesの組み合わせを表すプリミティブ(基本的なもの)。錐台(すいだい、英: Frustum)は、錐体から、頂点を共有し相似に縮小した錐体を取り除いた立体図形の事。
Axesとは軸の事。
 rajawali/Grid.java public class Grid extends Line3D
現在のシーンの「床」を表すRajawaliオブジェクト。
これはシーンに配置された静的グリッドで、さまざまなビューにパースペクティブを提供します。
 rajawali/PointCloud.java public class PointCloud extends Points
色を使用して深度センサまでの距離を示すポイントクラウドをレンダリングします。
着色は光のスペクトルに基づいています。最も近い点は赤色で、最も遠くは紫色です。
rajawali/Points.java public class Points extends Object3D
Rajawaliの点のプリミティブ(基本型)です。

それでは詳しくみていきましょう。

PointCloudActivity

onCreateでは、TangoPointCloudManagerを生成しています。また、PointCloudRajawaliRendererクラス(点群データのレンダラー)のインスタンス生成を行なっています。また、DisplayManagerを取得し、画面の回転方向をmDisplayRotationメンバ変数へ保持しています。
onStartでは、bindTangoServiceメソッド内で、Tangoサービスを通常のAndroidサービスとして初期化します。
onStopでは、OpenGLスレッドまたはUIスレッドで使用されているサービスが切断するまで同期します。Tangoコールバックスレッドでこの同じオブジェクトに対してロックしないでください。すべてのTangoコールバックコールが終了するまで、Tango.disconnectはここでブロックされます。Tangoのコールバックスレッドでこのオブジェクトをロックすると、デッドロックが発生します。
bindTangoServiceではTangoサービスを通常のAndroidサービスとして初期化します。 onPauseでmTango.disconnect()を呼び出すので、これはTango Serviceのバインドを解除するので、onResumeが呼び出されるたびに新しいTangoオブジェクトを作成する必要があります。サービスがOpenGLスレッドまたはUIスレッドで使用されているときに切断に対して同期させます。
setupTangoConfigはbindTangoService内で呼ばれるメソッドで、Tango設定オブジェクトを設定します。 この呼び出しを行う前に、mTangoオブジェクトが初期化されていることを確認してください。これはデフォルトの設定を使用して、さらに深度センサーを追加します。
startupTangoもbindTangoServiceメソッド内で呼ばれるメソッドで、Tangoサービスのコールバックリスナーを設定し、Tango接続後に必要なその他のパラメータを取得します。ポイントクラウドとTangoのイベントとポーズの更新をリッスンします。
setupRendererはonCreate時に呼ばれるメソッドで、Rajawaliサーフェイスビューとそのレンダラーを設定します。 これは、理想的にはonCreateで1回だけ呼び出されます。
setupTangoUxAndLayoutもonCreate時に呼ばれるメソッドでTangoUXの設定とそのリスナーの設定を行います。イベントは、例外条件が観測されたときに「DETECTED」とみなされ、根本原因が解決されたときに「RESOLVED」とみなされます。
画面のFirstボタンを押すとカメラが現在位置に設定されます。いわゆる一人称視点になります。
Thirdボタンを押すとカメラを現在位置に設定し、Z軸に45度回転し、更にカメラをY軸に45度回した位置に固定します。いわゆる第三者視点です。
Topボタンを押すとカメラを現在位置の上部に固定し上からの俯瞰表示にします。これらボタンの処理はTouchViewHandler内で行われます。
画面上には、getAveragedDepthメソッドで計算した平均深度とポイントクラウドの数が表示されています。

PointCloudRajawaliRenderer

ポイントクラウドのデータはXYZC形式で提供されるため、ポイントあたり4つのfloatを示します。
レンダリングされたポイントクラウドを更新します。 このためには、クラウドデータを取得した時点でポイントクラウドデータとデバイスポーズが必要です。
注:これは、OpenGLレンダリングスレッドから呼び出す必要があります。
Rajawaliは左手系を使用するため、共役四元数が必要です。(共役四元数はこちらのサイトの説明がわかりやすい)
現在のデバイスポーズに関する情報を更新します。
注:これは、OpenGLレンダリングスレッドから呼び出す必要があります。
Rajawaliは四元数に対して左手系を使用するため、共役四元数が必要です。

TouchViewHandler

標準的なパン操作とズームタッチ操作の処理を含む、VR設定のトップダウンビューと3人称ビューを追加するヘルパークラスです。
 

実行する

では実行してみましょう。実行すると次の画像のような点群表示が得られます。リアルタイムでかなり高速に点群表示できている事が確認できます。ただ、点群の更新はちょっと遅れるようですね。そんなに応答性が良い感じではありませんが、スマホで使うには申し分ない速度でしょう。

 

 

 

Lenovo Phab 2 Pro で Project Tango 入門 2

前回に続き、サンプルの動作を確認していきましょう。
java_augmented_reality_exampleです。
これは、Tango APIを使用して拡張現実感(AR)アプリケーションを作成する方法を示す簡単な例です。 それは、装置の正面1メートルのところに浮かぶ惑星地球とその周りを回転する月を表示します。
この例では、OpenGLレンダリングにRajawaliを使用しています。これには、バックグラウンドでの カラーカメラ画像と、前方3mの空間に浮かぶ地球の質感を持つ3D球が含まれます。
この部分は、通常のRajawaliアプリケーションのように、{@code AugmentedRealityRenderer} クラスで実装されています。
この例では、Tango APIを使用してOpenGLテクスチャにカラーカメラデータを効率的に取得し、 拡張現実感効果を実現するためにOpenGLカメラがデバイスの動きを追跡するようにする方法に焦点を当てます。
Rajawaliの仮想世界をRGBカメラと同期させる最良の結果を得るには、 KEY_BOOLEAN_LOWLATENCYIMUINTEGRATION設定パラメータを含めることが重要です。
Rajawaliのようなレンダリングライブラリを使用しない、より抜粋した例を探しているなら、 java_hello_video_exampleを見てください。
では、import projectをクリックし、java_augmented_reality_exampleを選択してOKを押します。

RajawaliはAndroid OpenGL フレームワークです。
実行すると次のように地球と月が表示され、位置がほぼ固定されます。ただ追従はあまりよくない感じです。

 

Lenovo Phab 2 Pro で Project Tango 入門

世界初の Tango 対応スマートフォンLenovo Phab 2 Proを購入しました。

まずは開封の儀

IMG_3839
なんとパッケージから内部が見えます。Phab 2 Proの特徴であるデプスカメラ、モーション・トラッキング・カメラが見えています。
 
IMG_3840IMG_3841
かなりでかい印象です。Xperia Zと比べるとこんなにも違います。
付属品は、ACアダプタ、ヘッドフォン、USBケーブル。
早速電源に繋いで充電をします。充電されるのを待っている間に、Project Tangoについて勉強することにしましょう。
まずは、Googleのサイトから。
https://get.google.com/tango/
まずはProject Tangoの仕組みの概要です。
Tangoのコンセプト
モーショントラッキング
エリア学習
奥行き検知

サンプルプロジェクトのダウンロードと実行

https://github.com/googlesamples/tango-examples-java/archive/master.zip をダウンロードします。
Android Studioを起動して「Inport project」より、java_basic_examplesディレクトリを選択してOKを押します。

プロジェクトが開いたら、ツールバーを見るといくつかのモジュールが存在していると思います。ここからhello_motion_trackingを選択してRunボタンをおして実行してみましょう。

実行するとAndroid Studioの下部に生の姿勢データが表示されます。

では次にhello_depth_preceptionを実行してみましょう。これも同じくLogcatに生の値を吐くだけです。ただポイントクラウドはデータ量が多いからか距離の平均を出力しているようです。

Logcatを見るかぎり、おおよそ0.2秒間隔で3万6千個の点を取得出来ているようです。
次に、heloo_area_descriptinを実行してみましょう。このサンプルは先ほどまでのサンプルより複雑ですね。
Larning mode onにしてStartするとセンサーの値から領域を学習し、学習した領域をADFに保存します。
最後にhello_videoです。
このhello_videoはとてもなめらかに動き、ほぼ遅延なくRGBカメラからの画像が画面上に表示されます。
ヘッダよりこのサンプルは以下の機能を説明しています。

 このサンプルでは、RGBカメラをOpenGLテクスチャに変換します。
 単純なレンダラーで標準のAndroidのサーフェスビュー(GLSurfaceView)を作成し、ビデオレンダリング用の適切な設定でTangoサービスに接続します。
新しいRGBビデオフレームがTango APIを介して利用可能になるたびに、OpenGLテクスチャに更新され、対応するタイムスタンプがlogcatおよびスクリーンに印刷されます。
 
 Tango RGBカメラで生成された特定のテクスチャ形式をレンダリングする方法を理解するために必要な最小OpenGLコードのみが提供されています。
これらの詳細は、HelloVideoRendererで見つけることができます。
 拡張現実エフェクトを使用して実際の3Dオブジェクトをレンダリングする例をお探しの場合は、java_augmented_reality_example
および/またはjava_augmented_reality_opengl_exampleを参照してください。

 

TurtleBot3-プリンターで印刷可能なロボティスク入門機

ロボティクス入門として、ROS入門機として定番のTurtleBotシリーズに新しくTurtleBot3が加わります。

TurtleBot3とは?

ROSの管理団体であるOpen RoboticsとROBOTISが共同開発しているROS対応のモジュラータイプロボットシステム「Turtlebot3」シリーズです。現在ワッフルとバーガーという2種類が販売されるようです。
2017/6/1から購入可能になるようですね。5月は教育機関向けアーリーバードを販売中でした。そちらは既に完売済。

TurtleBot3の特徴

TurtleBot3は教育、研究、製品開発向けの小型ロボットです。

オープンソースソフトウェア及びオープンソースハードウェア

TurtleBot3はオープンソースのロボット用ソフトウェアであるROS上で動きます。ハードウェアもすべてオープンになっていて、ロボットを構成するパーツのCAD情報が全てインターネット上で閲覧できます。ですから今すぐあなたの3Dプリンターでパーツを印刷してロボットを組み上げることも可能です。メインコントローラーボードのOpenCRもオープンであり、設計が公開されています。
そのため、その気になれば全て自分で作成して、ソフトウェアをインストールし、動かしてみるということが可能です。メインコントローラーボードの基盤を基板屋さんで作ってもらって自分でハンダ付けすればカスタマイズした基盤だって作れます!

カスタマイズ可能

TurtleBot3は自由にカスタマイズ可能です。ワッフルというベース部品を自由に組み合わせることでいろいろな形のロボットを作成することができます。既に販売が決まっているワッフルとバーガーというタイプの他にも「フレンズ」と言う、車、マニュピレーター、セグウェイ、運搬車、モンスター、タンク、オムニホイール、メカナム、バイク、トレイン、亀ロボット、キャリアといった12種類の形状、設計の違うロボットが用意されています。
それらフレンズ達の部品データもCADデータが公開されているため、プリンターで印刷可能です!

価格

気になる価格はバーガーが5万4千円、ワッフルが17万円です。