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.org/sumo
3 // Copyright (C) 2010-2017 German Aerospace Center (DLR) and others.
4 /****************************************************************************/
5 //
6 // This program and the accompanying materials
7 // are made available under the terms of the Eclipse Public License v2.0
8 // which accompanies this distribution, and is available at
9 // http://www.eclipse.org/legal/epl-v20.html
10 //
11 /****************************************************************************/
20 // Scalable model based on Krauss by Peter Wagner
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include <microsim/MSVehicle.h>
34 #include <microsim/MSLane.h>
35 #include "MSCFModel_PWag2009.h"
37 
38 
39 // ===========================================================================
40 // method definitions
41 // ===========================================================================
43  double decel, double emergencyDecel, double apparentDecel,
44  double dawdle, double headwayTime, double tauLast, double apProb) :
45  MSCFModel(vtype, accel, decel, emergencyDecel, apparentDecel, headwayTime), myDawdle(dawdle),
46  myTauDecel(decel * headwayTime),
47  myDecelDivTau(decel / headwayTime),
48  myTauLastDecel(decel * tauLast),
49  myActionPointProbability(apProb) {
50 }
51 
52 
54 
55 
56 double
57 MSCFModel_PWag2009::moveHelper(MSVehicle* const veh, double vPos) const {
58  const double vNext = MSCFModel::moveHelper(veh, vPos);
60  double apref = SPEED2ACCEL(vNext - veh->getSpeed());
61  vars->aOld = apref;
62  return vNext;
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 {
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() <= 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.);
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) 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 // this method should not do anything, since followSpeed() has taken care of dawdling already...
111 double
112 MSCFModel_PWag2009::dawdle(double speed) const {
113  return speed;
114 // return MAX2(0., speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
115 }
116 
117 // eventually, this method isn't needed anymore
118 //double
119 //MSCFModel_PWag2009::_v(const MSVehicle* const veh, double speed, double gap, double predSpeed) const {
120 // if (predSpeed == 0 && gap < 0.01) {
121 // return 0;
122 // }
123 // const double vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
124 // const double asafe = SPEED2ACCEL(vsafe - speed);
125 // VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
126 // double apref = vars->aOld;
127 // if (apref <= asafe && RandHelper::rand() <= myActionPointProbability * TS) {
128 // apref = myDecelDivTau * (gap + (predSpeed - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
129 // if (apref>myAccel)
130 // apref = myAccel;
131 // if (apref<-myDecel)
132 // apref = -myDecel;
133 // apref += myDawdle * RandHelper::rand((double) - 1., (double)1.);
134 // }
135 // if (apref > asafe)
136 // apref = asafe;
137 // return MAX2(0, vsafe+ACCEL2SPEED(apref));
138 //}
139 //
140 
141 MSCFModel*
145 }
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:83
double myTauDecel
The precomputed value for myDecel*myTau.
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle&#39;s car following model variables.
Definition: MSVehicle.h:891
double myApparentDecel
The vehicle&#39;s deceleration as expected by surrounding traffic [m/s^2].
Definition: MSCFModel.h:541
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:60
The car-following model abstraction.
Definition: MSCFModel.h:59
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
Definition: RandHelper.h:64
~MSCFModel_PWag2009()
Destructor.
double myAccel
The vehicle&#39;s maximum acceleration [m/s^2].
Definition: MSCFModel.h:534
T MAX2(T a, T b)
Definition: StdDefs.h:73
virtual double moveHelper(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
Definition: MSCFModel.cpp:155
#define TS
Definition: SUMOTime.h:51
#define SPEED2ACCEL(x)
Definition: SUMOTime.h:62
The car-following model and parameter.
Definition: MSVehicleType.h:72
double myDecelDivTau
The precomputed value for myDecel/myTau.
T MIN2(T a, T b)
Definition: StdDefs.h:67
double myDecel
The vehicle&#39;s maximum deceleration [m/s^2].
Definition: MSCFModel.h:537
double myTauLastDecel
The precomputed value for (minimum headway time)*myDecel.
MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
double stopSpeed(const MSVehicle *const veh, const double speed, double gap2pred) const
Computes the vehicle&#39;s safe speed for approaching a non-moving obstacle (no dawdling) ...
MSCFModel_PWag2009(const MSVehicleType *vtype, double accel, double decel, double emergencyDecel, double apparentDecel, double dawdle, double headwayTime, double tauLast, double apProb)
Constructor.
double myEmergencyDecel
The vehicle&#39;s maximum emergency deceleration [m/s^2].
Definition: MSCFModel.h:539
double dawdle(double speed) const
Applies driver imperfection (dawdling / sigma)
double myActionPointProbability
The probability for any action.
double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel) const
Computes the vehicle&#39;s safe speed (no dawdling)
double myHeadwayTime
The driver&#39;s desired time headway (aka reaction time tau) [s].
Definition: MSCFModel.h:544
double getSpeed() const
Returns the vehicle&#39;s current speed.
Definition: MSVehicle.h:482
double moveHelper(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.