Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSLeaderInfo.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2002-2026 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/****************************************************************************/
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>
28
29// ===========================================================================
30// class declarations
31// ===========================================================================
32class MSVehicle;
33class MSLane;
34
35
36// ===========================================================================
37// type definitions
38// ===========================================================================
39typedef std::pair<const MSVehicle*, double> CLeaderDist;
40typedef std::pair<MSVehicle*, double> LeaderDist;
41
42
43// ===========================================================================
44// class definitions
45// ===========================================================================
50public:
52 MSLeaderInfo(const double laneWidth, const MSVehicle* ego = nullptr, const double latOffset = 0.);
53
55 virtual ~MSLeaderInfo();
56
57 /* @brief adds this vehicle as a leader in the appropriate sublanes
58 * @param[in] veh The vehicle to add
59 * @param[in] beyond Whether the vehicle is beyond the existing leaders (and thus may be shadowed by them)
60 * @param[in] latOffset The lateral offset that must be added to the position of veh
61 * @return The number of free sublanes
62 */
63 virtual int addLeader(const MSVehicle* veh, bool beyond, double latOffset = 0.);
64
66 virtual void clear();
67
68 /* @brief returns sublanes occupied by veh
69 * @param[in] veh The vehicle to check
70 * @param[in] latOffset The offset value to add to the vehicle position
71 * @param[out] rightmost The rightmost sublane occupied by veh
72 * @param[out] leftmost The rightmost sublane occupied by veh
73 */
74 void getSubLanes(const MSVehicle* veh, double latOffset, int& rightmost, int& leftmost) const;
75
76 /* @brief returns the sublane boundaries of the ith sublane
77 * @param[in] sublane The sublane to check
78 * @param[in] latOffset The offset value to add to the result
79 * @param[out] rightSide The right border of the given sublane
80 * @param[out] leftSide The left border of the given sublane
81 */
82 void getSublaneBorders(int sublane, double latOffset, double& rightSide, double& leftSide) const;
83
85 const MSVehicle* operator[](int sublane) const;
86
87 int numSublanes() const {
88 return (int)myVehicles.size();
89 }
90
91 int numFreeSublanes() const {
92 return myFreeSublanes;
93 }
94
95 bool hasVehicles() const {
96 return myHasVehicles;
97 }
98
99 const std::vector<const MSVehicle*>& getVehicles() const {
100 return myVehicles;
101 }
102
103 int getSublaneOffset() const {
104 return myOffset;
105 }
106
108 void setSublaneOffset(int offset);
109
111 bool hasStoppedVehicle() const;
112
114 bool hasVehicle(const MSVehicle* veh) const;
115
117 void removeOpposite(const MSLane* lane);
118
120 virtual std::string toString() const;
121
122protected:
123
125 // @note: not const to simplify assignment
126 double myWidth;
127
130
131 std::vector<const MSVehicle*> myVehicles;
132
134 // if an ego vehicle is given in the constructor, the number of free
135 // sublanes of those covered by ego
137
141
143
144};
145
146
149public:
151 MSLeaderDistanceInfo(const double laneWidth, const MSVehicle* ego, const double latOffset);
152
154 MSLeaderDistanceInfo(const CLeaderDist& cLeaderDist, const double laneWidth);
155
157 virtual ~MSLeaderDistanceInfo();
158
159 /* @brief adds this vehicle as a leader in the appropriate sublanes
160 * @param[in] veh The vehicle to add
161 * @param[in] gap The gap between the egoFront+minGap to the back of veh
162 * or from the back of ego to the front+minGap of veh
163 * @param[in] latOffset The lateral offset that must be added to the position of veh
164 * @param[in] sublane The single sublane to which this leader shall be checked (-1 means: check for all)
165 * @return The number of free sublanes
166 */
167 virtual int addLeader(const MSVehicle* veh, double gap, double latOffset = 0, int sublane = -1);
168
169 virtual int addLeader(const MSVehicle* veh, bool beyond, double latOffset = 0) {
170 UNUSED_PARAMETER(veh);
171 UNUSED_PARAMETER(beyond);
172 UNUSED_PARAMETER(latOffset);
173 throw ProcessError(TL("Method not supported"));
174 }
175
177 virtual void addLeaders(MSLeaderDistanceInfo& other);
178
180 virtual void clear();
181
183 CLeaderDist operator[](int sublane) const;
184
186 virtual std::string toString() const;
187
188 const std::vector<double>& getDistances() const {
189 return myDistances;
190 }
191
193 void fixOppositeGaps(bool isFollower);
194
196 void patchGaps(double amount);
197
199 CLeaderDist getClosest() const;
200
201 void moveSamePosTo(const MSVehicle* ego, MSLeaderDistanceInfo& other);
202
204 double getMinDistToStopped() const;
205
206
207protected:
208
209 std::vector<double> myDistances;
210
211};
212
213
214/* @brief saves follower vehicles and their distances as well as their required gap relative to an ego vehicle
215 * when adding new followers, the one with the largest required gap is recored
216 * (rather than the one with the smallest gap) */
218public:
220 MSCriticalFollowerDistanceInfo(const double laneWidth, const MSVehicle* ego, const double latOffset, const bool haveOppositeLeaders = false);
221
224
225 /* @brief adds this vehicle as a follower in the appropriate sublanes
226 * @param[in] veh The vehicle to add
227 * @param[in] ego The vehicle which is being followed
228 * @param[in] gap The distance from the back of ego to the follower
229 * @param[in] latOffset The lateral offset that must be added to the position of veh
230 * @param[in] sublane The single sublane to which this leader shall be checked (-1 means: check for all)
231 * @return The number of free sublanes
232 */
233 int addFollower(const MSVehicle* veh, const MSVehicle* ego, double gap, double latOffset = 0, int sublane = -1);
234
235 virtual int addLeader(const MSVehicle* veh, double gap, double latOffset = 0, int sublane = -1) {
236 UNUSED_PARAMETER(veh);
237 UNUSED_PARAMETER(gap);
238 UNUSED_PARAMETER(latOffset);
239 UNUSED_PARAMETER(sublane);
240 throw ProcessError(TL("Method not supported"));
241 }
242
243 virtual int addLeader(const MSVehicle* veh, bool beyond, double latOffset = 0) {
244 UNUSED_PARAMETER(veh);
245 UNUSED_PARAMETER(beyond);
246 UNUSED_PARAMETER(latOffset);
247 throw ProcessError(TL("Method not supported"));
248 }
249
251 void clear();
252
254 std::string toString() const;
255
256protected:
257
258 // @brief the differences between requriedGap and actual gap for each of the followers
259 std::vector<double> myMissingGaps;
260
261 // @brief whether this Info objects tracks leaders instead of followers
263
264};
std::pair< MSVehicle *, double > LeaderDist
std::pair< const MSVehicle *, double > CLeaderDist
#define TL(string)
Definition MsgHandler.h:304
virtual int addLeader(const MSVehicle *veh, double gap, double latOffset=0, int sublane=-1)
std::vector< double > myMissingGaps
virtual ~MSCriticalFollowerDistanceInfo()
Destructor.
virtual int addLeader(const MSVehicle *veh, bool beyond, double latOffset=0)
std::string toString() const
print a debugging representation
void clear()
discard all information
int addFollower(const MSVehicle *veh, const MSVehicle *ego, double gap, double latOffset=0, int sublane=-1)
Representation of a lane in the micro simulation.
Definition MSLane.h:84
saves leader/follower vehicles and their distances relative to an ego vehicle
virtual void addLeaders(MSLeaderDistanceInfo &other)
updatd empty sublanes with vehicles and gaps from other
virtual std::string toString() const
print a debugging representation
double getMinDistToStopped() const
return minimum distance to a stopped vehicle or max double
const std::vector< double > & getDistances() const
CLeaderDist getClosest() const
return vehicle with the smalles gap
virtual ~MSLeaderDistanceInfo()
Destructor.
virtual int addLeader(const MSVehicle *veh, bool beyond, double latOffset=0)
CLeaderDist operator[](int sublane) const
return the vehicle and its distance for the given sublane
virtual void clear()
discard all information
std::vector< double > myDistances
void fixOppositeGaps(bool isFollower)
subtract vehicle length from all gaps if the leader vehicle is driving in the opposite direction
void patchGaps(double amount)
add given value to all gaps
virtual int addLeader(const MSVehicle *veh, double gap, double latOffset=0, int sublane=-1)
void moveSamePosTo(const MSVehicle *ego, MSLeaderDistanceInfo &other)
bool hasVehicle(const MSVehicle *veh) const
whether the given vehicle is part of this leaderInfo
std::vector< const MSVehicle * > myVehicles
int myFreeSublanes
the number of free sublanes
int myOffset
an extra offset for shifting the interpretation of sublane borders (default [0,myWidth])
void setSublaneOffset(int offset)
set number of sublanes by which to shift positions
bool hasStoppedVehicle() const
whether a stopped vehicle is leader
void removeOpposite(const MSLane *lane)
remove vehicles that are driving in the opposite direction (fully or partially) on the given lane
int egoRightMost
borders of the ego vehicle for filtering of free sublanes
int numFreeSublanes() const
void getSublaneBorders(int sublane, double latOffset, double &rightSide, double &leftSide) const
int numSublanes() const
virtual int addLeader(const MSVehicle *veh, bool beyond, double latOffset=0.)
virtual std::string toString() const
print a debugging representation
virtual void clear()
discard all information
virtual ~MSLeaderInfo()
Destructor.
const MSVehicle * operator[](int sublane) const
return the vehicle for the given sublane
bool hasVehicles() const
int getSublaneOffset() const
void getSubLanes(const MSVehicle *veh, double latOffset, int &rightmost, int &leftmost) const
const std::vector< const MSVehicle * > & getVehicles() const
double myWidth
the width of the lane to which this instance applies
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
#define UNUSED_PARAMETER(x)