Apollo 9.0
自动驾驶开放平台
map_service.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2017 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 <algorithm>
20#include <fstream>
21#include <utility>
22
26
27namespace apollo {
28namespace dreamview {
29
48using google::protobuf::RepeatedPtrField;
49
50namespace {
51
52template <typename MapElementInfoConstPtr>
53void ExtractIds(const std::vector<MapElementInfoConstPtr> &items,
54 RepeatedPtrField<std::string> *ids) {
55 ids->Reserve(static_cast<unsigned int>(items.size()));
56 for (const auto &item : items) {
57 ids->Add()->assign(item->id().id());
58 }
59 // The output is sorted so that the calculated hash will be
60 // invariant to the order of elements.
61 std::sort(ids->begin(), ids->end());
62}
63
64void ExtractRoadAndLaneIds(const std::vector<LaneInfoConstPtr> &lanes,
65 RepeatedPtrField<std::string> *lane_ids,
66 RepeatedPtrField<std::string> *road_ids) {
67 lane_ids->Reserve(static_cast<unsigned int>(lanes.size()));
68 road_ids->Reserve(static_cast<unsigned int>(lanes.size()));
69
70 for (const auto &lane : lanes) {
71 lane_ids->Add()->assign(lane->id().id());
72 if (!lane->road_id().id().empty()) {
73 road_ids->Add()->assign(lane->road_id().id());
74 }
75 }
76 // The output is sorted so that the calculated hash will be
77 // invariant to the order of elements.
78 std::sort(lane_ids->begin(), lane_ids->end());
79 std::sort(road_ids->begin(), road_ids->end());
80}
81
82} // namespace
83
84const char MapService::kMetaFileName[] = "/metaInfo.json";
85
86MapService::MapService(bool use_sim_map) : use_sim_map_(use_sim_map) {
87 ReloadMap(false);
88}
89
90bool MapService::ReloadMap(bool force_reload) {
91 boost::unique_lock<boost::shared_mutex> writer_lock(mutex_);
92 bool ret = true;
93 if (force_reload) {
95 }
96
97 // Update the x,y-offsets if present.
98 // UpdateOffsets();
99 return ret;
100}
101
102void MapService::UpdateOffsets() {
103 x_offset_ = 0.0;
104 y_offset_ = 0.0;
105 std::ifstream ifs(FLAGS_map_dir + kMetaFileName);
106 if (!ifs.is_open()) {
107 AINFO << "Failed to open map meta file: " << kMetaFileName;
108 } else {
109 nlohmann::json json;
110 ifs >> json;
111 ifs.close();
112
113 for (auto it = json.begin(); it != json.end(); ++it) {
114 auto val = it.value();
115 if (val.is_object()) {
116 auto x_offset = val.find("xoffset");
117 if (x_offset == val.end()) {
118 AWARN << "Cannot find x_offset for this map " << it.key();
119 continue;
120 }
121
122 if (!x_offset->is_number()) {
123 AWARN << "Expect x_offset with type 'number', but was "
124 << x_offset->type_name();
125 continue;
126 }
127 x_offset_ = x_offset.value();
128
129 auto y_offset = val.find("yoffset");
130 if (y_offset == val.end()) {
131 AWARN << "Cannot find y_offset for this map " << it.key();
132 continue;
133 }
134
135 if (!y_offset->is_number()) {
136 AWARN << "Expect y_offset with type 'number', but was "
137 << y_offset->type_name();
138 continue;
139 }
140 y_offset_ = y_offset.value();
141 }
142 }
143 }
144 AINFO << "Updated with map: x_offset " << x_offset_ << ", y_offset "
145 << y_offset_;
146}
147
148const hdmap::HDMap *MapService::HDMap() const {
149 return HDMapUtil::BaseMapPtr();
150}
151
152const hdmap::HDMap *MapService::SimMap() const {
153 return use_sim_map_ ? HDMapUtil::SimMapPtr() : HDMapUtil::BaseMapPtr();
154}
155
156bool MapService::MapReady() const { return HDMap() && SimMap(); }
157
158bool MapService::PointIsValid(const double x, const double y) const {
159 MapElementIds ids;
160 PointENU point;
161 point.set_x(x);
162 point.set_y(y);
163 CollectMapElementIds(point, 20, &ids);
164 return (ids.ByteSizeLong() != 0);
165}
166
167void MapService::CollectMapElementIds(const PointENU &point, double radius,
168 MapElementIds *ids) const {
169 if (!MapReady()) {
170 return;
171 }
172 boost::shared_lock<boost::shared_mutex> reader_lock(mutex_);
173
174 std::vector<LaneInfoConstPtr> lanes;
175 if (SimMap()->GetLanes(point, radius, &lanes) != 0) {
176 AERROR << "Fail to get lanes from sim_map.";
177 }
178 ExtractRoadAndLaneIds(lanes, ids->mutable_lane(), ids->mutable_road());
179
180 std::vector<ClearAreaInfoConstPtr> clear_areas;
181 if (SimMap()->GetClearAreas(point, radius, &clear_areas) != 0) {
182 AERROR << "Fail to get clear areas from sim_map.";
183 }
184 ExtractIds(clear_areas, ids->mutable_clear_area());
185
186 std::vector<CrosswalkInfoConstPtr> crosswalks;
187 if (SimMap()->GetCrosswalks(point, radius, &crosswalks) != 0) {
188 AERROR << "Fail to get crosswalks from sim_map.";
189 }
190 ExtractIds(crosswalks, ids->mutable_crosswalk());
191
192 std::vector<JunctionInfoConstPtr> junctions;
193 if (SimMap()->GetJunctions(point, radius, &junctions) != 0) {
194 AERROR << "Fail to get junctions from sim_map.";
195 }
196 ExtractIds(junctions, ids->mutable_junction());
197
198 std::vector<PNCJunctionInfoConstPtr> pnc_junctions;
199 if (SimMap()->GetPNCJunctions(point, radius, &pnc_junctions) != 0) {
200 AERROR << "Fail to get pnc junctions from sim_map.";
201 }
202 ExtractIds(pnc_junctions, ids->mutable_pnc_junction());
203
204 std::vector<ParkingSpaceInfoConstPtr> parking_spaces;
205 if (SimMap()->GetParkingSpaces(point, radius, &parking_spaces) != 0) {
206 AERROR << "Fail to get parking space from sim_map.";
207 }
208 ExtractIds(parking_spaces, ids->mutable_parking_space());
209
210 std::vector<SpeedBumpInfoConstPtr> speed_bumps;
211 if (SimMap()->GetSpeedBumps(point, radius, &speed_bumps) != 0) {
212 AERROR << "Fail to get speed bump from sim_map.";
213 }
214 ExtractIds(speed_bumps, ids->mutable_speed_bump());
215
216 std::vector<SignalInfoConstPtr> signals;
217 if (SimMap()->GetSignals(point, radius, &signals) != 0) {
218 AERROR << "Failed to get signals from sim_map.";
219 }
220
221 ExtractIds(signals, ids->mutable_signal());
222
223 std::vector<StopSignInfoConstPtr> stop_signs;
224 if (SimMap()->GetStopSigns(point, radius, &stop_signs) != 0) {
225 AERROR << "Failed to get stop signs from sim_map.";
226 }
227 ExtractIds(stop_signs, ids->mutable_stop_sign());
228
229 std::vector<YieldSignInfoConstPtr> yield_signs;
230 if (SimMap()->GetYieldSigns(point, radius, &yield_signs) != 0) {
231 AERROR << "Failed to get yield signs from sim_map.";
232 }
233 ExtractIds(yield_signs, ids->mutable_yield());
234}
235
237 boost::shared_lock<boost::shared_mutex> reader_lock(mutex_);
238
239 Map result;
240 if (!MapReady()) {
241 return result;
242 }
243 Id map_id;
244
245 for (const auto &id : ids.lane()) {
246 map_id.set_id(id);
247 auto element = SimMap()->GetLaneById(map_id);
248 if (element) {
249 auto lane = element->lane();
250 lane.clear_left_sample();
251 lane.clear_right_sample();
252 lane.clear_left_road_sample();
253 lane.clear_right_road_sample();
254 *result.add_lane() = lane;
255 }
256 }
257
258 for (const auto &id : ids.clear_area()) {
259 map_id.set_id(id);
260 auto element = SimMap()->GetClearAreaById(map_id);
261 if (element) {
262 *result.add_clear_area() = element->clear_area();
263 }
264 }
265
266 for (const auto &id : ids.crosswalk()) {
267 map_id.set_id(id);
268 auto element = SimMap()->GetCrosswalkById(map_id);
269 if (element) {
270 *result.add_crosswalk() = element->crosswalk();
271 }
272 }
273
274 for (const auto &id : ids.junction()) {
275 map_id.set_id(id);
276 auto element = SimMap()->GetJunctionById(map_id);
277 if (element) {
278 *result.add_junction() = element->junction();
279 }
280 }
281
282 for (const auto &id : ids.signal()) {
283 map_id.set_id(id);
284 auto element = SimMap()->GetSignalById(map_id);
285 if (element) {
286 *result.add_signal() = element->signal();
287 }
288 }
289
290 for (const auto &id : ids.stop_sign()) {
291 map_id.set_id(id);
292 auto element = SimMap()->GetStopSignById(map_id);
293 if (element) {
294 *result.add_stop_sign() = element->stop_sign();
295 }
296 }
297
298 for (const auto &id : ids.yield()) {
299 map_id.set_id(id);
300 auto element = SimMap()->GetYieldSignById(map_id);
301 if (element) {
302 *result.add_yield() = element->yield_sign();
303 }
304 }
305
306 for (const auto &id : ids.road()) {
307 map_id.set_id(id);
308 auto element = SimMap()->GetRoadById(map_id);
309 if (element) {
310 *result.add_road() = element->road();
311 }
312 }
313
314 for (const auto &id : ids.parking_space()) {
315 map_id.set_id(id);
316 auto element = SimMap()->GetParkingSpaceById(map_id);
317 if (element) {
318 *result.add_parking_space() = element->parking_space();
319 }
320 }
321
322 for (const auto &id : ids.speed_bump()) {
323 map_id.set_id(id);
324 auto element = SimMap()->GetSpeedBumpById(map_id);
325 if (element) {
326 *result.add_speed_bump() = element->speed_bump();
327 }
328 }
329
330 for (const auto &id : ids.pnc_junction()) {
331 map_id.set_id(id);
332 auto element = SimMap()->GetPNCJunctionById(map_id);
333 if (element) {
334 *result.add_pnc_junction() = element->pnc_junction();
335 }
336 }
337 apollo::hdmap::Header map_header;
338 if (SimMap()->GetMapHeader(&map_header)) {
339 result.mutable_header()->CopyFrom(map_header);
340 }
341
342 return result;
343}
344
345bool MapService::GetNearestLaneWithDistance(
346 const double x, const double y,
347 apollo::hdmap::LaneInfoConstPtr *nearest_lane, double *nearest_s,
348 double *nearest_l) const {
349 boost::shared_lock<boost::shared_mutex> reader_lock(mutex_);
350
351 PointENU point;
352 point.set_x(x);
353 point.set_y(y);
354 static constexpr double kSearchRadius = 3.0;
355 if (!MapReady() ||
356 HDMap()->GetNearestLaneWithDistance(point, kSearchRadius, nearest_lane,
357 nearest_s, nearest_l) < 0) {
358 AERROR << "Failed to get nearest lane!";
359 return false;
360 }
361 return true;
362}
363
364bool MapService::GetNearestLane(const double x, const double y,
365 LaneInfoConstPtr *nearest_lane,
366 double *nearest_s, double *nearest_l) const {
367 boost::shared_lock<boost::shared_mutex> reader_lock(mutex_);
368
369 PointENU point;
370 point.set_x(x);
371 point.set_y(y);
372 if (!MapReady() ||
373 HDMap()->GetNearestLane(point, nearest_lane, nearest_s, nearest_l) < 0) {
374 AERROR << "Failed to get nearest lane!";
375 return false;
376 }
377 return true;
378}
379
380bool MapService::GetNearestLaneWithHeading(const double x, const double y,
381 LaneInfoConstPtr *nearest_lane,
382 double *nearest_s, double *nearest_l,
383 const double heading) const {
384 boost::shared_lock<boost::shared_mutex> reader_lock(mutex_);
385
386 PointENU point;
387 point.set_x(x);
388 point.set_y(y);
389 static constexpr double kSearchRadius = 3.0;
390 static constexpr double kMaxHeadingDiff = 1.0;
391 if (!MapReady() || HDMap()->GetNearestLaneWithHeading(
392 point, kSearchRadius, heading, kMaxHeadingDiff,
393 nearest_lane, nearest_s, nearest_l) < 0) {
394 AERROR << "Failed to get nearest lane with heading.";
395 return false;
396 }
397 return true;
398}
399
401 std::vector<Path> *paths) const {
402 if (!CreatePathsFromRouting(routing, paths)) {
403 AERROR << "Unable to get paths from routing!";
404 return false;
405 }
406 return true;
407}
408
409bool MapService::GetPoseWithRegardToLane(const double x, const double y,
410 double *theta, double *s) const {
411 double l;
412 LaneInfoConstPtr nearest_lane;
413 if (!GetNearestLane(x, y, &nearest_lane, s, &l)) {
414 return false;
415 }
416
417 *theta = nearest_lane->Heading(*s);
418 return true;
419}
420
422 const double x, const double y, routing::LaneWaypoint *laneWayPoint) const {
423 double s, l;
424 LaneInfoConstPtr lane;
425 if (!GetNearestLane(x, y, &lane, &s, &l)) {
426 return false;
427 }
428
429 if (!CheckRoutingPointLaneType(lane)) {
430 return false;
431 }
432
433 laneWayPoint->set_id(lane->id().id());
434 laneWayPoint->set_s(s);
435 auto *pose = laneWayPoint->mutable_pose();
436 pose->set_x(x);
437 pose->set_y(y);
438
439 return true;
440}
441
443 const double x, const double y, const double heading,
444 routing::LaneWaypoint *laneWayPoint) const {
445 double s, l;
446 LaneInfoConstPtr lane;
447 if (!GetNearestLaneWithHeading(x, y, &lane, &s, &l, heading)) {
448 return false;
449 }
450
451 if (!CheckRoutingPointLaneType(lane)) {
452 return false;
453 }
454
455 laneWayPoint->set_id(lane->id().id());
456 laneWayPoint->set_s(s);
457 auto *pose = laneWayPoint->mutable_pose();
458 pose->set_x(x);
459 pose->set_y(y);
460
461 return true;
462}
463
465 const double x, const double y, const std::string id,
466 routing::LaneWaypoint *laneWayPoint) const {
467 LaneInfoConstPtr lane = HDMap()->GetLaneById(hdmap::MakeMapId(id));
468 if (!lane) {
469 return false;
470 }
471
472 if (!CheckRoutingPointLaneType(lane)) {
473 return false;
474 }
475
476 double s, l;
477 PointENU point;
478 point.set_x(x);
479 point.set_y(y);
480
481 if (!lane->GetProjection({point.x(), point.y()}, &s, &l)) {
482 return false;
483 }
484
485 // Limit s with max value of the length of the lane, or not the laneWayPoint
486 // may be invalid.
487 if (s > lane->lane().length()) {
488 s = lane->lane().length();
489 }
490
491 laneWayPoint->set_id(id);
492 laneWayPoint->set_s(s);
493 auto *pose = laneWayPoint->mutable_pose();
494 pose->set_x(x);
495 pose->set_y(y);
496
497 return true;
498}
499
500bool MapService::CheckRoutingPoint(const double x, const double y) const {
501 double s, l;
502 LaneInfoConstPtr lane;
503 if (!GetNearestLaneWithDistance(x, y, &lane, &s, &l)) {
504 if (GetParkingSpaceId(x, y) != "-1") {
505 return true;
506 }
507 return false;
508 }
509 if (!CheckRoutingPointLaneType(lane)) {
510 return false;
511 }
512 return true;
513}
514
515bool MapService::CheckRoutingPointWithHeading(const double x, const double y,
516 const double heading) const {
517 double s, l;
518 LaneInfoConstPtr lane;
519 if (!GetNearestLaneWithHeading(x, y, &lane, &s, &l, heading)) {
520 if (GetParkingSpaceId(x, y) != "-1") {
521 return true;
522 }
523 return false;
524 }
525 if (!CheckRoutingPointLaneType(lane)) {
526 return false;
527 }
528 return true;
529}
530
531bool MapService::CheckRoutingPointLaneType(LaneInfoConstPtr lane) const {
532 if (lane->lane().type() != Lane::CITY_DRIVING) {
533 AERROR
534 << "Failed to construct LaneWayPoint for RoutingRequest: Expected lane "
535 << lane->id().id() << " to be CITY_DRIVING, but was "
536 << apollo::hdmap::Lane::LaneType_Name(lane->lane().type());
537 return false;
538 }
539 return true;
540}
541
543 // Start from origin to find a lane from the map.
544 double s, l;
545 LaneInfoConstPtr lane;
546 if (!GetNearestLane(0.0, 0.0, &lane, &s, &l)) {
547 return false;
548 }
549
550 *start_point = lane->GetSmoothPoint(0.0);
551 return true;
552}
553
554bool MapService::CreatePathsFromRouting(const RoutingResponse &routing,
555 std::vector<Path> *paths) const {
556 if (routing.road().empty()) {
557 return false;
558 }
559
560 for (const auto &road : routing.road()) {
561 for (const auto &passage_region : road.passage()) {
562 // Each passage region in a road forms a path
563 if (!AddPathFromPassageRegion(passage_region, paths)) {
564 return false;
565 }
566 }
567 }
568 return true;
569}
570
571bool MapService::AddPathFromPassageRegion(
572 const routing::Passage &passage_region, std::vector<Path> *paths) const {
573 if (!MapReady()) {
574 return false;
575 }
576 boost::shared_lock<boost::shared_mutex> reader_lock(mutex_);
577
578 std::vector<MapPathPoint> path_points;
579 for (const auto &segment : passage_region.segment()) {
580 auto lane_ptr = HDMap()->GetLaneById(hdmap::MakeMapId(segment.id()));
581 if (!lane_ptr) {
582 AERROR << "Failed to find lane: " << segment.id();
583 return false;
584 }
585 if (segment.start_s() >= segment.end_s()) {
586 continue;
587 }
588 auto points = MapPathPoint::GetPointsFromLane(lane_ptr, segment.start_s(),
589 segment.end_s());
590 path_points.insert(path_points.end(), points.begin(), points.end());
591 }
592
593 if (path_points.size() < 2) {
594 return false;
595 }
596 paths->emplace_back(Path(std::move(path_points)));
597
598 return true;
599}
600
602 static std::hash<std::string> hash_function;
603 return hash_function(ids.DebugString());
604}
605
606double MapService::GetLaneHeading(const std::string &id_str, double s) {
607 auto *hdmap = HDMap();
608 CHECK(hdmap) << "Failed to get hdmap";
609
610 Id id;
611 id.set_id(id_str);
612 LaneInfoConstPtr lane_ptr = hdmap->GetLaneById(id);
613 if (lane_ptr != nullptr) {
614 return lane_ptr->Heading(s);
615 }
616 return 0.0;
617}
618
619std::string MapService::GetParkingSpaceId(const double x,
620 const double y) const {
621 PointENU point;
622 point.set_x(x);
623 point.set_y(y);
624 static constexpr double kSearchRadius = 3.0;
625 std::vector<ParkingSpaceInfoConstPtr> parking_spaces;
626
627 // Find parking spaces nearby
628 if (HDMap()->GetParkingSpaces(point, kSearchRadius, &parking_spaces) != 0) {
629 AERROR << "Fail to get parking space from sim_map.";
630 return "-1";
631 }
632
633 // Determine whether the point is in a neighboring parking space
634 for (const auto &parking_sapce : parking_spaces) {
635 if (!parking_sapce->polygon().is_convex()) {
636 AERROR << "The parking space information is incorrect and is not a "
637 "convex hull.";
638 return "-1";
639 }
640 apollo::common::math::Vec2d checked_point(x, y);
641 if (parking_sapce->polygon().IsPointIn(checked_point)) {
642 return parking_sapce->id().id();
643 }
644 }
645 return "-1";
646}
647
648} // namespace dreamview
649} // namespace apollo
Implements a class of 2-dimensional vectors.
Definition vec2d.h:42
bool CheckRoutingPoint(const double x, const double y) const
bool CheckRoutingPointWithHeading(const double x, const double y, const double heading) const
bool PointIsValid(const double x, const double y) const
double GetLaneHeading(const std::string &id_str, double s)
void CollectMapElementIds(const apollo::common::PointENU &point, double raidus, MapElementIds *ids) const
hdmap::Map RetrieveMapElements(const MapElementIds &ids) const
bool ReloadMap(bool force_reload)
MapService(bool use_sim_map=true)
bool GetStartPoint(apollo::common::PointENU *start_point) const
bool ConstructLaneWayPointWithLaneId(const double x, const double y, const std::string id, routing::LaneWaypoint *laneWayPoint) const
bool ConstructLaneWayPointWithHeading(const double x, const double y, const double heading, routing::LaneWaypoint *laneWayPoint) const
bool CheckRoutingPointLaneType(apollo::hdmap::LaneInfoConstPtr lane) const
bool GetPoseWithRegardToLane(const double x, const double y, double *theta, double *s) const
size_t CalculateMapHash(const MapElementIds &ids) const
bool GetPathsFromRouting(const apollo::routing::RoutingResponse &routing, std::vector< apollo::hdmap::Path > *paths) const
bool ConstructLaneWayPoint(const double x, const double y, routing::LaneWaypoint *laneWayPoint) const
The function fills out proper routing lane waypoint from the given (x,y) position.
std::string GetParkingSpaceId(const double x, const double y) const
static const HDMap * BaseMapPtr()
static const HDMap * SimMapPtr()
StopSignInfoConstPtr GetStopSignById(const Id &id) const
Definition hdmap.cc:58
PNCJunctionInfoConstPtr GetPNCJunctionById(const Id &id) const
Definition hdmap.cc:86
YieldSignInfoConstPtr GetYieldSignById(const Id &id) const
Definition hdmap.cc:62
ClearAreaInfoConstPtr GetClearAreaById(const Id &id) const
Definition hdmap.cc:66
LaneInfoConstPtr GetLaneById(const Id &id) const
Definition hdmap.cc:34
RoadInfoConstPtr GetRoadById(const Id &id) const
Definition hdmap.cc:78
JunctionInfoConstPtr GetJunctionById(const Id &id) const
Definition hdmap.cc:38
ParkingSpaceInfoConstPtr GetParkingSpaceById(const Id &id) const
Definition hdmap.cc:82
CrosswalkInfoConstPtr GetCrosswalkById(const Id &id) const
Definition hdmap.cc:54
SignalInfoConstPtr GetSignalById(const Id &id) const
Definition hdmap.cc:46
SpeedBumpInfoConstPtr GetSpeedBumpById(const Id &id) const
Definition hdmap.cc:70
static std::vector< MapPathPoint > GetPointsFromLane(LaneInfoConstPtr lane, const double start_s, const double end_s)
Definition path.cc:206
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
#define AWARN
Definition log.h:43
std::shared_ptr< const PNCJunctionInfo > PNCJunctionInfoConstPtr
std::shared_ptr< const JunctionInfo > JunctionInfoConstPtr
apollo::hdmap::Id MakeMapId(const std::string &id)
create a Map ID given a string.
Definition hdmap_util.h:85
std::shared_ptr< const StopSignInfo > StopSignInfoConstPtr
std::shared_ptr< const LaneInfo > LaneInfoConstPtr
std::shared_ptr< const ClearAreaInfo > ClearAreaInfoConstPtr
std::shared_ptr< const SignalInfo > SignalInfoConstPtr
std::shared_ptr< const SpeedBumpInfo > SpeedBumpInfoConstPtr
std::shared_ptr< const CrosswalkInfo > CrosswalkInfoConstPtr
std::shared_ptr< const YieldSignInfo > YieldSignInfoConstPtr
std::shared_ptr< const ParkingSpaceInfo > ParkingSpaceInfoConstPtr
class register implement
Some string util functions.
repeated Signal signal
Definition map.proto:51
repeated Junction junction
Definition map.proto:48
repeated StopSign stop_sign
Definition map.proto:50
repeated Crosswalk crosswalk
Definition map.proto:47
repeated ParkingSpace parking_space
Definition map.proto:57
repeated SpeedBump speed_bump
Definition map.proto:55
repeated PNCJunction pnc_junction
Definition map.proto:58
repeated ClearArea clear_area
Definition map.proto:54
repeated Road road
Definition map.proto:56
repeated apollo::routing::RoadSegment road
Definition routing.proto:25