Apollo 10.0
自动驾驶开放平台
qos_filler.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2024 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
18
19#include "cyber/common/log.h"
21
22#include "fastrtps/attributes/PublisherAttributes.h"
23#include "fastrtps/attributes/SubscriberAttributes.h"
24
25namespace apollo {
26namespace cyber {
27namespace transport {
28
31using proto::QosProfile;
33using transport::QosProfileConf;
34
36 const std::string& channel_name, const QosProfile& qos,
37 eprosima::fastrtps::PublisherAttributes* pub_attr) {
38 RETURN_VAL_IF_NULL2(pub_attr, false);
39 pub_attr->topic.topicName = channel_name;
40 pub_attr->topic.topicDataType = "UnderlayMessage";
41 pub_attr->topic.topicKind = eprosima::fastrtps::rtps::NO_KEY;
42 switch (qos.history()) {
43 case QosHistoryPolicy::HISTORY_KEEP_LAST:
44 pub_attr->topic.historyQos.kind =
45 eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS;
46 break;
47 case QosHistoryPolicy::HISTORY_KEEP_ALL:
48 pub_attr->topic.historyQos.kind =
49 eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS;
50 break;
51 default:
52 break;
53 }
54 switch (qos.durability()) {
55 case QosDurabilityPolicy::DURABILITY_TRANSIENT_LOCAL:
56 pub_attr->qos.m_durability.kind =
57 eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS;
58 break;
59 case QosDurabilityPolicy::DURABILITY_VOLATILE:
60 pub_attr->qos.m_durability.kind =
61 eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS;
62 break;
63 default:
64 break;
65 }
66
67 switch (qos.reliability()) {
68 case QosReliabilityPolicy::RELIABILITY_BEST_EFFORT:
69 pub_attr->qos.m_reliability.kind =
70 eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS;
71 break;
72 case QosReliabilityPolicy::RELIABILITY_RELIABLE:
73 pub_attr->qos.m_reliability.kind =
74 eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS;
75 break;
76 default:
77 break;
78 }
80 pub_attr->topic.historyQos.depth = static_cast<int32_t>(qos.depth());
81 }
82
83 // ensure the history depth is at least the requested queue size
84 RETURN_VAL_IF2(pub_attr->topic.historyQos.depth < 0, false);
85
86 // tranform messages per second to rtps heartbeat
87 // set default heartbeat period
88 pub_attr->times.heartbeatPeriod.seconds = 0;
89 pub_attr->times.heartbeatPeriod.fraction(300 * 4294967); // 300ms
90 if (qos.mps() != 0) {
91 uint64_t mps = qos.mps();
92
93 // adapt heartbeat period
94 if (mps > 1024) {
95 mps = 1024;
96 } else if (mps < 64) {
97 mps = 64;
98 }
99
100 uint64_t fractions = (256ull << 32) / mps;
101 uint32_t fraction = fractions & 0xffffffff;
102 int32_t seconds = static_cast<int32_t>(fractions >> 32);
103
104 pub_attr->times.heartbeatPeriod.seconds = seconds;
105 pub_attr->times.heartbeatPeriod.fraction(fraction);
106 }
107
108 pub_attr->qos.m_publishMode.kind =
109 eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE;
110 pub_attr->historyMemoryPolicy =
111 eprosima::fastrtps::rtps::DYNAMIC_RESERVE_MEMORY_MODE;
112 AINFO << channel_name << "qos: [history: " << pub_attr->topic.historyQos.kind
113 << "] [durability: " << pub_attr->qos.m_durability.kind
114 << "] [reliability: " << pub_attr->qos.m_reliability.kind
115 << "] [depth: " << pub_attr->topic.historyQos.depth
116 << "] [samples: " << pub_attr->topic.resourceLimitsQos.max_samples
117 << "]";
118
119 return true;
120}
121
123 const std::string& channel_name, const QosProfile& qos,
124 eprosima::fastrtps::SubscriberAttributes* sub_attr) {
125 RETURN_VAL_IF_NULL2(sub_attr, false);
126 sub_attr->topic.topicName = channel_name;
127 sub_attr->topic.topicDataType = "UnderlayMessage";
128 sub_attr->topic.topicKind = eprosima::fastrtps::rtps::NO_KEY;
129
130 switch (qos.history()) {
131 case QosHistoryPolicy::HISTORY_KEEP_LAST:
132 sub_attr->topic.historyQos.kind =
133 eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS;
134 break;
135 case QosHistoryPolicy::HISTORY_KEEP_ALL:
136 sub_attr->topic.historyQos.kind =
137 eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS;
138 break;
139 default:
140 break;
141 }
142 switch (qos.durability()) {
143 case QosDurabilityPolicy::DURABILITY_TRANSIENT_LOCAL:
144 sub_attr->qos.m_durability.kind =
145 eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS;
146 break;
147 case QosDurabilityPolicy::DURABILITY_VOLATILE:
148 sub_attr->qos.m_durability.kind =
149 eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS;
150 break;
151 default:
152 break;
153 }
154
155 switch (qos.reliability()) {
156 case QosReliabilityPolicy::RELIABILITY_BEST_EFFORT:
157 sub_attr->qos.m_reliability.kind =
158 eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS;
159 break;
160 case QosReliabilityPolicy::RELIABILITY_RELIABLE:
161 sub_attr->qos.m_reliability.kind =
162 eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS;
163 break;
164 default:
165 break;
166 }
168 sub_attr->topic.historyQos.depth = static_cast<int32_t>(qos.depth());
169 }
170
171 // ensure the history depth is at least the requested queue size
172 RETURN_VAL_IF2(sub_attr->topic.historyQos.depth < 0, false);
173
174 sub_attr->historyMemoryPolicy =
175 eprosima::fastrtps::rtps::DYNAMIC_RESERVE_MEMORY_MODE;
176 AINFO << channel_name << "qos: [history: " << sub_attr->topic.historyQos.kind
177 << "] [durability: " << sub_attr->qos.m_durability.kind
178 << "] [reliability: " << sub_attr->qos.m_reliability.kind
179 << "] [depth: " << sub_attr->topic.historyQos.depth
180 << "] [samples: " << sub_attr->topic.resourceLimitsQos.max_samples
181 << "]";
182
183 return true;
184}
185
187 const std::string& channel_name, const QosProfile& qos,
188 eprosima::fastrtps::TopicAttributes* topic_attr) {
189 RETURN_VAL_IF_NULL2(topic_attr, false);
190 topic_attr->topicName = channel_name;
191 topic_attr->topicDataType = "UnderlayMessage";
192 topic_attr->topicKind = eprosima::fastrtps::rtps::NO_KEY;
193
194 switch (qos.history()) {
195 case QosHistoryPolicy::HISTORY_KEEP_LAST:
196 topic_attr->historyQos.kind =
197 eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS;
198 break;
199 case QosHistoryPolicy::HISTORY_KEEP_ALL:
200 topic_attr->historyQos.kind =
201 eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS;
202 break;
203 default:
204 break;
205 }
206
208 topic_attr->historyQos.depth = static_cast<int32_t>(qos.depth());
209 }
210
211 // ensure the history depth is at least the requested queue size
212 RETURN_VAL_IF2(topic_attr->historyQos.depth < 0, false);
213
214 return true;
215}
216
218bool QosFiller::FillInPubQos(const std::string& channel_name,
219 const QosProfile& qos,
220 eprosima::fastdds::dds::PublisherQos* pub_qos) {
221 RETURN_VAL_IF_NULL2(pub_qos, false);
222 eprosima::fastrtps::PublisherAttributes pub_attr;
223 if (!GetDefaultPubAttributes(channel_name, qos, &pub_attr)) {
224 return false;
225 }
226 pub_qos->group_data().setValue(pub_attr.qos.m_groupData);
227 pub_qos->partition() = pub_attr.qos.m_partition;
228 pub_qos->presentation() = pub_attr.qos.m_presentation;
229 return true;
230}
231
233 const std::string& channel_name, const QosProfile& qos,
234 eprosima::fastdds::dds::DataWriterQos* writer_qos) {
235 RETURN_VAL_IF_NULL2(writer_qos, false);
236 eprosima::fastrtps::PublisherAttributes pub_attr;
237 if (!GetDefaultPubAttributes(channel_name, qos, &pub_attr)) {
238 return false;
239 }
240 writer_qos->writer_resource_limits().matched_subscriber_allocation =
241 pub_attr.matched_subscriber_allocation;
242 writer_qos->properties() = pub_attr.properties;
243 writer_qos->throughput_controller() = pub_attr.throughputController;
244 writer_qos->endpoint().unicast_locator_list = pub_attr.unicastLocatorList;
245 writer_qos->endpoint().multicast_locator_list = pub_attr.multicastLocatorList;
246 writer_qos->endpoint().remote_locator_list = pub_attr.remoteLocatorList;
247 writer_qos->endpoint().history_memory_policy = pub_attr.historyMemoryPolicy;
248 writer_qos->endpoint().user_defined_id = pub_attr.getUserDefinedID();
249 writer_qos->endpoint().entity_id = pub_attr.getEntityID();
250 writer_qos->reliable_writer_qos().times = pub_attr.times;
251 writer_qos->reliable_writer_qos().disable_positive_acks =
252 pub_attr.qos.m_disablePositiveACKs;
253 writer_qos->durability() = pub_attr.qos.m_durability;
254 writer_qos->durability_service() = pub_attr.qos.m_durabilityService;
255 writer_qos->deadline() = pub_attr.qos.m_deadline;
256 writer_qos->latency_budget() = pub_attr.qos.m_latencyBudget;
257 writer_qos->liveliness() = pub_attr.qos.m_liveliness;
258 writer_qos->reliability() = pub_attr.qos.m_reliability;
259 writer_qos->lifespan() = pub_attr.qos.m_lifespan;
260 writer_qos->user_data().setValue(pub_attr.qos.m_userData);
261 writer_qos->ownership() = pub_attr.qos.m_ownership;
262 writer_qos->ownership_strength() = pub_attr.qos.m_ownershipStrength;
263 writer_qos->destination_order() = pub_attr.qos.m_destinationOrder;
264 writer_qos->representation() = pub_attr.qos.representation;
265 writer_qos->publish_mode() = pub_attr.qos.m_publishMode;
266 writer_qos->history() = pub_attr.topic.historyQos;
267 writer_qos->resource_limits() = pub_attr.topic.resourceLimitsQos;
268 return true;
269}
270
271bool QosFiller::FillInSubQos(const std::string& channel_name,
272 const QosProfile& qos,
273 eprosima::fastdds::dds::SubscriberQos* sub_qos) {
274 RETURN_VAL_IF_NULL2(sub_qos, false);
275 eprosima::fastrtps::SubscriberAttributes sub_attr;
276 if (!GetDefaultSubAttributes(channel_name, qos, &sub_attr)) {
277 return false;
278 }
279 sub_qos->group_data().setValue(sub_attr.qos.m_groupData);
280 sub_qos->partition() = sub_attr.qos.m_partition;
281 sub_qos->presentation() = sub_attr.qos.m_presentation;
282 return true;
283}
284
286 const std::string& channel_name, const proto::QosProfile& qos,
287 eprosima::fastdds::dds::DataReaderQos* reader_qos) {
288 RETURN_VAL_IF_NULL2(reader_qos, false);
289 eprosima::fastrtps::SubscriberAttributes sub_attr;
290 if (!GetDefaultSubAttributes(channel_name, qos, &sub_attr)) {
291 return false;
292 }
293 reader_qos->reader_resource_limits().matched_publisher_allocation =
294 sub_attr.matched_publisher_allocation;
295 reader_qos->properties() = sub_attr.properties;
296 reader_qos->expects_inline_qos(sub_attr.expectsInlineQos);
297 reader_qos->endpoint().unicast_locator_list = sub_attr.unicastLocatorList;
298 reader_qos->endpoint().multicast_locator_list = sub_attr.multicastLocatorList;
299 reader_qos->endpoint().remote_locator_list = sub_attr.remoteLocatorList;
300 reader_qos->endpoint().history_memory_policy = sub_attr.historyMemoryPolicy;
301 reader_qos->endpoint().user_defined_id = sub_attr.getUserDefinedID();
302 reader_qos->endpoint().entity_id = sub_attr.getEntityID();
303 reader_qos->reliable_reader_qos().times = sub_attr.times;
304 reader_qos->reliable_reader_qos().disable_positive_ACKs =
305 sub_attr.qos.m_disablePositiveACKs;
306 reader_qos->durability() = sub_attr.qos.m_durability;
307 reader_qos->durability_service() = sub_attr.qos.m_durabilityService;
308 reader_qos->deadline() = sub_attr.qos.m_deadline;
309 reader_qos->latency_budget() = sub_attr.qos.m_latencyBudget;
310 reader_qos->liveliness() = sub_attr.qos.m_liveliness;
311 reader_qos->reliability() = sub_attr.qos.m_reliability;
312 reader_qos->lifespan() = sub_attr.qos.m_lifespan;
313 reader_qos->user_data().setValue(sub_attr.qos.m_userData);
314 reader_qos->ownership() = sub_attr.qos.m_ownership;
315 reader_qos->destination_order() = sub_attr.qos.m_destinationOrder;
316 reader_qos->type_consistency().type_consistency =
317 sub_attr.qos.type_consistency;
318 reader_qos->type_consistency().representation = sub_attr.qos.representation;
319 reader_qos->time_based_filter() = sub_attr.qos.m_timeBasedFilter;
320 reader_qos->history() = sub_attr.topic.historyQos;
321 reader_qos->resource_limits() = sub_attr.topic.resourceLimitsQos;
322 return true;
323}
324
325bool QosFiller::FillInTopicQos(const std::string& channel_name,
326 const proto::QosProfile& qos,
327 eprosima::fastdds::dds::TopicQos* topic_qos) {
328 RETURN_VAL_IF_NULL2(topic_qos, false);
329 eprosima::fastrtps::TopicAttributes topic_attr;
330 if (!GetDefaultTopicAttributes(channel_name, qos, &topic_attr)) {
331 return false;
332 }
333 topic_qos->history() = topic_attr.historyQos;
334 topic_qos->resource_limits() = topic_attr.resourceLimitsQos;
335 return true;
336}
337} // namespace transport
338} // namespace cyber
339} // namespace apollo
static bool FillInTopicQos(const std::string &channel_name, const proto::QosProfile &qos, eprosima::fastdds::dds::TopicQos *topic_qos)
static bool FillInPubQos(const std::string &channel_name, const proto::QosProfile &qos, eprosima::fastdds::dds::PublisherQos *pub_qos)
static bool FillInSubQos(const std::string &channel_name, const proto::QosProfile &qos, eprosima::fastdds::dds::SubscriberQos *sub_qos)
static bool FillInWriterQos(const std::string &channel_name, const proto::QosProfile &qos, eprosima::fastdds::dds::DataWriterQos *writer_qos)
static bool FillInReaderQos(const std::string &channel_name, const proto::QosProfile &qos, eprosima::fastdds::dds::DataReaderQos *reader_qos)
static const uint32_t QOS_HISTORY_DEPTH_SYSTEM_DEFAULT
#define RETURN_VAL_IF2(condition, val)
Definition log.h:131
#define RETURN_VAL_IF_NULL2(ptr, val)
Definition log.h:123
#define AINFO
Definition log.h:42
bool GetDefaultSubAttributes(const std::string &channel_name, const QosProfile &qos, eprosima::fastrtps::SubscriberAttributes *sub_attr)
bool GetDefaultTopicAttributes(const std::string &channel_name, const QosProfile &qos, eprosima::fastrtps::TopicAttributes *topic_attr)
bool GetDefaultPubAttributes(const std::string &channel_name, const QosProfile &qos, eprosima::fastrtps::PublisherAttributes *pub_attr)
Definition qos_filler.cc:35
class register implement
Definition arena_queue.h:37
optional QosHistoryPolicy history
optional QosDurabilityPolicy durability
optional QosReliabilityPolicy reliability