CARLA
 
载入中...
搜索中...
未找到
SignalParser.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// 包含Carla项目中OpenDRIVE相关的信号解析器(SignalParser)头文件,推测其中定义了SignalParser类的声明等内容,用于解析OpenDRIVE格式中的信号相关信息
7#include "carla/opendrive/parser/SignalParser.h"// 包含Carla项目中道路地图构建器(MapBuilder)相关的头文件,用于构建道路地图,可能涉及创建道路、添加各种道路元素等操作
8
10// 包含pugixml库的头文件,pugixml是一个用于解析XML文件的C++库,在这里用于解析OpenDRIVE格式对应的XML文件内容
11#include <pugixml/pugixml.hpp>
12// 定义在Carla项目的opendrive命名空间下的parser命名空间中,表明这些函数和类是用于OpenDRIVE解析相关的具体实现部分
13namespace carla {
14namespace opendrive {
15namespace parser {
16// 定义一个名为AddValidity的静态函数,用于为信号引用添加有效性范围信息
17 static void AddValidity(
18 road::element::RoadInfoSignal* signal_reference,
19 pugi::xml_node parent_node,
20 const std::string &node_name,
21 road::MapBuilder &map_builder) {
22 // 遍历父节点下所有名为"validity"的子节点
23 for (pugi::xml_node validity_node = parent_node.child(node_name.c_str());
24 validity_node;
25 validity_node = validity_node.next_sibling("validity")) {
26 // 获取有效性范围的起始车道和结束车道
27 const auto from_lane = validity_node.attribute("fromLane").as_int();
28 const auto to_lane = validity_node.attribute("toLane").as_int();
29 // 将有效性范围添加到信号引用中
30 map_builder.AddValidityToSignalReference(signal_reference, from_lane, to_lane);
31 }
32 }
33
35 const pugi::xml_document &xml,
36 carla::road::MapBuilder &map_builder) {
37
38 // 提取 OpenDRIVE
39 const pugi::xml_node opendrive_node = xml.child("OpenDRIVE");
40 const std::string validity = "validity";
41 // 遍历OpenDRIVE节点下的所有道路节点
42 for (pugi::xml_node road_node = opendrive_node.child("road");
43 road_node;
44 road_node = road_node.next_sibling("road")) {
45// 获取道路ID
46 road::RoadId road_id = road_node.attribute("id").as_uint();
47// 获取道路节点下的信号节点
48 const pugi::xml_node signals_node = road_node.child("signals");
49 if(signals_node){
50 // 遍历信号节点下的所有信号元素
51 for (pugi::xml_node signal_node : signals_node.children("signal")) {
52 // 获取信号的各种属性
53 const double s_position = signal_node.attribute("s").as_double();// 获取信号在道路上的横向位置(t坐标),从"signal"子节点的属性"t"中获取双精度浮点数值
54 const double t_position = signal_node.attribute("t").as_double();// 获取信号的标识符(SignId),从"signal"子节点的属性"id"中获取对应的值,具体类型由road::SignId定义
55 const road::SignId signal_id = signal_node.attribute("id").value();// 获取信号的名称,从"signal"子节点的属性"name"中获取对应的值,类型为std::string
56 const std::string name = signal_node.attribute("name").value();// 获取信号是否动态的标识,从"signal"子节点的属性"dynamic"中获取对应的值,类型为std::string
57 const std::string dynamic = signal_node.attribute("dynamic").value();// 获取信号的朝向信息,从"signal"子节点的属性"orientation"中获取对应的值,类型为std::string
58 const std::string orientation = signal_node.attribute("orientation").value();// 获取信号的垂直偏移量(z轴偏移),从"signal"子节点的属性"zOffSet"中获取双精度浮点数值
59 const double zOffset = signal_node.attribute("zOffSet").as_double();// 获取信号所属的国家信息,从"signal"子节点的属性"country"中获取对应的值,类型为std::string
60 const std::string country = signal_node.attribute("country").value();// 获取信号的类型信息,从"signal"子节点的属性"type"中获取对应的值,类型为std::string
61 const std::string type = signal_node.attribute("type").value();// 获取信号的子类型信息,从"signal"子节点的属性"subtype"中获取对应的值,类型为std::string
62 const std::string subtype = signal_node.attribute("subtype").value();// 获取信号的值,从"signal"子节点的属性"value"中获取双精度浮点数值
63 const double value = signal_node.attribute("value").as_double();// 获取信号的单位信息,从"signal"子节点的属性"unit"中获取对应的值,类型为std::string
64 const std::string unit = signal_node.attribute("unit").value();// 获取信号的高度信息,从"signal"子节点的属性"height"中获取双精度浮点数值
65 const double height = signal_node.attribute("height").as_double(); // 获取信号的宽度信息,从"signal"子节点的属性"width"中获取双精度浮点数值
66 const double width = signal_node.attribute("width").as_double();// 获取信号显示的文本信息,从"signal"子节点的属性"text"中获取对应的值,类型为std::string
67 const std::string text = signal_node.attribute("text").value();// 获取信号的水平偏移量(h轴偏移),从"signal"子节点的属性"hOffset"中获取双精度浮点数值
68 const double hOffset = signal_node.attribute("hOffset").as_double();// 获取信号的俯仰角信息,从"signal"子节点的属性"pitch"中获取双精度浮点数值
69 const double pitch = signal_node.attribute("pitch").as_double(); // 获取信号的翻滚角信息,从"signal"子节点的attribute("roll")中获取双精度浮点数值
70 const double roll = signal_node.attribute("roll").as_double(); // 输出调试信息,显示正在添加的信号的各种属性信息,方便调试时查看解析到的信号具体情况
71
72 log_debug("Road: ",
73 road_id,
74 "Adding Signal: ",
75 s_position,
76 t_position,
77 signal_id,
78 name,
79 dynamic,
80 orientation,
81 zOffset,
82 country,
83 type,
84 subtype,
85 value,
86 unit,
87 height,
88 width,
89 text,
90 hOffset,
91 pitch,
92 roll);
93// 通过地图构建器根据道路ID获取对应的道路对象指针,后续操作需要基于此道路对象来添加信号等元素
94 carla::road::Road *road = map_builder.GetRoad(road_id);
95 // 使用地图构建器添加信号,传入道路对象指针以及信号的各种属性信息,返回添加后的信号引用对象,
96 // 后续可以基于此信号引用对象进行更多相关操作,比如添加有效性范围等
97 auto signal_reference = map_builder.AddSignal(road,
98 signal_id,
99 s_position,
100 t_position,
101 name,
102 dynamic,
103 orientation,
104 zOffset,
105 country,
106 type,
107 subtype,
108 value,
109 unit,
110 height,
111 width,
112 text,
113 hOffset,
114 pitch,
115 roll);
116 // 调用AddValidity函数,为刚添加的信号引用对象添加有效性范围信息,传入信号引用对象、当前"signal"子节点(作为父节点)以及有效性范围节点名称等信息
117 AddValidity(signal_reference, signal_node, "validity", map_builder);
118// 处理信号的依赖节点
119 for (pugi::xml_node dependency_node : signal_node.children("dependency")) {
120 const std::string dependency_id = dependency_node.attribute("id").value();
121 const std::string dependency_type = dependency_node.attribute("type").value();
122 // 打印调试信息,显示为信号添加的依赖
123 log_debug("Added dependency to signal ", signal_id, ":", dependency_id, dependency_type);
124 // 将依赖添加到信号中
125 map_builder.AddDependencyToSignal(signal_id, dependency_id, dependency_type);
126 }
127 // 处理信号的惯性位置节点
128 for (pugi::xml_node position_node : signal_node.children("positionInertial")) {
129 const double x = position_node.attribute("x").as_double(); // 获取惯性位置的y坐标值,从"positionInertial"子节点的属性"y"中获取双精度浮点数值
130 const double y = position_node.attribute("y").as_double();// 获取惯性位置的z坐标值,从"positionInertial"子节点的属性"z"中获取双精度浮点数值
131 const double z = position_node.attribute("z").as_double();// 获取惯性位置的航向角(heading)值,从"positionInertial"子节点的属性"hdg"中获取双精度浮点数值
132 const double hdg = position_node.attribute("hdg").as_double();// 获取惯性位置的俯仰角(pitch)值,从"positionInertial"子节点的属性"pitch"中获取双精度浮点数值
133 const double inertial_pitch = position_node.attribute("pitch").as_double();// 获取惯性位置的翻滚角(roll)值,从"positionInertial"子节点的attribute("roll")中获取双精度浮点数值
134 const double inertial_roll = position_node.attribute("roll").as_double();// 通过地图构建器将获取到的信号惯性位置信息添加到对应的信号中,传入信号标识符以及惯性位置的各个坐标和角度信息
135
136 map_builder.AddSignalPositionInertial(
137 signal_id,
138 x, y, z,
139 hdg, inertial_pitch, inertial_roll);
140 }
141 }
142 // 处理信号引用节点,遍历"signals"节点下所有名为"signalReference"的子节点,每个子节点代表一个信号引用的相关信息
143 for (pugi::xml_node signal_reference_node : signals_node.children("signalReference")) {// 获取信号引用在道路上的纵向位置(s坐标),从"signalReference"子节点的属性"s"中获取双精度浮点数值
144 const double s_position = signal_reference_node.attribute("s").as_double();// 获取信号引用在道路上的横向位置(t坐标),从"signalReference"子节点的属性"t"中获取双精度浮点数值
145 const double t_position = signal_reference_node.attribute("t").as_double();// 获取信号引用的标识符(SignId),从"signalReference"子节点的属性"id"中获取对应的值,具体类型由road::SignId定义
146 const road::SignId signal_id = signal_reference_node.attribute("id").value();// 获取信号引用的朝向信息,从"signalReference"子节点的属性"orientation"中获取对应的值,类型为std::string
147 const std::string signal_reference_orientation =
148 signal_reference_node.attribute("orientation").value();
149 // 输出调试信息,显示正在添加的信号引用的相关信息,方便调试时查看信号引用情况
150 log_debug("Road: ",
151 road_id,
152 "Added SignalReference ",
153 s_position,
154 t_position,
155 signal_reference_orientation);
156 // 通过地图构建器根据道路ID获取对应的道路对象指针,后续操作需要基于此道路对象来添加信号引用等元素
157 carla::road::Road *road = map_builder.GetRoad(road_id);
158 // 使用地图构建器添加信号引用,传入道路对象指针以及信号引用的各种属性信息,返回添加后的信号引用对象,
159 // 后续可以基于此信号引用对象进行更多相关操作,比如添加有效性范围等
160 auto signal_reference = map_builder.AddSignalReference(
161 road,
162 signal_id,
163 s_position,
164 t_position,
165 signal_reference_orientation);
166 // 调用AddValidity函数,为刚添加的信号引用对象添加有效性范围信息,传入信号引用对象、当前"signalReference"子节点(作为父节点)以及有效性范围节点名称等信息
167 AddValidity(signal_reference, signal_reference_node, "validity", map_builder);
168 }
169 }
170 }
171 }
172} // namespace parser
173} // namespace opendrive
174} // namespace carla
static void Parse(const pugi::xml_document &xml, carla::road::MapBuilder &map_builder)
解析XML文档中的交通信号信息,并将其用于构建道路地图。 该函数读取XML文档中的交通信号数据,如信号灯的位置、类型和控制逻辑, 并使用这些数据来构建或更新道路地图中的交通信号部分。
void AddSignalPositionInertial(const SignId signal_id, const double x, const double y, const double z, const double hdg, const double pitch, const double roll)
void AddValidityToSignalReference(element::RoadInfoSignal *signal_reference, const LaneId from_lane, const LaneId to_lane)
void AddDependencyToSignal(const SignId signal_id, const std::string dependency_id, const std::string dependency_type)
element::RoadInfoSignal * AddSignalReference(Road *road, const SignId signal_id, const double s_position, const double t_position, const std::string signal_reference_orientation)
element::RoadInfoSignal * AddSignal(Road *road, const SignId signal_id, const double s, const double t, const std::string name, const std::string dynamic, const std::string orientation, const double zOffset, const std::string country, const std::string type, const std::string subtype, const double value, const std::string unit, const double height, const double width, const std::string text, const double hOffset, const double pitch, const double roll)
Road * GetRoad(const RoadId road_id)
double as_double(double def=0) const
Definition pugixml.cpp:5373
unsigned int as_uint(unsigned int def=0) const
Definition pugixml.cpp:5368
xml_node child(const char_t *name) const
Definition pugixml.cpp:5685
xml_object_range< xml_node_iterator > children() const
Definition pugixml.cpp:5620
xml_attribute attribute(const char_t *name) const
Definition pugixml.cpp:5695
static void AddValidity(road::element::RoadInfoSignal *signal_reference, pugi::xml_node parent_node, const std::string &node_name, road::MapBuilder &map_builder)
uint32_t RoadId
Definition RoadTypes.h:20
std::string SignId
Definition RoadTypes.h:35
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static void log_debug(Args &&... args)
Definition Logging.h:71