Eclipse SUMO - Simulation of Urban MObility
MSCFModel_PWag2009.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2010-2024 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 /****************************************************************************/
21 // Scalable model based on Krauss by Peter Wagner
22 /****************************************************************************/
23 #include <config.h>
24 
25 #include <microsim/MSVehicle.h>
26 #include <microsim/MSLane.h>
27 #include "MSCFModel_PWag2009.h"
29 
30 
31 // ===========================================================================
32 // method definitions
33 // ===========================================================================
35  MSCFModel(vtype),
36  myDawdle(vtype->getParameter().getCFParam(SUMO_ATTR_SIGMA, SUMOVTypeParameter::getDefaultImperfection(vtype->getParameter().vehicleClass))),
37  myTauDecel(myDecel * myHeadwayTime),
38  myDecelDivTau(myDecel / myHeadwayTime),
39  myTauLastDecel(myDecel * vtype->getParameter().getCFParam(SUMO_ATTR_CF_PWAGNER2009_TAULAST, 0.3)),
40  myActionPointProbability(vtype->getParameter().getCFParam(SUMO_ATTR_CF_PWAGNER2009_APPROB, 0.5)) {
41  // PWag2009 does not drive very precise and may violate minGap on occasion
43 }
44 
45 
47 
48 
49 double
50 MSCFModel_PWag2009::finalizeSpeed(MSVehicle* const veh, double vPos) const {
51  const double vNext = MSCFModel::finalizeSpeed(veh, vPos);
53  double apref = SPEED2ACCEL(vNext - veh->getSpeed());
54  vars->aOld = apref;
55  return vNext;
56 }
57 
58 double
59 MSCFModel_PWag2009::patchSpeedBeforeLC(const MSVehicle* veh, double vMin, double vMax) const {
60  UNUSED_PARAMETER(veh);
61  UNUSED_PARAMETER(vMin);
62  return vMax;
63 }
64 
65 // in addition, the parameters myTauLast, probAP, and sigmaAcc are needed; sigmaAcc can use myDawdle
66 // myTauLast might use the current time-step size, but this yields eventually an extreme model, I would be
67 // more careful and set it to something around 0.3 or 0.4, which are among the shortest headways I have
68 // seen so far in data ...
69 
70 double
71 MSCFModel_PWag2009::followSpeed(const MSVehicle* const veh, double speed, double gap, double predSpeed, double /*predMaxDecel*/, const MSVehicle* const /*pred*/, const CalcReason /*usage*/) const {
72  if (predSpeed == 0 && gap < 0.01) {
73  return 0;
74  }
75  const double vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
76  const double asafe = SPEED2ACCEL(vsafe - speed);
78  double apref = vars->aOld;
79  if (apref <= asafe && RandHelper::rand(veh->getRNG()) <= myActionPointProbability * TS) {
80  apref = myDecelDivTau * (gap + (predSpeed - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
81  apref = MIN2(apref, myAccel);
82  apref = MAX2(apref, -myDecel);
83  apref += myDawdle * RandHelper::rand((double) - 1., (double)1., veh->getRNG());
84  }
85  if (apref > asafe) {
86  apref = asafe;
87  }
88  return MAX2(0., speed + ACCEL2SPEED(apref));
89 }
90 
91 // uses the safe speed and preferred acceleration with the same NORMAL tau to compute stopSpeed
92 double
93 MSCFModel_PWag2009::stopSpeed(const MSVehicle* const /* veh */, const double speed, double gap, double /*decel*/, const CalcReason /*usage*/) const {
94  if (gap < 0.01) {
95  return 0.;
96  }
97  const double vsafe = -myTauDecel + sqrt(myTauDecel * myTauDecel + 2.0 * myDecel * gap);
98  const double asafe = SPEED2ACCEL(vsafe - speed);
99 // VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
100  double apref = myDecelDivTau * (gap - 2 * speed * myHeadwayTime) / (speed + myTauDecel);
101  if (apref <= asafe) {
102  apref = MIN2(apref, myAccel);
103  apref = MAX2(apref, -myDecel);
104  } else {
105  apref = asafe;
106  }
107  return MAX2(0., vsafe + ACCEL2SPEED(apref));
108 }
109 
110 
111 MSCFModel*
113  return new MSCFModel_PWag2009(vtype);
114 }
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:51
#define TS
Definition: SUMOTime.h:42
#define SPEED2ACCEL(x)
Definition: SUMOTime.h:53
@ SUMO_ATTR_CF_PWAGNER2009_TAULAST
@ SUMO_ATTR_COLLISION_MINGAP_FACTOR
@ SUMO_ATTR_CF_PWAGNER2009_APPROB
@ SUMO_ATTR_SIGMA
#define UNUSED_PARAMETER(x)
Definition: StdDefs.h:30
T MIN2(T a, T b)
Definition: StdDefs.h:76
T MAX2(T a, T b)
Definition: StdDefs.h:82
SumoRNG * getRNG() const
~MSCFModel_PWag2009()
Destructor.
double myDecelDivTau
The precomputed value for myDecel/myTau.
double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed (no dawdling)
double myTauLastDecel
The precomputed value for (minimum headway time)*myDecel.
double myActionPointProbability
The probability for any action.
double patchSpeedBeforeLC(const MSVehicle *veh, double vMin, double vMax) const
apply dawdling
MSCFModel_PWag2009(const MSVehicleType *vtype)
Constructor.
MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
double myTauDecel
The precomputed value for myDecel*myTau.
double stopSpeed(const MSVehicle *const veh, const double speed, double gap2pred, double decel, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
double finalizeSpeed(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
The car-following model abstraction.
Definition: MSCFModel.h:55
virtual double finalizeSpeed(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences. Called at most once per simulation...
Definition: MSCFModel.cpp:187
CalcReason
What the return value of stop/follow/free-Speed is used for.
Definition: MSCFModel.h:77
double myCollisionMinGapFactor
The factor of minGap that must be maintained to avoid a collision event.
Definition: MSCFModel.h:707
double myDecel
The vehicle's maximum deceleration [m/s^2].
Definition: MSCFModel.h:701
double myAccel
The vehicle's maximum acceleration [m/s^2].
Definition: MSCFModel.h:698
double myHeadwayTime
The driver's desired time headway (aka reaction time tau) [s].
Definition: MSCFModel.h:710
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:77
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle's car following model variables.
Definition: MSVehicle.h:995
double getSpeed() const
Returns the vehicle's current speed.
Definition: MSVehicle.h:493
The car-following model and parameter.
Definition: MSVehicleType.h:63
const SUMOVTypeParameter & getParameter() const
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
Definition: RandHelper.cpp:94
Structure representing possible vehicle parameter.
double getCFParam(const SumoXMLAttr attr, const double defaultValue) const
Returns the named value from the map, or the default if it is not contained there.