CARLA
 
载入中...
搜索中...
未找到
client/Waypoint.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/client/Waypoint.h" // 引入Waypoint头文件
8#include "carla/client/Map.h" // 引入Map头文件
9#include "carla/client/Junction.h" // 引入Junction头文件
10#include "carla/client/Landmark.h" // 引入Landmark头文件
11
12#include <unordered_set> // 引入unordered_set头文件,用于哈希集合
13
14namespace carla {
15namespace client {
16
17 // Waypoint构造函数,初始化一个Waypoint对象
19 : _parent(std::move(parent)), // 移动构造父Map对象
20 _waypoint(std::move(waypoint)), // 移动构造Waypoint对象
21 _transform(_parent->GetMap().ComputeTransform(_waypoint)), // 计算并初始化变换
22 _mark_record(_parent->GetMap().GetMarkRecord(_waypoint)) {} // 获取标记记录
23
24 Waypoint::~Waypoint() = default; // 默认析构函数
25
26 // 获取Waypoint所属的路口ID
28 return _parent->GetMap().GetJunctionId(_waypoint.road_id); // 从地图获取路口ID
29 }
30
31 // 判断Waypoint是否为路口
32 bool Waypoint::IsJunction() const {
33 return _parent->GetMap().IsJunction(_waypoint.road_id); // 判断该Waypoint的道路ID是否为路口
34 }
35
36 // 获取该Waypoint对应的路口对象
38 if (IsJunction()) { // 如果是路口
39 return _parent->GetJunction(*this); // 获取并返回对应的路口对象
40 }
41 return nullptr; // 如果不是路口,返回空指针
42 }
43
44 // 获取Waypoint所在车道的宽度
45 double Waypoint::GetLaneWidth() const {
46 return _parent->GetMap().GetLaneWidth(_waypoint); // 从地图中获取车道宽度
47 }
48
49 // 获取Waypoint所在车道的类型
51 return _parent->GetMap().GetLaneType(_waypoint); // 从地图中获取车道类型
52 }
53
54 // 获取Waypoint的下一个Waypoint列表
55 std::vector<SharedPtr<Waypoint>> Waypoint::GetNext(double distance) const {
56 auto waypoints = _parent->GetMap().GetNext(_waypoint, distance); // 获取下一个Waypoint列表
57 std::vector<SharedPtr<Waypoint>> result; // 结果存储容器
58 result.reserve(waypoints.size()); // 预留空间
59 for (auto &waypoint : waypoints) { // 遍历每个Waypoint
60 result.emplace_back(SharedPtr<Waypoint>(new Waypoint(_parent, std::move(waypoint)))); // 创建并添加到结果中
61 }
62 return result; // 返回下一个Waypoint的列表
63 }
64
65 // 获取Waypoint的前一个Waypoint列表
66 std::vector<SharedPtr<Waypoint>> Waypoint::GetPrevious(double distance) const {
67 auto waypoints = _parent->GetMap().GetPrevious(_waypoint, distance); // 获取前一个Waypoint列表
68 std::vector<SharedPtr<Waypoint>> result; // 结果存储容器
69 result.reserve(waypoints.size()); // 预留空间
70 for (auto &waypoint : waypoints) { // 遍历每个Waypoint
71 result.emplace_back(SharedPtr<Waypoint>(new Waypoint(_parent, std::move(waypoint)))); // 创建并添加到结果中
72 }
73 return result; // 返回前一个Waypoint的列表
74 }
75
76 // 获取Waypoint的下一个Waypoint直到车道结束
77 std::vector<SharedPtr<Waypoint>> Waypoint::GetNextUntilLaneEnd(double distance) const {
78 std::vector<SharedPtr<Waypoint>> result; // 结果存储容器
79 std::vector<SharedPtr<Waypoint>> next = GetNext(distance); // 获取下一个Waypoint列表
80
81 // 如果下一个Waypoint还在同一条路上,继续获取下一个
82 while (next.size() == 1 && next.front()->GetRoadId() == GetRoadId()) {
83 result.emplace_back(next.front()); // 将下一个Waypoint添加到结果中
84 next = result.back()->GetNext(distance); // 获取该Waypoint的下一个Waypoint
85 }
86
87 double current_s = GetDistance(); // 获取当前Waypoint的位置
88 if(result.size()) { // 如果结果中有Waypoint
89 current_s = result.back()->GetDistance(); // 获取最后一个Waypoint的位置
90 }
91
92 double remaining_length; // 剩余长度
93 double road_length = _parent->GetMap().GetLane(_waypoint).GetRoad()->GetLength(); // 获取道路的总长度
94 if(_waypoint.lane_id < 0) { // 如果车道ID为负数
95 remaining_length = road_length - current_s; // 剩余长度为道路总长减去当前距离
96 } else {
97 remaining_length = current_s; // 否则剩余长度为当前距离
98 }
99 remaining_length -= std::numeric_limits<double>::epsilon(); // 减去一个非常小的数值以避免浮动误差
100
101 // 如果结果中有Waypoint,获取其下一个Waypoint直到车道结束
102 if(result.size()) {
103 result.emplace_back(result.back()->GetNext(remaining_length).front()); // 添加最后一个Waypoint
104 } else {
105 result.emplace_back(GetNext(remaining_length).front()); // 如果没有Waypoint,则获取当前Waypoint的下一个
106 }
107
108 return result; // 返回直到车道结束的Waypoint列表
109 }
110
111 // 获取Waypoint的前一个Waypoint直到车道开始
112 std::vector<SharedPtr<Waypoint>> Waypoint::GetPreviousUntilLaneStart(double distance) const {
113 std::vector<SharedPtr<Waypoint>> result; // 结果存储容器
114 std::vector<SharedPtr<Waypoint>> prev = GetPrevious(distance); // 获取前一个Waypoint列表
115
116 // 如果前一个Waypoint还在同一条路上,继续获取前一个
117 while (prev.size() == 1 && prev.front()->GetRoadId() == GetRoadId()) {
118 result.emplace_back(prev.front()); // 将前一个Waypoint添加到结果中
119 prev = result.back()->GetPrevious(distance); // 获取该Waypoint的前一个Waypoint
120 }
121
122 double current_s = GetDistance(); // 获取当前Waypoint的位置
123 if(result.size()) { // 如果结果中有Waypoint
124 current_s = result.back()->GetDistance(); // 获取最后一个Waypoint的位置
125 }
126
127 double remaining_length; // 剩余长度
128 double road_length = _parent->GetMap().GetLane(_waypoint).GetRoad()->GetLength(); // 获取道路的总长度
129 if(_waypoint.lane_id < 0) { // 如果车道ID为负数
130 remaining_length = road_length - current_s; // 剩余长度为道路总长减去当前距离
131 } else {
132 remaining_length = current_s; // 否则剩余长度为当前距离
133 }
134 remaining_length -= std::numeric_limits<double>::epsilon(); // 减去一个非常小的数值以避免浮动误差
135
136 // 如果结果中有Waypoint,获取其前一个Waypoint直到车道开始
137 if(result.size()) {
138 result.emplace_back(result.back()->GetPrevious(remaining_length).front()); // 添加最后一个Waypoint
139 } else {
140 result.emplace_back(GetPrevious(remaining_length).front()); // 如果没有Waypoint,则获取当前Waypoint的前一个
141 }
142
143 return result; // 返回直到车道开始的Waypoint列表
144 }
145
147 // 获取右侧的Waypoint
148 auto right_lane_waypoint =
149 _parent->GetMap().GetRight(_waypoint);// 调用_parent的地图对象,获取右侧的Waypoint
150 if (right_lane_waypoint.has_value()) { // 如果右侧Waypoint存在
151 return SharedPtr<Waypoint>(new Waypoint(_parent, std::move(*right_lane_waypoint)));// 创建并返回右侧Waypoint的智能指针
152 }
153 return nullptr;// 如果右侧Waypoint不存在,返回nullptr
154 }
155
157 // 获取左侧的Waypoint
158 auto left_lane_waypoint =
159 _parent->GetMap().GetLeft(_waypoint);// 调用_parent的地图对象,获取左侧的Waypoint
160 if (left_lane_waypoint.has_value()) {// 如果左侧Waypoint存在
161 return SharedPtr<Waypoint>(new Waypoint(_parent, std::move(*left_lane_waypoint)));// 创建并返回左侧Waypoint的智能指针
162 }
163 return nullptr;// 如果左侧Waypoint不存在,返回nullptr
164 }
165
166 boost::optional<road::element::LaneMarking> Waypoint::GetRightLaneMarking() const {
167 // 获取右侧车道标记
168 if (_mark_record.first != nullptr) { // 如果右侧标记存在
169 return road::element::LaneMarking(*_mark_record.first);// 返回右侧车道标记
170 }
171 return boost::optional<road::element::LaneMarking>{};// 如果右侧标记不存在,返回空的可选值
172 }
173
174 boost::optional<road::element::LaneMarking> Waypoint::GetLeftLaneMarking() const {
175 // 获取左侧车道标记
176 if (_mark_record.second != nullptr) {// 如果左侧标记存在
177 return road::element::LaneMarking(*_mark_record.second);// 返回左侧车道标记
178 }
179 return boost::optional<road::element::LaneMarking>{};// 如果左侧标记不存在,返回空的可选值
180 }
181
182 template <typename EnumT>
183 static EnumT operator&(EnumT lhs, EnumT rhs) {
184 // 按位与运算符重载(适用于枚举类型)
185 return static_cast<EnumT>(
186 static_cast<typename std::underlying_type<EnumT>::type>(lhs) &
187 static_cast<typename std::underlying_type<EnumT>::type>(rhs));// 将枚举转换为底层类型,执行按位与运算,并转换回枚举类型
188 }
189
190 template <typename EnumT>
191 static EnumT operator|(EnumT lhs, EnumT rhs) {
192 // 按位或运算符重载(适用于枚举类型)
193 return static_cast<EnumT>(
194 static_cast<typename std::underlying_type<EnumT>::type>(lhs) |
195 static_cast<typename std::underlying_type<EnumT>::type>(rhs));// 将枚举转换为底层类型,执行按位或运算,并转换回枚举类型
196 }
197
199 // 获取车道变更信息
200 using lane_change_type = road::element::LaneMarking::LaneChange;// 定义车道变更类型别名
201
202 const auto lane_change_right_info = _mark_record.first;// 获取右侧车道变更信息
203 lane_change_type c_right;// 定义右侧车道变更类型
204 if (lane_change_right_info != nullptr) {// 如果右侧车道变更信息存在
205 const auto lane_change_right = lane_change_right_info->GetLaneChange();// 获取右侧车道变更
206 c_right = static_cast<lane_change_type>(lane_change_right);// 将右侧车道变更信息转换为LaneChange类型
207 } else {
208 c_right = lane_change_type::Both;// 如果没有右侧车道变更信息,默认车道变更为Both
209 }
210
211 const auto lane_change_left_info = _mark_record.second;// 获取左侧车道变更信息
212 lane_change_type c_left;// 定义左侧车道变更类型
213 if (lane_change_left_info != nullptr) {// 如果左侧车道变更信息存在
214 const auto lane_change_left = lane_change_left_info->GetLaneChange();// 获取左侧车道变更
215 c_left = static_cast<lane_change_type>(lane_change_left);// 将左侧车道变更信息转换为LaneChange类型
216 } else {
217 c_left = lane_change_type::Both;// 如果没有左侧车道变更信息,默认车道变更为Both
218 }
219
220 if (_waypoint.lane_id > 0) {// 如果当前Waypoint的车道ID大于0
221 // 如果路段是倒行(车道ID大于0),则右侧车道变更方向反转
222 if (c_right == lane_change_type::Right) {
223 c_right = lane_change_type::Left;// 右侧车道变更为左侧
224 } else if (c_right == lane_change_type::Left) {
225 c_right = lane_change_type::Right;// 右侧车道变更为右侧
226 }
227 }
228
229 if (((_waypoint.lane_id > 0) ? _waypoint.lane_id - 1 : _waypoint.lane_id + 1) > 0) {// 判断左侧车道是否有变化
230 // 如果路段是倒行(车道ID大于0),则左侧车道变更方向反转
231 if (c_left == lane_change_type::Right) {
232 c_left = lane_change_type::Left;// 左侧车道变更为左侧
233 } else if (c_left == lane_change_type::Left) {
234 c_left = lane_change_type::Right;// 左侧车道变更为右侧
235 }
236 }
237
238 // 返回右侧和左侧车道变更的组合
239 return (c_right & lane_change_type::Right) | (c_left & lane_change_type::Left);
240 }
241
242 std::vector<SharedPtr<Landmark>> Waypoint::GetAllLandmarksInDistance(
243 double distance, bool stop_at_junction) const {
244 // 获取指定距离范围内的所有地标
245 std::vector<SharedPtr<Landmark>> result; // 存储结果地标
246 auto signals = _parent->GetMap().GetSignalsInDistance(
247 _waypoint, distance, stop_at_junction);// 获取指定距离内的所有信号
248 std::unordered_set<const road::element::RoadInfoSignal*> added_signals; // 用于检查是否已添加过信号
249 for(auto &signal_data : signals){// 遍历信号数据
250 if(added_signals.count(signal_data.signal) > 0) {// 如果信号已添加过,跳过
251 continue;
252 }
253 added_signals.insert(signal_data.signal);// 将信号标记为已添加
254 auto waypoint = SharedPtr<Waypoint>(new Waypoint(_parent, signal_data.waypoint));// 创建信号对应的Waypoint
255 result.emplace_back(
256 new Landmark(waypoint, _parent, signal_data.signal, signal_data.accumulated_s));// 创建地标并加入结果中
257 }
258 return result;// 返回地标列表
259 }
260
261 std::vector<SharedPtr<Landmark>> Waypoint::GetLandmarksOfTypeInDistance(
262 double distance, std::string filter_type, bool stop_at_junction) const {
263 // 创建一个空的 Landmark 向量,用于存储符合条件的 Landmark 对象
264 std::vector<SharedPtr<Landmark>> result;
265 // 创建一个 unordered_set,用于存储已经添加过的信号,避免重复添加相同的信号
266 std::unordered_set<const road::element::RoadInfoSignal*> added_signals;
267 // 获取在指定距离范围内的所有信号数据
268 auto signals = _parent->GetMap().GetSignalsInDistance(
269 _waypoint, distance, stop_at_junction);
270 // 遍历每一个信号数据
271 for(auto &signal_data : signals){
272 // 检查信号的类型是否与指定的 filter_type 匹配
273 if(signal_data.signal->GetSignal()->GetType() == filter_type) {
274 if(added_signals.count(signal_data.signal) > 0) {
275 continue;
276 }
277 // 创建一个新的 Waypoint 对象,传入父对象和信号的 waypoint 数据
278 auto waypoint = SharedPtr<Waypoint>(new Waypoint(_parent, signal_data.waypoint));
279 result.emplace_back(
280 // 将新的 Landmark 对象添加到结果向量中
281 new Landmark(waypoint, _parent, signal_data.signal, signal_data.accumulated_s));
282 }
283 }
284 return result;// 返回符合条件的 Landmark 向量
285 }
286
287} // namespace client
288} // namespace carla
Landmark 类表示地图中的一个地标,该地标与某个信号相关联。 包含关于地标的各种属性和信息,可以用来在地图上找到该地标以及获取其相关数据。
Definition Landmark.h:23
SharedPtr< Waypoint > GetLeft() const
获取当前路径点左侧的路径点。
std::vector< SharedPtr< Landmark > > GetLandmarksOfTypeInDistance(double distance, std::string filter_type, bool stop_at_junction=false) const
获取从当前位置到指定距离内,按指定类型筛选的地标列表。
bool IsJunction() const
判断当前路径点是否在交叉路口。
road::element::Waypoint _waypoint
存储OpenDrive中的路径点信息。
SharedPtr< Waypoint > GetRight() const
获取当前路径点右侧的路径点。
SharedPtr< const Map > _parent
指向父Map对象的共享指针。
boost::optional< road::element::LaneMarking > GetLeftLaneMarking() const
获取当前路径点左侧的车道标记。
boost::optional< road::element::LaneMarking > GetRightLaneMarking() const
获取当前路径点右侧的车道标记。
road::JuncId GetJunctionId() const
获取交叉路口ID。
auto GetRoadId() const
获取道路ID。
~Waypoint()
析构函数。
double GetLaneWidth() const
获取车道宽度。
std::vector< SharedPtr< Waypoint > > GetPrevious(double distance) const
获取指定距离内的上一个路径点列表。
auto GetDistance() const
获取沿车道的距离(s值)。
Waypoint(SharedPtr< const Map > parent, road::element::Waypoint waypoint)
私有构造函数,用于内部创建Waypoint对象。
road::element::LaneMarking::LaneChange GetLaneChange() const
获取车道变更信息。
std::vector< SharedPtr< Waypoint > > GetNext(double distance) const
获取指定距离内的下一个路径点列表。
SharedPtr< Junction > GetJunction() const
获取交叉路口对象。
std::vector< SharedPtr< Waypoint > > GetNextUntilLaneEnd(double distance) const
获取从当前位置开始,沿车道方向直到道路终点的路径点列表。
std::vector< SharedPtr< Landmark > > GetAllLandmarksInDistance(double distance, bool stop_at_junction=false) const
获取从当前位置到指定距离内的所有地标列表。
std::vector< SharedPtr< Waypoint > > GetPreviousUntilLaneStart(double distance) const
获取从当前位置开始,沿车道反方向直到道路起点的路径点列表。
std::pair< const road::element::RoadInfoMarkRecord *, const road::element::RoadInfoMarkRecord * > _mark_record
分别指向右侧和左侧标记记录的指针对。
road::Lane::LaneType GetType() const
获取车道类型。
LaneType
可以作为标志使用
Definition Lane.h:29
static EnumT operator&(EnumT lhs, EnumT rhs)
static EnumT operator|(EnumT lhs, EnumT rhs)
int32_t JuncId
Definition RoadTypes.h:23
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
boost::shared_ptr< T > SharedPtr
使用这个SharedPtr(boost::shared_ptr)以保持与boost::python的兼容性, 但未来如果可能的话,我们希望能为std::shared_ptr制作一个Python适配器。
Definition Memory.h:19
包含CARLA客户端相关类和函数的命名空间。
LaneChange
可以用作标志。
Definition LaneMarking.h:50