SUMO - Simulation of Urban MObility
MSCFModel_IDM.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-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 /****************************************************************************/
19 // The Intelligent Driver Model (IDM) car-following model
20 /****************************************************************************/
21 
22 
23 // ===========================================================================
24 // included modules
25 // ===========================================================================
26 #ifdef _MSC_VER
27 #include <windows_config.h>
28 #else
29 #include <config.h>
30 #endif
31 
32 #include "MSCFModel_IDM.h"
33 #include <microsim/MSVehicle.h>
34 #include <microsim/MSLane.h>
36 #include <utils/common/SUMOTime.h>
37 
38 
39 // ===========================================================================
40 // method definitions
41 // ===========================================================================
43  double accel, double decel, double emergencyDecel, double apparentDecel,
44  double headwayTime, double delta,
45  double internalStepping) :
46  MSCFModel(vtype, accel, decel, emergencyDecel, apparentDecel, headwayTime), myDelta(delta),
47  myAdaptationFactor(1.), myAdaptationTime(0.),
48  myIterations(MAX2(1, int(TS / internalStepping + .5))),
49  myTwoSqrtAccelDecel(double(2 * sqrt(accel * decel))) {
50 }
51 
52 
54  double accel, double decel, double emergencyDecel, double apparentDecel,
55  double headwayTime,
56  double adaptationFactor, double adaptationTime,
57  double internalStepping) :
58  MSCFModel(vtype, accel, decel, emergencyDecel, apparentDecel, headwayTime), myDelta(4.),
59  myAdaptationFactor(adaptationFactor), myAdaptationTime(adaptationTime),
60  myIterations(MAX2(1, int(TS / internalStepping + .5))),
61  myTwoSqrtAccelDecel(double(2 * sqrt(accel * decel))) {
62 }
63 
64 
66 
67 
68 double
69 MSCFModel_IDM::moveHelper(MSVehicle* const veh, double vPos) const {
70  const double vNext = MSCFModel::moveHelper(veh, vPos);
71  if (myAdaptationFactor != 1.) {
73  vars->levelOfService += (vNext / veh->getLane()->getVehicleMaxSpeed(veh) - vars->levelOfService) / myAdaptationTime * TS;
74  }
75  return vNext;
76 }
77 
78 
79 double
80 MSCFModel_IDM::followSpeed(const MSVehicle* const veh, double speed, double gap2pred, double predSpeed, double /*predMaxDecel*/) const {
81  return _v(veh, gap2pred, speed, predSpeed, veh->getLane()->getVehicleMaxSpeed(veh));
82 }
83 
84 
85 double
86 MSCFModel_IDM::stopSpeed(const MSVehicle* const veh, const double speed, double gap2pred) const {
87  if (gap2pred < 0.01) {
88  return 0;
89  }
90  return _v(veh, gap2pred, speed, 0, veh->getLane()->getVehicleMaxSpeed(veh), false);
91 }
92 
93 
95 double
96 MSCFModel_IDM::interactionGap(const MSVehicle* const veh, double vL) const {
97  // Resolve the IDM equation to gap. Assume predecessor has
98  // speed != 0 and that vsafe will be the current speed plus acceleration,
99  // i.e that with this gap there will be no interaction.
100  const double acc = myAccel * (1. - pow(veh->getSpeed() / veh->getLane()->getVehicleMaxSpeed(veh), myDelta));
101  const double vNext = veh->getSpeed() + acc;
102  const double gap = (vNext - vL) * (veh->getSpeed() + vL) / (2 * myDecel) + vL;
103 
104  // Don't allow timeHeadWay < deltaT situations.
105  return MAX2(gap, SPEED2DIST(vNext));
106 }
107 
108 
109 double
110 MSCFModel_IDM::_v(const MSVehicle* const veh, const double gap2pred, const double egoSpeed,
111  const double predSpeed, const double desSpeed, const bool respectMinGap) const {
112 // this is more or less based on http://www.vwi.tu-dresden.de/~treiber/MicroApplet/IDM.html
113 // and http://arxiv.org/abs/cond-mat/0304337
114 // we assume however constant speed for the leader
115  double headwayTime = myHeadwayTime;
116  if (myAdaptationFactor != 1.) {
118  headwayTime *= myAdaptationFactor + vars->levelOfService * (1. - myAdaptationFactor);
119  }
120  double newSpeed = egoSpeed;
121  double gap = gap2pred;
122  for (int i = 0; i < myIterations; i++) {
123  const double delta_v = newSpeed - predSpeed;
124  double s = MAX2(0., newSpeed * headwayTime + newSpeed * delta_v / myTwoSqrtAccelDecel);
125  if (respectMinGap) {
126  s += myType->getMinGap();
127  }
128  const double acc = myAccel * (1. - pow(newSpeed / desSpeed, myDelta) - (s * s) / (gap * gap));
129  newSpeed += ACCEL2SPEED(acc) / myIterations;
130  //TODO use more realistic position update which takes accelerated motion into account
131  gap -= MAX2(0., SPEED2DIST(newSpeed - predSpeed) / myIterations);
132  }
133 // return MAX2(getSpeedAfterMaxDecel(egoSpeed), newSpeed);
134  return MAX2(0., newSpeed);
135 }
136 
137 
138 MSCFModel*
141 }
double getVehicleMaxSpeed(const SUMOVehicle *const veh) const
Returns the lane&#39;s maximum speed, given a vehicle&#39;s speed limit adaptation.
Definition: MSLane.h:475
~MSCFModel_IDM()
Destructor.
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:83
double interactionGap(const MSVehicle *const, double vL) const
Returns the maximum gap at which an interaction between both vehicles occurs.
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle&#39;s car following model variables.
Definition: MSVehicle.h:891
const MSVehicleType * myType
The type to which this model definition belongs to.
Definition: MSCFModel.h:531
#define SPEED2DIST(x)
Definition: SUMOTime.h:54
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
MSLane * getLane() const
Returns the lane the vehicle is on.
Definition: MSVehicle.h:564
double moveHelper(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel) const
Computes the vehicle&#39;s safe speed (no dawdling)
const double myDelta
The IDM delta exponent.
The car-following model abstraction.
Definition: MSCFModel.h:59
const double myAdaptationFactor
The IDMM adaptation factor beta.
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
The car-following model and parameter.
Definition: MSVehicleType.h:72
const double myAdaptationTime
The IDMM adaptation time tau.
double levelOfService
state variable for remembering speed deviation history (lambda)
double _v(const MSVehicle *const veh, const double gap2pred, const double mySpeed, const double predSpeed, const double desSpeed, const bool respectMinGap=true) const
double getMinGap() const
Get the free space in front of vehicles of this class.
const double myTwoSqrtAccelDecel
A computational shortcut.
MSCFModel_IDM(const MSVehicleType *vtype, double accel, double decel, double emergencyDecel, double apparentDecel, double headwayTime, double delta, double internalStepping)
Constructor.
double myDecel
The vehicle&#39;s maximum deceleration [m/s^2].
Definition: MSCFModel.h:537
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) ...
const int myIterations
The number of iterations in speed calculations.
double myEmergencyDecel
The vehicle&#39;s maximum emergency deceleration [m/s^2].
Definition: MSCFModel.h:539
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