先日、面白いものを見つけたので、ちょっとマネしてやってみました。
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 );
そのほかのコマンドの詳細はこちらを参照します。