2年前に子供が作った獅子舞ロボをKinectでコントロールできるようにしてみました。
獅子舞ロボはArduinoとサーボ×2でできています。
PCに接続したKinectで関節(Kinectではスケルトンと呼んでいます)を認識して、PCからシリアルで接続したArduinoに前後・左右の角度を送っています。
2自由度ですが、思ったよりも良く動くので、人型ロボットで動かしたくなりました。
2年前に子供が作った獅子舞ロボをKinectでコントロールできるようにしてみました。
獅子舞ロボはArduinoとサーボ×2でできています。
PCに接続したKinectで関節(Kinectではスケルトンと呼んでいます)を認識して、PCからシリアルで接続したArduinoに前後・左右の角度を送っています。
2自由度ですが、思ったよりも良く動くので、人型ロボットで動かしたくなりました。
はじめまして
自分は最近趣味でArduinoをはじめてサーボの制御を覚えたばかりです。
次のステップとしてセンサーと連動させて動かしたいと思いkinectを購入したのですがやり方がわからず苦戦しています。
もしよろしければこの獅子舞と動きを連動させるプログラムの書き方を参考にしたいので教えていただけませんか?
上記記事で使用したKinectはVer1なのですが、最近入手されたのであればVer2ではないかと思いますので、プログラムは異なりますが、基本的な考え方を書きます。
獅子舞ロボはサーボを2つ使い、前後・左右に動くようになっています。
Kinectには人の姿勢をスケルトンで取得できるサンプルプログラムがあると思います。
獅子舞ロボのコントロールでは、Kinectで頭の座標と腰の座標を取得し、比較して、同じような姿勢になるようにサーボの角度を指定しています。
お返事下さりありがとうございます。
質問よろしいですか?
頭と腰の座標を取得して比較とあるのですがこれらの比較はサンプルのプログラム内を弄って行うのですよね?
それはプログラムのどの部分で変更や追加をしたのか、覚えている範囲で教えていただけますか?
それから比較した結果をarduinoに送らなければならないと思うのですがその方法を教えていただけますか?
ソース(C#)を掘り出して確認しました。
上記でサンプルと書いていたのは
KINECT for Windows SDKプログラミングC#編 http://www.amazon.co.jp/dp/479803326X/
に記載されているSkeletonをベースにしました。
(同様のサンプルは多数存在すると思います)
頭と腰の座標を取得して比較は以下のようにやってました。(角度っぽいものが算出できればよしとしています。非常にいい加減です。)
Joint j1 = skeleton.Joints[JointType.Spine];
Joint j3 = skeleton.Joints[JointType.Head];
double x = j1.Position.X – j3.Position.X;
double z = j1.Position.Z – j3.Position.Z;
z = z * 180 + 90;
x = -x * 180 + 90;
arduinoへの送信はC#(.net)の機能を使って、以下のように行ってます。(一部簡略化しています)
// 初期化
System.IO.Ports.SerialPort serialPort = new System.IO.Ports.SerialPort();
serialPort.BaudRate = 9600;
serialPort.PortName = “COM6”;
serialPort.Open();
// 送信
String buf = z.ToString(“000″) + ” ” + x.ToString(“000”) + “\r\n”;
serialPort.Write(buf);
V1用のソースなのでそのままでは使えませんが、該当のソースを以下に置いておきます。
http://www.studiok-i.net/misc/MainWindow.xaml.cs
arduino側ではシリアルから受信した文字列を数値に戻して、サーボをコントロールするようにプログラムを書き込んでおきます。
(arduino側のソースは見つけられませんでした。)
ありがとうございました。
ソースコード等参考にさせていただきます。
細く説明もしてくださりとても助かりました。
本当にありがとうございます。