22#include <unordered_set>
24#include "absl/strings/match.h"
40constexpr double kLanesSearchRange = 10.0;
42constexpr int kBackwardDistance = 4;
56 if (absl::EndsWith(map_filename,
".xml")) {
68 if (!map_.has_header()) {
71 *map_header = map_.
header();
76 if (&map_proto != &map_) {
80 for (
const auto& lane : map_.
lane()) {
81 lane_table_[lane.id().id()].reset(
new LaneInfo(lane));
83 for (
const auto& junction : map_.
junction()) {
84 junction_table_[junction.id().id()].reset(
new JunctionInfo(junction));
87 for (
const auto& ad_area : map_.
ad_area()) {
88 area_table_[ad_area.id().id()].reset(
new AreaInfo(ad_area));
96 for (
const auto& signal : map_.
signal()) {
97 signal_table_[signal.id().id()].reset(
new SignalInfo(signal));
99 for (
const auto& crosswalk : map_.
crosswalk()) {
100 crosswalk_table_[crosswalk.id().id()].reset(
new CrosswalkInfo(crosswalk));
102 for (
const auto& stop_sign : map_.
stop_sign()) {
103 stop_sign_table_[stop_sign.id().id()].reset(
new StopSignInfo(stop_sign));
105 for (
const auto& yield_sign : map_.
yield()) {
106 yield_sign_table_[yield_sign.id().id()].reset(
109 for (
const auto& clear_area : map_.
clear_area()) {
110 clear_area_table_[clear_area.id().id()].reset(
113 for (
const auto& speed_bump : map_.
speed_bump()) {
114 speed_bump_table_[speed_bump.id().id()].reset(
118 parking_space_table_[parking_space.id().id()].reset(
122 pnc_junction_table_[pnc_junction.id().id()].reset(
125 for (
const auto& rsu : map_.
rsu()) {
126 rsu_table_[rsu.id().id()].reset(
new RSUInfo(rsu));
128 for (
const auto& overlap : map_.
overlap()) {
129 overlap_table_[overlap.id().id()].reset(
new OverlapInfo(overlap));
132 for (
const auto& road : map_.
road()) {
133 road_table_[road.id().id()].reset(
new RoadInfo(road));
135 for (
const auto& rsu : map_.
rsu()) {
136 rsu_table_[rsu.id().id()].reset(
new RSUInfo(rsu));
138 for (
const auto& road_ptr_pair : road_table_) {
139 const auto& road_id = road_ptr_pair.second->id();
140 for (
const auto& road_section : road_ptr_pair.second->sections()) {
141 const auto& section_id = road_section.id();
142 for (
const auto& lane_id : road_section.lane_id()) {
143 auto iter = lane_table_.find(lane_id.id());
144 if (iter != lane_table_.end()) {
145 iter->second->set_road_id(road_id);
146 iter->second->set_section_id(section_id);
148 AFATAL <<
"Unknown lane id: " << lane_id.id();
153 for (
const auto& lane_ptr_pair : lane_table_) {
154 lane_ptr_pair.second->PostProcess(*
this);
156 for (
const auto& junction_ptr_pair : junction_table_) {
157 junction_ptr_pair.second->PostProcess(*
this);
159 for (
const auto& stop_sign_ptr_pair : stop_sign_table_) {
160 stop_sign_ptr_pair.second->PostProcess(*
this);
162 for (
const auto& area_ptr_pair : area_table_) {
163 area_ptr_pair.second->PostProcess(*
this);
166 BuildLaneSegmentKDTree();
167 BuildJunctionPolygonKDTree();
168 BuildSignalSegmentKDTree();
169 BuildCrosswalkPolygonKDTree();
170 BuildStopSignSegmentKDTree();
171 BuildYieldSignSegmentKDTree();
172 BuildClearAreaPolygonKDTree();
173 BuildSpeedBumpSegmentKDTree();
174 BuildParkingSpacePolygonKDTree();
175 BuildPNCJunctionPolygonKDTree();
176 BuildAreaPolygonKDTree();
177 BuildBarrierGateSegmentKDTree();
182 LaneTable::const_iterator it = lane_table_.find(
id.
id());
183 return it != lane_table_.end() ? it->second :
nullptr;
187 JunctionTable::const_iterator it = junction_table_.find(
id.
id());
188 return it != junction_table_.end() ? it->second :
nullptr;
192 AreaTable::const_iterator it = area_table_.find(
id.
id());
193 return it != area_table_.end() ? it->second :
nullptr;
197 SignalTable::const_iterator it = signal_table_.find(
id.
id());
198 return it != signal_table_.end() ? it->second :
nullptr;
202 BarrierGateTable::const_iterator it = barrier_gate_table_.find(
id.
id());
203 return it != barrier_gate_table_.end() ? it->second :
nullptr;
207 CrosswalkTable::const_iterator it = crosswalk_table_.find(
id.
id());
208 return it != crosswalk_table_.end() ? it->second :
nullptr;
212 StopSignTable::const_iterator it = stop_sign_table_.find(
id.
id());
213 return it != stop_sign_table_.end() ? it->second :
nullptr;
217 YieldSignTable::const_iterator it = yield_sign_table_.find(
id.
id());
218 return it != yield_sign_table_.end() ? it->second :
nullptr;
222 ClearAreaTable::const_iterator it = clear_area_table_.find(
id.
id());
223 return it != clear_area_table_.end() ? it->second :
nullptr;
227 SpeedBumpTable::const_iterator it = speed_bump_table_.find(
id.
id());
228 return it != speed_bump_table_.end() ? it->second :
nullptr;
232 OverlapTable::const_iterator it = overlap_table_.find(
id.
id());
233 return it != overlap_table_.end() ? it->second :
nullptr;
237 RoadTable::const_iterator it = road_table_.find(
id.
id());
238 return it != road_table_.end() ? it->second :
nullptr;
242 ParkingSpaceTable::const_iterator it = parking_space_table_.find(
id.
id());
243 return it != parking_space_table_.end() ? it->second :
nullptr;
247 PNCJunctionTable::const_iterator it = pnc_junction_table_.find(
id.
id());
248 return it != pnc_junction_table_.end() ? it->second :
nullptr;
252 RSUTable::const_iterator it = rsu_table_.find(
id.
id());
253 return it != rsu_table_.end() ? it->second :
nullptr;
256 std::vector<LaneInfoConstPtr>* lanes)
const {
257 return GetLanes({point.x(), point.y()}, distance, lanes);
261 std::vector<LaneInfoConstPtr>* lanes)
const {
262 if (lanes ==
nullptr || lane_segment_kdtree_ ==
nullptr) {
266 std::vector<std::string> ids;
268 SearchObjects(point, distance, *lane_segment_kdtree_, &ids);
272 for (
const auto&
id : ids) {
279 std::vector<RoadInfoConstPtr>* roads)
const {
280 return GetRoads({point.x(), point.y()}, distance, roads);
284 std::vector<RoadInfoConstPtr>* roads)
const {
285 std::vector<LaneInfoConstPtr> lanes;
286 if (
GetLanes(point, distance, &lanes) != 0) {
289 std::unordered_set<std::string> road_ids;
290 for (
auto& lane : lanes) {
291 if (!lane->road_id().id().empty()) {
292 road_ids.insert(lane->road_id().id());
296 for (
auto& road_id : road_ids) {
299 roads->push_back(road);
306 const PointENU& point,
double distance,
307 std::vector<JunctionInfoConstPtr>* junctions)
const {
308 return GetJunctions({point.x(), point.y()}, distance, junctions);
312 const Vec2d& point,
double distance,
313 std::vector<JunctionInfoConstPtr>* junctions)
const {
314 if (junctions ==
nullptr || junction_polygon_kdtree_ ==
nullptr) {
318 std::vector<std::string> ids;
320 SearchObjects(point, distance, *junction_polygon_kdtree_, &ids);
324 for (
const auto&
id : ids) {
331 std::vector<AreaInfoConstPtr>* areas)
const {
332 return GetAreas({point.x(), point.y()}, distance, areas);
336 std::vector<AreaInfoConstPtr>* areas)
const {
337 if (areas ==
nullptr || area_polygon_kdtree_ ==
nullptr) {
341 std::vector<std::string> ids;
343 SearchObjects(point, distance, *area_polygon_kdtree_, &ids);
347 for (
const auto&
id : ids) {
354 std::vector<SignalInfoConstPtr>* signals)
const {
355 return GetSignals({point.x(), point.y()}, distance, signals);
359 std::vector<SignalInfoConstPtr>* signals)
const {
360 if (signals ==
nullptr || signal_segment_kdtree_ ==
nullptr) {
364 std::vector<std::string> ids;
366 SearchObjects(point, distance, *signal_segment_kdtree_, &ids);
370 for (
const auto&
id : ids) {
377 const PointENU& point,
double distance,
378 std::vector<BarrierGateInfoConstPtr>* barrier_gates)
const {
379 return GetBarrierGates({point.x(), point.y()}, distance, barrier_gates);
383 const Vec2d& point,
double distance,
384 std::vector<BarrierGateInfoConstPtr>* barrier_gates)
const {
385 if (barrier_gates ==
nullptr || barrier_gate_segment_kdtree_ ==
nullptr) {
388 barrier_gates->clear();
389 std::vector<std::string> ids;
391 SearchObjects(point, distance, *barrier_gate_segment_kdtree_, &ids);
395 for (
const auto&
id : ids) {
402 const PointENU& point,
double distance,
403 std::vector<CrosswalkInfoConstPtr>* crosswalks)
const {
404 return GetCrosswalks({point.x(), point.y()}, distance, crosswalks);
408 const Vec2d& point,
double distance,
409 std::vector<CrosswalkInfoConstPtr>* crosswalks)
const {
410 if (crosswalks ==
nullptr || crosswalk_polygon_kdtree_ ==
nullptr) {
414 std::vector<std::string> ids;
416 SearchObjects(point, distance, *crosswalk_polygon_kdtree_, &ids);
420 for (
const auto&
id : ids) {
427 const PointENU& point,
double distance,
428 std::vector<StopSignInfoConstPtr>* stop_signs)
const {
429 return GetStopSigns({point.x(), point.y()}, distance, stop_signs);
433 const Vec2d& point,
double distance,
434 std::vector<StopSignInfoConstPtr>* stop_signs)
const {
435 if (stop_signs ==
nullptr || stop_sign_segment_kdtree_ ==
nullptr) {
439 std::vector<std::string> ids;
441 SearchObjects(point, distance, *stop_sign_segment_kdtree_, &ids);
445 for (
const auto&
id : ids) {
452 const PointENU& point,
double distance,
453 std::vector<YieldSignInfoConstPtr>* yield_signs)
const {
454 return GetYieldSigns({point.x(), point.y()}, distance, yield_signs);
458 const Vec2d& point,
double distance,
459 std::vector<YieldSignInfoConstPtr>* yield_signs)
const {
460 if (yield_signs ==
nullptr || yield_sign_segment_kdtree_ ==
nullptr) {
463 yield_signs->clear();
464 std::vector<std::string> ids;
466 SearchObjects(point, distance, *yield_sign_segment_kdtree_, &ids);
470 for (
const auto&
id : ids) {
478 const PointENU& point,
double distance,
479 std::vector<ClearAreaInfoConstPtr>* clear_areas)
const {
480 return GetClearAreas({point.x(), point.y()}, distance, clear_areas);
484 const Vec2d& point,
double distance,
485 std::vector<ClearAreaInfoConstPtr>* clear_areas)
const {
486 if (clear_areas ==
nullptr || clear_area_polygon_kdtree_ ==
nullptr) {
489 clear_areas->clear();
490 std::vector<std::string> ids;
492 SearchObjects(point, distance, *clear_area_polygon_kdtree_, &ids);
496 for (
const auto&
id : ids) {
504 const PointENU& point,
double distance,
505 std::vector<SpeedBumpInfoConstPtr>* speed_bumps)
const {
506 return GetSpeedBumps({point.x(), point.y()}, distance, speed_bumps);
510 const Vec2d& point,
double distance,
511 std::vector<SpeedBumpInfoConstPtr>* speed_bumps)
const {
512 if (speed_bumps ==
nullptr || speed_bump_segment_kdtree_ ==
nullptr) {
515 speed_bumps->clear();
516 std::vector<std::string> ids;
518 SearchObjects(point, distance, *speed_bump_segment_kdtree_, &ids);
522 for (
const auto&
id : ids) {
530 const PointENU& point,
double distance,
531 std::vector<ParkingSpaceInfoConstPtr>* parking_spaces)
const {
536 const Vec2d& point,
double distance,
537 std::vector<ParkingSpaceInfoConstPtr>* parking_spaces)
const {
538 if (parking_spaces ==
nullptr || parking_space_polygon_kdtree_ ==
nullptr) {
541 parking_spaces->clear();
542 std::vector<std::string> ids;
544 SearchObjects(point, distance, *parking_space_polygon_kdtree_, &ids);
548 for (
const auto&
id : ids) {
557 std::vector<PNCJunctionInfoConstPtr>* pnc_junctions)
const {
563 std::vector<PNCJunctionInfoConstPtr>* pnc_junctions)
const {
564 if (pnc_junctions ==
nullptr || pnc_junction_polygon_kdtree_ ==
nullptr) {
567 pnc_junctions->clear();
569 std::vector<std::string> ids;
571 SearchObjects(point, distance, *pnc_junction_polygon_kdtree_, &ids);
576 for (
const auto&
id : ids) {
584 const double distance,
587 double* nearest_l)
const {
589 nearest_lane, nearest_s, nearest_l);
595 double* nearest_l)
const {
596 CHECK_NOTNULL(nearest_lane);
597 CHECK_NOTNULL(nearest_s);
598 CHECK_NOTNULL(nearest_l);
599 const auto* segment_object = lane_segment_kdtree_->GetNearestObject(point);
600 if (segment_object ==
nullptr) {
603 const Id& lane_id = segment_object->object()->id();
606 const int id = segment_object->id();
607 const auto& segment = (*nearest_lane)->segments()[id];
609 double apart_distance = segment.DistanceTo(point, &nearest_pt);
611 if (apart_distance > distance) {
615 *nearest_s = (*nearest_lane)->accumulate_s()[id] +
616 nearest_pt.DistanceTo(segment.start());
617 *nearest_l = segment.unit_direction().CrossProd(point - segment.start());
624 double* nearest_l)
const {
625 return GetNearestLane({point.x(), point.y()}, nearest_lane, nearest_s,
631 double* nearest_l)
const {
632 CHECK_NOTNULL(nearest_lane);
633 CHECK_NOTNULL(nearest_s);
634 CHECK_NOTNULL(nearest_l);
635 const auto* segment_object = lane_segment_kdtree_->GetNearestObject(point);
636 if (segment_object ==
nullptr) {
639 const Id& lane_id = segment_object->object()->id();
642 const int id = segment_object->id();
643 const auto& segment = (*nearest_lane)->segments()[id];
645 segment.DistanceTo(point, &nearest_pt);
646 *nearest_s = (*nearest_lane)->accumulate_s()[id] +
647 nearest_pt.DistanceTo(segment.start());
648 *nearest_l = segment.unit_direction().CrossProd(point - segment.start());
654 const PointENU& point,
const double distance,
const double central_heading,
656 double* nearest_s,
double* nearest_l)
const {
658 central_heading, max_heading_difference,
659 nearest_lane, nearest_s, nearest_l);
663 const Vec2d& point,
const double distance,
const double central_heading,
665 double* nearest_s,
double* nearest_l)
const {
666 CHECK_NOTNULL(nearest_lane);
667 CHECK_NOTNULL(nearest_s);
668 CHECK_NOTNULL(nearest_l);
670 std::vector<LaneInfoConstPtr> lanes;
672 max_heading_difference, &lanes) != 0) {
679 double min_distance = distance;
680 for (
const auto& lane : lanes) {
681 double s_offset = 0.0;
682 int s_offset_index = 0;
684 lane->DistanceTo(point, &map_point, &s_offset, &s_offset_index);
685 if (distance < min_distance) {
686 min_distance = distance;
687 *nearest_lane = lane;
689 s_index = s_offset_index;
693 if (*nearest_lane ==
nullptr) {
698 int segment_index =
static_cast<int>(
699 std::min(s_index, (*nearest_lane)->segments().size() - 1));
700 const auto& segment_2d = (*nearest_lane)->segments()[segment_index];
702 segment_2d.unit_direction().CrossProd(point - segment_2d.start());
708 const double central_heading,
709 const double max_heading_difference,
710 std::vector<LaneInfoConstPtr>* lanes)
const {
712 max_heading_difference, lanes);
716 const double central_heading,
717 const double max_heading_difference,
718 std::vector<LaneInfoConstPtr>* lanes)
const {
719 CHECK_NOTNULL(lanes);
720 std::vector<LaneInfoConstPtr> all_lanes;
721 const int status =
GetLanes(point, distance, &all_lanes);
722 if (status < 0 || all_lanes.empty()) {
727 for (
auto& lane : all_lanes) {
728 Vec2d proj_pt(0.0, 0.0);
729 double s_offset = 0.0;
730 int s_offset_index = 0;
731 double dis = lane->DistanceTo(point, &proj_pt, &s_offset, &s_offset_index);
732 if (dis <= distance) {
733 double heading_diff =
734 fabs(lane->headings()[s_offset_index] - central_heading);
736 max_heading_difference) {
737 lanes->push_back(lane);
746 const PointENU& point,
double radius,
747 std::vector<RoadROIBoundaryPtr>* road_boundaries,
748 std::vector<JunctionBoundaryPtr>* junctions)
const {
749 CHECK_NOTNULL(road_boundaries);
750 CHECK_NOTNULL(junctions);
752 road_boundaries->clear();
755 std::vector<LaneInfoConstPtr> lanes;
756 if (
GetLanes(point, radius, &lanes) != 0 || lanes.empty()) {
760 std::unordered_set<std::string> junction_id_set;
761 std::unordered_set<std::string> road_section_id_set;
762 for (
const auto& lane : lanes) {
763 const auto road_id = lane->road_id();
764 const auto section_id = lane->section_id();
765 std::string unique_id = road_id.id() + section_id.id();
766 if (road_section_id_set.count(unique_id) > 0) {
769 road_section_id_set.insert(unique_id);
771 if (road_ptr ==
nullptr) {
772 AERROR <<
"road id [" << road_id.id() <<
"] is not found.";
775 if (road_ptr->has_junction_id()) {
776 const Id junction_id = road_ptr->junction_id();
777 if (junction_id_set.count(junction_id.id()) > 0) {
780 junction_id_set.insert(junction_id.id());
783 if (junction_boundary_ptr->junction_info ==
nullptr) {
784 AERROR <<
"junction id [" << junction_id.id() <<
"] is not found.";
787 junctions->push_back(junction_boundary_ptr);
790 road_boundary_ptr->mutable_id()->CopyFrom(road_ptr->id());
791 for (
const auto& section : road_ptr->sections()) {
792 if (section.id().id() == section_id.id()) {
793 road_boundary_ptr->add_road_boundaries()->CopyFrom(
797 road_boundaries->push_back(road_boundary_ptr);
805 const PointENU& point,
double radius,
806 std::vector<RoadRoiPtr>* road_boundaries,
807 std::vector<JunctionInfoConstPtr>* junctions)
const {
808 if (road_boundaries ==
nullptr || junctions ==
nullptr) {
809 AERROR <<
"the pointer in parameter is null";
812 road_boundaries->clear();
814 std::set<std::string> junction_id_set;
815 std::vector<RoadInfoConstPtr> roads;
816 if (
GetRoads(point, radius, &roads) != 0) {
817 AERROR <<
"can not get roads in the range.";
820 for (
const auto& road_ptr : roads) {
821 if (road_ptr->has_junction_id()) {
824 if (junction_id_set.find(junction_ptr->id().id()) ==
825 junction_id_set.end()) {
826 junctions->push_back(junction_ptr);
827 junction_id_set.insert(junction_ptr->id().id());
831 const std::vector<apollo::hdmap::RoadBoundary>& temp_road_boundaries =
832 road_ptr->GetBoundaries();
833 road_boundary_ptr->id = road_ptr->id();
834 for (
const auto& temp_road_boundary : temp_road_boundaries) {
836 temp_road_boundary.outer_polygon();
837 for (
const auto& edge : boundary_polygon.edge()) {
839 for (
const auto& s : edge.curve().segment()) {
840 for (
const auto& p : s.line_segment().point()) {
841 road_boundary_ptr->left_boundary.line_points.push_back(p);
846 for (
const auto& s : edge.curve().segment()) {
847 for (
const auto& p : s.line_segment().point()) {
848 road_boundary_ptr->right_boundary.line_points.push_back(p);
853 if (temp_road_boundary.hole_size() != 0) {
854 for (
const auto& hole : temp_road_boundary.hole()) {
855 PolygonBoundary hole_boundary;
856 for (
const auto& edge : hole.edge()) {
858 for (
const auto& s : edge.curve().segment()) {
859 for (
const auto& p : s.line_segment().point()) {
860 hole_boundary.polygon_points.push_back(p);
865 road_boundary_ptr->holes_boundary.push_back(hole_boundary);
869 road_boundaries->push_back(road_boundary_ptr);
876 std::vector<RoadRoiPtr>* roads_roi,
877 std::vector<PolygonRoiPtr>* polygons_roi) {
878 if (roads_roi ==
nullptr || polygons_roi ==
nullptr) {
879 AERROR <<
"the pointer in parameter is null";
883 polygons_roi->clear();
884 std::set<std::string> polygon_id_set;
885 std::vector<RoadInfoConstPtr> roads;
886 std::vector<LaneInfoConstPtr> lanes;
887 if (
GetRoads(point, radius, &roads) != 0) {
888 AERROR <<
"can not get roads in the range.";
891 if (
GetLanes(point, radius, &lanes) != 0) {
892 AERROR <<
"can not get lanes in the range.";
895 for (
const auto& road_ptr : roads) {
897 if (road_ptr->has_junction_id()) {
900 if (polygon_id_set.find(junction_ptr->id().id()) ==
901 polygon_id_set.end()) {
903 polygon_roi_ptr->polygon = junction_ptr->polygon();
905 polygon_roi_ptr->attribute.id = junction_ptr->id();
906 polygons_roi->push_back(polygon_roi_ptr);
907 polygon_id_set.insert(junction_ptr->id().id());
912 std::vector<apollo::hdmap::RoadBoundary> temp_roads_roi;
913 temp_roads_roi = road_ptr->GetBoundaries();
914 if (!temp_roads_roi.empty()) {
915 road_boundary_ptr->id = road_ptr->id();
916 for (
const auto& temp_road_boundary : temp_roads_roi) {
918 temp_road_boundary.outer_polygon();
919 for (
const auto& edge : boundary_polygon.
edge()) {
921 for (
const auto& s : edge.curve().segment()) {
922 for (
const auto& p : s.line_segment().point()) {
923 road_boundary_ptr->left_boundary.line_points.push_back(p);
928 for (
const auto& s : edge.curve().segment()) {
929 for (
const auto& p : s.line_segment().point()) {
930 road_boundary_ptr->right_boundary.line_points.push_back(p);
935 if (temp_road_boundary.hole_size() != 0) {
936 for (
const auto& hole : temp_road_boundary.hole()) {
938 for (
const auto& edge : hole.edge()) {
940 for (
const auto& s : edge.curve().segment()) {
941 for (
const auto& p : s.line_segment().point()) {
947 road_boundary_ptr->holes_boundary.push_back(hole_boundary);
951 roads_roi->push_back(road_boundary_ptr);
956 for (
const auto& lane_ptr : lanes) {
958 for (
const auto& overlap_id : lane_ptr->lane().overlap_id()) {
960 for (
int i = 0; i < overlap_ptr->overlap().object_size(); ++i) {
961 if (overlap_ptr->overlap().object(i).id().id() == lane_ptr->id().id()) {
966 if (parkingspace_ptr !=
nullptr) {
967 if (polygon_id_set.find(parkingspace_ptr->id().id()) ==
968 polygon_id_set.end()) {
970 polygon_roi_ptr->polygon = parkingspace_ptr->polygon();
971 polygon_roi_ptr->attribute.type =
973 polygon_roi_ptr->attribute.id = parkingspace_ptr->id();
974 polygons_roi->push_back(polygon_roi_ptr);
975 polygon_id_set.insert(parkingspace_ptr->id().id());
987 std::vector<SignalInfoConstPtr>* signals)
const {
988 CHECK_NOTNULL(signals);
992 double nearest_s = 0.0;
993 double nearest_l = 0.0;
995 std::vector<LaneInfoConstPtr> temp_surrounding_lanes;
996 std::vector<LaneInfoConstPtr> surrounding_lanes;
999 car_point.
set_x(point.
x());
1000 car_point.
set_y(point.
y());
1002 if (
GetLanes(point, kLanesSearchRange, &temp_surrounding_lanes) == -1) {
1003 AINFO <<
"Can not find lanes around car.";
1006 for (
const auto& surround_lane : temp_surrounding_lanes) {
1007 if (surround_lane->IsOnLane(car_point)) {
1008 surrounding_lanes.push_back(surround_lane);
1011 if (surrounding_lanes.empty()) {
1012 AINFO <<
"Car is not on lane.";
1015 for (
const auto& lane : surrounding_lanes) {
1016 if (!lane->signals().empty()) {
1019 lane_ptr->
DistanceTo(car_point, &map_point, &nearest_s, &s_index);
1023 if (lane_ptr ==
nullptr) {
1025 if (lane_ptr ==
nullptr) {
1030 double unused_distance = distance + kBackwardDistance;
1031 double back_distance = kBackwardDistance;
1032 double s = nearest_s;
1033 while (s < back_distance) {
1034 for (
const auto& predecessor_lane_id : lane_ptr->lane().predecessor_id()) {
1040 back_distance = back_distance - s;
1041 s = lane_ptr->total_length();
1043 double s_start = s - back_distance;
1044 while (lane_ptr !=
nullptr) {
1045 double signal_min_dist = std::numeric_limits<double>::infinity();
1046 std::vector<SignalInfoConstPtr> min_dist_signal_ptr;
1047 for (
const auto& overlap_id : lane_ptr->lane().overlap_id()) {
1049 double lane_overlap_offset_s = 0.0;
1051 for (
int i = 0; i < overlap_ptr->overlap().object_size(); ++i) {
1052 if (overlap_ptr->overlap().object(i).id().id() == lane_ptr->id().id()) {
1053 lane_overlap_offset_s =
1054 overlap_ptr->overlap().object(i).lane_overlap_info().start_s() -
1058 signal_ptr =
GetSignalById(overlap_ptr->overlap().object(i).id());
1059 if (signal_ptr ==
nullptr || lane_overlap_offset_s < 0.0) {
1062 if (lane_overlap_offset_s < signal_min_dist) {
1063 signal_min_dist = lane_overlap_offset_s;
1064 min_dist_signal_ptr.clear();
1065 min_dist_signal_ptr.push_back(signal_ptr);
1066 }
else if (lane_overlap_offset_s < (signal_min_dist + 0.1) &&
1067 lane_overlap_offset_s > (signal_min_dist - 0.1)) {
1068 min_dist_signal_ptr.push_back(signal_ptr);
1072 if (!min_dist_signal_ptr.empty() && unused_distance >= signal_min_dist) {
1073 *signals = min_dist_signal_ptr;
1076 unused_distance = unused_distance - (lane_ptr->total_length() - s_start);
1077 if (unused_distance <= 0) {
1081 for (
const auto& successor_lane_id : lane_ptr->lane().successor_id()) {
1087 lane_ptr = tmp_lane_ptr;
1094 const Id&
id, std::vector<StopSignInfoConstPtr>* stop_signs)
const {
1095 CHECK_NOTNULL(stop_signs);
1098 if (stop_sign ==
nullptr) {
1102 std::vector<Id> associate_stop_sign_ids;
1103 const auto junction_ids = stop_sign->OverlapJunctionIds();
1104 for (
const auto& junction_id : junction_ids) {
1106 if (junction ==
nullptr) {
1109 const auto stop_sign_ids = junction->OverlapStopSignIds();
1110 std::copy(stop_sign_ids.begin(), stop_sign_ids.end(),
1111 std::back_inserter(associate_stop_sign_ids));
1114 std::vector<Id> associate_lane_ids;
1115 for (
const auto& stop_sign_id : associate_stop_sign_ids) {
1116 if (stop_sign_id.id() ==
id.id()) {
1121 if (stop_sign ==
nullptr) {
1124 stop_signs->push_back(stop_sign);
1132 std::vector<BarrierGateInfoConstPtr>* barrier_gates)
const {
1133 CHECK_NOTNULL(barrier_gates);
1135 barrier_gates->clear();
1137 double nearest_s = 0.0;
1138 double nearest_l = 0.0;
1140 std::vector<LaneInfoConstPtr> temp_surrounding_lanes;
1141 std::vector<LaneInfoConstPtr> surrounding_lanes;
1144 car_point.
set_x(point.
x());
1145 car_point.
set_y(point.
y());
1147 if (
GetLanes(point, kLanesSearchRange, &temp_surrounding_lanes) == -1) {
1148 AINFO <<
"Can not find lanes around car.";
1151 for (
const auto& surround_lane : temp_surrounding_lanes) {
1152 if (surround_lane->IsOnLane(car_point)) {
1153 surrounding_lanes.push_back(surround_lane);
1156 if (surrounding_lanes.empty()) {
1157 AINFO <<
"Car is not on lane.";
1160 for (
const auto& lane : surrounding_lanes) {
1161 if (!lane->barrier_gates().empty()) {
1164 lane_ptr->
DistanceTo(car_point, &map_point, &nearest_s, &s_index);
1168 if (lane_ptr ==
nullptr) {
1170 if (lane_ptr ==
nullptr) {
1175 double unused_distance = distance + kBackwardDistance;
1176 double back_distance = kBackwardDistance;
1177 double s = nearest_s;
1178 while (s < back_distance) {
1179 for (
const auto& predecessor_lane_id : lane_ptr->lane().predecessor_id()) {
1185 back_distance = back_distance - s;
1186 s = lane_ptr->total_length();
1188 double s_start = s - back_distance;
1189 while (lane_ptr !=
nullptr) {
1190 double barrier_min_dist = std::numeric_limits<double>::infinity();
1191 std::vector<BarrierGateInfoConstPtr> min_dist_barrier_ptr;
1192 for (
const auto& overlap_id : lane_ptr->lane().overlap_id()) {
1194 double lane_overlap_offset_s = 0.0;
1196 for (
int i = 0; i < overlap_ptr->overlap().object_size(); ++i) {
1197 if (overlap_ptr->overlap().object(i).id().id() == lane_ptr->id().id()) {
1198 lane_overlap_offset_s =
1199 overlap_ptr->overlap().object(i).lane_overlap_info().start_s() -
1204 if (barrier_ptr ==
nullptr || lane_overlap_offset_s < 0.0) {
1207 if (lane_overlap_offset_s < barrier_min_dist) {
1208 barrier_min_dist = lane_overlap_offset_s;
1209 min_dist_barrier_ptr.clear();
1210 min_dist_barrier_ptr.push_back(barrier_ptr);
1211 }
else if (lane_overlap_offset_s < (barrier_min_dist + 0.1) &&
1212 lane_overlap_offset_s > (barrier_min_dist - 0.1)) {
1213 min_dist_barrier_ptr.push_back(barrier_ptr);
1217 if (!min_dist_barrier_ptr.empty() && unused_distance >= barrier_min_dist) {
1218 *barrier_gates = min_dist_barrier_ptr;
1221 unused_distance = unused_distance - (lane_ptr->total_length() - s_start);
1222 if (unused_distance <= 0) {
1226 for (
const auto& successor_lane_id : lane_ptr->lane().successor_id()) {
1232 lane_ptr = tmp_lane_ptr;
1239 const Id&
id, std::vector<LaneInfoConstPtr>* lanes)
const {
1240 CHECK_NOTNULL(lanes);
1243 if (stop_sign ==
nullptr) {
1247 std::vector<Id> associate_stop_sign_ids;
1248 const auto junction_ids = stop_sign->OverlapJunctionIds();
1249 for (
const auto& junction_id : junction_ids) {
1251 if (junction ==
nullptr) {
1254 const auto stop_sign_ids = junction->OverlapStopSignIds();
1255 std::copy(stop_sign_ids.begin(), stop_sign_ids.end(),
1256 std::back_inserter(associate_stop_sign_ids));
1259 std::vector<Id> associate_lane_ids;
1260 for (
const auto& stop_sign_id : associate_stop_sign_ids) {
1261 if (stop_sign_id.id() ==
id.id()) {
1266 if (stop_sign ==
nullptr) {
1269 const auto lane_ids = stop_sign->OverlapLaneIds();
1270 std::copy(lane_ids.begin(), lane_ids.end(),
1271 std::back_inserter(associate_lane_ids));
1274 for (
const auto lane_id : associate_lane_ids) {
1276 if (lane ==
nullptr) {
1279 lanes->push_back(lane);
1286 const std::pair<double, double>& range,
1287 Map* local_map)
const {
1288 CHECK_NOTNULL(local_map);
1290 double distance = std::max(range.first, range.second);
1291 CHECK_GT(distance, 0.0);
1293 std::vector<LaneInfoConstPtr> lanes;
1296 std::vector<JunctionInfoConstPtr> junctions;
1299 std::vector<CrosswalkInfoConstPtr> crosswalks;
1302 std::vector<SignalInfoConstPtr> signals;
1305 std::vector<StopSignInfoConstPtr> stop_signs;
1308 std::vector<YieldSignInfoConstPtr> yield_signs;
1311 std::vector<ClearAreaInfoConstPtr> clear_areas;
1314 std::vector<SpeedBumpInfoConstPtr> speed_bumps;
1317 std::vector<RoadInfoConstPtr> roads;
1320 std::vector<ParkingSpaceInfoConstPtr> parking_spaces;
1323 std::unordered_set<std::string> map_element_ids;
1324 std::vector<Id> overlap_ids;
1326 for (
auto& lane_ptr : lanes) {
1327 map_element_ids.insert(lane_ptr->id().id());
1328 std::copy(lane_ptr->lane().overlap_id().begin(),
1329 lane_ptr->lane().overlap_id().end(),
1330 std::back_inserter(overlap_ids));
1331 *local_map->add_lane() = lane_ptr->
lane();
1334 for (
auto& crosswalk_ptr : crosswalks) {
1335 map_element_ids.insert(crosswalk_ptr->id().id());
1336 std::copy(crosswalk_ptr->crosswalk().overlap_id().begin(),
1337 crosswalk_ptr->crosswalk().overlap_id().end(),
1338 std::back_inserter(overlap_ids));
1339 *local_map->add_crosswalk() = crosswalk_ptr->
crosswalk();
1342 for (
auto& junction_ptr : junctions) {
1343 map_element_ids.insert(junction_ptr->id().id());
1344 std::copy(junction_ptr->junction().overlap_id().begin(),
1345 junction_ptr->junction().overlap_id().end(),
1346 std::back_inserter(overlap_ids));
1347 *local_map->add_junction() = junction_ptr->
junction();
1350 for (
auto& signal_ptr : signals) {
1351 map_element_ids.insert(signal_ptr->id().id());
1352 std::copy(signal_ptr->signal().overlap_id().begin(),
1353 signal_ptr->signal().overlap_id().end(),
1354 std::back_inserter(overlap_ids));
1355 *local_map->add_signal() = signal_ptr->
signal();
1358 for (
auto& stop_sign_ptr : stop_signs) {
1359 map_element_ids.insert(stop_sign_ptr->id().id());
1360 std::copy(stop_sign_ptr->stop_sign().overlap_id().begin(),
1361 stop_sign_ptr->stop_sign().overlap_id().end(),
1362 std::back_inserter(overlap_ids));
1363 *local_map->add_stop_sign() = stop_sign_ptr->
stop_sign();
1366 for (
auto& yield_sign_ptr : yield_signs) {
1367 std::copy(yield_sign_ptr->yield_sign().overlap_id().begin(),
1368 yield_sign_ptr->yield_sign().overlap_id().end(),
1369 std::back_inserter(overlap_ids));
1370 map_element_ids.insert(yield_sign_ptr->id().id());
1371 *local_map->add_yield() = yield_sign_ptr->yield_sign();
1374 for (
auto& clear_area_ptr : clear_areas) {
1375 map_element_ids.insert(clear_area_ptr->id().id());
1376 std::copy(clear_area_ptr->clear_area().overlap_id().begin(),
1377 clear_area_ptr->clear_area().overlap_id().end(),
1378 std::back_inserter(overlap_ids));
1379 *local_map->add_clear_area() = clear_area_ptr->
clear_area();
1382 for (
auto& speed_bump_ptr : speed_bumps) {
1383 map_element_ids.insert(speed_bump_ptr->id().id());
1384 std::copy(speed_bump_ptr->speed_bump().overlap_id().begin(),
1385 speed_bump_ptr->speed_bump().overlap_id().end(),
1386 std::back_inserter(overlap_ids));
1387 *local_map->add_speed_bump() = speed_bump_ptr->
speed_bump();
1390 for (
auto& road_ptr : roads) {
1391 map_element_ids.insert(road_ptr->id().id());
1392 *local_map->add_road() = road_ptr->
road();
1395 for (
auto& parking_space_ptr : parking_spaces) {
1396 map_element_ids.insert(parking_space_ptr->id().id());
1397 std::copy(parking_space_ptr->parking_space().overlap_id().begin(),
1398 parking_space_ptr->parking_space().overlap_id().end(),
1399 std::back_inserter(overlap_ids));
1400 *local_map->add_parking_space() = parking_space_ptr->
parking_space();
1403 for (
auto& overlap_id : overlap_ids) {
1405 if (overlap_ptr ==
nullptr) {
1406 AERROR <<
"overlpa id [" << overlap_id.id() <<
"] is not found.";
1410 bool need_delete =
false;
1411 for (
auto& overlap_object : overlap_ptr->overlap().object()) {
1412 if (map_element_ids.count(overlap_object.id().id()) <= 0) {
1418 *local_map->add_overlap() = overlap_ptr->
overlap();
1426 double distance,
double central_heading,
1427 double max_heading_difference,
1428 std::vector<RSUInfoConstPtr>* rsus)
const {
1429 CHECK_NOTNULL(rsus);
1435 double nearest_s = 0.0;
1436 double nearest_l = 0.0;
1438 max_heading_difference, &lane_ptr, &nearest_s,
1439 &nearest_l) == -1) {
1440 AERROR <<
"Fail to get nearest lanes";
1444 if (lane_ptr ==
nullptr) {
1445 AERROR <<
"Fail to get nearest lanes";
1450 double real_distance = distance + nearest_s;
1451 const std::string nearst_lane_id = lane_ptr->id().id();
1453 while (s < real_distance) {
1454 s += lane_ptr->total_length();
1455 std::vector<std::pair<double, JunctionInfoConstPtr>> overlap_junctions;
1457 for (
size_t x = 0; x < lane_ptr->junctions().size(); ++x) {
1458 const auto overlap_ptr = lane_ptr->junctions()[x];
1459 for (
int i = 0; i < overlap_ptr->overlap().object_size(); ++i) {
1460 const auto& overlap_object = overlap_ptr->overlap().object(i);
1461 if (overlap_object.id().id() == lane_ptr->id().id()) {
1462 start_s = overlap_object.lane_overlap_info().start_s();
1467 CHECK_NOTNULL(junction_ptr);
1468 if (nearst_lane_id == lane_ptr->id().id() &&
1469 !junction_ptr->polygon().IsPointIn(target_point)) {
1470 if (nearest_s > start_s) {
1475 overlap_junctions.push_back(std::make_pair(start_s, junction_ptr));
1479 std::sort(overlap_junctions.begin(), overlap_junctions.end());
1481 std::set<std::string> duplicate_checker;
1482 for (
const auto& overlap_junction : overlap_junctions) {
1483 const auto& junction = overlap_junction.second;
1484 if (duplicate_checker.count(junction->id().id()) > 0) {
1487 duplicate_checker.insert(junction->id().id());
1489 for (
const auto& overlap_id : junction->junction().overlap_id()) {
1491 CHECK_NOTNULL(overlap_ptr);
1492 for (
int i = 0; i < overlap_ptr->overlap().object_size(); ++i) {
1493 const auto& overlap_object = overlap_ptr->overlap().object(i);
1494 if (!overlap_object.has_rsu_overlap_info()) {
1498 const auto rsu_ptr =
GetRSUById(overlap_object.id());
1499 if (rsu_ptr !=
nullptr) {
1500 rsus->push_back(rsu_ptr);
1505 if (!rsus->empty()) {
1510 if (!rsus->empty()) {
1514 for (
const auto suc_lane_id : lane_ptr->lane().successor_id()) {
1516 if (lane_ptr->lane().successor_id_size() > 1) {
1518 lane_ptr = suc_lane_ptr;
1522 lane_ptr = suc_lane_ptr;
1528 if (rsus->empty()) {
1535template <
class Table,
class BoxTable,
class KDTree>
1536void HDMapImpl::BuildSegmentKDTree(
const Table& table,
1537 const AABoxKDTreeParams& params,
1538 BoxTable*
const box_table,
1539 std::unique_ptr<KDTree>*
const kdtree) {
1541 for (
const auto& info_with_id : table) {
1542 const auto* info = info_with_id.second.get();
1543 for (
size_t id = 0;
id < info->segments().size(); ++id) {
1544 const auto& segment = info->segments()[id];
1545 box_table->emplace_back(
1550 kdtree->reset(
new KDTree(*box_table, params));
1553template <
class Table,
class BoxTable,
class KDTree>
1554void HDMapImpl::BuildPolygonKDTree(
const Table& table,
1555 const AABoxKDTreeParams& params,
1556 BoxTable*
const box_table,
1557 std::unique_ptr<KDTree>*
const kdtree) {
1559 for (
const auto& info_with_id : table) {
1560 const auto* info = info_with_id.second.get();
1561 const auto& polygon = info->polygon();
1562 box_table->emplace_back(polygon.AABoundingBox(), info, &polygon, 0);
1564 kdtree->reset(
new KDTree(*box_table, params));
1567void HDMapImpl::BuildLaneSegmentKDTree() {
1568 AABoxKDTreeParams params;
1569 params.max_leaf_dimension = 5.0;
1570 params.max_leaf_size = 16;
1571 BuildSegmentKDTree(lane_table_, params, &lane_segment_boxes_,
1572 &lane_segment_kdtree_);
1575void HDMapImpl::BuildJunctionPolygonKDTree() {
1576 AABoxKDTreeParams params;
1577 params.max_leaf_dimension = 5.0;
1578 params.max_leaf_size = 1;
1579 BuildPolygonKDTree(junction_table_, params, &junction_polygon_boxes_,
1580 &junction_polygon_kdtree_);
1583void HDMapImpl::BuildAreaPolygonKDTree() {
1584 AABoxKDTreeParams params;
1585 params.max_leaf_dimension = 5.0;
1586 params.max_leaf_size = 1;
1587 BuildPolygonKDTree(area_table_, params, &area_polygon_boxes_,
1588 &area_polygon_kdtree_);
1591void HDMapImpl::BuildCrosswalkPolygonKDTree() {
1592 AABoxKDTreeParams params;
1593 params.max_leaf_dimension = 5.0;
1594 params.max_leaf_size = 1;
1595 BuildPolygonKDTree(crosswalk_table_, params, &crosswalk_polygon_boxes_,
1596 &crosswalk_polygon_kdtree_);
1599void HDMapImpl::BuildSignalSegmentKDTree() {
1600 AABoxKDTreeParams params;
1601 params.max_leaf_dimension = 5.0;
1602 params.max_leaf_size = 4;
1603 BuildSegmentKDTree(signal_table_, params, &signal_segment_boxes_,
1604 &signal_segment_kdtree_);
1607void HDMapImpl::BuildBarrierGateSegmentKDTree() {
1608 AABoxKDTreeParams params;
1609 params.max_leaf_dimension = 5.0;
1610 params.max_leaf_size = 4;
1611 BuildSegmentKDTree(barrier_gate_table_, params, &barrier_gate_segment_boxes_,
1612 &barrier_gate_segment_kdtree_);
1615void HDMapImpl::BuildStopSignSegmentKDTree() {
1616 AABoxKDTreeParams params;
1617 params.max_leaf_dimension = 5.0;
1618 params.max_leaf_size = 4;
1619 BuildSegmentKDTree(stop_sign_table_, params, &stop_sign_segment_boxes_,
1620 &stop_sign_segment_kdtree_);
1623void HDMapImpl::BuildYieldSignSegmentKDTree() {
1624 AABoxKDTreeParams params;
1625 params.max_leaf_dimension = 5.0;
1626 params.max_leaf_size = 4;
1627 BuildSegmentKDTree(yield_sign_table_, params, &yield_sign_segment_boxes_,
1628 &yield_sign_segment_kdtree_);
1631void HDMapImpl::BuildClearAreaPolygonKDTree() {
1632 AABoxKDTreeParams params;
1633 params.max_leaf_dimension = 5.0;
1634 params.max_leaf_size = 4;
1635 BuildPolygonKDTree(clear_area_table_, params, &clear_area_polygon_boxes_,
1636 &clear_area_polygon_kdtree_);
1639void HDMapImpl::BuildSpeedBumpSegmentKDTree() {
1640 AABoxKDTreeParams params;
1641 params.max_leaf_dimension = 5.0;
1642 params.max_leaf_size = 4;
1643 BuildSegmentKDTree(speed_bump_table_, params, &speed_bump_segment_boxes_,
1644 &speed_bump_segment_kdtree_);
1647void HDMapImpl::BuildParkingSpacePolygonKDTree() {
1648 AABoxKDTreeParams params;
1649 params.max_leaf_dimension = 5.0;
1650 params.max_leaf_size = 4;
1651 BuildPolygonKDTree(parking_space_table_, params,
1652 &parking_space_polygon_boxes_,
1653 &parking_space_polygon_kdtree_);
1656void HDMapImpl::BuildPNCJunctionPolygonKDTree() {
1657 AABoxKDTreeParams params;
1658 params.max_leaf_dimension = 5.0;
1659 params.max_leaf_size = 1;
1660 BuildPolygonKDTree(pnc_junction_table_, params, &pnc_junction_polygon_boxes_,
1661 &pnc_junction_polygon_kdtree_);
1664template <
class KDTree>
1665int HDMapImpl::SearchObjects(
const Vec2d& center,
const double radius,
1666 const KDTree& kdtree,
1667 std::vector<std::string>*
const results) {
1668 static std::mutex mutex_search_object;
1670 if (results ==
nullptr) {
1673 auto objects = kdtree.GetObjects(center, radius);
1674 std::unordered_set<std::string> result_ids;
1675 result_ids.reserve(objects.size());
1676 for (
const auto* object_ptr : objects) {
1677 result_ids.insert(object_ptr->object()->id().id());
1680 results->reserve(result_ids.size());
1681 results->assign(result_ids.begin(), result_ids.end());
1685void HDMapImpl::Clear() {
1687 lane_table_.clear();
1688 junction_table_.clear();
1689 area_table_.clear();
1690 signal_table_.clear();
1691 barrier_gate_table_.clear();
1692 crosswalk_table_.clear();
1693 stop_sign_table_.clear();
1694 yield_sign_table_.clear();
1695 overlap_table_.clear();
1697 lane_segment_boxes_.clear();
1698 lane_segment_kdtree_.reset(
nullptr);
1699 junction_polygon_boxes_.clear();
1700 junction_polygon_kdtree_.reset(
nullptr);
1701 area_polygon_boxes_.clear();
1702 area_polygon_kdtree_.reset(
nullptr);
1703 crosswalk_polygon_boxes_.clear();
1704 crosswalk_polygon_kdtree_.reset(
nullptr);
1705 signal_segment_boxes_.clear();
1706 signal_segment_kdtree_.reset(
nullptr);
1707 barrier_gate_segment_boxes_.clear();
1708 barrier_gate_segment_kdtree_.reset(
nullptr);
1709 stop_sign_segment_boxes_.clear();
1710 stop_sign_segment_kdtree_.reset(
nullptr);
1711 yield_sign_segment_boxes_.clear();
1712 yield_sign_segment_kdtree_.reset(
nullptr);
1713 clear_area_polygon_boxes_.clear();
1714 clear_area_polygon_kdtree_.reset(
nullptr);
1715 speed_bump_segment_boxes_.clear();
1716 speed_bump_segment_kdtree_.reset(
nullptr);
1717 parking_space_polygon_boxes_.clear();
1718 parking_space_polygon_kdtree_.reset(
nullptr);
1719 pnc_junction_polygon_boxes_.clear();
1720 pnc_junction_polygon_kdtree_.reset(
nullptr);
Implements a class of (undirected) axes-aligned bounding boxes in 2-D.
Implements a class of 2-dimensional vectors.
void set_x(const double x)
Setter for x component
double DistanceTo(const Vec2d &other) const
Returns the distance to the given vector
void set_y(const double y)
Setter for y component
int GetNearestLaneWithHeading(const apollo::common::PointENU &point, const double distance, const double central_heading, const double max_heading_difference, LaneInfoConstPtr *nearest_lane, double *nearest_s, double *nearest_l) const
get the nearest lane within a certain range by pose
int GetAreas(const apollo::common::PointENU &point, double distance, std::vector< AreaInfoConstPtr > *areas) const
get all areas in certain range
Id CreateHDMapId(const std::string &string_id) const
convert id data type
int GetRoadBoundaries(const apollo::common::PointENU &point, double radius, std::vector< RoadROIBoundaryPtr > *road_boundaries, std::vector< JunctionBoundaryPtr > *junctions) const
get all road and junctions boundaries within certain range
int GetStopSignAssociatedStopSigns(const Id &id, std::vector< StopSignInfoConstPtr > *stop_signs) const
get all other stop signs associated with a stop sign in the same junction
int GetJunctions(const apollo::common::PointENU &point, double distance, std::vector< JunctionInfoConstPtr > *junctions) const
get all junctions in certain range
int GetBarrierGates(const apollo::common::PointENU &point, double distance, std::vector< BarrierGateInfoConstPtr > *barrier_gates) const
get all barrier_gates in certain range
int GetNearestLane(const apollo::common::PointENU &point, LaneInfoConstPtr *nearest_lane, double *nearest_s, double *nearest_l) const
get nearest lane from target point,
OverlapInfoConstPtr GetOverlapById(const Id &id) const
int GetStopSigns(const apollo::common::PointENU &point, double distance, std::vector< StopSignInfoConstPtr > *stop_signs) const
get all stop signs in certain range
StopSignInfoConstPtr GetStopSignById(const Id &id) const
AreaInfoConstPtr GetAreaById(const Id &id) const
int GetLanesWithHeading(const apollo::common::PointENU &point, const double distance, const double central_heading, const double max_heading_difference, std::vector< LaneInfoConstPtr > *lanes) const
get all lanes within a certain range by pose
int LoadMapFromProto(const Map &map_proto)
load map from a protobuf message
JunctionInfoConstPtr GetJunctionById(const Id &id) const
ParkingSpaceInfoConstPtr GetParkingSpaceById(const Id &id) const
int GetNearestLaneWithDistance(const apollo::common::PointENU &point, const double distance, LaneInfoConstPtr *nearest_lane, double *nearest_s, double *nearest_l) const
get nearest lane from target point with search radius,
CrosswalkInfoConstPtr GetCrosswalkById(const Id &id) const
ClearAreaInfoConstPtr GetClearAreaById(const Id &id) const
int GetRoads(const apollo::common::PointENU &point, double distance, std::vector< RoadInfoConstPtr > *roads) const
get all roads in certain range
SignalInfoConstPtr GetSignalById(const Id &id) const
int GetPNCJunctions(const apollo::common::PointENU &point, double distance, std::vector< PNCJunctionInfoConstPtr > *pnc_junctions) const
get all pnc junctions in certain range
int GetForwardNearestRSUs(const apollo::common::PointENU &point, double distance, double central_heading, double max_heading_difference, std::vector< RSUInfoConstPtr > *rsus) const
get forward nearest rsus within certain range
int GetSignals(const apollo::common::PointENU &point, double distance, std::vector< SignalInfoConstPtr > *signals) const
get all signals in certain range
YieldSignInfoConstPtr GetYieldSignById(const Id &id) const
int GetCrosswalks(const apollo::common::PointENU &point, double distance, std::vector< CrosswalkInfoConstPtr > *crosswalks) const
get all crosswalks in certain range
int GetLocalMap(const apollo::common::PointENU &point, const std::pair< double, double > &range, Map *local_map) const
get a local map which is identical to the origin map except that all map elements without overlap wit...
int GetClearAreas(const apollo::common::PointENU &point, double distance, std::vector< ClearAreaInfoConstPtr > *clear_areas) const
get all clear areas in certain range
int GetRoi(const apollo::common::PointENU &point, double radius, std::vector< RoadRoiPtr > *roads_roi, std::vector< PolygonRoiPtr > *polygons_roi)
get ROI within certain range
PNCJunctionInfoConstPtr GetPNCJunctionById(const Id &id) const
int GetForwardNearestBarriersOnLane(const apollo::common::PointENU &point, const double distance, std::vector< BarrierGateInfoConstPtr > *barrier_gates) const
get forward nearest barrier_gates within certain range on the lane
RoadInfoConstPtr GetRoadById(const Id &id) const
int GetYieldSigns(const apollo::common::PointENU &point, double distance, std::vector< YieldSignInfoConstPtr > *yield_signs) const
get all yield signs in certain range
LaneInfoConstPtr GetLaneById(const Id &id) const
BarrierGateInfoConstPtr GetBarrierGateById(const Id &id) const
bool GetMapHeader(Header *map_header) const
RSUInfoConstPtr GetRSUById(const Id &id) const
int GetParkingSpaces(const apollo::common::PointENU &point, double distance, std::vector< ParkingSpaceInfoConstPtr > *parking_spaces) const
get all parking space in certain range
int GetSpeedBumps(const apollo::common::PointENU &point, double distance, std::vector< SpeedBumpInfoConstPtr > *speed_bumps) const
get all speed bumps in certain range
int LoadMapFromFile(const std::string &map_filename)
load map from local file
int GetForwardNearestSignalsOnLane(const apollo::common::PointENU &point, const double distance, std::vector< SignalInfoConstPtr > *signals) const
get forward nearest signals within certain range on the lane if there are two signals related to one ...
SpeedBumpInfoConstPtr GetSpeedBumpById(const Id &id) const
int GetStopSignAssociatedLanes(const Id &id, std::vector< LaneInfoConstPtr > *lanes) const
get all lanes associated with a stop sign in the same junction
int GetLanes(const apollo::common::PointENU &point, double distance, std::vector< LaneInfoConstPtr > *lanes) const
get all lanes in certain range
static bool LoadData(const std::string &filename, apollo::hdmap::Map *pb_map)
#define UNIQUE_LOCK_MULTITHREAD(mutex_type)
double NormalizeAngle(const double angle)
Normalize angle to [-PI, PI).
bool GetProtoFromFile(const std::string &file_name, google::protobuf::Message *message)
Parses the content of the file specified by the file_name as a representation of protobufs,...
std::shared_ptr< const PNCJunctionInfo > PNCJunctionInfoConstPtr
std::shared_ptr< const JunctionInfo > JunctionInfoConstPtr
std::shared_ptr< RoadROIBoundary > RoadROIBoundaryPtr
std::shared_ptr< const StopSignInfo > StopSignInfoConstPtr
std::shared_ptr< const AreaInfo > AreaInfoConstPtr
std::shared_ptr< const LaneInfo > LaneInfoConstPtr
std::shared_ptr< const ClearAreaInfo > ClearAreaInfoConstPtr
std::shared_ptr< const BarrierGateInfo > BarrierGateInfoConstPtr
std::shared_ptr< const SignalInfo > SignalInfoConstPtr
std::shared_ptr< const SpeedBumpInfo > SpeedBumpInfoConstPtr
std::shared_ptr< const RoadInfo > RoadInfoConstPtr
std::shared_ptr< const CrosswalkInfo > CrosswalkInfoConstPtr
std::shared_ptr< const RSUInfo > RSUInfoConstPtr
std::shared_ptr< JunctionBoundary > JunctionBoundaryPtr
std::shared_ptr< const YieldSignInfo > YieldSignInfoConstPtr
std::shared_ptr< const ParkingSpaceInfo > ParkingSpaceInfoConstPtr
std::shared_ptr< PolygonRoi > PolygonRoiPtr
std::shared_ptr< RoadRoi > RoadRoiPtr
std::shared_ptr< const OverlapInfo > OverlapInfoConstPtr
Contains parameters of axis-aligned bounding box.
repeated BoundaryEdge edge
repeated Junction junction
repeated StopSign stop_sign
repeated Crosswalk crosswalk
repeated ParkingSpace parking_space
repeated SpeedBump speed_bump
repeated BarrierGate barrier_gate
repeated PNCJunction pnc_junction
repeated ClearArea clear_area
std::vector< apollo::common::PointENU > polygon_points