在我序列化ros2消息并提取缓冲区数据后,当我如下所示进行序列化时,它存在以下问题:在引发“rcpputils::IllegalStateException”的示例后调用终止what():错误初始化。序列化消息的大小为零。[ros2run]:Aborted
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);
memcpy(new_msg.get_rcl_serialized_message().buffer, pmsg_test, serialized_size);
cloudSerializer.deserialize_message(&new_msg, &test_msg);
}
我尝试了上述方法,并期望能够实现
1条答案
按热度按时间lp0sw83n1#
(我假设
serialize_test_msg
只是new_msg
的一个未完成的重命名,反之亦然,这是你在运行 * 之后 * 做的,否则你的例子一开始就不会编译)问题是,当你调用
deserialize_message
时,new_msg
的大小为零,因为你使用的rclcpp::SerializedMessage
构造函数将size_t
作为创建的缓冲区的 capacity,而不是 size。它分配内存(然后您成功地将memcpy
分配到内存)并设置底层结构体的buffer
、buffer_capacity
和allocator
字段,但buffer_length
字段保持为零,缓冲区最初为空。memcpy
只将数据写入缓冲区(在容量范围内,所以这里没有问题),但buffer_length
保持不变,因此new_msg.get_rcl_serialized_message()
处于逻辑无效状态,无法被deserialize_message
正确解释。因此,在进行重新配置之前,您应该通过手动设置buffer_length
来解决这个问题(这不需要重新分配,因为它在它所相等的容量范围内):