ロボットボールSpheroをLeap Motionでジェスチャー認識してコントロールしてみた

Leap Motionで手の位置やジェスチャーを認識し、それに合わせてロボットボールSpheroを走らせてみました。

手を握った状態から開くと、コントロール開始。
手を開いたときの位置を基準に、前後左右に手を動かすだけで、Spheroを思うがままに走らせることができます。手を大きく動かせば高速に、少しだけ動かせばゆっくりに。


Leap Motionによる認識結果はWebブラウザ上に表示されます。上の動画中ではブラウザをフルスクリーン表示にしてあります。この可視化部分まではSDKのサンプルそのままです。サンプルにWebSocket経由で認識結果を送るコードを追加し、それをRubyスクリプトで受け取ってSpheroのコントロールを行っています。


コードはGitHubにあります。
実行にはLeap MotionJavaScript SDK、およびrubyのSpheroライブラリ(gem install spheroで導入)、em-websocketライブラリ、そしてもちろんSpheroLeap Motionが必要です。


どちらもAPIが良くできているため、開発は非常に簡単でした。書いたコード量的にはJavaScriptRuby合わせて200行くらい(サンプルそのままの可視化コードを除く)。内容としては、手を開く・握ると言ったジェスチャーの認識(といっても認識された指の本数に応じて条件分岐してるだけ)、データの受け渡し、Leap MotionからSpheroへの座標系の変換、速度差の吸収*1といった両者を繋ぐために必要な部分のみ。認識や操作の細部は全部APIにお任せ*2で、それ以外の部分に集中して開発できました。

*1:SpheroはBluetoothシリアル通信するため、送受信に時間がかかります。その間にもLeap Motionからの更新が大量に押し寄せてくるので、全部を送信していてはどんどん遅延が拡大していってしまいます。そこで、rubyのEventMachineのEM.deferを利用して、非同期に最新の更新分だけを送信するようにしています。

*2:高度に発達した科学は魔法と…