18#include <unordered_set>
20#include "absl/strings/str_cat.h"
28std::string CreateOverlapId() {
31 return absl::StrCat(
"overlap_", count);
43 for (
auto& road_internal : *roads) {
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);
51 (*road_internal.road.add_section()) = section_internal.section;
52 proto_data_.
pb_roads[road_internal.id] = road_internal.road;
55 for (
auto& crosswalk : road_internal.crosswalks) {
59 for (
auto& parking_space : road_internal.parking_spaces) {
63 for (
auto& clear_area : road_internal.clear_areas) {
67 for (
auto& speed_bump : road_internal.speed_bumps) {
71 for (
auto& stop_line_internal : road_internal.stop_lines) {
72 proto_data_.
pb_stop_lines[stop_line_internal.id] = stop_line_internal;
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) {
79 auto& stop_line_curve = proto_data_.
pb_stop_lines[stop_line_id].curve;
80 (*traffic_light.add_stop_line()) = stop_line_curve;
82 proto_data_.
pb_signals[traffic_light.id().id()] = traffic_light;
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) {
89 auto& stop_line_curve = proto_data_.
pb_stop_lines[stop_line_id].curve;
90 (*stop_sign.add_stop_line()) = stop_line_curve;
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) {
99 auto& stop_line_curve = proto_data_.
pb_stop_lines[stop_line_id].curve;
100 (*yield_sign.add_stop_line()) = stop_line_curve;
105 for (
auto& pnc_junction : road_internal.pnc_junctions) {
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;
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;
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;
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);
151 object_overlap = overlap.add_object();
152 object_overlap->mutable_id()->set_id(object_id);
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);
160 object_overlap->mutable_crosswalk_overlap_info();
162 object_overlap->mutable_clear_area_overlap_info();
166 object_overlap->mutable_speed_bump_overlap_info();
170 object_overlap->mutable_parking_space_overlap_info();
174 object_overlap->mutable_pnc_junction_overlap_info();
178 AERROR <<
"unknown object, object id:" << object_id;
180 proto_data_.
pb_lanes[lane_id].add_overlap_id()->set_id(overlap_id);
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;
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 &&
200 AINFO <<
"cannot find signal object_id:" << object_id;
204 std::string overlap_id = CreateOverlapId();
205 overlap.mutable_id()->set_id(overlap_id);
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);
220 object_overlap->mutable_stop_sign_overlap_info();
221 proto_data_.
pb_stop_signs[object_id].add_overlap_id()->set_id(overlap_id);
223 object_overlap->mutable_yield_sign_overlap_info();
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);
230 AERROR <<
"unknown signal, signal id:" << object_id;
233 proto_data_.
pb_lanes[lane_id].add_overlap_id()->set_id(overlap_id);
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;
244 AINFO <<
"cannot find junction object " << object_id;
248 std::string overlap_id = CreateOverlapId();
249 overlap.mutable_id()->set_id(overlap_id);
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);
261 object_overlap->mutable_junction_overlap_info();
262 proto_data_.
pb_junctions[object_id].add_overlap_id()->set_id(overlap_id);
264 AERROR <<
"unknown junction overlap, id:" << object_id;
266 proto_data_.
pb_lanes[lane_id].add_overlap_id()->set_id(overlap_id);
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) {
283 unique_object_id = object_id +
"_" + lane_id;
284 if (close_set.count(unique_object_id) > 0) {
287 close_set.insert(unique_object_id);
289 std::string overlap_id = CreateOverlapId();
290 overlap.mutable_id()->set_id(overlap_id);
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;
305 if (lane_lane_overlaps.count(make_pair(object_id, lane_id)) <= 0) {
306 AERROR <<
"lane overlap is not symmetrical " << overlap_id;
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);
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) {
329 std::string overlap_id = CreateOverlapId();
330 overlap.mutable_id()->set_id(overlap_id);
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);
338 object_overlap->mutable_crosswalk_overlap_info();
339 proto_data_.
pb_crosswalks[object_id].add_overlap_id()->set_id(
342 object_overlap->mutable_clear_area_overlap_info();
346 object_overlap->mutable_stop_sign_overlap_info();
347 proto_data_.
pb_stop_signs[object_id].add_overlap_id()->set_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);
359 proto_data_.
pb_junctions[junction_id].add_overlap_id()->set_id(
367 const std::vector<RoadInternal>& roads,
368 const std::vector<JunctionInternal>& junctions) {
369 std::unordered_map<std::pair<std::string, std::string>,
OverlapWithLane,
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)] =
389 GetLaneLaneOverlapElements(lane_lane_overlaps);
390 GetJunctionObjectOverlapElements(junctions);
394 for (
auto& road_pair : proto_data_.
pb_roads) {
395 *(pb_map->add_road()) = road_pair.second;
397 for (
auto& lane_pair : proto_data_.
pb_lanes) {
398 *(pb_map->add_lane()) = lane_pair.second;
401 *(pb_map->add_crosswalk()) = crosswalk_pair.second;
404 *(pb_map->add_parking_space()) = parking_space_pair.second;
407 *(pb_map->add_clear_area()) = clear_area_pair.second;
410 *(pb_map->add_speed_bump()) = speed_bump_pair.second;
412 for (
auto& signal_pair : proto_data_.
pb_signals) {
413 *(pb_map->add_signal()) = signal_pair.second;
416 *(pb_map->add_stop_sign()) = stop_sign_pair.second;
419 *(pb_map->add_yield()) = yield_sign_pair.second;
422 *(pb_map->add_pnc_junction()) = pnc_junction_pair.second;
425 *(pb_map->add_junction()) = junction_pair.second;
427 for (
auto& rsu_pair : proto_data_.
pb_rsus) {
428 *(pb_map->add_rsu()) = rsu_pair.second;
430 for (
auto& overlap_pair : proto_data_.
pb_overlaps) {
431 *(pb_map->add_overlap()) = overlap_pair.second;
434 AINFO <<
"hdmap statistics: roads-" << proto_data_.
pb_roads.size()
435 <<
",lanes-" << proto_data_.
pb_lanes.size() <<
",crosswalks-"
440 << proto_data_.
pb_signals.size() <<
",stop signs-"
445 << proto_data_.
pb_rsus.size() <<
",rsus-"
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)
apollo::hdmap::Overlap PbOverlap
apollo::hdmap::ObjectOverlapInfo PbObjectOverlapInfo
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