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を使用する方法を検討した方が良いと思います。