7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Tangoアプリ開発の基礎知識をまとめる

Last updated at Posted at 2016-12-27

jyukoです。Tangoの勉強でソースコードを眺めつつ、A-Frameをさわったり、ミニドローン飛ばしたりしてます。

Tangoアプリ開発の取っ掛かりとして、Tangoを理解する上で必要な要素技術をまとめておきます。
Tangoの概要については、前の記事を参照ください。

デプス・カメラ(depth camera)

深度を測るセンサを用い、奥行きを持った3次元距離画像を撮影するカメラを指すようです。

PHAB2 Proのスペックを改めて見直すと、**深度カメラ (TOF方式)**と記載されていました。
TOF方式は、"Time Of Flight"の略で、赤外線を照射して反射して返ってくるまでの時間で距離を測る仕組みです。

デプス・カメラで3Dスキャンやモーションキャプチャを行うデバイスとしては、Kinectが有名かと思います。
また、詳しい仕組みは非公開ですが、LeapMotionも赤外線を飛ばして3Dキャプチャを行う点は共通です。

近い将来、スマートフォンを始めとするモバイルデバイスに、デプス・カメラが標準搭載されてくるかもしれません。

点群データ(point cloud)

デプス・カメラによって得られるデータの形式です。
メッシュではなく、ポイントの集合体で形状を表しています。

Point_cloud_torus.gif

光の反射で測定しているので、一つ一つの点は物体表面の座標になります。
これらの点群データから、メッシュ形式に変換する手法もいくつかあるそうです。

ポイントには、位置(XYZ座標)だけではなく、色(RGB値)を持たせることもできます。
RGBカメラ(普通のカメラ)で得た画像から、デプス・カメラで得た座標に対応する位置のRGB値を取れば、おおよその色情報も含めてキャプチャができます。

Tangoアプリ開発には不要と思われますが、点群データを扱うオープンソースライブラリも紹介しておきます。
Point Cloud Library (PCL)

改めて、Tangoをさわってみる

プリインストールされているGoogleのアプリでは、点群が線でつながり、仮想空間が作られるようなデモが流れます。
Screenshot_20161216-221122.png

前回の記事でも紹介しましたが、Tango Unity SDKのExampleにある"ExperimentalMeshBuilderWithColor"です。
カメラを向けると室内をキャプチャして、メッシュができていきます。
Screenshot_20161218-003355.png

色情報を持てるpoint cloudをメッシュ形式に変換できるということは、つまりそういうことです。

Tango Unity SDKのコードを読む

Project Tango UnitySDK Examplesで、いつでも読み放題です。
点群データ(point cloud)がインターフェースに渡るまでの処理は、以下の3ファイルを眺めているとなんとなく理解できます。

TangoSDK/Core/Scripts/TangoWrappers/DepthProvider.cs

ファイル名やコメントからして、デプス・カメラからの情報を得るC APIのラッパー。
UpdateTangoEmulation()でXYZ座標と色情報をm_emulatedPointCloudに詰め詰めしておいて、GetTangoEmulation()が呼ばれたらreturnしている。

TangoSDK/Core/Scripts/Listener/DepthListener.cs

SendIfAvailable()が上記の_FillEmulatedPointCloud()で点群データを取ってきて、イベントハンドラに渡している。
_FillEmulatedPointCloud()DepthProvider.GetTangoEmulation()でラッパーからデータを取ってきている。

TangoSDK/Core/Scripts/TangoWrappers/TangoApplication.cs

Update()DepthProvider.UpdateTangoEmulation()実行からのDepthListener.SendIfAvailable()しているので、イベントハンドラにpointCloudが渡る。

見えるぞ!私にもTangoが見える!

まとめ

というわけで、最終的にはITangoPointCloudインターフェースのOnTangoPointCloudAvailable()Tango.TangoPointCloudDataが取れます。
XYZとCの配列になっているm_pointsが点群データ(point cloud)です。
使い方はこちら

やはり理論から入ると、API仕様やソースコードの見え方が違いますね。
期せずして、イベント駆動をちゃんと理解するきっかけにもなりました。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?