TCP接收数据转ROS Float64MultiArray时遇JSON序列化错误求助
问题分析
错误核心原因有两个:
- 消息类型不匹配:话题
/chatter声明的类型是std_msgs/Float64MultiArray,但代码中创建了Int32MultiArray对象,类型完全不符。 - 序列化方式错误:roslibpy通过JSON与rosbridge通信,仅支持原生Python数据结构(列表、字典等)的序列化,无法直接处理rospy的消息对象(比如
Int32MultiArray实例)。
解决方案
- 统一消息类型:将处理后的数据转换为浮点型列表,匹配
Float64MultiArray的类型要求。 - 用原生数据结构构建消息:直接用Python列表作为
data字段的值传入roslibpy.Message,不需要创建rospy的消息对象。
修改后的关键代码片段
替换原代码中从pos_arry = pos_arry.tolist()到talker.publish(...)的部分:
pos_arry = np.unique([x_val,y_val,z_val]) pos_arry = pos_arry.tolist() # 将整数列表转换为浮点型列表,匹配Float64MultiArray类型 pos_arry_float = [float(val) for val in pos_arry] # 直接用原生列表构建roslibpy可序列化的消息 talker.publish(roslibpy.Message({'data': pos_arry_float})) print('Sending message...')
完整修改后的代码
import roslibpy import socket import numpy as np import json # ROS Python Bridge client = roslibpy.Ros(host='localhost', port=9090) # same as rosbridge port client.run() print("Is ROS connected? ", client.is_connected) talker = roslibpy.Topic(client, '/chatter', 'std_msgs/Float64MultiArray') HOST = "0.0.0.0" # Standard loopback interface address (localhost) PORT = 8081 # Port to listen on (non-privileged ports are > 1023) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) while True: s.listen() conn, addr = s.accept() with conn: print(f"Connected by {addr}") while client.is_connected: data = conn.recv(1024) if not data: break conn.sendall(data) data = json.loads(data) data_list = data[0] x_val = data_list['x'] y_val = data_list['y'] z_val = data_list['z'] pos_arry = np.unique([x_val,y_val,z_val]) pos_arry = pos_arry.tolist() # 转换为浮点型列表 pos_arry_float = [float(val) for val in pos_arry] # 发布符合格式的消息 talker.publish(roslibpy.Message({'data': pos_arry_float})) print('Sending message...') talker.unadvertise() client.terminate()
内容的提问来源于stack exchange,提问作者Ankit Kumar
相关产品推荐
相关产品推荐

