« Processingでスーファミ風コントローラを扱う | Main | Kinect巨乳 WORLD CUP 2012で戦ってきた »

2012.04.28

KinectとArduinoを連携させる(4パターン)

何度か書いてますが、「インタラクティブわたがし」という、Kinectと綿菓子機が連携するシステムを作っています。(もちろん遊びで)

このシステム、元は赤い服の人が来たら赤い綿菓子、青い服の人が来たら青い綿菓子を作るというものですが、人を認識するためにKinectを、綿菓子の材料となるザラメの制御にArduinoを使っていて、気づいたら随分と色々な組み合わせを試していたので、ノウハウ紹介します。

OpenNI/C++
KinectSDK/C++
KinectSDK/C#
OpenNI/Processing

いずれもKinectのソースコード付きで解説すると大変なので省略し、Arduinoの初期化と呼び出しの箇所だけ書きます。また、数値を文字列に変換する書きっぷりも処理系によって違うので、dataという変数に入った値を出力するという想定で書きます。

●OpenNI+OpenCV/C++/MacOS

いわゆる最初のバージョンのインタラクティブわたがしで、出たばかりの「Kinectセンサープログラム」の3.2.7のサンプルに書き足す形で作りました。服の色を読み取った時点でボタンを押すと、3色の比率をArduinoに出力します。

KINECTセンサープログラミング KINECTセンサープログラミング
中村 薫

by G-Tools

【初期化】mainの中で
int backup,fd;
backup = dup(1);
fd = open("/dev/tty.usbserial-A700eXDJ", O_WRONLY|O_CREAT);
dup2(fd,1);

【呼び出し】適当な箇所で
std::cout << (int)data << std::endl;

●KinectSDK/C++/Win7

Mashup AwardというMicrosoftも協賛しているコンテストに出すために急遽、MicrosoftのSDKに書き換えたバージョンです。
http://ma7.mashupaward.jp/works/api/134?locale=ja

「Kinectセンサー画像プログラミング」の3.2のサンプルを参考にしています。今見たら、初期化と呼び出しを分けてませんね。

KINECTセンサー画像処理プログラミング―身体の動きがコントローラ C++でKinectプログラミング KINECTセンサー画像処理プログラミング―身体の動きがコントローラ C++でKinectプログラミング
谷尻 豊寿

by G-Tools

【初期化・呼び出し】
this->serialPort1->PortName = "COM3";
this->serialPort1->Open();
this->serialPort1->Write(data.ToString("D"));
this->serialPort1->Close();

●KinectSDK/C#/Win7

これは特に何かの参考書というわけではないのですが、ソースが公開されているKinectのプロジェクトにArduinoとの連携を足してみたいと思い、やってみました。

MTM07の展示で同じ部屋だった小坂先生のソースを参考にしています。
http://www.kosaka-lab.com/tips/2011/07/kinect-sdkkinecttank.php

【宣言】

using System.IO.Ports;

【初期化】

System.IO.Ports.SerialPort Port_Arduino;

this.Port_Arduino = new SerialPort();
this.Port_Arduino.BaudRate = 9600;
this.Port_Arduino.PortName = "COM3";
if (this.Port_Arduino.IsOpen != true)
{
    this.Port_Arduino.Open();
}

【呼び出し】
this.send_MSG = String.Format("{0}", data);

this.Port_Arduino.Write(this.send_MSG);

●OpenNI/Processing/Win&Mac

4月のエレキジャックフォーラムで展示した時のソースで、githubにも載せてます。
https://github.com/usopyon/kinect_watagashi_f

これまでのArduino連携が、KinectからArduinoに数字を送って、Arduinoが残りの処理をするのに対し、Firmataといって、信号を送るPC側がArduinoのピン番号も指定するというプロトコルを使っています。

Firmataも一長一短あるとは思いますが、複雑な処理をPCに片寄せできるのはいいかも。

【宣言】
import processing.serial.*;
import cc.arduino.*;
Arduino arduino;
【初期化】setupの中で
println(Arduino.list());
arduino = new Arduino(this, Arduino.list()[0], 57600);
arduino.pinMode(RPIN, Arduino.OUTPUT);
【呼び出し】
arduino.digitalWrite(RPIN,Arduino.LOW);

--

KINECT for Windows SDKプログラミングC#編 KINECT for Windows SDKプログラミングC#編
中村 薫 宮城 英人 田中 和希

by G-Tools

|

« Processingでスーファミ風コントローラを扱う | Main | Kinect巨乳 WORLD CUP 2012で戦ってきた »

Arduino」カテゴリの記事