ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

KinXT = Kinect + LEGO NXT

先日、面白いものを見つけたので、ちょっとマネしてやってみました。
LEGO社のNXTという、動作をプログラムできるオモチャがあるのですが、これをKinectから制御する。というものです。
#ちなみに、なんでNXTがあるかというと、会社でNXTを使ったプログラム入門のセミナーを行っているからです:-)
#あと、ソースは今のところ非公開にします


LEGO MINDSTORMS

どうやってやってるの?

NXTにはBluetoothが搭載されており、これを使ってPCと接続することができます。
PCと接続するとCOMポートの扱いとなるため、PCからコマンドを発行できるようになります。
このコマンドの中に「ダイレクトコマンド」というものがあり、これを使うとNXTに接続されているモーターなどを制御できるようになります。
今回は、PCからダイレクトコマンドを発行しNXTを操作します。そして、そのコマンドを発行するためのコントローラーがKinectになります。


ただし、この動画と違うのは、Xtion Pro + OpenNIでやりました。Xtion ProでDepth,User,Skeletonしか使っていないので、KinectでもXtion Liveでもできると思います。

どんな感じ?

こんな感じ
ポーズは

  • 右手を上げる:右のモーターが回る
  • 左手を上げる:左のモーターが回る
  • 両手を上げる:両方のモーターが回る
  • 腕の角度(ひじと手の角度)がそのままモーターのパワーになる
    • 腕を上に上げてる状態がパワー0
    • 前に倒すと前進の速度が上がる
    • 後に倒すと後進の速度が上がる

KinXT from Kaoru NAKAMURA on Vimeo.

どうやってるの?

NXTの側はファームウェアを入れただけ(NXTソフトウェアからダウンロードできるやる)で、プログラムを入れたりとかはしてません。
制御はすべてPC側から行っています。
PCとNXTはCOMポートを介したBluetooth通信になっていますが、コマンドが何かと面倒なのでいいのもはないかと探していたら、いいのがありましたw

これを使うと簡単にNXTにコマンドを送ることができます。
ちなみにBluetoothのスタックはマイクロソフトがいいみたいです。東芝のスタックだとダメらしいです。僕はMac Book AirのBootCampなので、そのまま使えました。


例として、1秒間NXTを前進させるにはこのように書きます

nxt.Connect( "COM3" );

nxt.SetOutputState( MotorPort.PortA, 100, MotorModes.On, MotorRegulationMode.Idle, 100, MotorRunState.Running, 0 );
nxt.SetOutputState( MotorPort.PortB, 100, MotorModes.On, MotorRegulationMode.Idle, 100, MotorRunState.Running, 0 );

Thread.Sleep( 1000 );

nxt.SetOutputState( MotorPort.PortA, 0, MotorModes.On, MotorRegulationMode.Idle, 100, MotorRunState.Running, 0 );
nxt.SetOutputState( MotorPort.PortB, 0, MotorModes.On, MotorRegulationMode.Idle, 100, MotorRunState.Running, 0 );


そのほかのコマンドの詳細はこちらを参照します。

まとめ

このように簡単にPCからNXTを動かすことはできます。
あとはKinectのジェスチャーなどを、制御のトリガーにすれば出来上がりです。実際、ここまで持ってくのに3時間くらいしかかかっていません。
遠隔に操作するのもKinectの利用例の一つだと思いますので、いろいろ遊んでみたら面白いと思います。