Eclipse SUMO - Simulation of Urban MObility
MSCFModel_Daniel1.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2012-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 /****************************************************************************/
16 // The original Krauss (1998) car-following model and parameter
17 /****************************************************************************/
18 
19 
20 // ===========================================================================
21 // included modules
22 // ===========================================================================
23 #include <config.h>
24 
25 #include <microsim/MSVehicle.h>
26 #include <microsim/MSLane.h>
27 #include "MSCFModel_Daniel1.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  myTmp1(vtype->getParameter().getCFParam(SUMO_ATTR_TMP1, 1.0)),
40  myTmp2(vtype->getParameter().getCFParam(SUMO_ATTR_TMP2, 1.0)),
41  myTmp3(vtype->getParameter().getCFParam(SUMO_ATTR_TMP3, 1.0)),
42  myTmp4(vtype->getParameter().getCFParam(SUMO_ATTR_TMP4, 1.0)),
43  myTmp5(vtype->getParameter().getCFParam(SUMO_ATTR_TMP5, 1.0)) {
44 }
45 
46 
48 
49 
50 double
51 MSCFModel_Daniel1::finalizeSpeed(MSVehicle* const veh, double vPos) const {
52  const double oldV = veh->getSpeed(); // save old v for optional acceleration computation
53  const double vSafe = MIN2(vPos, veh->processNextStop(vPos)); // process stops
54  // we need the acceleration for emission computation;
55  // in this case, we neglect dawdling, nonetheless, using
56  // vSafe does not incorporate speed reduction due to interaction
57  // on lane changing
58  const double vMin = getSpeedAfterMaxDecel(oldV);
59  const double vMax = MIN3(veh->getLane()->getVehicleMaxSpeed(veh), maxNextSpeed(oldV, veh), vSafe);
60 #ifdef _DEBUG
61  if (vMin > vMax) {
62  WRITE_WARNING("Maximum speed of vehicle '" + veh->getID() + "' is lower than the minimum speed (min: " + toString(vMin) + ", max: " + toString(vMax) + ").");
63  }
64 #endif
65  return veh->getLaneChangeModel().patchSpeed(vMin, MAX2(vMin, dawdle(vMax, veh->getRNG())), vMax, *this);
66 }
67 
68 
69 double
70 MSCFModel_Daniel1::followSpeed(const MSVehicle* const veh, double speed, double gap, double predSpeed, double /*predMaxDecel*/, const MSVehicle* const /*pred*/) const {
71  return MIN2(_vsafe(gap, predSpeed), maxNextSpeed(speed, veh));
72 }
73 
74 
75 double
76 MSCFModel_Daniel1::stopSpeed(const MSVehicle* const veh, const double speed, double gap) const {
77  return MIN2(_vsafe(gap, 0), maxNextSpeed(speed, veh));
78 }
79 
80 
81 double
82 MSCFModel_Daniel1::dawdle(double speed, std::mt19937* rng) const {
83  return MAX2(0., speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand(rng)));
84 }
85 
86 
88 double MSCFModel_Daniel1::_vsafe(double gap, double predSpeed) const {
89  if (predSpeed == 0 && gap < 0.01) {
90  return 0;
91  }
92  double vsafe = (double)(-1. * myTauDecel
93  + sqrt(
95  + (predSpeed * predSpeed)
96  + (2. * myDecel * gap)
97  ));
98  assert(vsafe >= 0);
99  return vsafe;
100 }
101 
102 
103 MSCFModel*
105  return new MSCFModel_Daniel1(vtype);
106 }
MSVehicleType
The car-following model and parameter.
Definition: MSVehicleType.h:65
MSVehicle::processNextStop
double processNextStop(double currentVelocity)
Processes stops, returns the velocity needed to reach the stop.
Definition: MSVehicle.cpp:1806
MSCFModel_Daniel1::myTauDecel
double myTauDecel
The precomputed value for myDecel*myTau.
Definition: MSCFModel_Daniel1.h:154
MSCFModel_Daniel1::dawdle
virtual double dawdle(double speed, std::mt19937 *rng) const
Applies driver imperfection (dawdling / sigma)
Definition: MSCFModel_Daniel1.cpp:82
MIN2
T MIN2(T a, T b)
Definition: StdDefs.h:73
MSCFModel_Daniel1::_vsafe
virtual double _vsafe(double gap, double predSpeed) const
Returns the "safe" velocity.
Definition: MSCFModel_Daniel1.cpp:88
WRITE_WARNING
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:275
MSCFModel_Daniel1::stopSpeed
virtual 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_Daniel1.cpp:76
MSCFModel_Daniel1::MSCFModel_Daniel1
MSCFModel_Daniel1(const MSVehicleType *vtype)
Constructor.
Definition: MSCFModel_Daniel1.cpp:35
MSCFModel::maxNextSpeed
virtual double maxNextSpeed(double speed, const MSVehicle *const veh) const
Returns the maximum speed given the current speed.
Definition: MSCFModel.cpp:238
MSCFModel_Daniel1.h
SUMO_ATTR_TMP2
@ SUMO_ATTR_TMP2
Definition: SUMOXMLDefinitions.h:551
ACCEL2SPEED
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:52
SUMO_ATTR_TMP1
@ SUMO_ATTR_TMP1
Definition: SUMOXMLDefinitions.h:550
MSCFModel_Daniel1::finalizeSpeed
double finalizeSpeed(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
Definition: MSCFModel_Daniel1.cpp:51
SUMO_ATTR_TMP5
@ SUMO_ATTR_TMP5
Definition: SUMOXMLDefinitions.h:554
SUMO_ATTR_TMP3
@ SUMO_ATTR_TMP3
Definition: SUMOXMLDefinitions.h:552
MSVehicle.h
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_Daniel1::duplicate
virtual MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
Definition: MSCFModel_Daniel1.cpp:104
SUMOVTypeParameter
Structure representing possible vehicle parameter.
Definition: SUMOVTypeParameter.h:86
MSVehicle::getLaneChangeModel
MSAbstractLaneChangeModel & getLaneChangeModel()
Definition: MSVehicle.cpp:4680
MSCFModel_Daniel1::~MSCFModel_Daniel1
~MSCFModel_Daniel1()
Destructor.
Definition: MSCFModel_Daniel1.cpp:47
MSVehicle::getLane
MSLane * getLane() const
Returns the lane the vehicle is on.
Definition: MSVehicle.h:560
toString
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:47
SUMO_ATTR_SIGMA
@ SUMO_ATTR_SIGMA
Definition: SUMOXMLDefinitions.h:548
MSCFModel::getSpeedAfterMaxDecel
virtual double getSpeedAfterMaxDecel(double v) const
Returns the velocity after maximum deceleration.
Definition: MSCFModel.h:342
MSCFModel::myDecel
double myDecel
The vehicle's maximum deceleration [m/s^2].
Definition: MSCFModel.h:620
MSCFModel_Daniel1::myDawdle
double myDawdle
The vehicle's dawdle-parameter. 0 for no dawdling, 1 for max.
Definition: MSCFModel_Daniel1.h:151
MSBaseVehicle::getID
const std::string & getID() const
Returns the name of the vehicle.
Definition: MSBaseVehicle.cpp:138
MSAbstractLaneChangeModel::patchSpeed
virtual double patchSpeed(const double min, const double wanted, const double max, const MSCFModel &cfModel)=0
Called to adapt the speed in order to allow a lane change. It uses information on LC-related desired ...
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
SUMO_ATTR_TMP4
@ SUMO_ATTR_TMP4
Definition: SUMOXMLDefinitions.h:553
MSCFModel::myAccel
double myAccel
The vehicle's maximum acceleration [m/s^2].
Definition: MSCFModel.h:617
MSLane.h
MSLane::getVehicleMaxSpeed
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition: MSLane.h:518
MIN3
T MIN3(T a, T b, T c)
Definition: StdDefs.h:86
MSCFModel_Daniel1::followSpeed
virtual 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_Daniel1.cpp:70
MSAbstractLaneChangeModel.h
MSBaseVehicle::getRNG
std::mt19937 * getRNG() const
Definition: MSBaseVehicle.cpp:758
MSVehicle
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:79