You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TCP接收数据转ROS Float64MultiArray时遇JSON序列化错误求助

问题分析

错误核心原因有两个:

  1. 消息类型不匹配:话题/chatter声明的类型是std_msgs/Float64MultiArray,但代码中创建了Int32MultiArray对象,类型完全不符。
  2. 序列化方式错误:roslibpy通过JSON与rosbridge通信,仅支持原生Python数据结构(列表、字典等)的序列化,无法直接处理rospy的消息对象(比如Int32MultiArray实例)。
解决方案
  1. 统一消息类型:将处理后的数据转换为浮点型列表,匹配Float64MultiArray的类型要求。
  2. 用原生数据结构构建消息:直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:31:16