Apollo 10.0
自动驾驶开放平台
proto_organizer.cc
浏览该文件的文档.
1/* Copyright 2017 The Apollo Authors. All Rights Reserved.
2
3Licensed under the Apache License, Version 2.0 (the "License");
4you may not use this file except in compliance with the License.
5You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9Unless required by applicable law or agreed to in writing, software
10distributed under the License is distributed on an "AS IS" BASIS,
11WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12See the License for the specific language governing permissions and
13limitations under the License.
14=========================================================================*/
15
17
18#include <unordered_set>
19
20#include "absl/strings/str_cat.h"
21
22#include "cyber/common/log.h"
25
26namespace {
27
28std::string CreateOverlapId() {
29 static int count = 0;
30 ++count;
31 return absl::StrCat("overlap_", count);
32}
33
34} // namespace
35
36namespace apollo {
37namespace hdmap {
38namespace adapter {
39
41
42void ProtoOrganizer::GetRoadElements(std::vector<RoadInternal>* roads) {
43 for (auto& road_internal : *roads) {
44 // lanes
45 for (auto& section_internal : road_internal.sections) {
46 for (auto& lane_internal : section_internal.lanes) {
47 std::string lane_id = lane_internal.lane.id().id();
48 proto_data_.pb_lanes[lane_id] = lane_internal.lane;
49 section_internal.section.add_lane_id()->set_id(lane_id);
50 }
51 (*road_internal.road.add_section()) = section_internal.section;
52 proto_data_.pb_roads[road_internal.id] = road_internal.road;
53 }
54 // crosswalks
55 for (auto& crosswalk : road_internal.crosswalks) {
56 proto_data_.pb_crosswalks[crosswalk.id().id()] = crosswalk;
57 }
58 // parking_spaces
59 for (auto& parking_space : road_internal.parking_spaces) {
60 proto_data_.pb_parking_spaces[parking_space.id().id()] = parking_space;
61 }
62 // clear areas
63 for (auto& clear_area : road_internal.clear_areas) {
64 proto_data_.pb_clear_areas[clear_area.id().id()] = clear_area;
65 }
66 // speed_bump
67 for (auto& speed_bump : road_internal.speed_bumps) {
68 proto_data_.pb_speed_bumps[speed_bump.id().id()] = speed_bump;
69 }
70 // stop lines
71 for (auto& stop_line_internal : road_internal.stop_lines) {
72 proto_data_.pb_stop_lines[stop_line_internal.id] = stop_line_internal;
73 }
74 // traffic_lights
75 for (auto& traffic_light_internal : road_internal.traffic_lights) {
76 auto& traffic_light = traffic_light_internal.traffic_light;
77 for (auto stop_line_id : traffic_light_internal.stop_line_ids) {
78 CHECK_GT(proto_data_.pb_stop_lines.count(stop_line_id), 0U);
79 auto& stop_line_curve = proto_data_.pb_stop_lines[stop_line_id].curve;
80 (*traffic_light.add_stop_line()) = stop_line_curve;
81 }
82 proto_data_.pb_signals[traffic_light.id().id()] = traffic_light;
83 }
84 // stop signs
85 for (auto& stop_sign_internal : road_internal.stop_signs) {
86 auto& stop_sign = stop_sign_internal.stop_sign;
87 for (auto stop_line_id : stop_sign_internal.stop_line_ids) {
88 CHECK_GT(proto_data_.pb_stop_lines.count(stop_line_id), 0U);
89 auto& stop_line_curve = proto_data_.pb_stop_lines[stop_line_id].curve;
90 (*stop_sign.add_stop_line()) = stop_line_curve;
91 }
92 proto_data_.pb_stop_signs[stop_sign.id().id()] = stop_sign;
93 }
94 // yield signs
95 for (auto& yield_sign_internal : road_internal.yield_signs) {
96 auto& yield_sign = yield_sign_internal.yield_sign;
97 for (auto stop_line_id : yield_sign_internal.stop_line_ids) {
98 CHECK_GT(proto_data_.pb_stop_lines.count(stop_line_id), 0U);
99 auto& stop_line_curve = proto_data_.pb_stop_lines[stop_line_id].curve;
100 (*yield_sign.add_stop_line()) = stop_line_curve;
101 }
102 proto_data_.pb_yield_signs[yield_sign.id().id()] = yield_sign;
103 }
104 // pnc junctions
105 for (auto& pnc_junction : road_internal.pnc_junctions) {
106 proto_data_.pb_pnc_junctions[pnc_junction.id().id()] = pnc_junction;
107 }
108 }
109}
110
112 const std::vector<JunctionInternal>& junctions) {
113 for (auto& junction_internal : junctions) {
114 std::string junction_id = junction_internal.junction.id().id();
115 proto_data_.pb_junctions[junction_id] = junction_internal.junction;
116 }
117}
118
119void ProtoOrganizer::GetLaneObjectOverlapElements(
120 const std::string& lane_id,
121 const std::vector<OverlapWithLane>& overlap_with_lanes) {
122 for (auto& overlap_object : overlap_with_lanes) {
123 std::string object_id = overlap_object.object_id;
124 if (proto_data_.pb_crosswalks.count(object_id) <= 0 &&
125 proto_data_.pb_clear_areas.count(object_id) <= 0 &&
126 proto_data_.pb_speed_bumps.count(object_id) <= 0 &&
127 proto_data_.pb_parking_spaces.count(object_id) <= 0 &&
128 proto_data_.pb_pnc_junctions.count(object_id) <= 0) {
129 continue;
130 }
131 PbOverlap overlap;
132 std::string overlap_id = CreateOverlapId();
133 overlap.mutable_id()->set_id(overlap_id);
134 for (auto& region_overlap : overlap_object.region_overlaps) {
135 *(overlap.add_region_overlap()) = region_overlap;
136 }
137
138 PbObjectOverlapInfo* object_overlap = overlap.add_object();
139 object_overlap->mutable_id()->set_id(lane_id);
140 object_overlap->mutable_lane_overlap_info()->set_start_s(
141 overlap_object.start_s);
142 object_overlap->mutable_lane_overlap_info()->set_end_s(
143 overlap_object.end_s);
144 object_overlap->mutable_lane_overlap_info()->set_is_merge(
145 overlap_object.is_merge);
146 if (!overlap_object.region_overlap_id.empty()) {
147 object_overlap->mutable_lane_overlap_info()
148 ->mutable_region_overlap_id()
149 ->set_id(overlap_object.region_overlap_id);
150 }
151 object_overlap = overlap.add_object();
152 object_overlap->mutable_id()->set_id(object_id);
153 if (proto_data_.pb_crosswalks.count(object_id) > 0) {
154 proto_data_.pb_crosswalks[object_id].add_overlap_id()->set_id(overlap_id);
155 if (!overlap_object.region_overlap_id.empty()) {
156 object_overlap->mutable_crosswalk_overlap_info()
157 ->mutable_region_overlap_id()
158 ->set_id(overlap_object.region_overlap_id);
159 }
160 object_overlap->mutable_crosswalk_overlap_info();
161 } else if (proto_data_.pb_clear_areas.count(object_id) > 0) {
162 object_overlap->mutable_clear_area_overlap_info();
163 proto_data_.pb_clear_areas[object_id].add_overlap_id()->set_id(
164 overlap_id);
165 } else if (proto_data_.pb_speed_bumps.count(object_id)) {
166 object_overlap->mutable_speed_bump_overlap_info();
167 proto_data_.pb_speed_bumps[object_id].add_overlap_id()->set_id(
168 overlap_id);
169 } else if (proto_data_.pb_parking_spaces.count(object_id)) {
170 object_overlap->mutable_parking_space_overlap_info();
171 proto_data_.pb_parking_spaces[object_id].add_overlap_id()->set_id(
172 overlap_id);
173 } else if (proto_data_.pb_pnc_junctions.count(object_id)) {
174 object_overlap->mutable_pnc_junction_overlap_info();
175 proto_data_.pb_pnc_junctions[object_id].add_overlap_id()->set_id(
176 overlap_id);
177 } else {
178 AERROR << "unknown object, object id:" << object_id;
179 }
180 proto_data_.pb_lanes[lane_id].add_overlap_id()->set_id(overlap_id);
181 proto_data_.pb_overlaps[overlap_id] = overlap;
182 }
183}
184
186 for (const auto& rsu_internal : objects.rsus) {
187 const std::string& rsu_id = rsu_internal.rsu.id().id();
188 proto_data_.pb_rsus[rsu_id] = rsu_internal.rsu;
189 }
190}
191
192void ProtoOrganizer::GetLaneSignalOverlapElements(
193 const std::string& lane_id,
194 const std::vector<OverlapWithLane>& overlap_with_lanes) {
195 for (auto& overlap_signal : overlap_with_lanes) {
196 std::string object_id = overlap_signal.object_id;
197 if (proto_data_.pb_signals.count(object_id) <= 0 &&
198 proto_data_.pb_stop_signs.count(object_id) <= 0 &&
199 proto_data_.pb_yield_signs.count(object_id) <= 0) {
200 AINFO << "cannot find signal object_id:" << object_id;
201 continue;
202 }
203 PbOverlap overlap;
204 std::string overlap_id = CreateOverlapId();
205 overlap.mutable_id()->set_id(overlap_id);
206 PbObjectOverlapInfo* object_overlap = overlap.add_object();
207 object_overlap->mutable_id()->set_id(lane_id);
208 object_overlap->mutable_lane_overlap_info()->set_start_s(
209 overlap_signal.start_s);
210 object_overlap->mutable_lane_overlap_info()->set_end_s(
211 overlap_signal.end_s);
212 object_overlap->mutable_lane_overlap_info()->set_is_merge(
213 overlap_signal.is_merge);
214 object_overlap = overlap.add_object();
215 object_overlap->mutable_id()->set_id(object_id);
216 if (proto_data_.pb_signals.count(object_id) > 0) {
217 object_overlap->mutable_signal_overlap_info();
218 proto_data_.pb_signals[object_id].add_overlap_id()->set_id(overlap_id);
219 } else if (proto_data_.pb_stop_signs.count(object_id) > 0) {
220 object_overlap->mutable_stop_sign_overlap_info();
221 proto_data_.pb_stop_signs[object_id].add_overlap_id()->set_id(overlap_id);
222 } else if (proto_data_.pb_yield_signs.count(object_id) > 0) {
223 object_overlap->mutable_yield_sign_overlap_info();
224 proto_data_.pb_yield_signs[object_id].add_overlap_id()->set_id(
225 overlap_id);
226 } else if (proto_data_.pb_rsus.count(object_id) > 0) {
227 object_overlap->mutable_rsu_overlap_info();
228 proto_data_.pb_rsus[object_id].add_overlap_id()->set_id(overlap_id);
229 } else {
230 AERROR << "unknown signal, signal id:" << object_id;
231 }
232
233 proto_data_.pb_lanes[lane_id].add_overlap_id()->set_id(overlap_id);
234 proto_data_.pb_overlaps[overlap_id] = overlap;
235 }
236}
237
238void ProtoOrganizer::GetLaneJunctionOverlapElements(
239 const std::string& lane_id,
240 const std::vector<OverlapWithLane>& overlap_with_lanes) {
241 for (auto& overlap_junction : overlap_with_lanes) {
242 std::string object_id = overlap_junction.object_id;
243 if (proto_data_.pb_junctions.count(object_id) <= 0) {
244 AINFO << "cannot find junction object " << object_id;
245 continue;
246 }
247 PbOverlap overlap;
248 std::string overlap_id = CreateOverlapId();
249 overlap.mutable_id()->set_id(overlap_id);
250 PbObjectOverlapInfo* object_overlap = overlap.add_object();
251 object_overlap->mutable_id()->set_id(lane_id);
252 object_overlap->mutable_lane_overlap_info()->set_start_s(
253 overlap_junction.start_s);
254 object_overlap->mutable_lane_overlap_info()->set_end_s(
255 overlap_junction.end_s);
256 object_overlap->mutable_lane_overlap_info()->set_is_merge(
257 overlap_junction.is_merge);
258 object_overlap = overlap.add_object();
259 object_overlap->mutable_id()->set_id(object_id);
260 if (proto_data_.pb_junctions.count(object_id) > 0) {
261 object_overlap->mutable_junction_overlap_info();
262 proto_data_.pb_junctions[object_id].add_overlap_id()->set_id(overlap_id);
263 } else {
264 AERROR << "unknown junction overlap, id:" << object_id;
265 }
266 proto_data_.pb_lanes[lane_id].add_overlap_id()->set_id(overlap_id);
267 proto_data_.pb_overlaps[overlap_id] = overlap;
268 }
269}
270
271void ProtoOrganizer::GetLaneLaneOverlapElements(
272 const std::unordered_map<std::pair<std::string, std::string>,
273 OverlapWithLane, PairHash>& lane_lane_overlaps) {
274 std::unordered_set<std::string> close_set;
275 for (auto& overlap_lane_pair : lane_lane_overlaps) {
276 auto& lane_id = overlap_lane_pair.first.first;
277 auto& overlap_lane = overlap_lane_pair.second;
278 std::string object_id = overlap_lane.object_id;
279 std::string unique_object_id = lane_id + "_" + object_id;
280 if (close_set.count(unique_object_id) > 0) {
281 continue;
282 }
283 unique_object_id = object_id + "_" + lane_id;
284 if (close_set.count(unique_object_id) > 0) {
285 continue;
286 }
287 close_set.insert(unique_object_id);
288 PbOverlap overlap;
289 std::string overlap_id = CreateOverlapId();
290 overlap.mutable_id()->set_id(overlap_id);
291 PbObjectOverlapInfo* object_overlap = overlap.add_object();
292 object_overlap->mutable_id()->set_id(lane_id);
293 object_overlap->mutable_lane_overlap_info()->set_start_s(
294 overlap_lane.start_s);
295 object_overlap->mutable_lane_overlap_info()->set_end_s(overlap_lane.end_s);
296 object_overlap->mutable_lane_overlap_info()->set_is_merge(
297 overlap_lane.is_merge);
298 object_overlap = overlap.add_object();
299 object_overlap->mutable_id()->set_id(object_id);
300 if (proto_data_.pb_lanes.count(object_id) <= 0) {
301 AERROR << "unknown overlap lane, id:" << object_id;
302 continue;
303 }
304
305 if (lane_lane_overlaps.count(make_pair(object_id, lane_id)) <= 0) {
306 AERROR << "lane overlap is not symmetrical " << overlap_id;
307 continue;
308 }
309 proto_data_.pb_lanes[lane_id].add_overlap_id()->set_id(overlap_id);
310 auto& lane_lane_overlap =
311 lane_lane_overlaps.at(make_pair(object_id, lane_id));
312 object_overlap->mutable_lane_overlap_info()->set_start_s(
313 lane_lane_overlap.start_s);
314 object_overlap->mutable_lane_overlap_info()->set_end_s(
315 lane_lane_overlap.end_s);
316 object_overlap->mutable_lane_overlap_info()->set_is_merge(
317 lane_lane_overlap.is_merge);
318 proto_data_.pb_lanes[object_id].add_overlap_id()->set_id(overlap_id);
319 proto_data_.pb_overlaps[overlap_id] = overlap;
320 }
321}
322
323void ProtoOrganizer::GetJunctionObjectOverlapElements(
324 const std::vector<JunctionInternal>& junctions) {
325 for (auto& junction_internal : junctions) {
326 const auto& junction_id = junction_internal.junction.id().id();
327 for (auto& overlap_junction : junction_internal.overlap_with_junctions) {
328 PbOverlap overlap;
329 std::string overlap_id = CreateOverlapId();
330 overlap.mutable_id()->set_id(overlap_id);
331 PbObjectOverlapInfo* object_overlap = overlap.add_object();
332 object_overlap->mutable_id()->set_id(junction_id);
333 object_overlap->mutable_junction_overlap_info();
334 std::string object_id = overlap_junction.object_id;
335 object_overlap = overlap.add_object();
336 object_overlap->mutable_id()->set_id(object_id);
337 if (proto_data_.pb_crosswalks.count(object_id) > 0) {
338 object_overlap->mutable_crosswalk_overlap_info();
339 proto_data_.pb_crosswalks[object_id].add_overlap_id()->set_id(
340 overlap_id);
341 } else if (proto_data_.pb_clear_areas.count(object_id) > 0) {
342 object_overlap->mutable_clear_area_overlap_info();
343 proto_data_.pb_clear_areas[object_id].add_overlap_id()->set_id(
344 overlap_id);
345 } else if (proto_data_.pb_stop_signs.count(object_id) > 0) {
346 object_overlap->mutable_stop_sign_overlap_info();
347 proto_data_.pb_stop_signs[object_id].add_overlap_id()->set_id(
348 overlap_id);
349 } else if (proto_data_.pb_signals.count(object_id) > 0) {
350 object_overlap->mutable_signal_overlap_info();
351 proto_data_.pb_signals[object_id].add_overlap_id()->set_id(overlap_id);
352 } else if (proto_data_.pb_rsus.count(object_id) > 0) {
353 object_overlap->mutable_rsu_overlap_info();
354 proto_data_.pb_rsus[object_id].add_overlap_id()->set_id(overlap_id);
355 } else {
356 continue;
357 }
358
359 proto_data_.pb_junctions[junction_id].add_overlap_id()->set_id(
360 overlap_id);
361 proto_data_.pb_overlaps[overlap_id] = overlap;
362 }
363 }
364}
365
367 const std::vector<RoadInternal>& roads,
368 const std::vector<JunctionInternal>& junctions) {
369 std::unordered_map<std::pair<std::string, std::string>, OverlapWithLane,
370 PairHash>
371 lane_lane_overlaps;
372 // overlap
373 for (auto& road_internal : roads) {
374 for (auto& road_section : road_internal.sections) {
375 for (auto& lane_internal : road_section.lanes) {
376 std::string lane_id = lane_internal.lane.id().id();
377 GetLaneObjectOverlapElements(lane_id, lane_internal.overlap_objects);
378 GetLaneSignalOverlapElements(lane_id, lane_internal.overlap_signals);
379 GetLaneJunctionOverlapElements(lane_id,
380 lane_internal.overlap_junctions);
381 for (auto& overlap_lane : lane_internal.overlap_lanes) {
382 lane_lane_overlaps[make_pair(lane_id, overlap_lane.object_id)] =
383 overlap_lane;
384 }
385 }
386 }
387 }
388
389 GetLaneLaneOverlapElements(lane_lane_overlaps);
390 GetJunctionObjectOverlapElements(junctions);
391}
392
394 for (auto& road_pair : proto_data_.pb_roads) {
395 *(pb_map->add_road()) = road_pair.second;
396 }
397 for (auto& lane_pair : proto_data_.pb_lanes) {
398 *(pb_map->add_lane()) = lane_pair.second;
399 }
400 for (auto& crosswalk_pair : proto_data_.pb_crosswalks) {
401 *(pb_map->add_crosswalk()) = crosswalk_pair.second;
402 }
403 for (auto& parking_space_pair : proto_data_.pb_parking_spaces) {
404 *(pb_map->add_parking_space()) = parking_space_pair.second;
405 }
406 for (auto& clear_area_pair : proto_data_.pb_clear_areas) {
407 *(pb_map->add_clear_area()) = clear_area_pair.second;
408 }
409 for (auto& speed_bump_pair : proto_data_.pb_speed_bumps) {
410 *(pb_map->add_speed_bump()) = speed_bump_pair.second;
411 }
412 for (auto& signal_pair : proto_data_.pb_signals) {
413 *(pb_map->add_signal()) = signal_pair.second;
414 }
415 for (auto& stop_sign_pair : proto_data_.pb_stop_signs) {
416 *(pb_map->add_stop_sign()) = stop_sign_pair.second;
417 }
418 for (auto& yield_sign_pair : proto_data_.pb_yield_signs) {
419 *(pb_map->add_yield()) = yield_sign_pair.second;
420 }
421 for (auto& pnc_junction_pair : proto_data_.pb_pnc_junctions) {
422 *(pb_map->add_pnc_junction()) = pnc_junction_pair.second;
423 }
424 for (auto& junction_pair : proto_data_.pb_junctions) {
425 *(pb_map->add_junction()) = junction_pair.second;
426 }
427 for (auto& rsu_pair : proto_data_.pb_rsus) {
428 *(pb_map->add_rsu()) = rsu_pair.second;
429 }
430 for (auto& overlap_pair : proto_data_.pb_overlaps) {
431 *(pb_map->add_overlap()) = overlap_pair.second;
432 }
433
434 AINFO << "hdmap statistics: roads-" << proto_data_.pb_roads.size()
435 << ",lanes-" << proto_data_.pb_lanes.size() << ",crosswalks-"
436 << proto_data_.pb_crosswalks.size() << ",parking spaces-"
437 << proto_data_.pb_parking_spaces.size() << ",clear areas-"
438 << proto_data_.pb_clear_areas.size() << ",speed bumps-"
439 << proto_data_.pb_speed_bumps.size() << ",signals-"
440 << proto_data_.pb_signals.size() << ",stop signs-"
441 << proto_data_.pb_stop_signs.size() << ",yield signs-"
442 << proto_data_.pb_yield_signs.size() << ",pnc-junctions-"
443 << proto_data_.pb_pnc_junctions.size() << ",junctions-"
444 << proto_data_.pb_junctions.size() << ",overlaps-"
445 << proto_data_.pb_rsus.size() << ",rsus-"
446 << proto_data_.pb_overlaps.size();
447}
448
449} // namespace adapter
450} // namespace hdmap
451} // namespace apollo
void GetObjectElements(const ObjectInternal &objects)
void OutputData(apollo::hdmap::Map *pb_map)
void GetJunctionElements(const std::vector< JunctionInternal > &junctions)
void GetOverlapElements(const std::vector< RoadInternal > &roads, const std::vector< JunctionInternal > &junctions)
void GetRoadElements(std::vector< RoadInternal > *roads)
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
apollo::hdmap::Overlap PbOverlap
apollo::hdmap::ObjectOverlapInfo PbObjectOverlapInfo
class register implement
Definition arena_queue.h:37
Define the Polygon2d class.
std::vector< RSUInternal > rsus
std::unordered_map< std::string, PbClearArea > pb_clear_areas
std::unordered_map< std::string, PbParkingSpace > pb_parking_spaces
std::unordered_map< std::string, PbSpeedBump > pb_speed_bumps
std::unordered_map< std::string, PbSignal > pb_signals
std::unordered_map< std::string, PbCrosswalk > pb_crosswalks
std::unordered_map< std::string, PbRoad > pb_roads
std::unordered_map< std::string, PbOverlap > pb_overlaps
std::unordered_map< std::string, PbStopSign > pb_stop_signs
std::unordered_map< std::string, PbRSU > pb_rsus
std::unordered_map< std::string, PbLane > pb_lanes
std::unordered_map< std::string, PbPNCJunction > pb_pnc_junctions
std::unordered_map< std::string, PbJunction > pb_junctions
std::unordered_map< std::string, StopLineInternal > pb_stop_lines
std::unordered_map< std::string, PbYieldSign > pb_yield_signs
Defines the Vec2d class.