35const std::string
BASE_PATH = LIBCARLA_TEST_CONTENT_FOLDER
"/OpenDrive/";
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);
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;
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);
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);
292 ASSERT_TRUE(map.has_value());
294 const std::string full_path =
BASE_PATH + file;
308 ASSERT_TRUE(map.has_value());
310 const std::string full_path =
BASE_PATH + file;
320TEST(road, parse_road_elevation) {
323 ASSERT_TRUE(map.has_value());
325 const std::string full_path =
BASE_PATH + file;
338 ASSERT_TRUE(map.has_value());
340 const std::string full_path =
BASE_PATH + file;
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) {
void AsyncRun(size_t worker_threads)
std::future< ResultT > Post(FunctorT &&functor)
static boost::optional< road::Map > Load(const std::string &opendrive)
Lane * GetLane(const LaneId id)
const T * GetInfo(const double s) const
double GetDistance() const
每条车道在道路横截面内可以提供多个道路标记条目。 道路标记信息定义了车道外边界的线条样式。 对于左侧车道,这是左边界;对于右侧车道,这是右边界。 左右车道之间的分隔线样式由零号车道(即中央车道)的道路标...
unsigned int as_uint(unsigned int def=0) const
xml_parse_result load_file(const char *path, unsigned int options=parse_default, xml_encoding encoding=encoding_auto)
xml_node child(const char_t *name) const
xml_object_range< xml_node_iterator > children() const
xml_attribute attribute(const char_t *name) const
static std::vector< std::string > GetAvailableFiles()
static std::string Load(const std::string &filename)
static void log(Args &&... args)
const std::string BASE_PATH
导入CARLA的实用工具命名空间,包含常用的功能函数和类。
static void test_roads(const pugi::xml_document &xml, boost::optional< Map > &map)
定义一个名为test_roads的函数,它接受一个const引用的pugi::xml_document对象和一个boost::optional<Map>对象作为参数
static void test_road_links(boost::optional< Map > &map)
static void test_junctions(const pugi::xml_document &xml, boost::optional< Map > &map)
static void test_road_elevation(const pugi::xml_document &xml, boost::optional< Map > &map)
static auto get_total_road_marks(pugi::xml_object_range< pugi::xml_named_node_iterator > &lane_nodes, LaneSection &lane_section)
获取车道节点中所有道路标记的总数,并对比解析得到的道路标记数量。
static void test_geometry(const pugi::xml_document &xml, boost::optional< Map > &map)