CARLA
 
载入中...
搜索中...
未找到
ImuPubSubTypes.cpp
浏览该文件的文档.
1// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/*!
16 * @file ImuPubSubTypes.cpp
17 * This header file contains the implementation of the serialization functions.
18 *
19 * This file was generated by the tool fastcdrgen.
20 */
21
22// 引入FastCDR库中用于处理缓冲区相关操作的头文件
23#include <fastcdr/FastBuffer.h>
24// 引入FastCDR库中用于处理CDR(通用数据表示)序列化和反序列化操作的头文件
25#include <fastcdr/Cdr.h>
26// 引入自定义的ImuPubSubTypes相关头文件,可能包含了Imu类型等相关定义
27#include "ImuPubSubTypes.h"
28
29// 为eprosima::fastrtps::rtps::SerializedPayload_t类型定义一个别名SerializedPayload_t,方便后续代码书写和理解
30using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
31// 为eprosima::fastrtps::rtps::InstanceHandle_t类型定义一个别名InstanceHandle_t,方便后续代码书写和理解
32using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
33
34// sensor_msgs命名空间下的msg子命名空间,这里应该是存放与消息相关的类型和操作的地方
35namespace sensor_msgs {
36 namespace msg {
37
38 // ImuPubSubType类的构造函数,用于初始化该类型相关的一些属性,主要是为序列化和反序列化做准备
40 {
41 // 设置类型的名称为 "sensor_msgs::msg::dds_::Imu_",这是ROS 2中的IMU消息类型,该名称用于在序列化和反序列化过程中标识消息类型
42 setName("sensor_msgs::msg::dds_::Imu_");
43
44 // 计算Imu类型的最大序列化大小,调用Imu类的相关方法获取其最大可能的序列化字节数
45 auto type_size = Imu::getMaxCdrSerializedSize();
46
47 // 计算序列化数据的对齐(为了处理可能存在的子消息),根据当前计算出的类型大小按照4字节对齐规则进行调整,确保数据在序列化时符合特定的对齐要求
48 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4);
49
50 // 将类型大小加上4字节的封装大小(ROS 2消息通常采用封装格式),计算出最终包含封装部分的消息总大小,并转换为uint32_t类型赋值给m_typeSize成员变量
51 m_typeSize = static_cast<uint32_t>(type_size) + 4; // encapsulation
52
53 // 检查Imu类型是否定义了键值(key),并保存其状态,后续在获取键值等相关操作时会用到这个状态判断
54 m_isGetKeyDefined = Imu::isKeyDefined();
55
56 // 计算Imu类型键的最大序列化大小,如果大于16字节,则选择较大的键长度,否则选择16字节,确定用于存储键值的缓冲区大小
57 size_t keyLength = Imu::getKeyMaxCdrSerializedSize() > 16?
59
60 // 为键值缓冲区分配内存,存储最大可能的键长度,通过malloc函数分配指定字节数的内存空间,并将返回的指针转换为unsigned char*类型赋值给m_keyBuffer成员变量
61 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
62
63 // 初始化缓冲区内容为零,确保没有未初始化的数据,通过memset函数将分配的内存区域每个字节都设置为0
64 memset(m_keyBuffer, 0, keyLength);
65 }
66
67
68 // ImuPubSubType类的析构函数,用于释放构造函数中为键值缓冲区分配的内存资源
70 {
71 if (m_keyBuffer!= nullptr)
72 {
73 free(m_keyBuffer);
74 }
75 }
76
77 // 序列化函数,将给定的Imu类型的数据对象序列化为SerializedPayload_t格式,以便进行传输或存储等操作
79 void* data,
80 SerializedPayload_t* payload)
81 {
82 // 将传入的void*类型的数据指针转换为Imu*类型指针,以便后续对具体的Imu类型数据进行序列化操作
83 Imu* p_type = static_cast<Imu*>(data);
84
85 // 创建一个eprosima::fastcdr::FastBuffer对象,用于管理原始数据缓冲区,将payload中的数据指针和最大缓冲区大小作为参数传递给构造函数,后续通过该对象操作实际要写入序列化数据的缓冲区
86 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
87 // 创建一个eprosima::fastcdr::Cdr对象,用于序列化数据,传入FastBuffer对象以及默认字节序(系统字节序)和DDS_CDR格式参数,使用该对象来执行具体的序列化逻辑
88 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
89 // 根据Cdr对象的字节序判断封装类型,设置payload的封装类型,如果是大端字节序则设置为CDR_BE,否则设置为CDR_LE
90 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
91 // 序列化封装头,按照CDR格式要求先处理封装部分的序列化,为后续具体数据的序列化做准备
92 ser.serialize_encapsulation();
93
94 try
95 {
96 // 序列化具体的Imu对象数据,调用Imu类的serialize方法,将Imu对象的数据按照定义好的序列化逻辑写入到Cdr对象中
97 p_type->serialize(ser);
98 }
99 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
100 {
101 // 如果在序列化过程中出现内存不足的情况,捕获异常并返回false,表示序列化失败
102 return false;
103 }
104
105 // 获取序列化后的数据长度,通过Cdr对象的相关方法获取已经序列化的数据字节数,并赋值给payload->length成员变量,用于记录实际序列化后的有效数据长度
106 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
107 return true;
108 }
109
110 // 反序列化函数,将SerializedPayload_t格式的数据反序列化为Imu类型的数据对象,还原出原始的数据内容
112 SerializedPayload_t* payload,
113 void* data)
114 {
115 try
116 {
117 // 将传入的void*类型数据指针转换为Imu类型指针,以便后续将反序列化得到的数据填充到对应的Imu对象中
118 Imu* p_type = static_cast<Imu*>(data);
119
120 // 创建一个eprosima::fastcdr::FastBuffer对象,用于管理原始数据缓冲区,将payload中的数据指针和实际数据长度(payload->length)作为参数传递给构造函数,使其管理包含序列化数据的缓冲区
121 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
122
123 // 创建一个eprosima::fastcdr::Cdr对象,用于反序列化数据,传入FastBuffer对象以及默认字节序(系统字节序)和DDS_CDR格式参数,使用该对象来执行具体的反序列化逻辑
124 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
125
126 // 反序列化封装头,按照CDR格式要求先处理封装部分的反序列化,恢复数据的结构和顺序信息
127 deser.read_encapsulation();
128
129 // 根据反序列化的数据的字节序,设置封装格式(大端或小端),与序列化时的判断逻辑一致,确保字节序的正确处理
130 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS? CDR_BE : CDR_LE;
131
132 // 反序列化具体的Imu对象数据,调用Imu类的deserialize方法,从Cdr对象中按照定义好的反序列化逻辑读取数据并填充到Imu对象中
133 p_type->deserialize(deser);
134 }
135 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
136 {
137 // 如果在反序列化过程中出现内存不足的情况,捕获异常并返回false,表示反序列化失败
138 return false;
139 }
140
141 // 反序列化成功,返回true
142 return true;
143 }
144
145
146 // 返回一个函数对象,该函数对象用于获取给定Imu数据对象序列化后的大小(包含封装部分),以方便在其他地方动态获取序列化后的长度信息
148 void* data)
149 {
150 return [data]() -> uint32_t
151 {
152 // 计算并返回序列化后的大小,先获取Imu对象本身序列化后的大小(调用相关函数获取),再加上封装部分的4字节大小
153 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<Imu*>(data))) +
154 4u /*encapsulation*/;
155 };
156 }
157
158 // 创建一个Imu类型的数据对象,并返回其void*指针,用于后续需要创建新的Imu对象进行操作的场景,比如在接收数据后反序列化到新创建的对象中等情况
160 {
161 return reinterpret_cast<void*>(new Imu());
162 }
163
164 // 删除通过createData函数创建的Imu数据对象,释放其占用的内存资源,避免内存泄漏,通过delete操作符进行内存释放
166 void* data)
167 {
168 delete(reinterpret_cast<Imu*>(data));
169 }
170
171 // 获取给定Imu数据对象的键(key),并将其填充到InstanceHandle_t结构中,用于在某些场景下(如消息匹配、查找等)进行标识等操作
173 void* data,
174 InstanceHandle_t* handle,
175 bool force_md5)
176 {
177 if (!m_isGetKeyDefined)
178 {
179 return false;
180 }
181
182 Imu* p_type = static_cast<Imu*>(data);
183
184 // 创建一个eprosima::fastcdr::FastBuffer对象,用于管理存储键值序列化数据的原始缓冲区,传入键值缓冲区指针(m_keyBuffer)和Imu类型键的最大序列化大小作为参数,用于后续操作键值的序列化数据
185 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
187
188 // 创建一个eprosima::fastcdr::Cdr对象,用于序列化键值数据,传入FastBuffer对象以及大端字节序(通常在处理键值等标识数据时有特定字节序要求),使用该对象来执行键值的序列化逻辑
189 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
190 // 调用Imu类的serializeKey方法,将Imu对象的键值按照定义好的序列化逻辑写入到Cdr对象中
191 p_type->serializeKey(ser);
192 if (force_md5 || Imu::getKeyMaxCdrSerializedSize() > 16)
193 {
194 // 如果要求强制使用MD5或者键值的最大序列化大小大于16字节,则进行以下MD5相关操作
195 m_md5.init();
196 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
197 m_md5.finalize();
198 for (uint8_t i = 0; i < 16; ++i)
199 {
200 // 将计算得到的MD5摘要值逐个字节填充到InstanceHandle_t结构的value数组中,用于后续作为唯一标识等用途
201 handle->value[i] = m_md5.digest[i];
202 }
203 }
204 else
205 {
206 for (uint8_t i = 0; i < 16; ++i)
207 {
208 // 如果不满足上述条件,则直接将键值缓冲区中的数据逐个字节填充到InstanceHandle_t结构的value数组中,作为标识数据
209 handle->value[i] = m_keyBuffer[i];
210 }
211 }
212 return true;
213 }
214 } //End of namespace msg
215} //End of namespace sensor_msgs
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
virtual eProsima_user_DllExport ~ImuPubSubType() override
virtual eProsima_user_DllExport std::function< uint32_t()> getSerializedSizeProvider(void *data) override
virtual eProsima_user_DllExport bool getKey(void *data, eprosima::fastrtps::rtps::InstanceHandle_t *ihandle, bool force_md5=false) override
eProsima_user_DllExport ImuPubSubType()
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
virtual eProsima_user_DllExport void deleteData(void *data) override
virtual eProsima_user_DllExport void * createData() override
This class represents the structure Imu defined by the user in the IDL file.
Definition Imu.h:76
static eProsima_user_DllExport bool isKeyDefined()
This function tells you if the Key has been defined for this type
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
This function serializes the key members of an object using CDR serialization.
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
This function deserializes an object using CDR serialization.
Definition Imu.cpp:156
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
This function returns the maximum serialized size of the Key of an object depending on the buffer ali...
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
This function serializes an object using CDR serialization.
Definition Imu.cpp:144
static eProsima_user_DllExport size_t getCdrSerializedSize(const sensor_msgs::msg::Imu &data, size_t current_alignment=0)
This function returns the serialized size of a data depending on the buffer alignment.
Definition Imu.cpp:128
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
This function returns the maximum serialized size of an object depending on the buffer alignment.
Definition Imu.cpp:121