Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
Leap Motion最新情報(2015年7月)

Leap Motion最新情報(2015年7月)

これは快適! Leap Motion v2で格段に良くなったSkeletal Tracking機能

2015年7月8日 改訂 (初版:2014/5/23)

v1と比べて非常に追従性がよくなった、最新のLeap Motion Version 2.0 Skeletal Trackingの入手方法や新しい機能について解説する。

Natural Software 中村 薫
  • このエントリーをはてなブックマークに追加

 2014年5月にベータ版として公開された「Leap Motion Version 2.0」(執筆時点ではVersion 2.2.6正式版となっている)について紹介する。

 Leap Motionの概要については、下記の記事を参照してほしい。開発環境の構築手順は変わらないので、以前の知識をそのまま使うことができる。

 まずは次の動画を見ていただきたい。Leap Motion v2の動画だ。

Leap Motion v2 を試しているところ

 今までのLeap Motion(以下、「Leap Motion v1」とする)と比べても非常に追従性がよく、リリース当時のプロモーションビデオに近くなっている。Leap Motion 2では、ハードウェアの変更はなく、ソフトウェアの変更のみとなっている。そのため、Leap Motionコントローラーが手元にあれば、すぐにでも試すことができる。

 本稿ではLeap Motion v2のSDKの入手方法や新しい機能について解説する。解説する内容は下記のリンク先を参照すると、より詳細な情報を得られるだろう。執筆時点(2015年7月)でのバージョンは「2.2.6+29154」である。クラスやメソッドなどについてはC#の名称としている。

インストーラーの入手

 どのような形であれ、Leap Motion v2の動きを見るためには、手元のコンピューターにLeap Motion v2のSDKをインストールする必要がある。インストーラーはLeap MotionのサイトのDeveloper Portalから入手する(Developer Portalにはアカウントが必要になるので、登録を先に済ませておくこと)。

図1 Leap Motion v2 SDKをダウンロードする

 ダウンロードするとZIPファイルが取得できる。これを解凍すると次の3つのファイルがある。

  • LeapSDKフォルダー(Leap Motion v2 SDK)
  • Leap_Motion_Installer~.exe(クライアントインストーラー)
  • README.txt
図2 Leap Motion v2 SDKを解凍する

 クライアントインストーラーを実行し、セットアップウィザードの指示に従ってインストールする。インストールが完了したら、ビジュアライザーを起動してみよう。タスクトレイのLeap Motionコントロールパネルを右クリックし、コンテキストメニューから[ビジュアライザー]を選択する(図3)。

図3 ビジュアライザーを起動する
図3 ビジュアライザーを起動する

 ビジュアライザーが起動したら(図4)、Leap Motionコントローラーを接続し、指を検出させてみよう。Leap Motion v1とは異なり、指の関節が表示され、手の形が浮き出てくるだろう。手を回転させたり、開閉させたりして見てほしい。Leap Motion v1と比較して明らかに追跡性能が向上していることが分かるだろう。さらに注意深く見てみると、腕が表示されていることが分かるだろう。

図4 ビジュアライザー

新しい機能

 Leap Motion v2では、基本的にLeap Motion v1の機能を踏襲し、追跡性能の向上および、より詳細な追跡情報の取得が可能となっている。新しい機能を見るにはこちらのページにアクセスすると早いだろう。Leap Motion v2の機能が見られる他、Leap Motionコントローラーが接続されていれば、実際に動作させることもできる。

ハンドモデル(Hand Model)および指の関節の検出

 手の形を追跡する。Leap Motion v1では「手のひら」と「指先」の追跡だけだったが、v2では「指の関節」を検出できるようになった。これによって手の形を認識できるようになった。次の図は、v2のハンドモデルである。

図5 ハンドモデル
図5 ハンドモデル

 指の関節はBoneクラスで表され、次の図に示す4つの骨(distalmedialproximalmetacarpal)から成り立っている。BoneクラスはFingerクラスのBoneメソッドに、ボーンの種類を指定することで取得できる。

図6 ハンドモデル
図6 ハンドモデル

ピンチ(Pinch)の検出

 親指と人差し指の開閉度を表す。タッチパネルで写真を拡大/縮小するような動作だ。開いている状態が「0」、閉じている状態が「1」となり、その間の値が開閉度合いとなっている(図7)。この値はHandクラスのPinchStrengthプロパティで取得できる。

図7 ピンチの検出
図7 ピンチの検出

グラブ(Grab)の検出

 指全体の開閉度を表す。「パー」から「グー」にする(または逆の)動作だ。開いている状態が「0」、閉じている状態が「1」となり、その間の値が開閉度合いとなっている(図8)。この値はHandクラスのGrabStrengthプロパティで取得できる。

図8 グラブの検出
図8 グラブの検出

検出値の信頼度(Data Confidence)

 Leap Motion v2では手を回転させる、手を重ねるなどの動きをしても、Leap Motion v1と比べて追跡し続けるようになっている。とはいえ、完全に検出できているわけではない。この値の信頼性を表すパラメーターが追加された。「0」~「1」の間で変化し、「1」に近いほど信頼される値となる(図9)。この値はHandクラスのConfidenceプロパティで取得できる。

図9 検出値の信頼度
図9 検出値の信頼度

右手と左手(Left or Right)の検出

 右手と左手を検出できるようになった(v1ではできなかった……)(図10)。検出を開始した時の手の形から判別しているようで、手を裏返してLeap Motionコントローラーに近づけると、逆の手として検出する。この値はHandクラスのIsLeftプロパティまたはIsRightプロパティで取得できる。

