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-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/****************************************************************************/
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>
27
28// ===========================================================================
29// class declarations
30// ===========================================================================
31class MSVehicle;
32class MSLane;
33
34
35// ===========================================================================
36// type definitions
37// ===========================================================================
38typedef std::pair<const MSVehicle*, double> CLeaderDist;
39typedef std::pair<MSVehicle*, double> LeaderDist;
40
41
42// ===========================================================================
43// class definitions
44// ===========================================================================
49public:
51 MSLeaderInfo(const double laneWidth, const MSVehicle* ego = nullptr, const double latOffset = 0.);
52
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
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
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
107 void setSublaneOffset(int offset);
108
110 bool hasStoppedVehicle() const;
111
113 bool hasVehicle(const MSVehicle* veh) const;
114
116 void removeOpposite(const MSLane* lane);
117
119 virtual std::string toString() const;
120
121protected:
122
124 // @note: not const to simplify assignment
125 double myWidth;
126
129
130 std::vector<const MSVehicle*> myVehicles;
131
133 // if an ego vehicle is given in the constructor, the number of free
134 // sublanes of those covered by ego
136
140
142
143};
144
145
148public:
150 MSLeaderDistanceInfo(const double laneWidth, const MSVehicle* ego, const double latOffset);
151
153 MSLeaderDistanceInfo(const CLeaderDist& cLeaderDist, const double laneWidth);
154
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
176 virtual void addLeaders(MSLeaderDistanceInfo& other);
177
179 virtual void clear();
180
182 CLeaderDist operator[](int sublane) const;
183
185 virtual std::string toString() const;
186
187 const std::vector<double>& getDistances() const {
188 return myDistances;
189 }
190
192 void fixOppositeGaps(bool isFollower);
193
195 void patchGaps(double amount);
196
198 CLeaderDist getClosest() const;
199
200 void moveSamePosTo(const MSVehicle* ego, MSLeaderDistanceInfo& other);
201
203 double getMinDistToStopped() const;
204
205
206protected:
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) */
217public:
219 MSCriticalFollowerDistanceInfo(const double laneWidth, const MSVehicle* ego, const double latOffset, const bool haveOppositeLeaders = false);
220
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
250 void clear();
251
253 std::string toString() const;
254
255protected:
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
262
263};
std::pair< MSVehicle *, double > LeaderDist
std::pair< const MSVehicle *, double > CLeaderDist
#define TL(string)
Definition MsgHandler.h:305
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)