通过MQTT发送Kinect Body []数据

时间:2018-02-06 18:48:37

标签: c# unity3d json.net mqtt kinect-v2

我正在尝试通过MQTT发送Microsoft的Kinect v2正文数据,以便在不直接连接到Kinect的情况下有效地映射骨架数据,但我似乎无法正确地反序列化Body []。我在Update()中每帧发布一个Bodys列表。

我目前的设置是使用Newtonsoft的JSON.Net来序列化从Body []获取的List并将其发布到MQTT(使用https://github.com/vovacooper/Unity3d_MQTT)。我使用过这个,因为Body类不可序列化(所以我不能使用JSONUtility?)。

基本上我有:

 void Update() {
     ...
     //trackedBodies is a List<Body> that contains the tracked Bodys
     //client is MQTTClient that is connected
     string bodyData = JsonConvert.SerializeObject(trackedBodies);
     client.Publish("test", System.Text.Encoding.UTF8.GetBytes(bodyData));
     ...
 }

 void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) {
     //Check MQTT for data, then deserialize
    List<Body> bodyData = JsonConvert.DeserializeObject<List<Body>>(System.Text.Encoding.UTF8.GetString(e.Message));
     Debug.Log(bodyData);
 }

当List为空时,我能够收到一个空的Bodys列表。当它是非空的时,代码会停止该方法,我根本无法再接收消息。 Update()方法仍然可以正常工作。

如果有人知道如何帮助我现有的东西,或者建议更好地替代我的问题,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

转换为JSON的数据可能太多了。也许你应该1)寻找替代的JSON库或2)自己解码和编码对象,只传输你需要的数据。

类似的东西:

void Update() {
...
    //trackedBodies is a List<Body> that contains the tracked Bodys
    //client is MQTTClient that is connected
    string bodyData;
    foreach(Body body: trackedBodies)
        bodyData += "|" + body.X + ";" + body.Y + ";" + body.Z;

    client.Publish("test", System.Text.Encoding.UTF8.GetBytes(bodyData));
    ...
}

另请看这里:https://www.newtonsoft.com/json/help/html/Performance.htm#ManuallySerialize

请问您可以在trackedBodies内查看哪种数据?

答案 1 :(得分:0)

我看到有些人也可能有同样的问题。我终于为自己找到了一个有效的解决方案。我个人刚刚通过创建一个自定义的'伪'类来暴露Body对象来表示正文并保持Joint和JointOrientation数组。我能够通过MQTT通过使用Json.NET序列化来发送这些自定义对象的列表。

干杯。