CARLA
 
载入中...
搜索中...
未找到
TwistWithCovariancePubSubTypes.cpp
浏览该文件的文档.
1#include <fastcdr/FastBuffer.h>
2#include <fastcdr/Cdr.h>
3
5// 定义SerializedPayload_t类型别名,它来自 eprosima::fastrtps::rtps 命名空间,用于表示序列化后的负载数据
6using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
7// 定义InstanceHandle_t类型别名,同样来自 eprosima::fastrtps::rtps 命名空间,用于表示实例句柄
8using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
9
10namespace geometry_msgs {
11 namespace msg {
12 // TwistWithCovariancePubSubType类的构造函数
14 {// 设置类型名称,用于标识该消息类型
15 setName("geometry_msgs::msg::dds_::TwistWithCovariance_");
16 // 获取TwistWithCovariance类型的最大CDR序列化大小
18 // 考虑可能的子消息对齐,进行字节对齐操作
19 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4);
20 // 计算包含封装头部后的总类型大小(加上4字节封装相关部分),并转换为uint32_t类型存储
21 m_typeSize = static_cast<uint32_t>(type_size) + 4;
22 // 判断TwistWithCovariance类型是否定义了获取键(Key)的操作
23 m_isGetKeyDefined = TwistWithCovariance::isKeyDefined();
24 // 获取TwistWithCovariance类型的键(Key)的最大CDR序列化大小
25 size_t keyLength = TwistWithCovariance::getKeyMaxCdrSerializedSize() > 16 ?
27 // 分配用于存储键(Key)数据的缓冲区内存空间
28 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
29 // 初始化键(Key)缓冲区内存空间为0
30 memset(m_keyBuffer, 0, keyLength);
31 }
32 // TwistWithCovariancePubSubType类的析构函数,用于释放之前分配的键(Key)缓冲区内存
40 // 序列化函数,将给定的数据对象(TwistWithCovariance类型)序列化为SerializedPayload_t格式
42 void* data,
43 SerializedPayload_t* payload)
44 {// 将传入的void*类型数据转换为TwistWithCovariance*类型指针,方便后续操作
45 TwistWithCovariance* p_type = static_cast<TwistWithCovariance*>(data);
46
47 // 创建一个FastBuffer对象,用于管理原始的字节缓冲区
48 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
49 // 创建一个Cdr对象,用于执行实际的序列化操作,指定了字节序、CDR版本等相关配置
50 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
51 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
52 // 首先序列化封装头部信息(可能包含一些协议相关的标识等)
53 ser.serialize_encapsulation();
54
55 try
56 {
57 // 调用TwistWithCovariance对象的serialize函数,将其具体数据序列化到Cdr对象管理的缓冲区中
58 p_type->serialize(ser);
59 }
60 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
61 {// 如果内存不足抛出异常,则返回false表示序列化失败
62 return false;
63 }
64
65 // 获取序列化后数据的实际长度,并设置到payload的length成员中
66 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
67 return true;
68 }
69 // 反序列化函数,将SerializedPayload_t格式的数据反序列化为TwistWithCovariance类型的对象
71 SerializedPayload_t* payload,
72 void* data)
73 {
74 try
75 {
76 // 将传入的void*类型数据转换为TwistWithCovariance*类型指针,方便后续操作
77 TwistWithCovariance* p_type = static_cast<TwistWithCovariance*>(data);
78
79 // 创建一个FastBuffer对象,用于管理原始的字节缓冲区
80 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
81
82 // 创建一个Cdr对象,用于执行实际的反序列化操作,指定了字节序、CDR版本等相关配置
83 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
84
85 // 首先反序列化封装头部信息,获取相关的字节序等配置信息,并设置到payload的encapsulation成员中
86 deser.read_encapsulation();
87 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
88
89 // 调用TwistWithCovariance对象的deserialize函数,从Cdr对象管理的缓冲区中反序列化出具体数据
90 p_type->deserialize(deser);
91 }
92 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
93 {// 如果内存不足抛出异常,则返回false表示反序列化失败
94 return false;
95 }
96 // 反序列化成功,返回true
97 return true;
98 }
99 // 返回一个函数对象,该函数对象用于获取给定数据对象序列化后的大小
101 void* data)
102 {
103 return [data]() -> uint32_t
104 {// 计算并返回TwistWithCovariance类型对象序列化后的大小
105 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<TwistWithCovariance*>(data))) +
106 4u /*encapsulation*/;
107 };
108 }
109 // 创建一个新的TwistWithCovariance类型对象,并返回其void*指针,用于后续的操作
111 {
112 return reinterpret_cast<void*>(new TwistWithCovariance());
113 }
114 // 删除给定的TwistWithCovariance类型对象,释放其占用的内存空间
116 void* data)
117 {
118 delete(reinterpret_cast<TwistWithCovariance*>(data));
119 }
120 // 获取给定数据对象(TwistWithCovariance类型)的键(Key)信息,并填充到InstanceHandle_t结构体中
122 void* data,
123 InstanceHandle_t* handle,
124 bool force_md5)
125 {
126 if (!m_isGetKeyDefined)
127 {// 如果TwistWithCovariance类型没有定义获取键(Key)的操作,则直接返回false
128 return false;
129 }
130
131 TwistWithCovariance* p_type = static_cast<TwistWithCovariance*>(data);
132
133 // 创建一个FastBuffer对象,用于管理存储键(Key)数据的缓冲区
134 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
136
137 // 创建一个Cdr对象,用于将键(Key)数据序列化到缓冲区中,指定为大端序
138 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
139 p_type->serializeKey(ser);
141 {// 如果强制使用MD5计算或者键(Key)的最大CDR序列化大小大于16字节
142 m_md5.init();
143 // 使用MD5算法对象更新要计算的数据(键(Key)缓冲区中的数据,长度为已序列化的键
144 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
145 // 完成MD5计算
146 m_md5.finalize();
147 for (uint8_t i = 0; i < 16; ++i)
148 {// 将MD5计算结果的每个字节填充到InstanceHandle_t结构体的value数组中
149 handle->value[i] = m_md5.digest[i];
150 }
151 }
152 else
153 {
154 for (uint8_t i = 0; i < 16; ++i)
155 {// 如果键(Key)大小不超过16字节,直接将键(Key)缓冲区中的数据复制到InstanceHandle_t结构体的value数组中
156 handle->value[i] = m_keyBuffer[i];
157 }
158 }
159 return true;
160 }
161 }
162}
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport void deleteData(void *data) override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
virtual eProsima_user_DllExport std::function< uint32_t()> getSerializedSizeProvider(void *data) override
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
virtual eProsima_user_DllExport void * createData() override
virtual eProsima_user_DllExport bool getKey(void *data, eprosima::fastrtps::rtps::InstanceHandle_t *ihandle, bool force_md5=false) override
virtual eProsima_user_DllExport ~TwistWithCovariancePubSubType() override
此类表示用户在 IDL 文件中定义的 TwistWithCovariance 结构。 <>
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
使用 CDR 序列化对象的键成员。
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
返回对象键的最大序列化大小(取决于缓冲区对齐)。
static eProsima_user_DllExport bool isKeyDefined()
告诉您此类型的键是否已定义。
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
使用 CDR 反序列化对象。
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
返回对象的最大序列化大小(取决于缓冲区对齐)。
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
使用 CDR 序列化序列化对象。
static eProsima_user_DllExport size_t getCdrSerializedSize(const geometry_msgs::msg::TwistWithCovariance &data, size_t current_alignment=0)
返回数据的序列化大小(取决于缓冲区对齐)。