CARLA
 
载入中...
搜索中...
未找到
ProfilesParser.cpp
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
8// 包含Carla的OpenDRIVE解析器中的ProfilesParser头文件,用于解析道路剖面相关信息
9
11// 包含Carla中构建地图的MapBuilder头文件
12
13#include <pugixml/pugixml.hpp>
14// 包含pugixml库的头文件,用于解析XML文件
15
16
17namespace carla {
18namespace opendrive {
19namespace parser {
20
21
23 carla::road::Road *road { nullptr };
24 // 指向carla::road::Road类型的指针,用于表示与高程剖面相关的道路,初始化为nullptr
25 double s { 0.0 };
26 // 沿着道路的距离,初始化为0.0
27 double a { 0.0 };
28 // 多项式系数a,初始化为0.0
29 double b { 0.0 };
30 // 多项式系数b,初始化为0.0
31 double c { 0.0 };
32 // 多项式系数c,初始化为0.0
33 double d { 0.0 };
34 // 多项式系数d,初始化为0.0
35 };
36
37
39 std::string side { "both" };
40 // 表示横向横坡的侧边,初始化为"both"
41 };
42
43
44 struct LateralShape {
45 double t { 0.0 };
46 // 横向形状相关的变量t,初始化为0.0
47 };
48
49
51 carla::road::Road *road { nullptr };
52 // 指向carla::road::Road类型的指针,用于表示与横向剖面相关的道路,初始化为nullptr
53 double s { 0.0 };
54 // 沿着道路的距离,初始化为0.0
55 double a { 0.0 };
56 // 多项式系数a,初始化为0.0
57 double b { 0.0 };
58 // 多项式系数b,初始化为0.0
59 double c { 0.0 };
60 // 多项式系数c,初始化为0.0
61 double d { 0.0 };
62 // 多项式系数d,初始化为0.0
63 std::string type { "superelevation" };
64 // 横向剖面的类型,初始化为"superelevation"
66 // 横向横坡信息
68 // 横向形状信息
69 };
70
71
73 const pugi::xml_document &xml,
74 carla::road::MapBuilder &map_builder) {
75 // ProfilesParser类中的Parse函数,用于解析XML中的道路剖面信息并构建地图相关内容
76 // 输入为一个pugi::xml_document类型的XML文档对象和一个carla::road::MapBuilder类型的地图构建器对象
77
78
79 std::vector<ElevationProfile> elevation_profile;
80 // 用于存储高程剖面信息的向量
81 std::vector<LateralProfile> lateral_profile;
82 // 用于存储横向剖面信息的向量
83
84
85 for (pugi::xml_node node_road : xml.child("OpenDRIVE").children("road")) {
86 // 遍历XML文档中<OpenDRIVE>下的所有<road>节点
87 // 每个<road>节点代表一条道路
88
89
90 // 解析高程剖面
91 pugi::xml_node node_profile = node_road.child("elevationProfile");
92 // 获取当前<road>节点下的<elevationProfile>子节点,该节点包含高程剖面信息
93 uint64_t number_profiles = 0;
94 // 用于统计高程剖面的数量,初始化为0
95
96
97 if (node_profile) {
98 // 如果存在<elevationProfile>节点
99
100
101 // 所有的几何
102 for (pugi::xml_node node_elevation : node_profile.children("elevation")) {
103 // 遍历<elevationProfile>节点下的所有<elevation>子节点,每个<elevation>节点包含一个高程段的信息
104 ElevationProfile elev;
105
106
107 // 获取道路 id
108 road::RoadId road_id = node_road.attribute("id").as_uint();
109 // 从<road>节点的"id"属性获取道路的ID
110 elev.road = map_builder.GetRoad(road_id);
111 // 通过地图构建器根据道路ID获取对应的道路对象,并赋值给elev.road
112
113
114 // 获取常用属性
115 elev.s = node_elevation.attribute("s").as_double();
116 // 从<elevation>节点的"s"属性获取沿着道路的距离
117 elev.a = node_elevation.attribute("a").as_double();
118 // 从<elevation>节点的"a"属性获取多项式系数a
119 elev.b = node_elevation.attribute("b").as_double();
120 // 从<elevation>节点的"b"属性获取多项式系数b
121 elev.c = node_elevation.attribute("c").as_double();
122 // 从<elevation>节点的"c"属性获取多项式系数c
123 elev.d = node_elevation.attribute("d").as_double();
124 // 从<elevation>节点的"d"属性获取多项式系数d
125
126
127 // 添加它
128 elevation_profile.emplace_back(elev);
129 // 将解析得到的高程剖面信息添加到elevation_profile向量中
130 number_profiles++;
131 // 高程剖面数量加1
132 }
133 }
134 // 如果没有找到,则添加默认配置
135 if (number_profiles == 0) {
136 ElevationProfile elev;
137 road::RoadId road_id = node_road.attribute("id").as_uint();
138 elev.road = map_builder.GetRoad(road_id);
139
140
141 // 获取常用属性
142 elev.s = 0;
143 // 沿着道路的距离设置为0
144 elev.a = 0;
145 // 多项式系数a设置为0
146 elev.b = 0;
147 // 多项式系数b设置为0
148 elev.c = 0;
149 // 多项式系数c设置为0
150 elev.d = 0;
151 // 多项式系数d设置为0
152
153
154 // 添加它
155 elevation_profile.emplace_back(elev);
156 // 将默认的高程剖面信息添加到elevation_profile向量中
157 }
158
159
160 // 解析横向剖面
161 node_profile = node_road.child("lateralProfile");
162 // 获取当前<road>节点下的<lateralProfile>子节点,该节点包含横向剖面信息
163 if (node_profile) {
164 for (pugi::xml_node node : node_profile.children()) {
165 // 遍历<lateralProfile>节点下的所有子节点
166
167
168 LateralProfile lateral;
169
170
171 // 获取路 id
172 road::RoadId road_id = node_road.attribute("id").as_uint();
173 // 从<road>节点的"id"属性获取道路的ID
174 lateral.road = map_builder.GetRoad(road_id);
175 // 通过地图构建器根据道路ID获取对应的道路对象,并赋值给lateral.road
176
177
178 // 获取常用属性
179 lateral.s = node.attribute("s").as_double();
180 // 从子节点的"s"属性获取沿着道路的距离
181 lateral.a = node.attribute("a").as_double();
182 // 从子节点的"a"属性获取多项式系数a
183 lateral.b = node.attribute("b").as_double();
184 // 从子节点的"b"属性获取多项式系数b
185 lateral.c = node.attribute("c").as_double();
186 // 从子节点的"c"属性获取多项式系数c
187 lateral.d = node.attribute("d").as_double();
188 // 从子节点的"d"属性获取多项式系数d
189
190
191 // 处理不同类型
192 lateral.type = node.name();
193 // 将子节点的名称作为横向剖面的类型
194 if (lateral.type == "crossfall") {
195 lateral.cross.side = node.attribute("side").value();
196 // 如果类型是"crossfall",从子节点的"side"属性获取横向横坡的侧边信息并赋值给lateral.cross.side
197 } else if (lateral.type == "shape") {
198 lateral.shape.t = node.attribute("t").as_double();
199 // 如果类型是"shape",从子节点的"t"属性获取横向形状相关的变量t的值并赋值给lateral.shape.t
200 }
201
202
203 // 添加它
204 lateral_profile.emplace_back(lateral);
205 // 将解析得到的横向剖面信息添加到lateral_profile向量中
206 }
207 }
208 }
209
210
211 // 调用地图构建器map_builder
212 for (auto const pro : elevation_profile) {
213 map_builder.AddRoadElevationProfile(pro.road, pro.s, pro.a, pro.b, pro.c, pro.d);
214 // 遍历elevation_profile向量,调用地图构建器的AddRoadElevationProfile函数,将高程剖面信息添加到地图构建器中
215 }
216
217
218 /// @todo: RoadInfo classes must be created to fit this information
219 // for (auto const pro : lateral_profile) {
220 // if (pro.type == "superelevation")
221 // map_builder.AddRoadLateralSuperElevation(pro.road, pro.s, pro.a, pro.b, pro.c, pro.d);
222 // else if (pro.type == "crossfall")
223 // map_builder.AddRoadLateralCrossfall(pro.road, pro.s, pro.a, pro.b, pro.c, pro.d, pro.cross.side);
224 // else if (pro.type == "shape")
225 // map_builder.AddRoadLateralShape(pro.road, pro.s, pro.a, pro.b, pro.c, pro.d, pro.shape.t);
226 // }
227
228
229 }
230
231
232} // namespace parser
233} // namespace opendrive
234} // namespace carla
static void Parse(const pugi::xml_document &xml, carla::road::MapBuilder &map_builder)
解析XML文档中的道路设计配置文件信息,并将其用于构建道路地图 该函数读取XML文档中的道路设计配置文件数据,如道路的水平和垂直曲线信息 并使用这些数据来构建或更新道路地图中的道路设计配置文件部分
void AddRoadElevationProfile(Road *road, const double s, const double a, const double b, const double c, const double d)
Road * GetRoad(const RoadId road_id)
xml_node child(const char_t *name) const
Definition pugixml.cpp:5685
xml_object_range< xml_node_iterator > children() const
Definition pugixml.cpp:5620
uint32_t RoadId
Definition RoadTypes.h:20
CARLA模拟器的主命名空间。
Definition Carla.cpp:139