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-2018 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
18 // Scalable model based on Krauss by Peter Wagner
19 /****************************************************************************/
20 
21 
22 // ===========================================================================
23 // included modules
24 // ===========================================================================
25 #include <config.h>
26 
27 #include <microsim/MSVehicle.h>
28 #include <microsim/MSLane.h>
29 #include "MSCFModel_PWag2009.h"
31 
32 
33 // ===========================================================================
34 // method definitions
35 // ===========================================================================
37  MSCFModel(vtype),
38  myDawdle(vtype->getParameter().getCFParam(SUMO_ATTR_SIGMA, SUMOVTypeParameter::getDefaultImperfection(vtype->getParameter().vehicleClass))),
39  myTauDecel(myDecel * myHeadwayTime),
40  myDecelDivTau(myDecel / myHeadwayTime),
41  myTauLastDecel(myDecel * vtype->getParameter().getCFParam(SUMO_ATTR_CF_PWAGNER2009_TAULAST, 0.3)),
42  myActionPointProbability(vtype->getParameter().getCFParam(SUMO_ATTR_CF_PWAGNER2009_APPROB, 0.5)) {
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 // in addition, the parameters myTauLast, probAP, and sigmaAcc are needed; sigmaAcc can use myDawdle
59 // myTauLast might use the current time-step size, but this yields eventually an extreme model, I would be
60 // more careful and set it to something around 0.3 or 0.4, which are among the shortest headways I have
61 // seen so far in data ...
62 
63 double
64 MSCFModel_PWag2009::followSpeed(const MSVehicle* const veh, double speed, double gap, double predSpeed, double /*predMaxDecel*/, const MSVehicle* const /*pred*/) const {
65  if (predSpeed == 0 && gap < 0.01) {
66  return 0;
67  }
68  const double vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
69  const double asafe = SPEED2ACCEL(vsafe - speed);
71  double apref = vars->aOld;
72  if (apref <= asafe && RandHelper::rand() <= myActionPointProbability * TS) {
73  apref = myDecelDivTau * (gap + (predSpeed - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
74  apref = MIN2(apref, myAccel);
75  apref = MAX2(apref, -myDecel);
76  apref += myDawdle * RandHelper::rand((double) - 1., (double)1.);
77  }
78  if (apref > asafe) {
79  apref = asafe;
80  }
81  return MAX2(0., speed + ACCEL2SPEED(apref));
82 }
83 
84 // uses the safe speed and preferred acceleration with the same NORMAL tau to compute stopSpeed
85 double
86 MSCFModel_PWag2009::stopSpeed(const MSVehicle* const /* veh */, const double speed, double gap) const {
87  if (gap < 0.01) {
88  return 0.;
89  }
90  const double vsafe = -myTauDecel + sqrt(myTauDecel * myTauDecel + 2.0 * myDecel * gap);
91  const double asafe = SPEED2ACCEL(vsafe - speed);
92 // VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
93  double apref = myDecelDivTau * (gap - 2 * speed * myHeadwayTime) / (speed + myTauDecel);
94  if (apref <= asafe) {
95  apref = MIN2(apref, myAccel);
96  apref = MAX2(apref, -myDecel);
97  } else {
98  apref = asafe;
99  }
100  return MAX2(0., vsafe + ACCEL2SPEED(apref));
101 }
102 
103 // this method should not do anything, since followSpeed() has taken care of dawdling already...
104 double
105 MSCFModel_PWag2009::dawdle(double speed) const {
106  return speed;
107 // return MAX2(0., speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
108 }
109 
110 // eventually, this method isn't needed anymore
111 //double
112 //MSCFModel_PWag2009::_v(const MSVehicle* const veh, double speed, double gap, double predSpeed) const {
113 // if (predSpeed == 0 && gap < 0.01) {
114 // return 0;
115 // }
116 // const double vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
117 // const double asafe = SPEED2ACCEL(vsafe - speed);
118 // VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
119 // double apref = vars->aOld;
120 // if (apref <= asafe && RandHelper::rand() <= myActionPointProbability * TS) {
121 // apref = myDecelDivTau * (gap + (predSpeed - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
122 // if (apref>myAccel)
123 // apref = myAccel;
124 // if (apref<-myDecel)
125 // apref = -myDecel;
126 // apref += myDawdle * RandHelper::rand((double) - 1., (double)1.);
127 // }
128 // if (apref > asafe)
129 // apref = asafe;
130 // return MAX2(0, vsafe+ACCEL2SPEED(apref));
131 //}
132 //
133 
134 MSCFModel*
136  return new MSCFModel_PWag2009(vtype);
137 }
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:79
double myTauDecel
The precomputed value for myDecel*myTau.
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle&#39;s car following model variables.
Definition: MSVehicle.h:909
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:54
Structure representing possible vehicle parameter.
The car-following model abstraction.
Definition: MSCFModel.h:57
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
Definition: RandHelper.h:61
~MSCFModel_PWag2009()
Destructor.
double myAccel
The vehicle&#39;s maximum acceleration [m/s^2].
Definition: MSCFModel.h:590
T MAX2(T a, T b)
Definition: StdDefs.h:76
#define TS
Definition: SUMOTime.h:45
#define SPEED2ACCEL(x)
Definition: SUMOTime.h:56
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:165
The car-following model and parameter.
Definition: MSVehicleType.h:66
double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0) const
Computes the vehicle&#39;s safe speed (no dawdling)
double myDecelDivTau
The precomputed value for myDecel/myTau.
T MIN2(T a, T b)
Definition: StdDefs.h:70
double myDecel
The vehicle&#39;s maximum deceleration [m/s^2].
Definition: MSCFModel.h:593
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) ...
double dawdle(double speed) const
Applies driver imperfection (dawdling / sigma)
MSCFModel_PWag2009(const MSVehicleType *vtype)
Constructor.
double myActionPointProbability
The probability for any action.
double finalizeSpeed(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
double myHeadwayTime
The driver&#39;s desired time headway (aka reaction time tau) [s].
Definition: MSCFModel.h:602
double getSpeed() const
Returns the vehicle&#39;s current speed.
Definition: MSVehicle.h:483