2

私はプログラミングに比較的慣れていないので、質問がばかげている場合はご容赦ください。私は現在、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);
4

2 に答える 2

0

OSC では、次の 32 ビット境界までパディングする必要があります。つまり、長さが 4 バイトの偶数倍になるまで、ゼロを追加してメッセージをパディングする必要があります。

に対しても同じことを行う必要がありますtypetag。1つしか送信しない場合でも、ゼロで埋めてtypetagください,s00,s

于 2016-05-25T20:26:21.613 に答える
0

うーん...正確にはわかりませんが、OSCeletonを使用できます。処理の例が付属しています - 以前に使用したことがありますが、正常に動作します。

(この例は、OSC アドレス パターンを正しく使用する方法を理解するのにも役立ちます...)

https://github.com/Sensebloom/OSCeleton

https://github.com/Sensebloom/OSCeleton-examples

于 2013-06-17T16:29:09.107 に答える