47 auto elevation_profile_nodes = road_node.children(
"elevationProfile");
50 for (
pugi::xml_node elevation_profile_node : elevation_profile_nodes) {
52 auto total_elevations = 0;
54 auto elevation_nodes = elevation_profile_node.children(
"elevation");
56 auto total_elevation_parser = std::distance(elevation_nodes.begin(), elevation_nodes.end());
61 float s = elevation_node.attribute(
"s").as_float();
63 const auto elevation = map->GetMap().GetRoad(road_id).GetInfo<
RoadInfoElevation>(s);
64 if (elevation !=
nullptr)
67 ASSERT_EQ(total_elevations, total_elevation_parser);
79 for (
pugi::xml_node plan_view_nodes : road_node.children(
"planView")) {
80 auto geometries_parser = plan_view_nodes.children(
"geometry");
81 auto total_geometries_parser = std::distance(geometries_parser.begin(), geometries_parser.end());
82 auto total_geometries = 0;
83 for (
pugi::xml_node geometry_node : plan_view_nodes.children(
"geometry")){
84 float s = geometry_node.attribute(
"s").as_float();
86 if (geometry !=
nullptr)
89 ASSERT_EQ(total_geometries, total_geometries_parser);
111 constexpr auto error = 1e-5;
113 auto total_road_mark = 0;
115 auto total_road_mark_parser = 0;
119 auto road_mark_nodes = lane_node.children(
"roadMark");
121 total_road_mark_parser += std::distance(road_mark_nodes.begin(), road_mark_nodes.end());
123 const int lane_id = lane_node.attribute(
"id").as_int();
124 Lane* lane =
nullptr;
126 lane = lane_section.
GetLane(lane_id);
128 EXPECT_NE(lane,
nullptr);
132 const auto s_offset = road_mark_node.attribute(
"sOffset").as_double();
133 const auto type = road_mark_node.attribute(
"type").as_string();
134 const auto material = road_mark_node.attribute(
"material").as_string();
135 const auto color = road_mark_node.attribute(
"color").as_string();
138 if (road_mark !=
nullptr) {
139 EXPECT_NEAR(lane->
GetDistance() + s_offset, road_mark->GetDistance(), error);
140 EXPECT_EQ(type, road_mark->GetType());
141 EXPECT_EQ(material, road_mark->GetMaterial());
142 EXPECT_EQ(color, road_mark->GetColor());
147 return std::make_pair(total_road_mark, total_road_mark_parser);
156 auto roads_parser = open_drive_node.
children(
"road");
157 auto total_roads_parser = std::distance(roads_parser.begin(), roads_parser.end());
158 auto total_roads = map->GetMap().GetRoads().size();
159 ASSERT_EQ(total_roads, total_roads_parser);
162 RoadId road_id = road_node.attribute(
"id").as_uint();
167 auto lane_sections_parser = lanes_node.children(
"laneSection");
168 auto total_lane_sections_parser = std::distance(lane_sections_parser.begin(), lane_sections_parser.end());
169 auto total_lane_sections = map->GetMap().GetRoad(road_id).GetLaneSections().size();
170 ASSERT_EQ(total_lane_sections, total_lane_sections_parser);
175 const double s = lane_section_node.attribute(
"s").as_double();
176 auto lane_section = map->GetMap().GetRoad(road_id).GetLaneSectionsAt(s);
177 size_t total_lanes = 0u;
179 for (
auto it = lane_section.begin(); it != lane_section.end(); ++it) {
180 total_lanes = it->GetLanes().size();
183 auto left_nodes = lane_section_node.child(
"left").children(
"lane");
184 auto center_nodes = lane_section_node.child(
"center").children(
"lane");
185 auto right_nodes = lane_section_node.child(
"right").children(
"lane");
186 auto total_lanes_parser = std::distance(left_nodes.begin(), left_nodes.end());
187 total_lanes_parser += std::distance(right_nodes.begin(), right_nodes.end());
188 total_lanes_parser += std::distance(center_nodes.begin(), center_nodes.end());
190 ASSERT_EQ(total_lanes, total_lanes_parser);
193 auto total_road_mark = 0;
194 auto total_road_mark_parser = 0;
196 for (
auto it = lane_section.begin(); it != lane_section.end(); ++it) {
201 total_road_mark = total_left.first + total_center.first + total_right.first;
202 total_road_mark_parser = total_left.first + total_center.first + total_right.first;
204 ASSERT_EQ(total_road_mark, total_road_mark_parser);
215 auto& junctions = map->GetMap().GetJunctions();
217 auto total_junctions_parser = std::distance(open_drive_node.
children(
"junction").begin(), open_drive_node.
children(
"junction").end());
219 ASSERT_EQ(junctions.size(), total_junctions_parser);
223 auto total_connections_parser = std::distance(junction_node.children(
"connection").begin(), junction_node.children(
"connection").end());
225 JuncId junction_id = junction_node.attribute(
"id").as_int();
226 auto& junction = junctions.find(junction_id)->second;
228 auto& connections = junction.GetConnections();
230 ASSERT_EQ(connections.size(), total_connections_parser);
232 for (
pugi::xml_node connection_node : junction_node.children(
"connection")) {
234 auto total_lane_links_parser = std::distance(connection_node.children(
"laneLink").begin(), connection_node.children(
"laneLink").end());
236 ConId connection_id = connection_node.attribute(
"id").as_uint();
238 auto& connection = connections.find(connection_id)->second;
240 auto& lane_links = connection.lane_links;
242 ASSERT_EQ(lane_links.size(), total_lane_links_parser);
251 for (
auto &road : map->GetMap().GetRoads()) {
253 for (
auto §ion : road.second.GetLaneSections()) {
255 for (
auto &lane : section.GetLanes()) {
257 for (
auto link : lane.second.GetNextLanes()) {
258 ASSERT_TRUE(link !=
nullptr);
261 for (
auto link : lane.second.GetPreviousLanes()) {
262 ASSERT_TRUE(link !=
nullptr);
355 std::vector<std::future<void>> results;
360 results.push_back(pool.
Post([file]() {
361 carla::StopWatch stop_watch;
362 auto m = OpenDriveParser::Load(util::OpenDrive::Load(file));
363 ASSERT_TRUE(m.has_value());
366 const auto topology = map.GenerateTopology();
367 ASSERT_FALSE(topology.empty());
370 auto waypoints = map.GenerateWaypoints(0.5);
371 ASSERT_FALSE(waypoints.empty());
373 Random::Shuffle(waypoints);
375 const auto number_of_waypoints_to_explore =
376 std::min<size_t>(2000u, waypoints.size());
378 for (auto i = 0u; i < number_of_waypoints_to_explore; ++i) {
379 auto wp = waypoints[i];
381 map.ComputeTransform(wp);
384 ASSERT_NE(wp, waypoints[0u]);
387 for (auto &&successor : map.GetSuccessors(wp)) {
389 successor.road_id != wp.road_id ||
390 successor.section_id != wp.section_id ||
391 successor.lane_id != wp.lane_id ||
392 successor.s != wp.s);
396 for (auto j = 0u; j < 200u; ++j) {
398 auto next_wps = map.GetNext(origin, Random::Uniform(0.0001, 150.0));
399 if (next_wps.empty()) {
403 const auto number_of_next_wps_to_explore =
404 std::min<size_t>(10u, next_wps.size());
406 Random::Shuffle(next_wps);
408 for (auto k = 0u; k < number_of_next_wps_to_explore; ++k) {
409 auto next = next_wps[k];
413 next.road_id != wp.road_id ||
414 next.section_id != wp.section_id ||
415 next.lane_id != wp.lane_id ||
418 auto right = map.GetRight(next);
419 if (right.has_value()) {
420 ASSERT_EQ(right->road_id, next.road_id);
421 ASSERT_EQ(right->section_id, next.section_id);
422 ASSERT_NE(right->lane_id, next.lane_id);
423 ASSERT_EQ(right->s, next.s);
426 auto left = map.GetLeft(next);
427 if (left.has_value()) {
429 ASSERT_EQ(left->road_id, next.road_id);
430 ASSERT_EQ(left->section_id, next.section_id);
431 ASSERT_NE(left->lane_id, next.lane_id);
432 ASSERT_EQ(left->s, next.s);
435 origin = next_wps[0u];
438 ASSERT_GT(count, 0u);
439 float seconds = 1e-3f * stop_watch.GetElapsedTime();
444 for (
auto &result : results) {
455 std::vector<std::future<void>> results;
459 results.push_back(pool.
Post([file]() {
461 carla::StopWatch stop_watch;
463 auto m = OpenDriveParser::Load(util::OpenDrive::Load(file));
464 ASSERT_TRUE(m.has_value());
467 for (auto i = 0u; i < 10'000u; ++i) {
468 const auto location = Random::Location(-500.0f, 500.0f);
469 auto owp = map.GetClosestWaypointOnRoad(location);
470 ASSERT_TRUE(owp.has_value());
473 for (auto &next : map.GetNext(wp, 0.5)) {
475 next.road_id != wp.road_id ||
476 next.section_id != wp.section_id ||
477 next.lane_id != wp.lane_id ||
481 auto left = map.GetLeft(wp);
482 if (left.has_value()) {
483 ASSERT_EQ(left->road_id, wp.road_id);
484 ASSERT_EQ(left->section_id, wp.section_id);
485 ASSERT_NE(left->lane_id, wp.lane_id);
486 ASSERT_EQ(left->s, wp.s);
489 auto right = map.GetRight(wp);
490 if (right.has_value()) {
491 ASSERT_EQ(right->road_id, wp.road_id);
492 ASSERT_EQ(right->section_id, wp.section_id);
493 ASSERT_NE(right->lane_id, wp.lane_id);
494 ASSERT_EQ(right->s, wp.s);
498 float seconds = 1e-3f * stop_watch.GetElapsedTime();
503 for (
auto &result : results) {