2

我对编程比较陌生,所以如果问题很愚蠢,请原谅。我现在正在做一个涉及 Kinect 的项目。我正在使用 C# 提取实时关节信息(例如位置和方向),然后使用 OSC 消息 -Udp 协议将数据发送到处理中。我从 C# 发送了 OSC 消息包,问题是我不知道如何将消息发送到我想要的处理中。或者可能,我在 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());

我该如何添加类型标签?这可能是导致以下错误的原因吗?

在我的处理代码中,我尝试使用以下代码获取关节位置值:

  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

比我使用处理中给出的示例绑定接收消息,该示例显示消息的地址模式和类型标签:

println("addrpattern\t"+theOscMessage.addrPattern());
println("typetag\t"+theOscMessage.typetag());

它打印出这个:

addrpattern pundle typetag u???N?N?$xlt???

我不明白代码有什么问题。地址模式不是“联合”吗?或者至少是“捆绑”?什么是水滴...

Ps 我在 Win7 操作系统计算机上使用 Visual C# 2010 Express 和 Processing 2.0b9 64bit。

非常感谢你的帮助!

更新: 虽然我仍然不知道如何解决这个问题,但我找到了一种在处理中接收消息的方法。我没有使用 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);  
}

然后您可以看到正在打印的数据。ps 在 C# 中,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

嗯...不确定,但您可以使用 OSCeleton。它带有一个处理示例 - 我以前使用过它,它工作正常。

(该示例还可以帮助您了解如何正确使用 OSC 地址模式...)

https://github.com/Sensebloom/OSCeleton

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

于 2013-06-17T16:29:09.107 回答
0

OSC 需要填充到下一个 32 位边界,这意味着您需要添加零来填充消息,直到它的长度是四个字节的偶数倍。

您需要对typetag. 即使您只发送一个typetag,也用零填充它,所以,s00不仅仅是,s

于 2016-05-25T20:26:21.613 回答