CARLA
 
载入中...
搜索中...
未找到
Road.h
浏览该文件的文档.
1// Copyright (c) 2020 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#pragma once
8
9#include "carla/geom/Mesh.h" // 引入 Mesh 类的定义
10#include "carla/Iterator.h" // 引入 Iterator 类的定义
11#include "carla/ListView.h" // 引入 ListView 类的定义
12#include "carla/NonCopyable.h" // 引入 NonCopyable 类的定义
13#include "carla/road/element/Geometry.h" // 引入 Geometry 相关元素的定义
14#include "carla/road/element/RoadInfo.h" // 引入 RoadInfo 的定义
15#include "carla/road/InformationSet.h" // 引入 InformationSet 的定义
16#include "carla/road/Junction.h" // 引入 Junction 类的定义
17#include "carla/road/LaneSection.h" // 引入 LaneSection 类的定义
18#include "carla/road/LaneSectionMap.h" // 引入 LaneSectionMap 的定义
19#include "carla/road/RoadElementSet.h" // 引入 RoadElementSet 的定义
20#include "carla/road/RoadTypes.h" // 引入 RoadTypes 的定义
21
22#include <unordered_map> // 引入 unordered_map
23#include <vector> // 引入 vector
24
25namespace carla {
26namespace road {
27
28 class MapData; // 前向声明 MapData 类
29 class Elevation; // 前向声明 Elevation 类
30 class MapBuilder; // 前向声明 MapBuilder 类
31
32 class Road : private MovableNonCopyable { // 定义 Road 类,继承自 MovableNonCopyable
33 public:
34
35 Road() = default; // 默认构造函数
36
37 const MapData* GetMap() const; // 获取地图数据的指针
38
39 RoadId GetId() const; // 获取路段 ID
40
41 std::string GetName() const; // 获取路段名称
42
43 double GetLength() const; // 获取路段长度
44
45 bool IsJunction() const; // 判断是否为交叉口
46
47 JuncId GetJunctionId() const; // 获取交叉口 ID
48
49 Lane& GetLaneByDistance(double s, LaneId lane_id); // 根据距离和车道 ID 获取车道引用
50
51 const Lane& GetLaneByDistance(double s, LaneId lane_id) const; // 根据距离和车道 ID 获取常量车道引用
52
53 /// 在特定的 s 值获取所有车道
54 std::vector<Lane*> GetLanesByDistance(double s); // 返回在指定距离的车道指针
55
56 std::vector<const Lane*> GetLanesByDistance(double s) const; // 返回在指定距离的常量车道指针
57
58 RoadId GetSuccessor() const; // 获取下一个路段 ID
59
60 RoadId GetPredecessor() const; // 获取前一个路段 ID
61
62 Lane& GetLaneById(SectionId section_id, LaneId lane_id); // 根据区段 ID 和车道 ID 获取车道引用
63
64 const Lane& GetLaneById(SectionId section_id, LaneId lane_id) const; // 根据区段 ID 和车道 ID 获取常量车道引用
65
66 Lane* GetNextLane(const double s, const LaneId lane_id); // 获取下一个车道指针
67
68 Lane* GetPrevLane(const double s, const LaneId lane_id); // 获取前一个车道指针
69
70 /// 获取给定车道 ID 的起始车道段
71 LaneSection* GetStartSection(LaneId id); // 根据车道 ID 获取起始车道段指针
72
73 /// 获取给定车道 ID 的结束车道段
74 LaneSection* GetEndSection(LaneId id); // 根据车道 ID 获取结束车道段指针
75
76 std::vector<Road*> GetNexts() const; // 获取所有下一个路段的指针
77
78 std::vector<Road*> GetPrevs() const; // 获取所有前一个路段的指针
79
80 const geom::CubicPolynomial& GetElevationOn(const double s) const; // 获取指定距离点的高程信息
81
82 /// 返回指定距离的中心点(车道 0)的导向点
83 /// - @param s 距离路段的距离来计算点
84 element::DirectedPoint GetDirectedPointIn(const double s) const; // 返回带有车道偏移和高程记录的导向点
85
86 /// 返回指定距离的中心点(车道 0)的导向点,不考虑车道偏移
87 /// - @param s 距离路段的距离来计算点
88 element::DirectedPoint GetDirectedPointInNoLaneOffset(const double s) const; // 返回不考虑车道偏移的导向点
89
90 /// 返回一个包含以下内容的对:
91 /// - @b first: 从路段开始到最近点的距离(s)
92 /// - @b second: 从此路段最近点到 p 的欧几里得距离
93 /// @param loc 要计算距离的点
94 const std::pair<double, double> GetNearestPoint(
95 const geom::Location& loc) const; // 获取到最近点的距离和欧几里得距离的对
96
97 /// 返回最近的车道指针,给定相对于路段的 s 值和位置
98 /// @param dist 从路段起点到要计算的点的距离
99 /// @param loc 要计算距离的点
100 const std::pair<const Lane*, double> GetNearestLane(
101 const double s,
102 const geom::Location& loc,
103 uint32_t type = static_cast<uint32_t>(Lane::LaneType::Any)) const; // 获取最近车道及其距离的对
104
105 template <typename T>
106 const T* GetInfo(const double s) const { // 模板函数,根据距离获取信息指针
107 return _info.GetInfo<T>(s);
108 }
109
110 template <typename T>
111 std::vector<const T*> GetInfos() const { // 模板函数,获取所有信息的常量指针
112 return _info.GetInfos<T>();
113 }
114 template <typename T>
115 std::vector<const T*> GetInfosInRange(const double min_s, const double max_s) const {
116 // 在指定范围内获取信息,并返回常量指针的向量
117 return _info.GetInfos<T>(min_s, max_s);
118 }
119
120 auto GetLaneSections() const {
121 // 获取车道段并返回一个视图
122 return MakeListView(
123 iterator::make_map_values_const_iterator(_lane_sections.begin()), // 从开始迭代器创建常量值迭代器
124 iterator::make_map_values_const_iterator(_lane_sections.end())); // 到结束迭代器创建常量值迭代器
125 }
126
127 private:
128
129 template <typename MultiMapT>
130 static auto GetLessEqualRange(MultiMapT& map, double s) {
131 // 获取小于等于给定 s 值的范围
132 if (map.find(s) == map.end()) { // 如果 s 不在地图中
133 auto it = map.lower_bound(s); // 找到第一个大于 s 的迭代器
134 if (it == map.begin()) { // 如果它是第一个元素
135 return std::make_pair(map.end(), map.end()); // 返回结束迭代器的对
136 }
137 s = (--it)->first; // 向前移动一次,获取小于等于 s 的值
138 }
139 return std::make_pair(map.lower_bound(s), map.upper_bound(s)); // 返回小于等于和大于 s 的范围
140 }
141
142 public:
143
144 auto GetLaneSectionsAt(const double s) {
145 // 获取在给定 s 位置的车道段
146 auto pair = GetLessEqualRange(_lane_sections, s); // 获取小于等于 s 的范围
147 return MakeListView(
148 iterator::make_map_values_iterator(pair.first), // 创建值迭代器视图
149 iterator::make_map_values_iterator(pair.second)); // 创建值迭代器视图
150 }
151
152 auto GetLaneSectionsAt(const double s) const {
153 // 获取在给定 s 位置的车道段(常量版本)
154 auto pair = GetLessEqualRange(_lane_sections, s); // 获取小于等于 s 的范围
155 return MakeListView(
156 iterator::make_map_values_const_iterator(pair.first), // 创建常量值迭代器视图
157 iterator::make_map_values_const_iterator(pair.second)); // 创建常量值迭代器视图
158 }
159
161 // 根据 ID 获取车道段引用
162 return _lane_sections.GetById(id);
163 }
164
166 // 根据 ID 获取车道段的常量引用
167 return _lane_sections.GetById(id);
168 }
169
170 /// 返回上限 s,即给定 s 位置的车道段结束距离(限制在路段长度内)。
171 double UpperBound(double s) const {
172 auto it = _lane_sections.upper_bound(s); // 获取大于 s 的第一个迭代器
173 return it != _lane_sections.end() ? it->first : _length; // 如果找到,返回其值;否则返回路段长度
174 }
175
176 /// 获取在给定 s 位置的所有车道
177 std::map<LaneId, const Lane*> GetLanesAt(const double s) const;
178
179 private:
180
181 friend MapBuilder; // 声明 MapBuilder 为友元类
182
183 MapData* _map_data{ nullptr }; // 地图数据指针,初始化为 nullptr
184
185 RoadId _id{ 0 }; // 路段 ID,初始化为 0
186
187 std::string _name; // 路段名称
188
189 double _length{ 0.0 }; // 路段长度,初始化为 0.0
190
191 bool _is_junction{ false }; // 是否为交叉口,初始化为 false
192
193 JuncId _junction_id{ -1 }; // 交叉口 ID,初始化为 -1
194
195 LaneSectionMap _lane_sections; // 车道段映射
196
197 RoadId _successor{ 0 }; // 下一个路段 ID,初始化为 0
198
199 RoadId _predecessor{ 0 }; // 前一个路段 ID,初始化为 0
200
201 InformationSet _info; // 信息集合
202
203 std::vector<Road*> _nexts; // 下一个路段的指针向量
204
205 std::vector<Road*> _prevs; // 前一个路段的指针向量
206 };
207} // road
208} // carla
这个类用于禁止拷贝构造函数和赋值操作,但允许移动构造函数和赋值操作
定义一个三次多项式CubicPolynomial类,用于描述和计算三次多项式 f(x) = a + b * x + c * x^2 + d * x^3
const T * GetInfo(const double s) const
返回给定类型和距离s的单一信息
std::vector< const T * > GetInfos() const
返回从道路起点给定类型的所有信息
LaneSection & GetById(SectionId id)
std::vector< const T * > GetInfos() const
Definition Road.h:111
MapData * _map_data
Definition Road.h:183
std::vector< const T * > GetInfosInRange(const double min_s, const double max_s) const
Definition Road.h:115
RoadId GetPredecessor() const
double GetLength() const
const std::pair< double, double > GetNearestPoint(const geom::Location &loc) const
返回一个包含以下内容的对:
std::vector< Road * > GetPrevs() const
static auto GetLessEqualRange(MultiMapT &map, double s)
Definition Road.h:130
Lane * GetPrevLane(const double s, const LaneId lane_id)
const T * GetInfo(const double s) const
Definition Road.h:106
double _length
Definition Road.h:189
std::vector< const Lane * > GetLanesByDistance(double s) const
JuncId _junction_id
Definition Road.h:193
Lane & GetLaneById(SectionId section_id, LaneId lane_id)
InformationSet _info
Definition Road.h:201
double UpperBound(double s) const
返回上限 s,即给定 s 位置的车道段结束距离(限制在路段长度内)。
Definition Road.h:171
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
std::map< LaneId, const Lane * > GetLanesAt(const double s) const
获取在给定 s 位置的所有车道
std::vector< Road * > GetNexts() const
LaneSection * GetStartSection(LaneId id)
获取给定车道 ID 的起始车道段
const Lane & GetLaneById(SectionId section_id, LaneId lane_id) const
friend MapBuilder
Definition Road.h:181
Lane * GetNextLane(const double s, const LaneId lane_id)
auto GetLaneSections() const
Definition Road.h:120
bool _is_junction
Definition Road.h:191
const geom::CubicPolynomial & GetElevationOn(const double s) const
Lane & GetLaneByDistance(double s, LaneId lane_id)
auto GetLaneSectionsAt(const double s)
Definition Road.h:144
const std::pair< const Lane *, double > GetNearestLane(const double s, const geom::Location &loc, uint32_t type=static_cast< uint32_t >(Lane::LaneType::Any)) const
返回最近的车道指针,给定相对于路段的 s 值和位置
auto GetLaneSectionsAt(const double s) const
Definition Road.h:152
element::DirectedPoint GetDirectedPointIn(const double s) const
返回指定距离的中心点(车道 0)的导向点
std::vector< Lane * > GetLanesByDistance(double s)
在特定的 s 值获取所有车道
RoadId _successor
Definition Road.h:197
const LaneSection & GetLaneSectionById(SectionId id) const
Definition Road.h:165
element::DirectedPoint GetDirectedPointInNoLaneOffset(const double s) const
返回指定距离的中心点(车道 0)的导向点,不考虑车道偏移
JuncId GetJunctionId() const
LaneSection * GetEndSection(LaneId id)
获取给定车道 ID 的结束车道段
std::string GetName() const
std::string _name
Definition Road.h:187
RoadId _predecessor
Definition Road.h:199
const Lane & GetLaneByDistance(double s, LaneId lane_id) const
const MapData * GetMap() const
bool IsJunction() const
LaneSection & GetLaneSectionById(SectionId id)
Definition Road.h:160
static auto make_map_values_iterator(It it)
创建一个迭代器,该迭代器提供对map值的非const引用的遍历。
Definition Iterator.h:51
static auto make_map_values_const_iterator(It it)
创建一个迭代器,该迭代器提供对map值的const引用的遍历。
Definition Iterator.h:61
uint32_t SectionId
Definition RoadTypes.h:29
int32_t JuncId
Definition RoadTypes.h:23
int32_t LaneId
Definition RoadTypes.h:26
uint32_t RoadId
Definition RoadTypes.h:20
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static auto MakeListView(Iterator begin, Iterator end)