我对编程比较陌生,所以如果问题很愚蠢,请原谅。我现在正在做一个涉及 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);