Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSLCM_LC2013.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-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/****************************************************************************/
22// A lane change model developed by D. Krajzewicz, J. Erdmann et al. between 2004 and 2013
23/****************************************************************************/
24#pragma once
25#include <config.h>
26
28#include <vector>
29
30// INVALID_SPEED should be used when the construction of upper bound for the speed
31// leads to no restrictions, e.g. during LC-messaging to followers or leaders.
32// Currently either std::numeric_limits<...>.max() or -1 is used for this purpose in many places.
33// TODO: implement this everywhere and remove workarounds for ballistic update in cases of possible '-1'-returns. Refs. #2577
34#define INVALID_SPEED 299792458 + 1 // nothing can go faster than the speed of light!
35
36
37// ===========================================================================
38// class definitions
39// ===========================================================================
46public:
47
49
50 virtual ~MSLCM_LC2013();
51
53 LaneChangeModel getModelID() const override {
55 }
56
59
60 bool debugVehicle() const override;
61
70 int wantsChange(
71 int laneOffset,
72 MSAbstractLaneChangeModel::MSLCMessager& msgPass, int blocked,
73 const std::pair<MSVehicle*, double>& leader,
74 const std::pair<MSVehicle*, double>& follower,
75 const std::pair<MSVehicle*, double>& neighLead,
76 const std::pair<MSVehicle*, double>& neighFollow,
77 const MSLane& neighLane,
78 const std::vector<MSVehicle::LaneQ>& preb,
79 MSVehicle** lastBlocked,
80 MSVehicle** firstBlocked) override;
81
82 void* inform(void* info, MSVehicle* sender) override;
83
94 double patchSpeed(const double min, const double wanted, const double max,
95 const MSCFModel& cfModel) override;
96
97 void changed() override;
98
99 void resetState() override;
100
101 double getSafetyFactor() const override;
102
103 double getOppositeSafetyFactor() const override;
104
105 void prepareStep() override;
106
108 std::string getParameter(const std::string& key) const override;
109
111 void setParameter(const std::string& key, const std::string& value) override;
112
114 double computeSpeedLat(double latDist, double& maneuverDist, bool urgent) const override;
115
119 virtual void saveState(OutputDevice& out) const override;
120
124 virtual void loadState(const SUMOSAXAttributes& attrs) override;
125
126protected:
127
129 double _patchSpeed(double min, const double wanted, double max,
130 const MSCFModel& cfModel);
131
133 int _wantsChange(
134 int laneOffset,
135 MSAbstractLaneChangeModel::MSLCMessager& msgPass, int blocked,
136 const std::pair<MSVehicle*, double>& leader,
137 const std::pair<MSVehicle*, double>& follower,
138 const std::pair<MSVehicle*, double>& neighLead,
139 const std::pair<MSVehicle*, double>& neighFollow,
140 const MSLane& neighLane,
141 const std::vector<MSVehicle::LaneQ>& preb,
142 MSVehicle* lastBlocked,
143 MSVehicle* firstBlocked);
144
145 /* @brief decide whether we will overtake or follow a blocking leader
146 * and inform it accordingly
147 * If we decide to follow, myVSafes will be extended
148 * returns the planned speed if following or -1 if overtaking */
150 int blocked, int dir,
151 const std::pair<MSVehicle*, double>& neighLead,
152 double remainingSeconds);
153
156 int blocked, int dir,
157 const std::pair<MSVehicle*, double>& neighFollow,
158 double remainingSeconds,
159 double plannedSpeed);
160
161
162 /* @brief compute the distance to cover until a safe gap to the vehicle v in front is reached
163 * assuming constant velocities
164 * @param[in] follower the vehicle which overtakes
165 * @param[in] leader the vehicle to be overtaken
166 * @param[in] gap initial distance between front of follower and back of leader
167 * @param[in] leaderSpeed an assumed speed for the leader (default uses the current speed)
168 * @param[in] followerSpeed an assumed speed for the follower (default uses the current speed)
169 * @return the distance that the relative positions would have to change.
170 */
171 static double overtakeDistance(const MSVehicle* follower, const MSVehicle* leader, const double gap, double followerSpeed = INVALID_SPEED, double leaderSpeed = INVALID_SPEED);
172
174 int slowDownForBlocked(MSVehicle* blocked, int state);
175
177 double anticipateFollowSpeed(const std::pair<MSVehicle*, double>& leaderDist, double dist, double vMax, bool acceleratingLeader);
178
180 void adaptSpeedToPedestrians(const MSLane* lane, double& v);
181
183 bool saveBlockerLength(double length, double foeLeftSpace) override;
184
185 inline bool amBlockingLeader() {
186 return (myOwnState & LCA_AMBLOCKINGLEADER) != 0;
187 }
188 inline bool amBlockingFollower() {
189 return (myOwnState & LCA_AMBLOCKINGFOLLOWER) != 0;
190 }
191 inline bool amBlockingFollowerNB() {
193 }
197 inline bool currentDistDisallows(double dist, int laneOffset, double lookForwardDist) {
198 return dist / (abs(laneOffset)) < lookForwardDist;
199 }
200 inline bool currentDistAllows(double dist, int laneOffset, double lookForwardDist) {
201 return dist / abs(laneOffset) > lookForwardDist;
202 }
203
205 bool hasFreeLane(int laneOffset, const std::pair<MSVehicle*, double>& neighLeadStopped) const;
206
207protected:
208
210 typedef std::pair<double, int> Info;
211
215
216 /* @brief a value for tracking the probability of following the/"Rechtsfahrgebot"
217 * A larger negative value indicates higher probability for moving to the
218 * right (as in mySpeedGainProbability) */
220
223
224 /*@brief the speed to use when computing the look-ahead distance for
225 * determining urgency of strategic lane changes */
227
228 bool myDontBrake; // XXX: myDontBrake is initialized as false and seems not to be changed anywhere... What's its purpose???
229
231
233 double myCooperativeParam; // in [0,1]
237
238 // @brief the factor by which the lookahead distance to the left differs from the lookahead to the right
240 // @brief the factor by which the speedGain-threshold for the leftdiffers from the threshold for the right
242
243 // @brief lookahead for speedGain in seconds
245 // @brief the minimum time to spent driving without lane change after a speed-gain change
247 // @brief the threshold value of mySpeedGainProbability for making a speedGain change urgent
249 // @brief bounus factor staying on the inside of multi-lane roundabout
251 // @brief factor for cooperative speed adjustment
253
254 // time for unrestricted driving on the right to accept keepRight change
256
257 // @brief speed difference factor for overtaking the leader on the neighbor lane before changing to that lane
259
260 // for feature testing
262
264
266
267 // @brief thresholds for changing to the right/left
271};
#define INVALID_SPEED
@ LCA_AMBLOCKINGLEADER
@ LCA_AMBLOCKINGFOLLOWER_DONTBRAKE
@ LCA_AMBLOCKINGFOLLOWER
A class responsible for exchanging messages between cars involved in lane-change interaction.
Interface for lane-change models.
int myOwnState
The current state of the vehicle.
The car-following model abstraction.
Definition MSCFModel.h:57
A lane change model developed by D. Krajzewicz, J. Erdmann et al. between 2004 and 2013.
bool currentDistAllows(double dist, int laneOffset, double lookForwardDist)
int wantsChange(int laneOffset, MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, const std::pair< MSVehicle *, double > &leader, const std::pair< MSVehicle *, double > &follower, const std::pair< MSVehicle *, double > &neighLead, const std::pair< MSVehicle *, double > &neighFollow, const MSLane &neighLane, const std::vector< MSVehicle::LaneQ > &preb, MSVehicle **lastBlocked, MSVehicle **firstBlocked) override
Called to examine whether the vehicle wants to change using the given laneOffset. This method gets th...
bool amBlockingLeader()
void informFollower(MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, int dir, const std::pair< MSVehicle *, double > &neighFollow, double remainingSeconds, double plannedSpeed)
decide whether we will try cut in before the follower or allow to be overtaken
long long int myKeepRightProbability
double computeSpeedLat(double latDist, double &maneuverDist, bool urgent) const override
decides the next lateral speed (for continuous lane changing)
double myOvertakeDeltaSpeedFactor
bool amBlockingFollowerNB()
double myLookAheadSpeed
bool debugVehicle() const override
whether the current vehicles shall be debugged
double myStrategicParam
long long int mySpeedGainProbabilityRight
double myRoundaboutBonus
double mySpeedGainLookahead
const double myExperimentalParam1
double patchSpeed(const double min, const double wanted, const double max, const MSCFModel &cfModel) override
Called to adapt the speed in order to allow a lane change. It uses information on LC-related desired ...
void initDerivedParameters()
init cached parameters derived directly from model parameters
LaneChangeModel getModelID() const override
Returns the model's id.
double myCooperativeParam
double anticipateFollowSpeed(const std::pair< MSVehicle *, double > &leaderDist, double dist, double vMax, bool acceleratingLeader)
anticipate future follow speed for the given leader
std::string getParameter(const std::string &key) const override
try to retrieve the given parameter from this device. Throw exception for unsupported key
void setParameter(const std::string &key, const std::string &value) override
try to set the given parameter for this laneChangeModel. Throw exception for unsupported key
bool hasFreeLane(int laneOffset, const std::pair< MSVehicle *, double > &neighLeadStopped) const
whether there is a lane beyond laneOffset that can be used to overtake the stopped leader on the neig...
double myCooperativeSpeed
bool amBlockingFollower()
double informLeader(MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, int dir, const std::pair< MSVehicle *, double > &neighLead, double remainingSeconds)
double _patchSpeed(double min, const double wanted, double max, const MSCFModel &cfModel)
double mySpeedGainParam
double myLookaheadLeft
double myLeadingBlockerLength
int _wantsChange(int laneOffset, MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, const std::pair< MSVehicle *, double > &leader, const std::pair< MSVehicle *, double > &follower, const std::pair< MSVehicle *, double > &neighLead, const std::pair< MSVehicle *, double > &neighFollow, const MSLane &neighLane, const std::vector< MSVehicle::LaneQ > &preb, MSVehicle *lastBlocked, MSVehicle *firstBlocked)
helper function for doing the actual work
std::pair< double, int > Info
information regarding save velocity (unused) and state flags of the ego vehicle
void prepareStep() override
double getSafetyFactor() const override
return factor for modifying the safety constraints of the car-following model
double myLeftSpace
double myOppositeParam
bool amBlockingFollowerPlusNB()
double myKeepRightParam
bool currentDistDisallows(double dist, int laneOffset, double lookForwardDist)
void adaptSpeedToPedestrians(const MSLane *lane, double &v)
react to pedestrians on the given lane
virtual void saveState(OutputDevice &out) const override
Save the state of the laneChangeModel.
virtual ~MSLCM_LC2013()
long long int myChangeProbThresholdRight
double getOppositeSafetyFactor() const override
return factor for modifying the safety constraints for opposite-diretction overtaking of the car-foll...
long long int mySpeedGainProbabilityLeft
a value for tracking the probability that a change to that side is beneficial
void resetState() override
double mySpeedGainRight
double myKeepRightAcceptanceTime
double mySpeedGainUrgency
int slowDownForBlocked(MSVehicle *blocked, int state)
compute useful slowdowns for blocked vehicles
bool saveBlockerLength(double length, double foeLeftSpace) override
reserve space at the end of the lane to avoid dead locks
void changed() override
double mySpeedGainRemainTime
void * inform(void *info, MSVehicle *sender) override
long long int myChangeProbThresholdLeft
virtual void loadState(const SUMOSAXAttributes &attrs) override
Loads the state of the laneChangeModel from the given attributes.
static double overtakeDistance(const MSVehicle *follower, const MSVehicle *leader, const double gap, double followerSpeed=INVALID_SPEED, double leaderSpeed=INVALID_SPEED)
Representation of a lane in the micro simulation.
Definition MSLane.h:84
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
Static storage of an output device and its base (abstract) implementation.
Encapsulated SAX-Attributes.