通过 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 的列表。
干杯。
我正在尝试通过 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 的列表。
干杯。