私はプログラミングに比較的慣れていないので、質問がばかげている場合はご容赦ください。私は現在、Kinect を含むプロジェクトに取り組んでいます。C# を使用してライブ ジョイント情報 (位置や向きなど) を抽出し、OSC メッセージ -Udp プロトコルを使用してデータを Processing に送信しています。C# から OSC メッセージ バンドルを送信しました。問題は、Processing で必要なメッセージにメッセージをディスパッチする方法がわからないことです。または、C# で間違った形式でデータを送信した可能性があります。コードで何が間違っていて、エラーが発生した可能性があるかを誰かが教えてくれれば、非常にありがたいです。
次のコードを使用して、C# から関節位置を送信します。
if (joint0.JointType == JointType.ElbowRight)
{
// distance in meter
String temp = "ElbowRight " + joint0.Position.X * 1000 + " " + joint0.Position.Y * 1000 + " " + joint0.Position.Z * 1000;
Console.WriteLine(temp);
OscElement message = new OscElement("/joint/" + joint0.JointType.ToString(), joint0.Position.X * 1000, joint0.Position.Y * 1000, joint0.Position.Z, joint0.TrackingState.ToString());
bundle.AddElement(message);
}
OscSender.Send(bundle); // send message bundle
「/joint/」の部分がメッセージのアドレスパターンです。次のデータは、メッセージの引数です。http://opensoundcontrol.org/spec-1_0によると 、アドレス パターンの後に OSC タイプ タグ文字列を追加する必要があります。これは、文字「,」(カンマ) で始まり、その後に対応する一連の文字が続く OSC 文字列です。指定されたメッセージの OSC 引数のシーケンスに正確に一致します。ただし、これを試してみると、フォーマット例外が発生し、エラーが次のように報告されました: 無効な文字 (\44)。私がしたことは、単に「,s」を OSC メッセージに追加しただけです。
OscElement message = new OscElement("/joint/" + ",s" + joint0.JointType.ToString(), joint0.Position.X * 1000, joint0.Position.Y * 1000, joint0.Position.Z, joint0.TrackingState.ToString());
type タグを追加するにはどうすればよいですか? これが次のエラーを引き起こした理由でしょうか?
私の処理コードでは、次のコードを使用して関節位置の値を取得しようとしました。
if(theOscMessage.checkAddrPattern("/joint")==true) {
String firstValue = theOscMessage.get(0).stringValue();
float xosc = theOscMessage.get(1).floatValue(); // get the second osc argument
float yosc = theOscMessage.get(2).floatValue(); // get the second osc argument
float zosc = theOscMessage.get(3).floatValue(); // get the second osc argument
String thirdValue = theOscMessage.get(4).stringValue(); // get the third osc argument
println("### values: "+xosc+", "+xosc+", "+zosc);
return;
}
ただし、次のエラーが発生しました: [2013/6/16 20:20:53] ERROR @ UdpServer.run() ArrayIndexOutOfBoundsException: java.lang.ArrayIndexOutOfBoundsException
メッセージのアドレス パターンとタイプ タグを表示する Processing で示した例を使用して、メッセージの受信を結び付けました。
println("addrpattern\t"+theOscMessage.addrPattern());
println("typetag\t"+theOscMessage.typetag());
これを出力しました:
addrpattern pundle typetag u???N?N?$xlt???
コードの何が問題なのかわかりません。アドレスパターンは「ジョイント」じゃないの?または少なくとも「バンドル」?パドルとは…
Ps Win7 OS コンピューターで Visual C# 2010 Express と Processing 2.0b9 64bit を使用しています。
助けてくれてありがとう!
更新:
この問題を解決する方法はまだわかりませんが、Processing でメッセージを受信する方法を見つけました。OSC バンドルを使用する代わりに、異なるアドレス パターンで Osc メッセージを送信しています。oscP5.plug(this,”leftFoot”,”/joint/AnkleLeft”);
次に、draw メソッドでメッセージ プラグ (例: ) を使用します 。次に、leftFoot というメソッドを作成します。
public void leftFoot(float fx, float fy, float fz, String state) {
println("Received: "+fx+", "+fy+", "+fz+", "+state);
}
すると、データが印刷されているのがわかります。C# の ps OSC メッセージは次を使用して送信されました。
OscElement message = new OscElement("/joint" + "/" + joint0.JointType.ToString(), joint0.Position.X * 1000, joint0.Position.Y * 1000, joint0.Position.Z, joint0.TrackingState.ToString());
OscSender.Send(message);