ROS2消息反序列化实现报错:序列化消息大小为0的初始化异常
ROS2反序列化报错:Wrongly initialized. Serialized message has a size of zero.
问题原因
你的代码存在两处关键错误,直接导致了该报错:
- 变量名不匹配:反序列化段声明了
serialize_test_msg,但后续操作却使用了未定义的new_msg,导致数据没有被正确拷贝到目标序列化对象中。 - SerializedMessage结构未正确初始化:仅用数据大小初始化对象,未同步设置内部
rcl_serialized_message_t的有效长度字段,ROS2无法识别到有效数据。
修复后的代码
void callbackCloudResponseMessage(const planning_interface::msg::Cloud & msg) { /* serialize */ rclcpp::Serialization<planning_interface::msg::Cloud> cloudSerializer; rclcpp::SerializedMessage serialized_msg; cloudSerializer.serialize_message(&msg, &serialized_msg); uint8_t* serialized_data = serialized_msg.get_rcl_serialized_message().buffer; size_t serialized_size = serialized_msg.size(); static uint8_t buf_test[FRAME_LENGTH_MAX+1]; uint8_t *pmsg_test = buf_test + DATA_PAYLOAD; memcpy(pmsg_test, serialized_data, serialized_size); /* deserialize */ planning_interface::msg::Cloud test_msg; // 同时指定初始大小和容量,确保对象能容纳数据 rclcpp::SerializedMessage serialize_test_msg(serialized_size, serialized_size); // 拷贝数据到正确的序列化对象 memcpy(serialize_test_msg.get_rcl_serialized_message().buffer, pmsg_test, serialized_size); // 显式设置有效数据长度 serialize_test_msg.get_rcl_serialized_message().buffer_length = serialized_size; cloudSerializer.deserialize_message(&serialize_test_msg, &test_msg); }
核心修复点
- 替换未定义的
new_msg为正确的serialize_test_msg变量 - 使用双参数构造函数初始化
SerializedMessage,同步指定数据大小和缓冲区容量 - 显式设置
buffer_length字段,让ROS2识别到序列化数据的有效长度
内容的提问来源于stack exchange,提问作者chakloong
相关产品推荐
相关产品推荐

