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.org/sumo
3 // Copyright (C) 2010-2019 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 /****************************************************************************/
17 // Scalable model based on Krauss by Peter Wagner
18 /****************************************************************************/
19 
20 
21 // ===========================================================================
22 // included modules
23 // ===========================================================================
24 #include <config.h>
25 
26 #include <microsim/MSVehicle.h>
27 #include <microsim/MSLane.h>
28 #include "MSCFModel_PWag2009.h"
30 
31 
32 // ===========================================================================
33 // method definitions
34 // ===========================================================================
36  MSCFModel(vtype),
37  myDawdle(vtype->getParameter().getCFParam(SUMO_ATTR_SIGMA, SUMOVTypeParameter::getDefaultImperfection(vtype->getParameter().vehicleClass))),
38  myTauDecel(myDecel * myHeadwayTime),
39  myDecelDivTau(myDecel / myHeadwayTime),
40  myTauLastDecel(myDecel * vtype->getParameter().getCFParam(SUMO_ATTR_CF_PWAGNER2009_TAULAST, 0.3)),
41  myActionPointProbability(vtype->getParameter().getCFParam(SUMO_ATTR_CF_PWAGNER2009_APPROB, 0.5)) {
42 }
43 
44 
46 
47 
48 double
49 MSCFModel_PWag2009::finalizeSpeed(MSVehicle* const veh, double vPos) const {
50  const double vNext = MSCFModel::finalizeSpeed(veh, vPos);
52  double apref = SPEED2ACCEL(vNext - veh->getSpeed());
53  vars->aOld = apref;
54  return vNext;
55 }
56 
57 // in addition, the parameters myTauLast, probAP, and sigmaAcc are needed; sigmaAcc can use myDawdle
58 // myTauLast might use the current time-step size, but this yields eventually an extreme model, I would be
59 // more careful and set it to something around 0.3 or 0.4, which are among the shortest headways I have
60 // seen so far in data ...
61 
62 double
63 MSCFModel_PWag2009::followSpeed(const MSVehicle* const veh, double speed, double gap, double predSpeed, double /*predMaxDecel*/, const MSVehicle* const /*pred*/) const {
64  if (predSpeed == 0 && gap < 0.01) {
65  return 0;
66  }
67  const double vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
68  const double asafe = SPEED2ACCEL(vsafe - speed);
70  double apref = vars->aOld;
71  if (apref <= asafe && RandHelper::rand(veh->getRNG()) <= myActionPointProbability * TS) {
72  apref = myDecelDivTau * (gap + (predSpeed - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
73  apref = MIN2(apref, myAccel);
74  apref = MAX2(apref, -myDecel);
75  apref += myDawdle * RandHelper::rand((double) - 1., (double)1., veh->getRNG());
76  }
77  if (apref > asafe) {
78  apref = asafe;
79  }
80  return MAX2(0., speed + ACCEL2SPEED(apref));
81 }
82 
83 // uses the safe speed and preferred acceleration with the same NORMAL tau to compute stopSpeed
84 double
85 MSCFModel_PWag2009::stopSpeed(const MSVehicle* const /* veh */, const double speed, double gap) const {
86  if (gap < 0.01) {
87  return 0.;
88  }
89  const double vsafe = -myTauDecel + sqrt(myTauDecel * myTauDecel + 2.0 * myDecel * gap);
90  const double asafe = SPEED2ACCEL(vsafe - speed);
91 // VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
92  double apref = myDecelDivTau * (gap - 2 * speed * myHeadwayTime) / (speed + myTauDecel);
93  if (apref <= asafe) {
94  apref = MIN2(apref, myAccel);
95  apref = MAX2(apref, -myDecel);
96  } else {
97  apref = asafe;
98  }
99  return MAX2(0., vsafe + ACCEL2SPEED(apref));
100 }
101 
102 // this method should not do anything, since followSpeed() has taken care of dawdling already...
103 double
104 MSCFModel_PWag2009::dawdle(double speed) const {
105  return speed;
106 // return MAX2(0., speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
107 }
108 
109 // eventually, this method isn't needed anymore
110 //double
111 //MSCFModel_PWag2009::_v(const MSVehicle* const veh, double speed, double gap, double predSpeed) const {
112 // if (predSpeed == 0 && gap < 0.01) {
113 // return 0;
114 // }
115 // const double vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
116 // const double asafe = SPEED2ACCEL(vsafe - speed);
117 // VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables();
118 // double apref = vars->aOld;
119 // if (apref <= asafe && RandHelper::rand() <= myActionPointProbability * TS) {
120 // apref = myDecelDivTau * (gap + (predSpeed - speed) * myHeadwayTime - speed * myHeadwayTime) / (speed + myTauDecel);
121 // if (apref>myAccel)
122 // apref = myAccel;
123 // if (apref<-myDecel)
124 // apref = -myDecel;
125 // apref += myDawdle * RandHelper::rand((double) - 1., (double)1.);
126 // }
127 // if (apref > asafe)
128 // apref = asafe;
129 // return MAX2(0, vsafe+ACCEL2SPEED(apref));
130 //}
131 //
132 
133 MSCFModel*
135  return new MSCFModel_PWag2009(vtype);
136 }
MSVehicleType
The car-following model and parameter.
Definition: MSVehicleType.h:65
MIN2
T MIN2(T a, T b)
Definition: StdDefs.h:73
MSCFModel_PWag2009::myDawdle
double myDawdle
Definition: MSCFModel_PWag2009.h:138
ACCEL2SPEED
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:52
MSCFModel_PWag2009::VehicleVariables::aOld
double aOld
Definition: MSCFModel_PWag2009.h:117
MSCFModel_PWag2009::myTauDecel
double myTauDecel
The precomputed value for myDecel*myTau.
Definition: MSCFModel_PWag2009.h:141
SPEED2ACCEL
#define SPEED2ACCEL(x)
Definition: SUMOTime.h:54
SUMO_ATTR_CF_PWAGNER2009_APPROB
@ SUMO_ATTR_CF_PWAGNER2009_APPROB
Definition: SUMOXMLDefinitions.h:835
MSVehicle::getCarFollowVariables
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle's car following model variables.
Definition: MSVehicle.h:910
MSCFModel::finalizeSpeed
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:164
MSCFModel_PWag2009::myTauLastDecel
double myTauLastDecel
The precomputed value for (minimum headway time)*myDecel.
Definition: MSCFModel_PWag2009.h:147
MSVehicle.h
MSCFModel_PWag2009::myDecelDivTau
double myDecelDivTau
The precomputed value for myDecel/myTau.
Definition: MSCFModel_PWag2009.h:144
MSCFModel_PWag2009::duplicate
MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
Definition: MSCFModel_PWag2009.cpp:134
MAX2
T MAX2(T a, T b)
Definition: StdDefs.h:79
RandHelper::rand
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
Definition: RandHelper.h:53
MSCFModel_PWag2009::stopSpeed
double stopSpeed(const MSVehicle *const veh, const double speed, double gap2pred) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
Definition: MSCFModel_PWag2009.cpp:85
MSCFModel_PWag2009::dawdle
double dawdle(double speed) const
Applies driver imperfection (dawdling / sigma)
Definition: MSCFModel_PWag2009.cpp:104
TS
#define TS
Definition: SUMOTime.h:43
MSCFModel_PWag2009::followSpeed
double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0) const
Computes the vehicle's safe speed (no dawdling)
Definition: MSCFModel_PWag2009.cpp:63
SUMOVTypeParameter
Structure representing possible vehicle parameter.
Definition: SUMOVTypeParameter.h:86
MSCFModel_PWag2009::MSCFModel_PWag2009
MSCFModel_PWag2009(const MSVehicleType *vtype)
Constructor.
Definition: MSCFModel_PWag2009.cpp:35
MSCFModel::myHeadwayTime
double myHeadwayTime
The driver's desired time headway (aka reaction time tau) [s].
Definition: MSCFModel.h:629
MSCFModel_PWag2009.h
MSCFModel_PWag2009::finalizeSpeed
double finalizeSpeed(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
Definition: MSCFModel_PWag2009.cpp:49
MSCFModel_PWag2009::~MSCFModel_PWag2009
~MSCFModel_PWag2009()
Destructor.
Definition: MSCFModel_PWag2009.cpp:45
SUMO_ATTR_CF_PWAGNER2009_TAULAST
@ SUMO_ATTR_CF_PWAGNER2009_TAULAST
Definition: SUMOXMLDefinitions.h:834
SUMO_ATTR_SIGMA
@ SUMO_ATTR_SIGMA
Definition: SUMOXMLDefinitions.h:548
MSCFModel::myDecel
double myDecel
The vehicle's maximum deceleration [m/s^2].
Definition: MSCFModel.h:620
MSCFModel
The car-following model abstraction.
Definition: MSCFModel.h:56
config.h
MSVehicle::getSpeed
double getSpeed() const
Returns the vehicle's current speed.
Definition: MSVehicle.h:476
RandHelper.h
MSCFModel::myAccel
double myAccel
The vehicle's maximum acceleration [m/s^2].
Definition: MSCFModel.h:617
MSLane.h
MSCFModel_PWag2009::VehicleVariables
Definition: MSCFModel_PWag2009.h:115
MSCFModel_PWag2009::myActionPointProbability
double myActionPointProbability
The probability for any action.
Definition: MSCFModel_PWag2009.h:150
MSBaseVehicle::getRNG
std::mt19937 * getRNG() const
Definition: MSBaseVehicle.cpp:758
MSVehicle
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:79