Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/microsim/MSLeaderInfo.h
185785 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2002-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file MSLeaderInfo.h
15
/// @author Jakob Erdmann
16
/// @date Oct 2015
17
///
18
// Information about vehicles ahead (may be multiple vehicles if
19
// lateral-resolution is active)
20
/****************************************************************************/
21
#pragma once
22
#include <config.h>
23
24
#include <string>
25
#include <vector>
26
#include <utils/common/StdDefs.h>
27
28
// ===========================================================================
29
// class declarations
30
// ===========================================================================
31
class MSVehicle;
32
class MSLane;
33
34
35
// ===========================================================================
36
// type definitions
37
// ===========================================================================
38
typedef std::pair<const MSVehicle*, double> CLeaderDist;
39
typedef std::pair<MSVehicle*, double> LeaderDist;
40
41
42
// ===========================================================================
43
// class definitions
44
// ===========================================================================
45
/**
46
* @class MSLeaderInfo
47
*/
48
class MSLeaderInfo {
49
public:
50
/// Constructor
51
MSLeaderInfo(const double laneWidth, const MSVehicle* ego = nullptr, const double latOffset = 0.);
52
53
/// Destructor
54
virtual ~MSLeaderInfo();
55
56
/* @brief adds this vehicle as a leader in the appropriate sublanes
57
* @param[in] veh The vehicle to add
58
* @param[in] beyond Whether the vehicle is beyond the existing leaders (and thus may be shadowed by them)
59
* @param[in] latOffset The lateral offset that must be added to the position of veh
60
* @return The number of free sublanes
61
*/
62
virtual int addLeader(const MSVehicle* veh, bool beyond, double latOffset = 0.);
63
64
/// @brief discard all information
65
virtual void clear();
66
67
/* @brief returns sublanes occupied by veh
68
* @param[in] veh The vehicle to check
69
* @param[in] latOffset The offset value to add to the vehicle position
70
* @param[out] rightmost The rightmost sublane occupied by veh
71
* @param[out] leftmost The rightmost sublane occupied by veh
72
*/
73
void getSubLanes(const MSVehicle* veh, double latOffset, int& rightmost, int& leftmost) const;
74
75
/* @brief returns the sublane boundaries of the ith sublane
76
* @param[in] sublane The sublane to check
77
* @param[in] latOffset The offset value to add to the result
78
* @param[out] rightSide The right border of the given sublane
79
* @param[out] leftSide The left border of the given sublane
80
*/
81
void getSublaneBorders(int sublane, double latOffset, double& rightSide, double& leftSide) const;
82
83
/// @brief return the vehicle for the given sublane
84
const MSVehicle* operator[](int sublane) const;
85
86
int numSublanes() const {
87
return (int)myVehicles.size();
88
}
89
90
int numFreeSublanes() const {
91
return myFreeSublanes;
92
}
93
94
bool hasVehicles() const {
95
return myHasVehicles;
96
}
97
98
const std::vector<const MSVehicle*>& getVehicles() const {
99
return myVehicles;
100
}
101
102
int getSublaneOffset() const {
103
return myOffset;
104
}
105
106
/// @brief set number of sublanes by which to shift positions
107
void setSublaneOffset(int offset);
108
109
/// @brief whether a stopped vehicle is leader
110
bool hasStoppedVehicle() const;
111
112
/// @brief whether the given vehicle is part of this leaderInfo
113
bool hasVehicle(const MSVehicle* veh) const;
114
115
/// @brief remove vehicles that are driving in the opposite direction (fully or partially) on the given lane
116
void removeOpposite(const MSLane* lane);
117
118
/// @brief print a debugging representation
119
virtual std::string toString() const;
120
121
protected:
122
123
/// @brief the width of the lane to which this instance applies
124
// @note: not const to simplify assignment
125
double myWidth;
126
127
/// @brief an extra offset for shifting the interpretation of sublane borders (default [0,myWidth])
128
int myOffset;
129
130
std::vector<const MSVehicle*> myVehicles;
131
132
/// @brief the number of free sublanes
133
// if an ego vehicle is given in the constructor, the number of free
134
// sublanes of those covered by ego
135
int myFreeSublanes;
136
137
/// @brief borders of the ego vehicle for filtering of free sublanes
138
int egoRightMost;
139
int egoLeftMost;
140
141
bool myHasVehicles;
142
143
};
144
145
146
/// @brief saves leader/follower vehicles and their distances relative to an ego vehicle
147
class MSLeaderDistanceInfo : public MSLeaderInfo {
148
public:
149
/// Constructor
150
MSLeaderDistanceInfo(const double laneWidth, const MSVehicle* ego, const double latOffset);
151
152
/// @brief Construct for the non-sublane-case
153
MSLeaderDistanceInfo(const CLeaderDist& cLeaderDist, const double laneWidth);
154
155
/// Destructor
156
virtual ~MSLeaderDistanceInfo();
157
158
/* @brief adds this vehicle as a leader in the appropriate sublanes
159
* @param[in] veh The vehicle to add
160
* @param[in] gap The gap between the egoFront+minGap to the back of veh
161
* or from the back of ego to the front+minGap of veh
162
* @param[in] latOffset The lateral offset that must be added to the position of veh
163
* @param[in] sublane The single sublane to which this leader shall be checked (-1 means: check for all)
164
* @return The number of free sublanes
165
*/
166
virtual int addLeader(const MSVehicle* veh, double gap, double latOffset = 0, int sublane = -1);
167
168
virtual int addLeader(const MSVehicle* veh, bool beyond, double latOffset = 0) {
169
UNUSED_PARAMETER(veh);
170
UNUSED_PARAMETER(beyond);
171
UNUSED_PARAMETER(latOffset);
172
throw ProcessError(TL("Method not supported"));
173
}
174
175
/// @brief updatd empty sublanes with vehicles and gaps from other
176
virtual void addLeaders(MSLeaderDistanceInfo& other);
177
178
/// @brief discard all information
179
virtual void clear();
180
181
/// @brief return the vehicle and its distance for the given sublane
182
CLeaderDist operator[](int sublane) const;
183
184
/// @brief print a debugging representation
185
virtual std::string toString() const;
186
187
const std::vector<double>& getDistances() const {
188
return myDistances;
189
}
190
191
/// @brief subtract vehicle length from all gaps if the leader vehicle is driving in the opposite direction
192
void fixOppositeGaps(bool isFollower);
193
194
/// @brief add given value to all gaps
195
void patchGaps(double amount);
196
197
/// @brief return vehicle with the smalles gap
198
CLeaderDist getClosest() const;
199
200
void moveSamePosTo(const MSVehicle* ego, MSLeaderDistanceInfo& other);
201
202
/// @brief return minimum distance to a stopped vehicle or max double
203
double getMinDistToStopped() const;
204
205
206
protected:
207
208
std::vector<double> myDistances;
209
210
};
211
212
213
/* @brief saves follower vehicles and their distances as well as their required gap relative to an ego vehicle
214
* when adding new followers, the one with the largest required gap is recored
215
* (rather than the one with the smallest gap) */
216
class MSCriticalFollowerDistanceInfo : public MSLeaderDistanceInfo {
217
public:
218
/// Constructor
219
MSCriticalFollowerDistanceInfo(const double laneWidth, const MSVehicle* ego, const double latOffset, const bool haveOppositeLeaders = false);
220
221
/// Destructor
222
virtual ~MSCriticalFollowerDistanceInfo();
223
224
/* @brief adds this vehicle as a follower in the appropriate sublanes
225
* @param[in] veh The vehicle to add
226
* @param[in] ego The vehicle which is being followed
227
* @param[in] gap The distance from the back of ego to the follower
228
* @param[in] latOffset The lateral offset that must be added to the position of veh
229
* @param[in] sublane The single sublane to which this leader shall be checked (-1 means: check for all)
230
* @return The number of free sublanes
231
*/
232
int addFollower(const MSVehicle* veh, const MSVehicle* ego, double gap, double latOffset = 0, int sublane = -1);
233
234
virtual int addLeader(const MSVehicle* veh, double gap, double latOffset = 0, int sublane = -1) {
235
UNUSED_PARAMETER(veh);
236
UNUSED_PARAMETER(gap);
237
UNUSED_PARAMETER(latOffset);
238
UNUSED_PARAMETER(sublane);
239
throw ProcessError(TL("Method not supported"));
240
}
241
242
virtual int addLeader(const MSVehicle* veh, bool beyond, double latOffset = 0) {
243
UNUSED_PARAMETER(veh);
244
UNUSED_PARAMETER(beyond);
245
UNUSED_PARAMETER(latOffset);
246
throw ProcessError(TL("Method not supported"));
247
}
248
249
/// @brief discard all information
250
void clear();
251
252
/// @brief print a debugging representation
253
std::string toString() const;
254
255
protected:
256
257
// @brief the differences between requriedGap and actual gap for each of the followers
258
std::vector<double> myMissingGaps;
259
260
// @brief whether this Info objects tracks leaders instead of followers
261
bool myHaveOppositeLeaders;
262
263
};
264
265