レビュー
» 2013年08月06日 16時50分 公開

触れずに操作:「Leap Motion Controller」の可能性を考えた (2/3)

[瓜生聖,ITmedia]

Leap Motion用のプログラムを開発するには

システムトレイのLeap Motion Controllerアイコンから「Settings」を選択し、Leap Motion Control Panelを起動、「Troubleshooting」タブから「Diagnostic Visualizer」をクリック

 Leap Motion Controller対応プログラムを開発する場合は、同社のWebサイトからダウンロードできるSDKをインストールする必要がある。SDKはJavaScript、C#、Unity、Python、ObjectiveC、C++、JAVAと、豊富な言語やプラットフォームに対応している。

 Leap Motionで検知できるのは手のひら、指、そのほかペンのようなポインティング可能なツールだ。実際にどのようなデータが取得できるかは「Leap Motion Control Panel」から「Diagnostic Visualizer」を起動させるとよく分かる。座標はLeap Motionの上面中央を原点とする3次元空間――左方向にX軸、上方向にY軸、手前方向にZ軸の直行座標系となる。

 指やペンの情報はfingerモデル、Toolモデル、その両方を含むPointableモデルとして、先端の位置情報のほか、ベクトル情報を取得できる。また、後述のHandモデルと合わせて「指と手のひらにぴったりフィットする球体」の中心座標、半径も得られる。「ほぼ平ら」な状態は「より大きな球体」として認識されるため、図らずも巨にゅ……巨大球体平面説が裏付けられたわけだ。この情報を利用したアプリの登場を期待したい。

Diagnostic Visualizer。handの情報、finder情報のほか、手のひらの中心点、垂線ベクトルなどが表示されている(画面=右)

handの追加情報。手のひら・指にフィットする球体が表示されている。データとしてはこの球体の半径と中心点が取得できる(画面=左)。位置情報はLeap Motion Controllerを基点とした直交座標系で取得(画面=右)

Handモデルの取得情報。手のひらの中心点、手のひらのベクトル、手で包み込まれる球体の中心点、半径(画面=左)。FingerモデルとToolモデル。位置情報の他、ベクトルが取得できる(画面=右)

 手の情報はHandモデルとして認識されるが、Fingerモデルなどよりもやや複雑になる。手だけではなく、FingerオブジェクトやToolオブジェクトもその手に関連付けられるからだ。FingerオブジェクトにはIDが振られるが、拳を握り込んだりすれば指は検知されなくなる。その結果、いったんロストしたFingerオブジェクトにはIDの連続性はない。5本の指が検出できればその位置関係から人差し指がどれかを認識することは可能だが、いったんその指がロストすれば再び5本の指が検知できるまでどれが人差し指かを判定することは難しい。

 Fingerオブジェクトに限らず、Leap Motion Controllerで検知されるオブジェクトはいつでもロストする可能性があることを前提としてプログラミングする必要がある。また、その逆に突然出現することも考慮したうえで、連続的な操作を実現しなくてはならない。このあたりは作り手の「作法」として徐々に洗練されていくだろう。

 Fingerオブジェクト以外にHandモデルで取得できる情報は手のひらの中心点座標、移動速度(ミリ/秒)、手のひらに対する垂直ベクトル、手のひらの中心から指に向かうベクトルなど。これらは飛行機を手のひらで操作するアプリなどで利用されている。

 Leap Motion Controllerからはそれぞれの3軸の座標情報だけでなく、回転(回転軸のベクトル、回転角)、拡大/縮小、直線移動といった動き(モーションデータ)も扱いやすい形で取得することができる。さらに、特定のモーションはジェスチャーとしても取得できる。開発者が連続した位置情報を元に動きやジェスチャーを解析する必要がないため、効率のよい開発が可能だ。もちろん、モーションデータ、さらには座標データの変化を読み取れば自分自身でほかのジェスチャーを実装することも可能だ。

 認識できるジェスチャーは次の通り。それぞれ指1本ごとに検出できるので「指2本によるスワイプ」も認識可能だ。

  • サークル:1本の指による円運動
  • スワイプ:平行運動
  • キータップ:キーを叩くような上下運動
  • スクリーンタップ:スクリーンをタップするような前後運動
サークルは指を回転させている間継続する連続的なジェスチャー(画面=左)。回転軸のベクトル、回転方向などが取得できる(画面=右)

スワイプもサークル同様、連続的なジェスチャーとして取得される

Leap Motion Controllerがサポートする2種類のタップのうちの1つ、キータップ。ピアノの鍵盤を叩くように下げて、すぐに上げる。上下にトンと叩くような指の動き。このほか、スクリーンをタップするように前方に動かすジェスチャーもある

Leap Motionのアーキテクチャ

 これらの情報はAPIを用いて取得するが、Leap Motion Controllerには2系統のAPIが用意されている。1つはネイティブなインタフェース。オーバヘッドが小さいというメリットがある一方、開発するアプリケーションはダイナミック・リンク・ライブラリをリンクする必要がある。そしてもう1つがWebSocketインタフェースだ。このWebSocketインタフェースの実装により、さまざまな言語での開発が容易になっている。

 WebSocketは、HTTPをベースとした継続的な双方向通信を可能とするプロトコルで、Ajaxの構成技術の1つであるXMLHttpRequest(XHR)に置き換わるものだ。HTML5仕様を出自とし、IE、Firefox、Ghrome、Safari、Operaなどに実装されている。そのため、特にライブラリをバイナリレベルでリンクさせる必要はなく、ブラウザ上で動くLeap Motion Controller対応JavaScriptアプリケーションを開発することもできる。

 もちろん、そのほかの言語でもWebSocketインタフェースは利用可能で、SDKに含まれない有志によるライブラリ・フレームワークはProcessing、Ruby、ActionScriptなどさまざまな言語のものが開発されている。

WebSocketインタフェースの仕組み。ポート6437でWebSocketサーバが動作する(画面=左)。JavaScriptサンプル集(画面=右)

ジェスチャー認識時のJSONデータを表示する「Gesture JSON Printout」(画面=左)。PointableとHandのデータを表示する「Pointable and Hand Data」(http://js.leapmotion.com/examples/parcoords.html)

「Pointable and Hand Data」のJavaScriptの一部。Leap.loop()がLeap Motion Controllerからのコールバック関数となる(画面=左)。JavaScriptで書かれたWebアプリケーションをchromeで実行し、デベロッパーツールでWebSocketの通信内容を表示したところ(画面=右)

Copyright © ITmedia, Inc. All Rights Reserved.

この記事が気に入ったら
ITmedia PC USER に「いいね!」しよう