図10 右手と左手の検出

指の種類の検出

 指の種類(親指~小指)を検出できるようになった(これもv1ではできなかった……)。ビジュアライザーを見ても分かる通り、Leap Motion v2では手を閉じて(グーにして)も指を検出するようになった。これによって、指の種類を検出できるようになっている(図11)。ただし常に検出し続けるため、Leap Motion v1との互換性が損なわれている部分もあるので、注意が必要だ。これについては後述する。この値はFingerクラスのTypeメソッドで取得できる。

図11 指の種類の検出
図11 指の種類の検出

カメラ画像の取得

 v2のリリースからしばらくして、Leap Motionのカメラ画像が取得できるようになった。Leap Motionは2眼のカメラと3つの赤外線LEDで手を検出しているが、このカメラ画像にアクセスする手段は今まで提供されていなかった。

 Leap Motionのカメラ画像は既定では無効になっており、設定画面から有効にする。

図12 カメラ画像の有効化

 これによってLeap Motionのカメラ画像(左右2つ)を取得できるようになる(図13)。これは次に紹介するVR機能への対応も含まれている。

図13 Leap Motionのカメラ画像

VR(Virtual Reality)対応

 Leap Motionは画期的ではあったが、実際にこれでコンピューターを操作してみると、「操作が難しい」「疲れる」など、今までの入力方法を置き換えるのは難しかった。

 Leap Motionが有効な入力デバイスとして活躍できる場所の一つにVRが挙げられる。Oculus RiftのようなHMD(Head Mounted Display: ヘッドマウントディスプレイ)型のVRデバイスでは目を覆ってしまうため、コンテンツを見る没入感は非常に大きいが、コンテンツを操作するために入力デバイスは非常に限られる。Leap Motion社はこのようなVRデバイス(特にOculus Rift)の入力デバイスとしてのLeap Motionの活用も進めている(図14)。

図14 Oculus RiftとLeap Motionを組み合わせる

 先に紹介したカメラを使うことで、覆われている目の前を見ることができる。Leap Motionのカメラは2つあり、Oculus Riftも右目、左目に分かれているので、左右のカメラの画像を左右の目に割り当てることで、目のように使うことができる。

 さらに、Leap Motionは手を検出できるので、目の前に差し出した手を検出できる。検出した手はVR空間内の3Dモデルの手(腕)と連動しており、空間内の別の3Dオブジェクトとの当たり判定を行うことができる。すなわち、VR空間内に自分の手を入れられるようになる。

 最近のアップデートでは、3Dモデルの手をカメラ画像のテクスチャで描画することで、自分の手をそのままVR空間内に持ち込むことができるので、より自然なインターフェースを作ることができるようになった(図15。詳しくは「VRコンテンツをLeap Motion×Oculus Rift×Unityで始めよう!:進化した「Leap Motion」と「Oculus Rift」で広がるVR(Virtual Reality)の活用シーン - ITmedia PC USER」を参照)。

図15 Leap Motionを使ってVR空間内にアクセスする

Leap Motion v2での注意点

 Leap Motion v2では、指を開いても閉じても5本の指を検出し続けるようになった。パーでも指は5本、グーでも指は5本を検出している(FingerクラスのCountプロパティの値)。Leap Motion v1では指を閉じると検出できなかったので、パーでは5本、グーでは0本となっていた。既存のv1アプリケーションで指の数をプログラムで利用している場合は常に5本を検出する(例えばじゃんけんアプリでは常にパーとなる)ので、意図しない動作になるだろう。このため、FingerクラスのベースクラスであるPointableクラスにIsExtendedプロパティが追加されている。IsExtendedプロパティがtrueの場合は指が伸びている(Leap Motion v1での検出状態)、falseの場合は指が閉じている(Leap Motion v1での未検出状態)となる。この条件を追加する必要があるだろう。

 次の画面は、「Leap Motionでのタッチ操作はどう開発するのか?[C++] - Build Insider(今後、改訂予定)」のサンプルをLeap Motion v1とLeap Motion v2で動作させた結果だ。人差し指だけを出している状態になり、v1とv2で指の表示が異なっていることが分かるだろう。

図16 Leap Motion v1での動作結果
図17 Leap Motion v2での動作結果

 より具体的なコード(C#の場合)は次の通りだ。

C#
var frame = leap.Frame();
var hand = frame.Hands.FirstOrDefault( ( h ) => h.IsValid );
if ( hand != null ) {
  // v2では常に5になる
  var count1 = hand.Fingers.Count;

  // 伸びている指の数が返る
  var count2 = hand.Fingers.Count( ( f ) => f.IsExtended );

  foreach ( var finger in hand.Fingers ) {
    if ( finger.IsExtended ) {
      // 従来の指の処理
    }
  }
}
Leap Motion v2とv1の差異を解消するために、IsExtendedプロパティを活用しているコードの例(Program.cs)

最後に

 Leap Motion v1の精度では実現できなかったアイデアがいよいよ実現できるのではないだろうか。現在、Leap MotionコントローラーはBBソフトサービス株式会社が代理店となり、以前よりも安心して購入できる。また大手家電量販店でも販売されているため、以前にも増して気軽に購入できるようになっている。

 販売状況が整ったLeap Motionコントローラーと大幅に精度、機能が向上したLeap Motion v2で新しいアイデアが形になることを願っている。

サイトからのお知らせ

Twitterでつぶやこう!