Penta creation

ホームへ
2016年10月08日

Raspberry Pi 3BでLeap Motionを使う

Raspberry Pi 3BでLeap Motionが使えるか試してみました。

Leap Motionの仕組み

現時点では、ソフトウェアがRaspberry Piに対応していないので、Leap MotionをRaspberry Piに直接接続して使うことはできません。

ただし、Leap MotionはWebアプリケーション開発用にJSONデータを出力しているので、そのデータを取得、加工することによってRaspberry PiでLeap Motionを使うことができます。


Leap Motionには大きくわけて2つの仕組みがあります。

ひとつは、SDKを通じてLeap Motionソフトウェアから座標データを取得、制御する仕組みです。こちらはJAVAやC++などアプリケーション開発用の仕組みになります。

もう一つは、WebSocket ServerからJSON形式のデータを取得、leap.js等で制御する仕組みです。こちらはWebアプリケーション用の仕組みで、Leap Motionはソフトウェアをインストールすると、WebSocket Server(ws://localhost:6437/)を自動的に立ち上げるようになっています。

Raspberry PiなどLeap Motionのソフトウェアが対応していない端末も、リモートでWebSocket Serverにアクセスし、JSONデータを取得、加工することによって、Leap Motionを使うことができます。

Leap MotionのセットアップからWebSocket Serverの確認まで

Leap Motionのセットアップは簡単です。Leap Motionをパソコンに接続して、ソフトウェアをインストールすれば完了です。セットアップが完了すると、WebSocket Serverが立ち上がりJSON形式のデータが出力されていることが確認できます。詳細は下記のページが参考になります。

Raspberry PiからリモートでWebSocket Serverに接続

WebSocket Serverに、Raspberry Piなどからリモートで 接続してJSONデータを取得するには、いくつか作業する必要があります。作業内容は下記4つですが、開発環境によって作業内容は変わってきます。
※ここではMacOSXでの作業内容を説明します。

上記ページを参考にさせてもらいました。

(1)Leap Motionの設定ファイル修正
(2)MacOSXのファイアーウォールの接続許可
(3)PF(Packet Filter)によるポートの開放
(4)プログラムでWebSocket Serverに接続 ※今回はProcessingを使用します。

(1) Leap Motionの設定ファイル修正

Leap Motionはver1.2からセキュリティが強化され、デフォルトではWebSocket Serverへの接続は拒否されます。そこで、「~/Library/Application Support/Leap Motion/config.json」と「/Library/Application Support/Leap Motion/config.json」の2つのファイルに「"websockets_allow_remote": true」、「"websockets_enabled": true」を追加します。

{
  "configuration": {
    "background_app_mode": 2,
    "websockets_allow_remote": true,
    "websockets_enabled": true
  }
}

この作業をする前にターミナルで「sudo launchctl unload /Library/LaunchDaemons/com.leapmotion.leapd.plist」して、Leap Motionのデーモンを停止しないとうまくいかない場合があるようです。ファイルを修正終わったら「sudo launchctl load /Library/LaunchDaemons/com.leapmotion.leapd.plist」でデーモンを再起動します。

(2) MacOSXのファイアーウォールの接続許可

MacOSXではアプリケーションレベルでファイアーウォールを設定することができます。

デフォルトでは、ファイアーウォールは「切」になっていますが、「入」にしている場合、「システム環境設定」>「セキュリティとプライバシー」>「ファイアーウォール」のファイアーウォールオプションでLeapMotionを許可する必要があります。※ファイアーウォールは「切」でも大丈夫です。


(3) PFによるポートの開放

WebSocket Serverにリモートで接続できるように、6437ポートをPacket Filterを使用して開放する必要があります。「/etc/pf.conf」を開いて「pass in proto tcp from any to any port 6437」を追加して、ターミナルで「sudo pfctl -vnf /etc/pf.conf」して設定を反映させます。

# Open port 6437 for TCP on all interfaces
pass in proto tcp from any to any port 6437

「/etc/pf.conf」はOSのアップデートの際上書きされてしまうので注意が必要です。

(4) プログラムでWebSocket Serverに接続

Raspberry Pi側のソフトウェアはProcessingを使用しました。
WebSocket Server用のライブラリーをインストールして、WebSocket関連のプログラミングをすれば、Raspberry PiでLeap Motionを使用することができるようになります。
※WebSocket Serverに接続する際のIPアドレスはWebSocket ServerのPCのIPアドレスになるので注意が必要です。「127.0.0.1:6437」はローカルホストです!

import websockets.*;
float x,y;

void setup(){
  size(600,900); 

  //テスト用ローカルマシン
  new WebsocketClient(this,"ws://127.0.0.1:6437");

  //本番用リモート
  //new WebsocketClient(this,"サーバーのIPアドレス:6347");
}

void draw(){
  background(0);

  fill(255,255,255,100);
  ellipse(x,900-y,20,20);
}

//=========================================================
// Websocket
//=========================================================
//WebSocket Serverに接続できたらwebSocketEventが返されます。
void webSocketEvent(String msg){

  //Leap MotionのJSONデータがStringで取得できる
 //println(msg)

  //JSON形式にパース
  JSONObject jsonData = JSONObject.parse(msg);  

  //https://developer.leapmotion.com/documentation/v2/javascript/supplements/Leap_JSON.html
  //上記を見てどのパラメーターを拾って処理するか検討します。

  if(!(jsonData.isNull("pointables"))){
    JSONArray pointables = jsonData.getJSONArray("pointables");
    
    if(!(pointables.isNull(1))){
      JSONObject pointables_1 = pointables.getJSONObject(1);
      
      if(!(pointables_1.isNull("tipPosition"))){
        JSONArray tipPosition = pointables_1.getJSONArray("tipPosition");
        
        x = tipPosition.getFloat(0);
        y = tipPosition.getFloat(1);
      }
    }
  }   
}

この方法を使えば、Raspberry Piにアームなどを接続して、Leap Motionから遠隔でアームを操作するなどが可能になります。今回は簡単な手の位置が取れればよかったので、JSONデータを直接加工しましたが、JSONデータの構造は複雑なので、もっと複雑なことをしようとした場合は、node.js環境でleap.jsを使用する方法を検討した方が良いと思います。

前の記事へ

Raspberry Pi 3BにIGZOパネルを接続

次の記事へ

Processing3でTwitter4J

ページトップへ