CARLA
 
载入中...
搜索中...
未找到
road/Map.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/geom/Rtree.h" // 包含R树类的定义
11#include "carla/geom/Transform.h" // 包含Transform类的定义
12#include "carla/NonCopyable.h" // 包含不可复制类的定义
13#include "carla/road/element/LaneMarking.h" // 包含车道标记类的定义
14#include "carla/road/element/RoadInfoMarkRecord.h" // 包含道路信息标记记录类的定义
15#include "carla/road/element/Waypoint.h" // 包含路径点类的定义
16#include "carla/road/MapData.h" // 包含地图数据类的定义
17#include "carla/road/RoadTypes.h" // 包含道路类型的定义
18#include "carla/road/MeshFactory.h" // 包含网格工厂类的定义
19#include "carla/geom/Vector3D.h" // 包含三维向量类的定义
20#include "carla/rpc/OpendriveGenerationParameters.h" // 包含OpenDrive生成参数的定义
21
22#include <boost/optional.hpp> // 包含可选类型的定义
23
24#include <vector> // 包含向量类的定义
25
26namespace carla {
27namespace road {
28
29 class Map : private MovableNonCopyable { // 地图类,禁止复制
30 public:
31
32 using Waypoint = element::Waypoint; // 定义Waypoint为element::Waypoint的别名
33
34 /// ========================================================================
35 /// -- Constructor ---------------------------------------------------------
36 /// ========================================================================
37
38 Map(MapData m) : _data(std::move(m)) { // 构造函数,初始化_map数据
39 CreateRtree(); // 创建R树
40 }
41
42 /// ========================================================================
43 /// -- Georeference --------------------------------------------------------
44 /// ========================================================================
45
46 const geom::GeoLocation &GetGeoReference() const { // 获取地理参考
47 return _data.GetGeoReference(); // 返回地图数据中的地理参考
48 }
49
50 /// ========================================================================
51 /// -- Geometry ------------------------------------------------------------
52 /// ========================================================================
53
54 boost::optional<element::Waypoint> GetClosestWaypointOnRoad( // 获取道路上最近的路径点
55 const geom::Location &location, // 输入位置
56 int32_t lane_type = static_cast<int32_t>(Lane::LaneType::Driving)) const; // 默认车道类型为驾驶车道
57
58 boost::optional<element::Waypoint> GetWaypoint( // 获取指定位置的路径点
59 const geom::Location &location, // 输入位置
60 int32_t lane_type = static_cast<int32_t>(Lane::LaneType::Driving)) const; // 默认车道类型为驾驶车道
61
62 boost::optional<element::Waypoint> GetWaypoint( // 根据道路ID和车道ID获取路径点
63 RoadId road_id, // 道路ID
64 LaneId lane_id, // 车道ID
65 float s) const; // s表示沿车道的距离
66
67 geom::Transform ComputeTransform(Waypoint waypoint) const; // 计算路径点的变换
68
69 /// ========================================================================
70 /// -- Road information ----------------------------------------------------
71 /// ========================================================================
72
73 const Lane &GetLane(Waypoint waypoint) const; // 获取路径点所在的车道
74
75 Lane::LaneType GetLaneType(Waypoint waypoint) const; // 获取路径点所在车道的类型
76
77 double GetLaneWidth(Waypoint waypoint) const; // 获取路径点所在车道的宽度
78
79 JuncId GetJunctionId(RoadId road_id) const; // 获取道路的交叉口ID
80
81 bool IsJunction(RoadId road_id) const; // 判断道路是否为交叉口
82
83 std::pair<const element::RoadInfoMarkRecord *, const element::RoadInfoMarkRecord *> // 获取路径点的标记记录
84 GetMarkRecord(Waypoint waypoint) const;
85
86 std::vector<element::LaneMarking> CalculateCrossedLanes( // 计算经过的车道
87 const geom::Location &origin, // 起始位置
88 const geom::Location &destination) const; // 终止位置
89
90 /// 返回定义二维区域的位置信息,重复位置表示一个区域结束
91 std::vector<geom::Location> GetAllCrosswalkZones() const; // 获取所有人行道区域
92
93 /// 数据结构用于信号搜索
95 const element::RoadInfoSignal *signal; // 信号指针
96 Waypoint waypoint; // 路径点
97 double accumulated_s = 0; // 累计距离
98 };
99
100
101 /// 从初始路点搜索信号,直到定义的距离。
102 std::vector<SignalSearchData> GetSignalsInDistance(
103 Waypoint waypoint, double distance, bool stop_at_junction = false) const; // 获取指定距离内的信号
104
105 /// 返回地图中的所有 RoadInfoSignal
106 std::vector<const element::RoadInfoSignal*>
107 GetAllSignalReferences() const; // 获取所有信号的引用
108
109 /// ========================================================================
110 /// -- 路点生成 -------------------------------------------------------------
111 /// ========================================================================
112
113 /// 返回每个可行驶后续车道入口处的路点列表;即从 @a waypoint 出发,
114 /// 车辆可以驶向的下一个路段的每个路点列表。
115 std::vector<Waypoint> GetSuccessors(Waypoint waypoint) const; // 获取后继路点
116 std::vector<Waypoint> GetPredecessors(Waypoint waypoint) const; // 获取前驱路点
117
118 /// 返回距离 @a waypoint @a distance 的路点列表,
119 /// 使得车辆可以驶向这些路点。
120 std::vector<Waypoint> GetNext(Waypoint waypoint, double distance) const; // 获取下一个路点
121 /// 返回距离 @a waypoint @a distance 的路点列表,
122 /// 使得车辆可以反向驶向这些路点。
123 std::vector<Waypoint> GetPrevious(Waypoint waypoint, double distance) const; // 获取上一个路点
124
125 /// 返回 @a waypoint 右侧车道的路点。
126 boost::optional<Waypoint> GetRight(Waypoint waypoint) const; // 获取右侧路点
127
128 /// 返回 @a waypoint 左侧车道的路点。
129 boost::optional<Waypoint> GetLeft(Waypoint waypoint) const; // 获取左侧路点
130
131 /// 在 @a map 中生成所有路点,路点之间相隔 @a approx_distance。
132 std::vector<Waypoint> GenerateWaypoints(double approx_distance) const; // 生成路点
133
134 /// 在每个 @a lane 的入口处生成路点,
135 /// 默认是行驶车道类型。
136 std::vector<Waypoint> GenerateWaypointsOnRoadEntries(Lane::LaneType lane_type = Lane::LaneType::Driving) const; // 生成道路入口的路点
137
138 /// 在指定道路的每个车道入口处生成路点。
139 std::vector<Waypoint> GenerateWaypointsInRoad(RoadId road_id, Lane::LaneType lane_type = Lane::LaneType::Driving) const; // 生成道路上的路点
140
141 /// 生成定义 @a map 拓扑结构的最小路点集。
142 /// 路点放置在每个车道入口处。
143 std::vector<std::pair<Waypoint, Waypoint>> GenerateTopology() const; // 生成拓扑结构
144
145 /// 生成交叉口的路点。
146 std::vector<std::pair<Waypoint, Waypoint>> GetJunctionWaypoints(JuncId id, Lane::LaneType lane_type) const; // 获取交叉口路点
147
148 Junction* GetJunction(JuncId id); // 获取交叉口指针
149
150 const Junction* GetJunction(JuncId id) const; // 获取交叉口常量指针
151
152 std::unordered_map<road::RoadId, std::unordered_set<road::RoadId>>
153 ComputeJunctionConflicts(JuncId id) const; // 计算交叉口冲突
154
155 /// 基于 OpenDRIVE 构建网格
157 const double distance,
158 const float extra_width = 0.6f,
159 const bool smooth_junctions = true) const; // 生成网格
160
161 std::vector<std::unique_ptr<geom::Mesh>> GenerateChunkedMesh(
162 const rpc::OpendriveGenerationParameters& params) const; // 生成分块网格
163
164 std::map<road::Lane::LaneType , std::vector<std::unique_ptr<geom::Mesh>>>
166 const geom::Vector3D& minpos,
167 const geom::Vector3D& maxpos) const; // 在指定位置生成有序分块网格
168
169/// Buids a mesh of all crosswalks based on the OpenDRIVE // 基于OpenDRIVE构建所有人行横道的网格
171
172std::vector<std::pair<geom::Transform, std::string>> GetTreesTransform( // 获取树木的变换信息
173 const geom::Vector3D& minpos, // 最小位置
174 const geom::Vector3D& maxpos, // 最大位置
175 float distancebetweentrees, // 树木之间的距离
176 float distancefromdrivinglineborder, // 距离行车线边界的距离
177 float s_offset = 0) const; // 偏移量,默认值为0
178
179geom::Mesh GenerateWalls(const double distance, const float wall_height) const; // 生成墙体网格,参数为距离和墙高
180
181// 构建与车道标记相关的网格列表
182std::vector<std::unique_ptr<geom::Mesh>> GenerateLineMarkings(
183 const rpc::OpendriveGenerationParameters& params, // OpenDRIVE生成参数
184 const geom::Vector3D& minpos, // 最小位置
185 const geom::Vector3D& maxpos, // 最大位置
186 std::vector<std::string>& outinfo ) const; // 输出信息列表
187
188const std::unordered_map<SignId, std::unique_ptr<Signal>>& GetSignals() const { // 获取信号映射
189 return _data.GetSignals(); // 返回信号数据
190}
191
192const std::unordered_map<ContId, std::unique_ptr<Controller>>& GetControllers() const { // 获取控制器映射
193 return _data.GetControllers(); // 返回控制器数据
194}
195
196std::vector<carla::geom::BoundingBox> GetJunctionsBoundingBoxes() const; // 获取交叉口的边界框
197
198#ifdef LIBCARLA_WITH_GTEST
199 MapData &GetMap() { // 获取地图数据
200 return _data; // 返回地图数据
201 }
202#endif // LIBCARLA_WITH_GTEST
203
204private:
205
206 friend MapBuilder; // 友元类
207 MapData _data; // 地图数据
208
209 using Rtree = geom::SegmentCloudRtree<Waypoint>; // 使用R树结构
210 Rtree _rtree; // R树对象
211
212 void CreateRtree(); // 创建R树
213
214 // 辅助函数,用于构造R树元素列表
215 void AddElementToRtree( // 将元素添加到R树
216 std::vector<Rtree::TreeElement> &rtree_elements, // R树元素列表
217 geom::Transform &current_transform, // 当前变换
218 geom::Transform &next_transform, // 下一个变换
219 Waypoint &current_waypoint, // 当前路点
220 Waypoint &next_waypoint); // 下一个路点
221
222 void AddElementToRtreeAndUpdateTransforms( // 添加元素到R树并更新变换
223 std::vector<Rtree::TreeElement> &rtree_elements, // R树元素列表
224 geom::Transform &current_transform, // 当前变换
225 Waypoint &current_waypoint, // 当前路点
226 Waypoint &next_waypoint); // 下一个路点
227
228public:
229 inline float GetZPosInDeformation(float posx, float posy) const; // 获取变形中的Z轴位置
230
231 std::map<road::Lane::LaneType, std::vector<std::unique_ptr<geom::Mesh>>> // 多线程生成道路网格
232 GenerateRoadsMultithreaded( const carla::geom::MeshFactory& mesh_factory, // 网格工厂
233 const std::vector<RoadId>& RoadsID, // 道路ID列表
234 const size_t index, // 当前索引
235 const size_t number_of_roads_per_thread) const; // 每个线程的道路数量
236
237 void GenerateJunctions(const carla::geom::MeshFactory& mesh_factory, // 生成交叉口
238 const rpc::OpendriveGenerationParameters& params, // OpenDRIVE生成参数
239 const geom::Vector3D& minpos, // 最小位置
240 const geom::Vector3D& maxpos, // 最大位置
241 std::map<road::Lane::LaneType, std::vector<std::unique_ptr<geom::Mesh>>>* // 输出交叉口网格列表
242 juntion_out_mesh_list) const;
243
244 void GenerateSingleJunction(const carla::geom::MeshFactory& mesh_factory, // 生成单个交叉口
245 const JuncId Id, // 交叉口ID
246 std::map<road::Lane::LaneType, std::vector<std::unique_ptr<geom::Mesh>>>* // 输出交叉口网格列表
247 junction_out_mesh_list) const;
248
249 // 返回在指定位置之间的交叉口ID列表
250 std::vector<JuncId> FilterJunctionsByPosition( // 根据位置过滤交叉口
251 const geom::Vector3D& minpos, // 最小位置
252 const geom::Vector3D& maxpos) const; // 最大位置
253
254 // 返回在指定位置之间的道路ID列表
255 std::vector<RoadId> FilterRoadsByPosition( // 根据位置过滤道路
256 const geom::Vector3D& minpos, // 最小位置
257 const geom::Vector3D& maxpos ) const; // 最大位置
258
259 std::unique_ptr<geom::Mesh> SDFToMesh(const road::Junction& jinput, const std::vector<geom::Vector3D>& sdfinput, int grid_cells_per_dim) const; // 将SDF转换为网格
260 };
261
262} // namespace road
263} // namespace carla
这个类用于禁止拷贝构造函数和赋值操作,但允许移动构造函数和赋值操作
Mesh辅助生成器
Definition MeshFactory.h:22
网格数据容器、验证器和导出器。
Definition Mesh.h:43
LaneType
可以作为标志使用
Definition Lane.h:29
const geom::GeoLocation & GetGeoReference() const
Definition MapData.h:32
const std::unordered_map< SignId, std::unique_ptr< Signal > > & GetSignals() const
Definition MapData.h:78
const std::unordered_map< ContId, std::unique_ptr< Controller > > & GetControllers() const
Definition MapData.h:82
std::vector< std::pair< Waypoint, Waypoint > > GenerateTopology() const
生成定义 map 拓扑结构的最小路点集。 路点放置在每个车道入口处。
const Junction * GetJunction(JuncId id) const
JuncId GetJunctionId(RoadId road_id) const
std::vector< Waypoint > GetPrevious(Waypoint waypoint, double distance) const
返回距离 waypoint distance 的路点列表, 使得车辆可以反向驶向这些路点。
bool IsJunction(RoadId road_id) const
Lane::LaneType GetLaneType(Waypoint waypoint) const
boost::optional< element::Waypoint > GetClosestWaypointOnRoad(const geom::Location &location, int32_t lane_type=static_cast< int32_t >(Lane::LaneType::Driving)) const
========================================================================
std::unique_ptr< geom::Mesh > SDFToMesh(const road::Junction &jinput, const std::vector< geom::Vector3D > &sdfinput, int grid_cells_per_dim) const
std::vector< std::pair< geom::Transform, std::string > > GetTreesTransform(const geom::Vector3D &minpos, const geom::Vector3D &maxpos, float distancebetweentrees, float distancefromdrivinglineborder, float s_offset=0) const
double GetLaneWidth(Waypoint waypoint) const
std::vector< SignalSearchData > GetSignalsInDistance(Waypoint waypoint, double distance, bool stop_at_junction=false) const
从初始路点搜索信号,直到定义的距离。
std::vector< RoadId > FilterRoadsByPosition(const geom::Vector3D &minpos, const geom::Vector3D &maxpos) const
void AddElementToRtreeAndUpdateTransforms(std::vector< Rtree::TreeElement > &rtree_elements, geom::Transform &current_transform, Waypoint &current_waypoint, Waypoint &next_waypoint)
std::vector< Waypoint > GenerateWaypointsOnRoadEntries(Lane::LaneType lane_type=Lane::LaneType::Driving) const
在每个 lane 的入口处生成路点, 默认是行驶车道类型。
friend MapBuilder
Definition road/Map.h:206
std::vector< geom::Location > GetAllCrosswalkZones() const
返回定义二维区域的位置信息,重复位置表示一个区域结束
geom::Mesh GenerateWalls(const double distance, const float wall_height) const
std::vector< carla::geom::BoundingBox > GetJunctionsBoundingBoxes() const
boost::optional< Waypoint > GetRight(Waypoint waypoint) const
返回 waypoint 右侧车道的路点。
std::vector< JuncId > FilterJunctionsByPosition(const geom::Vector3D &minpos, const geom::Vector3D &maxpos) const
std::map< road::Lane::LaneType, std::vector< std::unique_ptr< geom::Mesh > > > GenerateRoadsMultithreaded(const carla::geom::MeshFactory &mesh_factory, const std::vector< RoadId > &RoadsID, const size_t index, const size_t number_of_roads_per_thread) const
std::vector< element::LaneMarking > CalculateCrossedLanes(const geom::Location &origin, const geom::Location &destination) const
boost::optional< Waypoint > GetLeft(Waypoint waypoint) const
返回 waypoint 左侧车道的路点。
Map(MapData m)
========================================================================
Definition road/Map.h:38
std::pair< const element::RoadInfoMarkRecord *, const element::RoadInfoMarkRecord * > GetMarkRecord(Waypoint waypoint) const
geom::Mesh GetAllCrosswalkMesh() const
Buids a mesh of all crosswalks based on the OpenDRIVE // 基于OpenDRIVE构建所有人行横道的网格
std::vector< Waypoint > GetNext(Waypoint waypoint, double distance) const
返回距离 waypoint distance 的路点列表, 使得车辆可以驶向这些路点。
Junction * GetJunction(JuncId id)
const geom::GeoLocation & GetGeoReference() const
========================================================================
Definition road/Map.h:46
boost::optional< element::Waypoint > GetWaypoint(const geom::Location &location, int32_t lane_type=static_cast< int32_t >(Lane::LaneType::Driving)) const
void GenerateJunctions(const carla::geom::MeshFactory &mesh_factory, const rpc::OpendriveGenerationParameters &params, const geom::Vector3D &minpos, const geom::Vector3D &maxpos, std::map< road::Lane::LaneType, std::vector< std::unique_ptr< geom::Mesh > > > *juntion_out_mesh_list) const
const std::unordered_map< SignId, std::unique_ptr< Signal > > & GetSignals() const
Definition road/Map.h:188
std::vector< Waypoint > GenerateWaypointsInRoad(RoadId road_id, Lane::LaneType lane_type=Lane::LaneType::Driving) const
在指定道路的每个车道入口处生成路点。
const std::unordered_map< ContId, std::unique_ptr< Controller > > & GetControllers() const
Definition road/Map.h:192
std::vector< std::unique_ptr< geom::Mesh > > GenerateChunkedMesh(const rpc::OpendriveGenerationParameters &params) const
geom::Transform ComputeTransform(Waypoint waypoint) const
std::map< road::Lane::LaneType, std::vector< std::unique_ptr< geom::Mesh > > > GenerateOrderedChunkedMeshInLocations(const rpc::OpendriveGenerationParameters &params, const geom::Vector3D &minpos, const geom::Vector3D &maxpos) const
void GenerateSingleJunction(const carla::geom::MeshFactory &mesh_factory, const JuncId Id, std::map< road::Lane::LaneType, std::vector< std::unique_ptr< geom::Mesh > > > *junction_out_mesh_list) const
std::vector< Waypoint > GenerateWaypoints(double approx_distance) const
在 map 中生成所有路点,路点之间相隔 approx_distance。
std::vector< Waypoint > GetPredecessors(Waypoint waypoint) const
std::vector< Waypoint > GetSuccessors(Waypoint waypoint) const
========================================================================
std::vector< std::unique_ptr< geom::Mesh > > GenerateLineMarkings(const rpc::OpendriveGenerationParameters &params, const geom::Vector3D &minpos, const geom::Vector3D &maxpos, std::vector< std::string > &outinfo) const
boost::optional< element::Waypoint > GetWaypoint(RoadId road_id, LaneId lane_id, float s) const
float GetZPosInDeformation(float posx, float posy) const
void AddElementToRtree(std::vector< Rtree::TreeElement > &rtree_elements, geom::Transform &current_transform, geom::Transform &next_transform, Waypoint &current_waypoint, Waypoint &next_waypoint)
std::vector< const element::RoadInfoSignal * > GetAllSignalReferences() const
返回地图中的所有 RoadInfoSignal
std::vector< std::pair< Waypoint, Waypoint > > GetJunctionWaypoints(JuncId id, Lane::LaneType lane_type) const
生成交叉口的路点。
std::unordered_map< road::RoadId, std::unordered_set< road::RoadId > > ComputeJunctionConflicts(JuncId id) const
const Lane & GetLane(Waypoint waypoint) const
========================================================================
geom::Mesh GenerateMesh(const double distance, const float extra_width=0.6f, const bool smooth_junctions=true) const
基于 OpenDRIVE 构建网格
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
数据结构用于信号搜索
Definition road/Map.h:94
const element::RoadInfoSignal * signal
Definition road/Map.h:95
Seting for map generation from opendrive without additional geometry