通过 MQTT 发送 Kinect Body[] 数据

Sending Kinect Body[] data over MQTT

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

我当前的设置是使用 Newtonsoft 的 JSON.Net 序列化从 Body[] 中获取的列表并将其发布到 MQTT(使用 https://github.com/vovacooper/Unity3d_MQTT)。我使用它是因为 Body class 不可序列化(所以我不能使用 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);
 }

当列表为空时,我可以收到 Body 的空列表。当它为非空时,该方法的代码将停止,我根本无法再接收消息。 Update() 方法仍然正常工作。

如果有人body 知道如何帮助我解决目前的问题,或者提出更好的替代方案来解决我的问题,我将不胜感激。

可能数据太多,无法转换为 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里面是什么数据?

我看到有些人可能也有同样的问题。我终于为自己找到了一个可行的解决方案。我个人只是通过创建自定义 'pseudo' class 来表示 body 并保存 Joint 和 JointOrientation 数组来公开 Body object。通过使用 Json.NET 序列化它们,我能够通过 MQTT 发送这些自定义 object 的列表。

干杯。