CARLA
 
载入中...
搜索中...
未找到
MapBuilder.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
7#include "carla/StringUtil.h" // 引入字符串工具库
8#include "carla/road/MapBuilder.h" // 引入地图构建器
9#include "carla/road/element/RoadInfoElevation.h" // 引入道路高度信息类
10#include "carla/road/element/RoadInfoGeometry.h" // 引入道路几何信息类
11#include "carla/road/element/RoadInfoLaneAccess.h" // 引入车道访问信息类
12#include "carla/road/element/RoadInfoLaneBorder.h" // 引入车道边界信息类
13#include "carla/road/element/RoadInfoLaneHeight.h" // 引入车道高度信息类
14#include "carla/road/element/RoadInfoLaneMaterial.h" // 引入车道材料信息类
15#include "carla/road/element/RoadInfoLaneOffset.h" // 引入车道偏移信息类
16#include "carla/road/element/RoadInfoLaneRule.h" // 引入车道规则信息类
17#include "carla/road/element/RoadInfoLaneVisibility.h" // 引入车道可见性信息类
18#include "carla/road/element/RoadInfoLaneWidth.h" // 引入车道宽度信息类
19#include "carla/road/element/RoadInfoMarkRecord.h" // 引入道路标记记录类
20#include "carla/road/element/RoadInfoMarkTypeLine.h" // 引入道路标记类型线类
21#include "carla/road/element/RoadInfoSpeed.h" // 引入道路速度信息类
22#include "carla/road/element/RoadInfoSignal.h" // 引入道路信号信息类
23#include "carla/road/element/RoadInfoVisitor.h" // 引入道路信息访问者类
24#include "carla/road/element/RoadInfoCrosswalk.h" // 引入人行横道信息类
25#include "carla/road/InformationSet.h" // 引入信息集合类
26#include "carla/road/Signal.h" // 引入信号类
27#include "carla/road/SignalType.h" // 引入信号类型类
28
29#include <iterator> // 引入迭代器相关库
30#include <memory> // 引入智能指针库
31#include <algorithm> // 引入算法库
32
33using namespace carla::road::element; // 使用carla::road::element命名空间
34
35namespace carla {
36namespace road {
37
38 boost::optional<Map> MapBuilder::Build() {
39
40 CreatePointersBetweenRoadSegments(); // 创建路段之间的指针
41 RemoveZeroLaneValiditySignalReferences(); // 移除无效车道信号引用
42
43 for (auto &&info : _temp_road_info_container) { // 遍历临时道路信息容器
44 DEBUG_ASSERT(info.first != nullptr); // 确保道路信息不为空
45 info.first->_info = InformationSet(std::move(info.second)); // 移动并设置道路信息
46 }
47
48 for (auto &&info : _temp_lane_info_container) { // 遍历临时车道信息容器
49 DEBUG_ASSERT(info.first != nullptr); // 确保车道信息不为空
50 info.first->_info = InformationSet(std::move(info.second)); // 移动并设置车道信息
51 }
52
53 // compute transform requires the roads to have the RoadInfo
54 SolveSignalReferencesAndTransforms(); // 解决信号引用和变换
55
56 SolveControllerAndJuntionReferences(); // 解决控制器和交叉口引用
57
58 // remove temporal already used information
59 _temp_road_info_container.clear(); // 清空临时道路信息容器
60 _temp_lane_info_container.clear(); // 清空临时车道信息容器
61
62 // _map_data is a member of MapBuilder so you must especify if
63 // you want to keep it (will return copy -> Map(const Map &))
64 // or move it (will return move -> Map(Map &&))
65 Map map(std::move(_map_data)); // 移动并创建地图对象
66 CreateJunctionBoundingBoxes(map); // 创建交叉口的边界框
67 ComputeJunctionRoadConflicts(map); // 计算交叉口道路冲突
68 CheckSignalsOnRoads(map); // 检查道路上的信号
69
70 return map; // 返回构建的地图
71 }
72
73 // called from profiles parser
75 Road *road, // 道路指针
76 const double s, // 路段位置
77 const double a, // 高度参数a
78 const double b, // 高度参数b
79 const double c, // 高度参数c
80 const double d) { // 高度参数d
81 DEBUG_ASSERT(road != nullptr); // 确保道路不为空
82 auto elevation = std::make_unique<RoadInfoElevation>(s, a, b, c, d); // 创建道路高度信息
83 _temp_road_info_container[road].emplace_back(std::move(elevation)); // 添加到临时道路信息容器
84 }
85
87 Road *road, // 道路指针
88 const std::string name, // 人行横道名称
89 const double s, // 路段位置
90 const double t, // 路段横坐标
91 const double zOffset, // 高度偏移
92 const double hdg, // 偏航角
93 const double pitch, // 俯仰角
94 const double roll, // 翻滚角
95 const std::string orientation, // 定位方向
96 const double width, // 宽度
97 const double length, // 长度
98 const std::vector<road::element::CrosswalkPoint> points) { // 人行横道点集
99 DEBUG_ASSERT(road != nullptr); // 确保道路不为空
100 auto cross = std::make_unique<RoadInfoCrosswalk>(s, name, t, zOffset, hdg, pitch, roll, std::move(orientation), width, length, std::move(points)); // 创建人行横道信息
101 _temp_road_info_container[road].emplace_back(std::move(cross)); // 添加到临时道路信息容器
102 }
103
104 // called from lane parser
106 Lane *lane, // 车道指针
107 const double s, // 位置
108 const std::string restriction) { // 限制条件
109 DEBUG_ASSERT(lane != nullptr); // 确保车道不为空
110 _temp_lane_info_container[lane].emplace_back(std::make_unique<RoadInfoLaneAccess>(s, restriction)); // 创建车道访问信息并添加到临时车道信息容器
111 }
112
114 Lane *lane, // 车道指针
115 const double s, // 位置
116 const double a, // 边界参数a
117 const double b, // 边界参数b
118 const double c, // 边界参数c
119 const double d) { // 边界参数d
120 DEBUG_ASSERT(lane != nullptr); // 确保车道不为空
121 _temp_lane_info_container[lane].emplace_back(std::make_unique<RoadInfoLaneBorder>(s, a, b, c, d)); // 创建车道边界信息并添加到临时车道信息容器
122 }
123
125 Lane *lane, // 车道指针
126 const double s, // 位置
127 const double inner, // 内部高度
128 const double outer) { // 外部高度
129 DEBUG_ASSERT(lane != nullptr); // 确保车道不为空
130 _temp_lane_info_container[lane].emplace_back(std::make_unique<RoadInfoLaneHeight>(s, inner, outer)); // 创建车道高度信息并添加到临时车道信息容器
131 }
132
134 Lane *lane, // 车道指针
135 const double s, // 位置
136 const std::string surface, // 表面材料
137 const double friction, // 摩擦系数
138 const double roughness) { // 粗糙度
139 DEBUG_ASSERT(lane != nullptr); // 确保车道不为空
140 _temp_lane_info_container[lane].emplace_back(std::make_unique<RoadInfoLaneMaterial>(s, surface, friction,
141 roughness)); // 创建车道材料信息并添加到临时车道信息容器
142 }
143
145 Lane *lane, // 车道指针
146 const double s, // 位置
147 const std::string value) { // 规则值
148 DEBUG_ASSERT(lane != nullptr); // 确保车道不为空
149 _temp_lane_info_container[lane].emplace_back(std::make_unique<RoadInfoLaneRule>(s, value)); // 创建车道规则信息并添加到临时车道信息容器
150 }
151
153 Lane *lane, // 车道指针
154 const double s, // 位置
155 const double forward, // 前方可见性
156 const double back, // 后方可见性
157 const double left, // 左侧可见性
158 const double right) { // 右侧可见性
159 DEBUG_ASSERT(lane != nullptr); // 确保车道不为空
160 _temp_lane_info_container[lane].emplace_back(std::make_unique<RoadInfoLaneVisibility>(s, forward, back,
161 left, right)); // 创建车道可见性信息并添加到临时车道信息容器
162 }
163
165 Lane *lane, // 车道指针
166 const double s, // 位置
167 const double a, // 宽度参数a
168 const double b, // 宽度参数b
169 const double c, // 宽度参数c
170 const double d) { // 宽度参数d
171 DEBUG_ASSERT(lane != nullptr); // 确保车道不为空
172 _temp_lane_info_container[lane].emplace_back(std::make_unique<RoadInfoLaneWidth>(s, a, b, c, d)); // 创建车道宽度信息并添加到临时车道信息容器
173 }
174
176 Lane *lane, // 车道指针
177 const int road_mark_id, // 道路标记ID
178 const double s, // 位置
179 const std::string type, // 标记类型
180 const std::string weight, // 标记重量
181 const std::string color, // 标记颜色
182 const std::string material, // 标记材料
183 const double width, // 标记宽度
184 std::string lane_change, // 车道变更类型
185 const double height, // 标记高度
186 const std::string type_name, // 类型名称
187 const double type_width) { // 类型宽度
188 DEBUG_ASSERT(lane != nullptr); // 确保车道不为空
189 RoadInfoMarkRecord::LaneChange lc; // 定义车道变更类型
190
191 StringUtil::ToLower(lane_change); // 将车道变更类型转换为小写
192
193 if (lane_change == "increase") { // 如果是增加
194 lc = RoadInfoMarkRecord::LaneChange::Increase; // 设置为增加
195 } else if (lane_change == "decrease") { // 如果是减少
196 lc = RoadInfoMarkRecord::LaneChange::Decrease; // 设置为减少
197 } else if (lane_change == "none") { // 如果没有
198 lc = RoadInfoMarkRecord::LaneChange::None; // 设置为无
199 } else { // 其他情况
200 lc = RoadInfoMarkRecord::LaneChange::Both; // 设置为双向
201 }
202 _temp_lane_info_container[lane].emplace_back(std::make_unique<RoadInfoMarkRecord>(s, road_mark_id, type,
203 weight, color,
204 material, width, lc, height, type_name, type_width)); // 创建道路标记记录并添加到临时车道信息容器
205 }
207 Lane *lane, // 道路车道指针
208 const int road_mark_id, // 道路标记ID
209 const double length, // 标记线长度
210 const double space, // 标记线间距
211 const double tOffset, // 垂直偏移量
212 const double s, // 纵向位置
213 const std::string rule, // 规则字符串
214 const double width) { // 标记线宽度
215 DEBUG_ASSERT(lane != nullptr); // 确保车道指针不为空
216 auto it = MakeRoadInfoIterator<RoadInfoMarkRecord>(_temp_lane_info_container[lane]); // 创建道路信息迭代器
217 for (; !it.IsAtEnd(); ++it) { // 遍历道路信息
218 if (it->GetRoadMarkId() == road_mark_id) { // 如果找到匹配的道路标记ID
219 it->GetLines().emplace_back(std::make_unique<RoadInfoMarkTypeLine>(s, road_mark_id, length, space,
220 tOffset, rule, width)); // 添加新的标记线对象
221 break; // 跳出循环
222 }
223 }
224}
225
227 Lane *lane, // 道路车道指针
228 const double s, // 纵向位置
229 const double max, // 最大速度
230 const std::string /*unit*/) { // 单位(未使用)
231 DEBUG_ASSERT(lane != nullptr); // 确保车道指针不为空
232 _temp_lane_info_container[lane].emplace_back(std::make_unique<RoadInfoSpeed>(s, max)); // 添加车道速度信息
233}
234
236 Road* road, // 道路指针
237 const SignId signal_id, // 信号ID
238 const double s, // 纵向位置
239 const double t, // 横向位置
240 const std::string name, // 信号名称
241 const std::string dynamic, // 动态信息
242 const std::string orientation, // 方向
243 const double zOffset, // 高度偏移量
244 const std::string country, // 国家
245 const std::string type, // 信号类型
246 const std::string subtype, // 信号子类型
247 const double value, // 信号值
248 const std::string unit, // 单位
249 const double height, // 信号高度
250 const double width, // 信号宽度
251 const std::string text, // 文字内容
252 const double hOffset, // 水平偏移量
253 const double pitch, // 俯仰角
254 const double roll) { // 横滚角
255 _temp_signal_container[signal_id] = std::make_unique<Signal>( // 创建信号对象并存储
256 road->GetId(), // 获取道路ID
257 signal_id, // 信号ID
258 s, // 纵向位置
259 t, // 横向位置
260 name, // 信号名称
261 dynamic, // 动态信息
262 orientation, // 方向
263 zOffset, // 高度偏移量
264 country, // 国家
265 type, // 信号类型
266 subtype, // 信号子类型
267 value, // 信号值
268 unit, // 单位
269 height, // 信号高度
270 width, // 信号宽度
271 text, // 文字内容
272 hOffset, // 水平偏移量
273 pitch, // 俯仰角
274 roll); // 横滚角
275
276 return AddSignalReference(road, signal_id, s, t, orientation); // 添加信号引用并返回
277}
278
280 const SignId signal_id, // 信号ID
281 const double x, // X坐标
282 const double y, // Y坐标
283 const double z, // Z坐标
284 const double hdg, // 航向角
285 const double pitch, // 俯仰角
286 const double roll) { // 横滚角
287 std::unique_ptr<Signal> &signal = _temp_signal_container[signal_id]; // 获取信号对象引用
288 signal->_using_inertial_position = true; // 设置为使用惯性位置
289 geom::Location location = geom::Location(x, -y, z); // 创建位置对象,注意Y轴取反
290 signal->_transform = geom::Transform(location, geom::Rotation( // 创建变换对象
291 geom::Math::ToDegrees(static_cast<float>(pitch)), // 俯仰角转换为度
292 geom::Math::ToDegrees(static_cast<float>(-hdg)), // 航向角转换为度并取反
293 geom::Math::ToDegrees(static_cast<float>(roll)))); // 横滚角转换为度
294}
295
297 const SignId signal_id, // 信号ID
298 const RoadId road_id, // 道路ID
299 const double s, // 纵向位置
300 const double t, // 横向位置
301 const double zOffset, // 高度偏移量
302 const double hOffset, // 水平偏移量
303 const double pitch, // 俯仰角
304 const double roll) { // 横滚角
305 std::unique_ptr<Signal> &signal = _temp_signal_container[signal_id]; // 获取信号对象引用
306 signal->_road_id = road_id; // 设置道路ID
307 signal->_s = s; // 设置纵向位置
308 signal->_t = t; // 设置横向位置
309 signal->_zOffset = zOffset; // 设置高度偏移量
310 signal->_hOffset = hOffset; // 设置水平偏移量
311 signal->_pitch = pitch; // 设置俯仰角
312 signal->_roll = roll; // 设置横滚角
313}
314
316 Road* road,
317 const SignId signal_id,
318 const double s_position,
319 const double t_position,
320 const std::string signal_reference_orientation) {
321
322 const double epsilon = 0.00001; // 定义一个极小值,用于比较
323 RELEASE_ASSERT(s_position >= 0.0); // 确保s_position为非负数
324 // 防止s_position等于道路长度
325 double fixed_s = geom::Math::Clamp(s_position, 0.0, road->GetLength() - epsilon);
326 // 在临时容器中创建一个RoadInfoSignal对象并存储
327 _temp_road_info_container[road].emplace_back(std::make_unique<element::RoadInfoSignal>(
328 signal_id, road->GetId(), fixed_s, t_position, signal_reference_orientation));
329 // 获取刚刚添加的信号引用
330 auto road_info_signal = static_cast<element::RoadInfoSignal*>(
331 _temp_road_info_container[road].back().get());
332 // 将信号引用添加到临时信号参考容器中
333 _temp_signal_reference_container.emplace_back(road_info_signal);
334 return road_info_signal; // 返回信号引用
335 }
336
338 element::RoadInfoSignal* signal_reference,
339 const LaneId from_lane,
340 const LaneId to_lane) {
341 // 为信号引用添加有效性信息
342 signal_reference->_validities.emplace_back(LaneValidity(from_lane, to_lane));
343 }
344
346 const SignId signal_id,
347 const std::string dependency_id,
348 const std::string dependency_type) {
349 // 为信号添加依赖关系
350 _temp_signal_container[signal_id]->_dependencies.emplace_back(
351 SignalDependency(dependency_id, dependency_type));
352 }
353
354 // 构建道路对象
356 const RoadId road_id,
357 const std::string name,
358 const double length,
359 const JuncId junction_id,
360 const RoadId predecessor,
361 const RoadId successor) {
362
363 // 添加道路
364 auto road = &(_map_data._roads.emplace(road_id, Road()).first->second);
365
366 // 设置道路数据
367 road->_map_data = &_map_data; // 设置地图数据指针
368 road->_id = road_id; // 设置道路ID
369 road->_name = name; // 设置道路名称
370 road->_length = length; // 设置道路长度
371 road->_junction_id = junction_id; // 设置交叉口ID
372 (junction_id != -1) ? road->_is_junction = true : road->_is_junction = false; // 判断是否为交叉口
373 road->_successor = successor; // 设置后继道路
374 road->_predecessor = predecessor; // 设置前驱道路
375
376 return road; // 返回道路对象
377 }
378
380 Road *road,
381 const SectionId id,
382 const double s) {
383 DEBUG_ASSERT(road != nullptr); // 确保道路不为空
384 carla::road::LaneSection &sec = road->_lane_sections.Emplace(id, s); // 在道路中添加车道段
385 sec._road = road; // 设置车道段所属道路
386 return &sec; // 返回车道段对象
387 }
388
391 const int32_t lane_id,
392 const uint32_t lane_type,
393 const bool lane_level,
394 const int32_t predecessor,
395 const int32_t successor) {
396 DEBUG_ASSERT(section != nullptr); // 确保车道段不为空
397
398 // 添加车道
399 auto *lane = &((section->_lanes.emplace(lane_id, Lane()).first)->second);
400
401 // 设置车道数据
402 lane->_id = lane_id; // 设置车道ID
403 lane->_lane_section = section; // 设置所属车道段
404 lane->_level = lane_level; // 设置车道等级
405 lane->_type = static_cast<carla::road::Lane::LaneType>(lane_type); // 设置车道类型
406 lane->_successor = successor; // 设置后继车道
407 lane->_predecessor = predecessor; // 设置前驱车道
408
409 return lane; // 返回车道对象
410 }
411
413 Road *road,
414 const double s,
415 const double x,
416 const double y,
417 const double hdg,
418 const double length) {
419 DEBUG_ASSERT(road != nullptr); // 确保道路不为空
420 const geom::Location location(static_cast<float>(x), static_cast<float>(y), 0.0f); // 创建位置对象
421 // 创建几何线对象
422 auto line_geometry = std::make_unique<GeometryLine>(
423 s,
424 length,
425 hdg,
426 location);
427
428 // 将新的道路几何信息添加到临时道路信息容器中
429 _temp_road_info_container[road].emplace_back(std::move(elevation));
430 }
431
432// 创建道路速度信息
434 Road *road,
435 const double s,
436 const std::string /*type*/,
437 const double max,
438 const std::string /*unit*/) {
439 DEBUG_ASSERT(road != nullptr); // 确保道路指针不为nullptr
440 // 将新的速度信息添加到临时道路信息容器中
441 _temp_road_info_container[road].emplace_back(std::make_unique<RoadInfoSpeed>(s, max));
442 }
443
444// 创建道路段偏移信息
446 Road *road,
447 const double s,
448 const double a,
449 const double b,
450 const double c,
451 const double d) {
452 DEBUG_ASSERT(road != nullptr); // 确保道路指针不为nullptr
453 // 将新的车道偏移信息添加到临时道路信息容器中
454 _temp_road_info_container[road].emplace_back(std::make_unique<RoadInfoLaneOffset>(s, a, b, c, d));
455 }
456
457// 添加道路几何弧形信息
459 Road *road,
460 const double s,
461 const double x,
462 const double y,
463 const double hdg,
464 const double length,
465 const double curvature) {
466 DEBUG_ASSERT(road != nullptr); // 确保道路指针不为nullptr
467 // 创建位置对象
468 //创建一个位置对象,表示弧形的起始点
469 const geom::Location location(static_cast<float>(x), static_cast<float>(y), 0.0f);
470 // 创建弧形几何对象
471 auto arc_geometry = std::make_unique<GeometryArc>(
472 s,
473 length,
474 hdg,
475 location,
476 curvature);
477
478 // 将新的道路几何信息(弧形)添加到临时道路信息容器中
479 _temp_road_info_container[road].emplace_back(std::unique_ptr<RoadInfo>(new RoadInfoGeometry(s,
480 std::move(arc_geometry))));
481 }
482
483// 添加道路几何螺旋形信息
485 Road * road,
486 const double s,
487 const double x,
488 const double y,
489 const double hdg,
490 const double length,
491 const double curvStart,
492 const double curvEnd) {
493 // throw_exception(std::runtime_error("geometry spiral not supported"));
494 DEBUG_ASSERT(road != nullptr); // 确保道路指针不为nullptr
495 // 创建位置对象
496 const geom::Location location(static_cast<float>(x), static_cast<float>(y), 0.0f);
497 // 创建螺旋几何对象
498 auto spiral_geometry = std::make_unique<GeometrySpiral>(
499 s,
500 length,
501 hdg,
502 location,
503 curvStart,
504 curvEnd);
505
506 // 将新的道路几何信息(螺旋)添加到临时道路信息容器中
507 _temp_road_info_container[road].emplace_back(std::unique_ptr<RoadInfo>(new RoadInfoGeometry(s,
508 std::move(spiral_geometry))));
509 }
510
511// 添加道路几何三次多项式信息
513 Road * road,
514 const double s,
515 const double x,
516 const double y,
517 const double hdg,
518 const double length,
519 const double a,
520 const double b,
521 const double c,
522 const double d) {
523 // throw_exception(std::runtime_error("geometry poly3 not supported"));
524 DEBUG_ASSERT(road != nullptr); // 确保 road 指针不为空
525const geom::Location location(static_cast<float>(x), static_cast<float>(y), 0.0f); // 创建一个位置对象,坐标为 (x, y),高度为 0.0f
526auto poly3_geometry = std::make_unique<GeometryPoly3>( // 创建一个 GeometryPoly3 对象的智能指针
527 s,
528 length,
529 hdg,
530 location,
531 a,
532 b,
533 c,
534 d);
535_temp_road_info_container[road].emplace_back(std::unique_ptr<RoadInfo>(new RoadInfoGeometry(s, // 将 RoadInfoGeometry 对象添加到临时道路信息容器中
536 std::move(poly3_geometry)))); // 移动 poly3_geometry 智能指针
537
538void MapBuilder::AddRoadGeometryParamPoly3( // 定义一个函数,用于添加参数化的三次曲线道路几何信息
539 Road * road, // 道路指针
540 const double s, // 曲线长度
541 const double x, // x 坐标
542 const double y, // y 坐标
543 const double hdg, // 航向角
544 const double length, // 道路长度
545 const double aU, // 参数 U 的系数 a
546 const double bU, // 参数 U 的系数 b
547 const double cU, // 参数 U 的系数 c
548 const double dU, // 参数 U 的系数 d
549 const double aV, // 参数 V 的系数 a
550 const double bV, // 参数 V 的系数 b
551 const double cV, // 参数 V 的系数 c
552 const double dV, // 参数 V 的系数 d
553 const std::string p_range) { // 参数范围类型
554 //throw_exception(std::runtime_error("geometry poly3 not supported")); // 抛出异常,表示不支持三次曲线几何(已注释)
555 bool arcLength; // 声明一个布尔变量,用于判断弧长
556 if(p_range == "arcLength"){ // 如果参数范围是弧长
557 arcLength = true; // 设置 arcLength 为 true
558 }else{ // 否则
559 arcLength = false; // 设置 arcLength 为 false
560 }
561 DEBUG_ASSERT(road != nullptr); // 确保 road 指针不为空
562 const geom::Location location(static_cast<float>(x), static_cast<float>(y), 0.0f); // 创建一个位置对象
563 auto parampoly3_geometry = std::make_unique<GeometryParamPoly3>( // 创建一个 GeometryParamPoly3 对象的智能指针
564 s,
565 length,
566 hdg,
567 location,
568 aU,
569 bU,
570 cU,
571 dU,
572 aV,
573 bV,
574 cV,
575 dV,
576 arcLength); // 将 arcLength 作为参数传入
577 _temp_road_info_container[road].emplace_back(std::unique_ptr<RoadInfo>(new RoadInfoGeometry(s, // 将 RoadInfoGeometry 对象添加到临时道路信息容器中
578 std::move(parampoly3_geometry)))); // 移动 parampoly3_geometry 智能指针
579
580void MapBuilder::AddJunction(const int32_t id, const std::string name) { // 定义一个函数,用于添加交叉口
581 _map_data.GetJunctions().emplace(id, Junction(id, name)); // 在地图数据中添加交叉口
582}
583
584void MapBuilder::AddConnection( // 定义一个函数,用于添加交叉口连接
585 const JuncId junction_id, // 交叉口 ID
586 const ConId connection_id, // 连接 ID
587 const RoadId incoming_road, // 输入道路 ID
588 const RoadId connecting_road) { // 连接道路 ID
589 DEBUG_ASSERT(_map_data.GetJunction(junction_id) != nullptr); // 确保交叉口存在
590 _map_data.GetJunction(junction_id)->GetConnections().emplace(connection_id, // 在交叉口中添加连接
591 Junction::Connection(connection_id, incoming_road, connecting_road)); // 创建连接对象并添加
592}
593
594void MapBuilder::AddLaneLink( // 定义一个函数,用于添加车道链接
595 const JuncId junction_id, // 交叉口 ID
596 const ConId connection_id, // 连接 ID
597 const LaneId from, // 起始车道 ID
598 const LaneId to) { // 目标车道 ID
599 DEBUG_ASSERT(_map_data.GetJunction(junction_id) != nullptr); // 确保交叉口存在
600 _map_data.GetJunction(junction_id)->GetConnection(connection_id)->AddLaneLink(from, to); // 添加车道链接
601}
602
603void MapBuilder::AddJunctionController( // 定义一个函数,用于添加交叉口控制器
604 const JuncId junction_id, // 交叉口 ID
605 std::set<road::ContId>&& controllers) { // 控制器集合
606 DEBUG_ASSERT(_map_data.GetJunction(junction_id) != nullptr); // 确保交叉口存在
607 _map_data.GetJunction(junction_id)->_controllers = std::move(controllers); // 移动控制器集合到交叉口
608}
609
611 const RoadId road_id,
612 const LaneId lane_id,
613 const double s) {
614 // 根据给定的道路ID、车道ID和距离s,获取车道的指针
615 return &_map_data.GetRoad(road_id).GetLaneByDistance(s, lane_id);
616}
617
619 const RoadId road_id) {
620 // 根据道路ID获取道路的指针
621 return &_map_data.GetRoad(road_id);
622}
623
624// 返回车道对象的指针
625Lane *MapBuilder::GetEdgeLanePointer(RoadId road_id, bool from_start, LaneId lane_id) {
626
627 // 检查地图数据中是否包含给定的道路ID
628 if (!_map_data.ContainsRoad(road_id)) {
629 return nullptr; // 如果不包含,返回空指针
630 }
631 Road &road = _map_data.GetRoad(road_id); // 获取对应的道路
632
633 // 获取车道段
634 LaneSection *section;
635 if (from_start) {
636 section = road.GetStartSection(lane_id); // 从起点获取车道段
637 } else {
638 section = road.GetEndSection(lane_id); // 从终点获取车道段
639 }
640
641 // 获取车道
642 DEBUG_ASSERT(section != nullptr); // 确保车道段不是空指针
643 return section->GetLane(lane_id); // 返回车道的指针
644}
645
646// 返回从指定车道出发的所有后续车道的指针列表(使用道路和交叉口信息)
647std::vector<Lane *> MapBuilder::GetLaneNext(
648 RoadId road_id,
649 SectionId section_id,
650 LaneId lane_id) {
651 std::vector<Lane *> result; // 存储结果的向量
652
653 // 检查地图数据中是否包含给定的道路ID
654 if (!_map_data.ContainsRoad(road_id)) {
655 return result; // 如果不包含,返回空列表
656 }
657 Road &road = _map_data.GetRoad(road_id); // 获取对应的道路
658
659 // 获取车道段
660 LaneSection &section = road._lane_sections.GetById(section_id);
661
662 // 获取车道
663 Lane *lane = section.GetLane(lane_id);
664 DEBUG_ASSERT(lane != nullptr); // 确保车道不是空指针
665
666 // 获取后继和前驱(道路和车道)
667 LaneId next;
668 RoadId next_road;
669 if (lane_id <= 0) {
670 next_road = road.GetSuccessor(); // 获取后继道路ID
671 next = lane->GetSuccessor(); // 获取后继车道ID
672 } else {
673 next_road = road.GetPredecessor(); // 获取前驱道路ID
674 next = lane->GetPredecessor(); // 获取前驱车道ID
675 }
676
677 // 检查后继是否是道路或交叉口
678 bool next_is_junction = !_map_data.ContainsRoad(next_road);
679 double s = section.GetDistance(); // 获取车道段的距离
680
681 // 检查是否在中间的车道段
682 if ((lane_id > 0 && s > 0) ||
683 (lane_id <= 0 && road._lane_sections.upper_bound(s) != road._lane_sections.end())) {
684 // 检查车道是否有后继链接(如果没有,说明它在中间段结束)
685 if (next != 0 || (lane_id == 0 && next == 0)) {
686 // 切换到下一个/上一个车道段
687 if (lane_id <= 0) {
688 result.push_back(road.GetNextLane(s, next)); // 获取下一个车道
689 } else {
690 result.push_back(road.GetPrevLane(s, next)); // 获取上一个车道
691 }
692 }
693 } else if (!next_is_junction) {
694 // 切换到另一条道路/交叉口
695 if (next != 0 || (lane_id == 0 && next == 0)) {
696 // 单一路段
697 result.push_back(GetEdgeLanePointer(next_road, (next <= 0), next)); // 获取边缘车道指针
698 }
699 } else {
700 // 多条道路(交叉口)
701
702 /// @todo 是否正确使用道路ID作为段ID?(NS: 我只是添加了这个强制转换以避免编译器警告)。
703 auto next_road_as_junction = static_cast<JuncId>(next_road);
704 auto options = GetJunctionLanes(next_road_as_junction, road_id, lane_id); // 获取交叉口车道
705 for (auto opt : options) {
706 result.push_back(GetEdgeLanePointer(opt.first, (opt.second <= 0), opt.second)); // 将选项添加到结果中
707 }
708 }
709
710 return result; // 返回车道指针列表
711}
712
713std::vector<std::pair<RoadId, LaneId>> MapBuilder::GetJunctionLanes(
714 JuncId junction_id,
715 RoadId road_id,
716 LaneId lane_id) {
717 std::vector<std::pair<RoadId, LaneId>> result; // 存储结果的向量
718
719 // 获取交叉口(具体实现未显示)
720 Junction *junction = _map_data.GetJunction(junction_id); // 根据 junction_id 获取交叉口指针
721if (junction == nullptr) { // 检查交叉口是否为空
722 return result; // 如果为空,返回结果
723}
724
725// 检查所有连接
726for (auto con : junction->_connections) { // 遍历交叉口的所有连接
727 // 仅处理与我们道路相关的连接
728 if (con.second.incoming_road == road_id) { // 如果 incoming_road 与 road_id 匹配
729 // 对于中心车道,连接车道 ID 始终为 0,不需要搜索,因为它不在交叉口中
730 if (lane_id == 0) { // 如果车道 ID 为 0
731 result.push_back(std::make_pair(con.second.connecting_road, 0)); // 将连接的道路和车道 ID 0 添加到结果中
732 } else { // 如果车道 ID 不为 0
733 // 检查所有车道链接
734 for (auto link : con.second.lane_links) { // 遍历连接的车道链接
735 // 是否是我们的车道 ID?
736 if (link.from == lane_id) { // 如果链接的起始车道等于当前车道 ID
737 // 添加为选项
738 result.push_back(std::make_pair(con.second.connecting_road, link.to)); // 将连接的道路和目标车道添加到结果中
739 }
740 }
741 }
742 }
743}
744
745return result; // 返回结果
746}
747
748// 为下一个车道分配指针
750 // 处理每个车道以定义其下一个车道
751 for (auto &road : _map_data._roads) { // 遍历地图数据中的所有道路
752 for (auto &section : road.second._lane_sections) { // 遍历每条道路的车道段
753 for (auto &lane : section.second._lanes) { // 遍历每个车道
754
755 // 分配下一个车道指针
756 lane.second._next_lanes = GetLaneNext(road.first, section.second._id, lane.first); // 获取下一个车道
757
758 // 将找到的每个车道添加为其前驱
759 for (auto next_lane : lane.second._next_lanes) { // 遍历下一个车道
760 // 添加为前驱
761 DEBUG_ASSERT(next_lane != nullptr); // 确保下一个车道不为空
762 next_lane->_prev_lanes.push_back(&lane.second); // 将当前车道添加到下一个车道的前驱列表中
763 }
764
765 }
766 }
767 }
768
769 // 处理每个车道以定义其下一个车道
770 for (auto &road : _map_data._roads) { // 遍历地图数据中的所有道路
771 for (auto &section : road.second._lane_sections) { // 遍历每条道路的车道段
772 for (auto &lane : section.second._lanes) { // 遍历每个车道
773
774 // 添加下一个道路
775 for (auto next_lane : lane.second._next_lanes) { // 遍历下一个车道
776 DEBUG_ASSERT(next_lane != nullptr); // 确保下一个车道不为空
777 // 避免同一路径
778 if (next_lane->GetRoad() != &road.second) { // 如果下一个车道的道路不是当前道路
779 if (std::find(road.second._nexts.begin(), road.second._nexts.end(),
780 next_lane->GetRoad()) == road.second._nexts.end()) { // 检查下一个道路是否已经存在于列表中
781 road.second._nexts.push_back(next_lane->GetRoad()); // 添加下一个道路
782 }
783 }
784 }
785
786 // 添加前驱道路
787 for (auto prev_lane : lane.second._prev_lanes) { // 遍历前驱车道
788 DEBUG_ASSERT(prev_lane != nullptr); // 确保前驱车道不为空
789 // 避免同一路径
790 if (prev_lane->GetRoad() != &road.second) { // 如果前驱车道的道路不是当前道路
791 if (std::find(road.second._prevs.begin(), road.second._prevs.end(),
792 prev_lane->GetRoad()) == road.second._prevs.end()) { // 检查前驱道路是否已经存在于列表中
793 road.second._prevs.push_back(prev_lane->GetRoad()); // 添加前驱道路
794 }
795 }
796 }
797
798 }
799 }
800 }
801}
802
803geom::Transform MapBuilder::ComputeSignalTransform(std::unique_ptr<Signal> &signal, MapData &data) {
804 DirectedPoint point = data.GetRoad(signal->_road_id).GetDirectedPointInNoLaneOffset(signal->_s); // 获取指定道路上的导向点
805 point.ApplyLateralOffset(static_cast<float>(-signal->_t)); // 应用横向偏移
806 point.location.y *= -1; // Unreal Y 轴修正
807 point.location.z += static_cast<float>(signal->_zOffset); // 应用 Z 轴偏移
808 geom::Transform transform(point.location, geom::Rotation( // 创建变换对象
809 geom::Math::ToDegrees(static_cast<float>(signal->_pitch)), // 转换并应用俯仰角
810 geom::Math::ToDegrees(static_cast<float>(-(point.tangent + signal->_hOffset))), // 转换并应用偏航角
811 geom::Math::ToDegrees(static_cast<float>(signal->_roll)))); // 转换并应用滚转角
812 return transform; // 返回变换对象
813}
814
816 // 遍历临时信号引用容器
817 for(auto signal_reference : _temp_signal_reference_container){
818 // 将信号引用的信号指针设置为临时信号容器中的信号
819 signal_reference->_signal =
820 _temp_signal_container[signal_reference->_signal_id].get();
821 }
822
823 // 遍历临时信号容器
824 for(auto& signal_pair : _temp_signal_container) {
825 auto& signal = signal_pair.second; // 获取信号对象
826 if (signal->_using_inertial_position) { // 如果使用惯性位置则跳过
827 continue;
828 }
829 // 计算信号变换
830 auto transform = ComputeSignalTransform(signal, _map_data);
831 // 如果信号类型是交通灯
832 if (SignalType::IsTrafficLight(signal->GetType())) {
833 // 调整交通灯位置
834 transform.location = transform.location +
835 geom::Location(transform.GetForwardVector()*0.25);
836 }
837 // 设置信号的变换属性
838 signal->_transform = transform;
839 }
840
841 // 移动临时信号容器到地图数据中
843
844 // 生成信号引用的默认有效性
846}
847
849 // 遍历地图数据中的所有交叉口
850 for(const auto& junction : _map_data._junctions) {
851 // 遍历每个交叉口的控制器
852 for(const auto& controller : junction.second._controllers) {
853 // 在地图数据中查找控制器
854 auto it = _map_data._controllers.find(controller);
855 if(it != _map_data._controllers.end()){ // 如果找到了控制器
856 if( it->second != nullptr ){ // 确保控制器不为空
857 // 将交叉口添加到控制器的交叉口集合中
858 it->second->_junctions.insert(junction.first);
859 // 遍历控制器管理的信号
860 for(const auto & signal : it->second->_signals) {
861 // 查找信号在地图数据中的位置
862 auto signal_it = _map_data._signals.find(signal);
863 if( signal_it->second != nullptr ){ // 确保信号不为空
864 // 将控制器添加到信号的控制器集合中
865 signal_it->second->_controllers.insert(controller);
866 }
867 }
868 }
869 }
870 }
871 }
872}
873
875 // 遍历地图中的所有交叉口
876 for (auto &junctionpair : map._data.GetJunctions()) {
877 auto* junction = map.GetJunction(junctionpair.first); // 获取交叉口对象
878 auto waypoints = map.GetJunctionWaypoints(junction->GetId(), Lane::LaneType::Any); // 获取交叉口的路径点
879 const int number_intervals = 10; // 定义分段数量
880
881 // 初始化最小和最大坐标
882 float minx = std::numeric_limits<float>::max();
883 float miny = std::numeric_limits<float>::max();
884 float minz = std::numeric_limits<float>::max();
885 float maxx = -std::numeric_limits<float>::max();
886 float maxy = -std::numeric_limits<float>::max();
887 float maxz = -std::numeric_limits<float>::max();
888
889 // 定义获取最小和最大坐标的Lambda函数
890 auto get_min_max = [&](geom::Location position) {
891 // 更新最小坐标
892 if (position.x < minx) {
893 minx = position.x;
894 }
895 if (position.y < miny) {
896 miny = position.y;
897 }
898 if (position.z < minz) {
899 minz = position.z;
900 }
901
902 // 更新最大坐标
903 if (position.x > maxx) {
904 maxx = position.x;
905 }
906 if (position.y > maxy) {
907 maxy = position.y;
908 }
909 if (position.z > maxz) {
910 maxz = position.z;
911 }
912 };
913
914 // 遍历所有路径点
915 for (auto &waypoint_p : waypoints) {
916 auto &waypoint_start = waypoint_p.first; // 起始路径点
917 auto &waypoint_end = waypoint_p.second; // 结束路径点
918 double interval = (waypoint_end.s - waypoint_start.s) / static_cast<double>(number_intervals); // 计算间隔
919 auto next_wp = waypoint_end; // 下一个路径点
920 auto location = map.ComputeTransform(next_wp).location; // 获取位置
921
922 // 更新最小和最大坐标
923 get_min_max(location);
924
925 next_wp = waypoint_start; // 重置下一个路径点
926 location = map.ComputeTransform(next_wp).location; // 获取位置
927
928 // 更新最小和最大坐标
929 get_min_max(location);
930
931 // 遍历分段
932 for (int i = 0; i < number_intervals; ++i) {
933 if (interval < std::numeric_limits<double>::epsilon()) // 如果间隔很小则跳出
934 break;
935 auto next = map.GetNext(next_wp, interval); // 获取下一个路径点
936 if(next.size()){ // 如果找到了下一个路径点
937 next_wp = next.back(); // 更新下一个路径点
938 }
939
940 location = map.ComputeTransform(next_wp).location; // 获取位置
941 get_min_max(location); // 更新最小和最大坐标
942 }
943 }
944 // 计算交叉口的中心位置和范围
945 carla::geom::Location location(0.5f * (maxx + minx), 0.5f * (maxy + miny), 0.5f * (maxz + minz));
946 carla::geom::Vector3D extent(0.5f * (maxx - minx), 0.5f * (maxy - miny), 0.5f * (maxz - minz));
947
948 // 设置交叉口的边界框
949 junction->_bounding_box = carla::geom::BoundingBox(location, extent);
950 }
951}
952
954 const ContId controller_id, // 控制器ID
955 const std::string controller_name, // 控制器名称
956 const uint32_t controller_sequence, // 控制器序列
957 const std::set<road::SignId>&& signals) { // 控制器管理的信号集合
958
959 // 将控制器添加到地图数据中
960 auto controller_pair = _map_data._controllers.emplace(
961 std::make_pair(
962 controller_id,
963 std::make_unique<Controller>(controller_id, controller_name, controller_sequence)));
964
965 DEBUG_ASSERT(controller_pair.first != _map_data._controllers.end()); // 确保控制器成功添加
966 DEBUG_ASSERT(controller_pair.first->second); // 确保控制器对象不为空
967
968 // 添加控制器管理的信号
969 controller_pair.first->second->_signals = std::move(signals);
970
971 // 将控制器ID添加到该控制器管理的信号中
972 auto& signals_map = _map_data._signals; // 获取信号映射
973 for(auto signal: signals) { // 遍历信号集合
974 auto it = signals_map.find(signal); // 查找信号
975 if(it != signals_map.end()) { // 如果找到信号
976 it->second->_controllers.insert(controller_id); // 将控制器添加到信号的控制器集合中
977 }
978 }
979}
980// 计算交叉口的道路冲突
982 // 遍历地图中的所有交叉口
983 for (auto &junctionpair : map._data.GetJunctions()) {
984 auto& junction = junctionpair.second; // 获取交叉口对象
985 // 储存在交叉口对象的_road_conflicts 属性中
986 junction._road_conflicts = (map.ComputeJunctionConflicts(junction.GetId())); // 计算交叉口的道路冲突
987 }
988}
989// 为信号参考生成默认的有效性
991 // 遍历临时信号引用容器
992 for (auto * signal_reference : _temp_signal_reference_container) {
993 if (signal_reference->_validities.size() == 0) { //检查信号参考是否有有效性
994 // 如果信号引用没有有效性
995 Road* road = GetRoad(signal_reference->GetRoadId()); // 获取信号引用所在的道路
996 auto lanes = road->GetLanesByDistance(signal_reference->GetS()); // 根据距离获取车道
997 switch (signal_reference->GetOrientation()) { // 根据信号的朝向进行处理
998 case SignalOrientation::Positive: { // 正向信号
999 LaneId min_lane = 1; // 最小车道ID初始化为1
1000 LaneId max_lane = 0; // 最大车道ID初始化为0
1001 for (const auto* lane : lanes) { // 遍历车道
1002 auto lane_id = lane->GetId(); // 获取车道ID
1003 if(lane_id > max_lane) { // 更新最大车道ID
1004 max_lane = lane_id;
1005 }
1006 }
1007 if(min_lane <= max_lane) { // 如果最小车道ID小于等于最大车道ID
1008 AddValidityToSignalReference(signal_reference, min_lane, max_lane); // 添加有效性
1009 }
1010 break;
1011 }
1012 case SignalOrientation::Negative: { // 反向信号
1013 LaneId min_lane = 0; // 最小车道ID初始化为0
1014 LaneId max_lane = -1; // 最大车道ID初始化为-1
1015 for (const auto* lane : lanes) { // 遍历车道
1016 auto lane_id = lane->GetId(); // 获取车道ID
1017 if(lane_id < min_lane) { // 更新最小车道ID
1018 min_lane = lane_id;
1019 }
1020 }
1021 if(min_lane <= max_lane) { // 如果最小车道ID小于等于最大车道ID
1022 AddValidityToSignalReference(signal_reference, min_lane, max_lane); // 添加有效性
1023 }
1024 break;
1025 }
1026 case SignalOrientation::Both: { // 双向信号
1027 // 获取正向车道
1028 LaneId min_lane = 1; // 最小车道ID初始化为1
1029 LaneId max_lane = 0; // 最大车道ID初始化为0
1030 for (const auto* lane : lanes) { // 遍历车道
1031 auto lane_id = lane->GetId(); // 获取车道ID
1032 if(lane_id > max_lane) { // 更新最大车道ID
1033 max_lane = lane_id;
1034 }
1035 }
1036 if(min_lane <= max_lane) { // 如果最小车道ID小于等于最大车道ID
1037 AddValidityToSignalReference(signal_reference, min_lane, max_lane); // 添加有效性
1038 }
1039
1040 // 获取反向车道
1041 min_lane = 0; // 初始化最小车道 ID 为 0
1042max_lane = -1; // 初始化最大车道 ID 为 -1
1043
1044for (const auto* lane : lanes) { // 遍历所有车道
1045 auto lane_id = lane->GetId(); // 获取当前车道的 ID
1046 if(lane_id < min_lane) { // 如果当前车道 ID 小于最小车道 ID
1047 min_lane = lane_id; // 更新最小车道 ID
1048 }
1049}
1050
1051if(min_lane <= max_lane) { // 如果最小车道 ID 小于等于最大车道 ID
1052 AddValidityToSignalReference(signal_reference, min_lane, max_lane); // 添加信号参考的有效性
1053}
1054break; // 跳出当前循环
1055}
1056}
1057}
1058
1059void MapBuilder::RemoveZeroLaneValiditySignalReferences() { // 定义移除零车道有效性信号引用的函数
1060 std::vector<element::RoadInfoSignal*> elements_to_remove; // 存储待移除的信号元素
1061 for (auto * signal_reference : _temp_signal_reference_container) { // 遍历临时信号引用容器
1062 bool should_remove = true; // 标记是否应移除
1063 for (auto & lane_validity : signal_reference->_validities) { // 遍历信号引用的有效性
1064 if ( (lane_validity._from_lane != 0) || // 如果起始车道不为 0
1065 (lane_validity._to_lane != 0)) { // 或者结束车道不为 0
1066 should_remove = false; // 不应移除
1067 break; // 跳出当前循环
1068 }
1069 }
1070 if (signal_reference->_validities.size() == 0) { // 如果有效性列表为空
1071 should_remove = false; // 不应移除
1072 }
1073
1074 if (should_remove) { // 如果标记为应移除
1075 elements_to_remove.push_back(signal_reference); // 添加到待移除列表
1076 }
1077 }
1078
1079 for (auto* element : elements_to_remove) { // 遍历待移除的元素
1080 auto road_id = element->GetRoadId(); // 获取道路 ID
1081 auto& road_info = _temp_road_info_container[GetRoad(road_id)]; // 获取与该道路相关的信息
1082 road_info.erase(std::remove_if(road_info.begin(), road_info.end(), // 移除信号元素
1083 [=] (auto& info_ptr) {
1084 return (info_ptr.get() == element); // 如果指针指向当前元素,则移除
1085 }), road_info.end());
1086 _temp_signal_reference_container.erase(std::remove(_temp_signal_reference_container.begin(), // 从临时信号引用容器中移除
1087 _temp_signal_reference_container.end(), element),
1089 }
1090}
1091
1092void MapBuilder::CheckSignalsOnRoads(Map &map) { // 定义检查道路上信号的函数
1093 for (auto& signal_pair : map._data._signals) { // 遍历地图中的所有信号
1094 auto& signal = signal_pair.second; // 获取信号对象
1095 auto signal_position = signal->GetTransform().location; // 获取信号的位置
1096 auto signal_rotation = signal->GetTransform().rotation; // 获取信号的旋转信息
1097 auto closest_waypoint_to_signal = // 获取离信号最近的路点
1098 map.GetClosestWaypointOnRoad(signal_position,
1099 static_cast<int32_t>(carla::road::Lane::LaneType::Shoulder) | static_cast<int32_t>(carla::road::Lane::LaneType::Driving));
1100
1101 // 工作绕过以避免移动 stencil stop
1102 if (
1103 signal->GetName().find("Stencil_STOP") != std::string::npos || // 如果信号名称包含 "Stencil_STOP"
1104 signal->GetName().find("STATIC") != std::string::npos || // 或者包含 "STATIC"
1105 signal->_using_inertial_position) { // 或使用惯性位置
1106 continue; // 跳过此次循环
1107 }
1108
1109 if(closest_waypoint_to_signal) { // 如果找到了最近的路点
1110 auto road_transform = map.ComputeTransform(closest_waypoint_to_signal.get()); // 计算路点的变换
1111 auto distance_to_road = (road_transform.location - signal_position).Length(); // 计算信号与路的距离
1112 double lane_width = map.GetLaneWidth(closest_waypoint_to_signal.get()); // 获取车道宽度
1113 int displacement_direction = 1; // 初始化位移方向为 1
1114 int iter = 0; // 初始化迭代次数
1115 int MaxIter = 10; // 设置最大迭代次数为 10
1116
1117 // 移动信号直到找到合适的位置
1118 while(distance_to_road < (lane_width * 0.7) && iter < MaxIter && displacement_direction != 0) {
1119 if(iter == 0) { // 如果是第一次迭代
1120 log_debug("Traffic sign", // 记录调试信息
1121 signal->GetSignalId(),
1122 "overlaps a driving lane. Moving out of the road...");
1123 }
1124
1125 auto right_waypoint = map.GetRight(closest_waypoint_to_signal.get()); // 获取信号右侧的路点
1126auto right_lane_type = (right_waypoint) ?
1127 map.GetLaneType(right_waypoint.get()) :
1128 carla::road::Lane::LaneType::None; // 获取右侧车道类型,如果没有路点则为 None
1129
1130auto left_waypoint = map.GetLeft(closest_waypoint_to_signal.get()); // 获取信号左侧的路点
1131auto left_lane_type = (left_waypoint) ?
1132 map.GetLaneType(left_waypoint.get()) :
1133 carla::road::Lane::LaneType::None; // 获取左侧车道类型,如果没有路点则为 None
1134
1135if (right_lane_type != carla::road::Lane::LaneType::Driving) { // 如果右侧车道不是行驶车道
1136 displacement_direction = 1; // 设置位移方向为 1(向右)
1137} else if (left_lane_type != carla::road::Lane::LaneType::Driving) { // 如果左侧车道不是行驶车道
1138 displacement_direction = -1; // 设置位移方向为 -1(向左)
1139} else {
1140 displacement_direction = 0; // 如果两侧都是行驶车道,设置位移方向为 0(不移动)
1141}
1142
1143geom::Vector3D displacement = 1.f*(road_transform.GetRightVector()) * // 计算位移向量
1144 static_cast<float>(abs(lane_width)) * 0.2f; // 使用车道宽度的绝对值乘以 0.2
1145
1146signal_position += (displacement * displacement_direction); // 根据位移方向更新信号的位置
1147signal_rotation = road_transform.rotation; // 更新信号的旋转信息为道路的旋转信息
1148closest_waypoint_to_signal = // 获取更新后信号位置最近的路点
1149 map.GetClosestWaypointOnRoad(signal_position,
1150 static_cast<int32_t>(carla::road::Lane::LaneType::Shoulder) | static_cast<int32_t>(carla::road::Lane::LaneType::Driving));
1151
1152distance_to_road = // 计算信号与最近路点之间的距离
1153 (map.ComputeTransform(closest_waypoint_to_signal.get()).location -
1154 signal_position).Length(); // 计算两者间的长度
1155lane_width = map.GetLaneWidth(closest_waypoint_to_signal.get()); // 获取最近路点所在车道的宽度
1156iter++; // 增加迭代次数
1157}
1158
1159if(iter == MaxIter) { // 如果达到最大迭代次数
1160 log_debug("Failed to find suitable place for signal."); // 记录无法找到合适位置的调试信息
1161} else {
1162 // 只有在找到合适位置时才进行位移
1163 signal->_transform.location = signal_position; // 更新信号的位置
1164 signal->_transform.rotation = signal_rotation; // 更新信号的旋转信息
1165 }
1166 }
1167 }
1168 }
1169
1170} // namespace road
1171} // namespace carla
#define DEBUG_ASSERT(predicate)
Definition Debug.h:68
#define RELEASE_ASSERT(pred)
Definition Debug.h:94
地图类的前向声明,用于在LaneInvasionSensor类中可能的引用。
static void ToLower(WritableRangeT &str)
Definition StringUtil.h:40
static T Clamp(T a, T min=T(0), T max=T(1))
Definition Math.h:54
static constexpr T ToDegrees(T rad)
Definition Math.h:40
carla::geom::BoundingBox _bounding_box
JuncId GetId() const
std::unordered_map< RoadId, std::unordered_set< RoadId > > _road_conflicts
Connection * GetConnection(ConId id)
std::set< ContId > _controllers
std::unordered_map< ConId, Connection > & GetConnections()
LaneSection & Emplace(SectionId id, double s)
LaneSection & GetById(SectionId id)
double GetDistance() const
Lane * GetLane(const LaneId id)
std::map< LaneId, Lane > _lanes
Definition LaneSection.h:61
const SectionId _id
Definition LaneSection.h:55
LaneId _successor
Definition Lane.h:136
std::vector< Lane * > _next_lanes
Definition Lane.h:140
LaneId _predecessor
Definition Lane.h:138
LaneType
可以作为标志使用
Definition Lane.h:29
LaneId GetPredecessor() const
Definition Lane.h:102
LaneId GetSuccessor() const
Definition Lane.h:98
LaneSection * _lane_section
Definition Lane.h:126
LaneId GetId() const
LaneType _type
Definition Lane.h:132
std::unordered_map< SignId, std::unique_ptr< Signal > > _temp_signal_container
Definition MapBuilder.h:418
void AddRoadGeometryArc(carla::road::Road *road, const double s, const double x, const double y, const double hdg, const double length, const double curvature)
void CreateController(const ContId controller_id, const std::string controller_name, const uint32_t controller_sequence, const std::set< road::SignId > &&signals)
carla::road::Lane * AddRoadSectionLane(carla::road::LaneSection *section, const LaneId lane_id, const uint32_t lane_type, const bool lane_level, const LaneId predecessor, const LaneId successor)
void AddSignalPositionRoad(const SignId signal_id, const RoadId road_id, const double s, const double t, const double zOffset, const double hOffset, const double pitch, const double roll)
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 CreateRoadSpeed(Road *road, const double s, const std::string type, const double max, const std::string unit)
carla::road::Road * AddRoad(const RoadId road_id, const std::string name, const double length, const JuncId junction_id, const RoadId predecessor, const RoadId successor)
void CreateSectionOffset(Road *road, const double s, const double a, const double b, const double c, const double d)
void AddJunctionController(const JuncId junction_id, std::set< ContId > &&controllers)
carla::road::LaneSection * AddRoadSection(carla::road::Road *road, const SectionId id, const double s)
void CreateLaneAccess(Lane *lane, const double s, const std::string restriction)
void AddRoadObjectCrosswalk(Road *road, const std::string name, const double s, const double t, const double zOffset, const double hdg, const double pitch, const double roll, const std::string orientation, const double width, const double length, const std::vector< road::element::CrosswalkPoint > points)
void CreateLaneHeight(Lane *lane, const double s, const double inner, const double outer)
geom::Transform ComputeSignalTransform(std::unique_ptr< Signal > &signal, MapData &data)
Lane * GetLane(const RoadId road_id, const LaneId lane_id, const double s)
void CreateLaneBorder(Lane *lane, const double s, const double a, const double b, const double c, const double d)
void ComputeJunctionRoadConflicts(Map &map)
Compute the conflicts of the roads (intersecting roads) // 计算道路冲突(相交道路)
void AddValidityToSignalReference(element::RoadInfoSignal *signal_reference, const LaneId from_lane, const LaneId to_lane)
void CreateLaneRule(Lane *lane, const double s, const std::string value)
void SolveControllerAndJuntionReferences()
Solve the references between Controllers and Juntions // 解决控制器和交叉口之间的引用
void AddRoadElevationProfile(Road *road, const double s, const double a, const double b, const double c, const double d)
boost::optional< Map > Build()
void AddJunction(const JuncId id, const std::string name)
void CreateLaneSpeed(Lane *lane, const double s, const double max, const std::string unit)
std::unordered_map< Road *, std::vector< std::unique_ptr< element::RoadInfo > > > _temp_road_info_container
Map to temporary store all the road and lane infos until the map is // 用于临时存储所有道路和车道信息,直到地图构建完成,因此可以一...
Definition MapBuilder.h:412
void AddLaneLink(const JuncId junction_id, const ConId connection_id, const LaneId from, const LaneId to)
void AddDependencyToSignal(const SignId signal_id, const std::string dependency_id, const std::string dependency_type)
void AddRoadGeometryParamPoly3(carla::road::Road *road, const double s, const double x, const double y, const double hdg, const double length, const double aU, const double bU, const double cU, const double dU, const double aV, const double bV, const double cV, const double dV, const std::string p_range)
std::vector< std::pair< RoadId, LaneId > > GetJunctionLanes(JuncId junction_id, RoadId road_id, LaneId lane_id)
void RemoveZeroLaneValiditySignalReferences()
Removes signal references with lane validity equal to [0,0] // 移除车道有效性等于[0,0]的信号引用 as they have no ef...
void CreateRoadMarkTypeLine(Lane *lane, const int road_mark_id, const double length, const double space, const double tOffset, const double s, const std::string rule, const double width)
void CreateJunctionBoundingBoxes(Map &map)
Create the bounding boxes of each junction // 创建每个交叉口的边界框
element::RoadInfoSignal * AddSignalReference(Road *road, const SignId signal_id, const double s_position, const double t_position, const std::string signal_reference_orientation)
std::unordered_map< Lane *, std::vector< std::unique_ptr< element::RoadInfo > > > _temp_lane_info_container
Definition MapBuilder.h:415
std::vector< element::RoadInfoSignal * > _temp_signal_reference_container
Definition MapBuilder.h:420
void AddRoadGeometryPoly3(carla::road::Road *road, const double s, const double x, const double y, const double hdg, const double length, const double a, const double b, const double c, const double d)
void GenerateDefaultValiditiesForSignalReferences()
Generates a default validity field for signal references with missing validity record in OpenDRIVE //...
void AddConnection(const JuncId junction_id, const ConId connection_id, const RoadId incoming_road, const RoadId connecting_road)
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)
void CreateRoadMark(Lane *lane, const int road_mark_id, const double s, const std::string type, const std::string weight, const std::string color, const std::string material, const double width, const std::string lane_change, const double height, const std::string type_name, const double type_width)
std::vector< Lane * > GetLaneNext(RoadId road_id, SectionId section_id, LaneId lane_id)
Return a list of pointers to all lanes from a lane (using road and // 返回从某车道到所有车道的指针列表(使用道路和 junction...
void CreateLaneWidth(Lane *lane, const double s, const double a, const double b, const double c, const double d)
void SolveSignalReferencesAndTransforms()
Solves the signal references in the road // 解决道路中的信号引用
void CreateLaneVisibility(Lane *lane, const double s, const double forward, const double back, const double left, const double right)
void CreatePointersBetweenRoadSegments()
Create the pointers between RoadSegments based on the ids. // 根据标识符创建道路段之间的指针
Road * GetRoad(const RoadId road_id)
void CreateLaneMaterial(Lane *lane, const double s, const std::string surface, const double friction, const double roughness)
void CheckSignalsOnRoads(Map &map)
Checks signals overlapping driving lanes and emits a warning // 检查重叠驾驶车道的信号并发出警告
void AddRoadGeometrySpiral(carla::road::Road *road, const double s, const double x, const double y, const double hdg, const double length, const double curvStart, const double curvEnd)
void AddRoadGeometryLine(carla::road::Road *road, const double s, const double x, const double y, const double hdg, const double length)
Lane * GetEdgeLanePointer(RoadId road_id, bool from_start, LaneId lane_id)
Return the pointer to a lane object. // 返回车道对象的指针
std::unordered_map< RoadId, Road > _roads
Definition MapData.h:94
Road & GetRoad(const RoadId id)
Definition MapData.cpp:21
std::unordered_map< ContId, std::unique_ptr< Controller > > _controllers
Definition MapData.h:100
bool ContainsRoad(RoadId id) const
Definition MapData.h:48
std::unordered_map< JuncId, Junction > & GetJunctions()
Definition MapData.cpp:17
Junction * GetJunction(JuncId id)
Definition MapData.cpp:29
std::unordered_map< SignId, std::unique_ptr< Signal > > _signals
Definition MapData.h:98
MapData * _map_data
Definition Road.h:183
RoadId GetPredecessor() const
double GetLength() const
Lane * GetPrevLane(const double s, const LaneId lane_id)
double _length
Definition Road.h:189
JuncId _junction_id
Definition Road.h:193
LaneSectionMap _lane_sections
Definition Road.h:195
RoadId GetSuccessor() const
std::vector< Road * > _nexts
Definition Road.h:203
std::vector< Road * > _prevs
Definition Road.h:205
RoadId GetId() const
LaneSection * GetStartSection(LaneId id)
获取给定车道 ID 的起始车道段
Lane * GetNextLane(const double s, const LaneId lane_id)
bool _is_junction
Definition Road.h:191
Lane & GetLaneByDistance(double s, LaneId lane_id)
std::vector< Lane * > GetLanesByDistance(double s)
在特定的 s 值获取所有车道
RoadId _successor
Definition Road.h:197
element::DirectedPoint GetDirectedPointInNoLaneOffset(const double s) const
返回指定距离的中心点(车道 0)的导向点,不考虑车道偏移
LaneSection * GetEndSection(LaneId id)
获取给定车道 ID 的结束车道段
std::string _name
Definition Road.h:187
RoadId _predecessor
Definition Road.h:199
static bool IsTrafficLight(const std::string &type)
std::vector< LaneValidity > _validities
SignalOrientation GetOrientation() const
uint32_t SectionId
Definition RoadTypes.h:29
int32_t JuncId
Definition RoadTypes.h:23
std::string ContId
Definition RoadTypes.h:41
int32_t LaneId
Definition RoadTypes.h:26
uint32_t RoadId
Definition RoadTypes.h:20
std::string SignId
Definition RoadTypes.h:35
uint32_t ConId
Definition RoadTypes.h:38
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static void log_debug(Args &&... args)
Definition Logging.h:71
void AddLaneLink(LaneId from, LaneId to)
void ApplyLateralOffset(float lateral_offset)
Definition Geometry.cpp:45