SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
MSCFModel_KraussOrig1.cpp
Go to the documentation of this file.
1 /****************************************************************************/
11 // The original Krauss (1998) car-following model and parameter
12 /****************************************************************************/
13 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
14 // Copyright (C) 2001-2015 DLR (http://www.dlr.de/) and contributors
15 /****************************************************************************/
16 //
17 // This file is part of SUMO.
18 // SUMO is free software: you can redistribute it and/or modify
19 // it under the terms of the GNU General Public License as published by
20 // the Free Software Foundation, either version 3 of the License, or
21 // (at your option) any later version.
22 //
23 /****************************************************************************/
24 
25 
26 // ===========================================================================
27 // included modules
28 // ===========================================================================
29 #ifdef _MSC_VER
30 #include <windows_config.h>
31 #else
32 #include <config.h>
33 #endif
34 
35 #include <microsim/MSVehicle.h>
36 #include <microsim/MSLane.h>
37 #include "MSCFModel_KraussOrig1.h"
40 
41 
42 // ===========================================================================
43 // method definitions
44 // ===========================================================================
46  SUMOReal dawdle, SUMOReal headwayTime)
47  : MSCFModel(vtype, accel, decel, headwayTime), myDawdle(dawdle), myTauDecel(decel* headwayTime) {
48 }
49 
50 
52 
53 
56  const SUMOReal oldV = veh->getSpeed(); // save old v for optional acceleration computation
57  const SUMOReal vSafe = MIN2(vPos, veh->processNextStop(vPos)); // process stops
58  // we need the acceleration for emission computation;
59  // in this case, we neglect dawdling, nonetheless, using
60  // vSafe does not incorporate speed reduction due to interaction
61  // on lane changing
62  const SUMOReal vMin = getSpeedAfterMaxDecel(oldV);
63  // do not exceed max decel even if it is unsafe
64  SUMOReal vMax = MAX2(vMin,
65  MIN3(veh->getLane()->getVehicleMaxSpeed(veh), maxNextSpeed(oldV, veh), vSafe));
66 #ifdef _DEBUG
67  //if (vMin > vMax) {
68  // WRITE_WARNING("Vehicle's '" + veh->getID() + "' maximum speed is lower than the minimum speed (min: " + toString(vMin) + ", max: " + toString(vMax) + ").");
69  //}
70 #endif
71  return veh->getLaneChangeModel().patchSpeed(vMin, MAX2(vMin, dawdle(vMax)), vMax, *this);
72 }
73 
74 
76 MSCFModel_KraussOrig1::followSpeed(const MSVehicle* const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal predMaxDecel) const {
77  return MIN2(vsafe(gap, predSpeed, predMaxDecel), maxNextSpeed(speed, veh));
78 }
79 
80 
82 MSCFModel_KraussOrig1::insertionFollowSpeed(const MSVehicle* const veh, SUMOReal speed, SUMOReal gap2pred, SUMOReal predSpeed, SUMOReal predMaxDecel) const {
83  // since the Krauss model tries to compute the maximum follow speed in
84  // method followSpeed this is also used for insertionFollowSpeed
85  // (due to discretization error this may not always be the same value as
86  // returned by maximumSafeFollowSpeed)
87  return followSpeed(veh, speed, gap2pred, predSpeed, predMaxDecel);
88 }
89 
90 
92 MSCFModel_KraussOrig1::stopSpeed(const MSVehicle* const veh, const SUMOReal speed, SUMOReal gap) const {
93  return MIN2(vsafe(gap, 0., 0.), maxNextSpeed(speed, veh));
94 }
95 
96 
99  return MAX2(SUMOReal(0), speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
100 }
101 
102 
104 SUMOReal MSCFModel_KraussOrig1::vsafe(SUMOReal gap, SUMOReal predSpeed, SUMOReal /* predMaxDecel */) const {
105  if (predSpeed == 0 && gap < 0.01) {
106  return 0;
107  }
109  + sqrt(
111  + (predSpeed * predSpeed)
112  + (2. * myDecel * gap)
113  ));
114  assert(vsafe >= 0);
115  return vsafe;
116 }
117 
118 
119 MSCFModel*
122 }
123 
124 
125 /****************************************************************************/
SUMOReal getSpeedAfterMaxDecel(SUMOReal v) const
Returns the velocity after maximum deceleration.
Definition: MSCFModel.h:283
virtual MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:80
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:61
virtual SUMOReal maxNextSpeed(SUMOReal speed, const MSVehicle *const veh) const
Returns the maximum speed given the current speed.
Definition: MSCFModel.cpp:86
The car-following model abstraction.
Definition: MSCFModel.h:59
virtual SUMOReal vsafe(SUMOReal gap, SUMOReal predSpeed, SUMOReal predMaxDecel) const
Returns the "safe" velocity.
SUMOReal insertionFollowSpeed(const MSVehicle *const veh, SUMOReal speed, SUMOReal gap2pred, SUMOReal predSpeed, SUMOReal predMaxDecel) const
Computes the vehicle's safe speed (no dawdling) This method is used during the insertion stage...
SUMOReal myAccel
The vehicle's maximum acceleration [m/s^2].
Definition: MSCFModel.h:345
static SUMOReal rand()
Returns a random real number in [0, 1)
Definition: RandHelper.h:62
T MAX2(T a, T b)
Definition: StdDefs.h:74
SUMOReal myHeadwayTime
The driver's desired time headway (aka reaction time tau) [s].
Definition: MSCFModel.h:351
SUMOReal processNextStop(SUMOReal currentVelocity)
Processes stops, returns the velocity needed to reach the stop.
Definition: MSVehicle.cpp:831
SUMOReal myTauDecel
The precomputed value for myDecel*myTau.
SUMOReal moveHelper(MSVehicle *const veh, SUMOReal vPos) const
Applies interaction with stops and lane changing model influences.
The car-following model and parameter.
Definition: MSVehicleType.h:74
MSAbstractLaneChangeModel & getLaneChangeModel()
Definition: MSVehicle.cpp:1884
SUMOReal followSpeed(const MSVehicle *const veh, SUMOReal speed, SUMOReal gap2pred, SUMOReal predSpeed, SUMOReal predMaxDecel) const
Computes the vehicle's safe speed (no dawdling)
SUMOReal myDawdle
The vehicle's dawdle-parameter. 0 for no dawdling, 1 for max.
virtual SUMOReal dawdle(SUMOReal speed) const
Applies driver imperfection (dawdling / sigma)
T MIN2(T a, T b)
Definition: StdDefs.h:68
MSCFModel_KraussOrig1(const MSVehicleType *vtype, SUMOReal accel, SUMOReal decel, SUMOReal dawdle, SUMOReal headwayTime)
Constructor.
virtual SUMOReal stopSpeed(const MSVehicle *const veh, const SUMOReal speed, SUMOReal gap2pred) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling) ...
virtual SUMOReal patchSpeed(const SUMOReal min, const SUMOReal wanted, const SUMOReal max, const MSCFModel &cfModel)=0
Called to adapt the speed in order to allow a lane change.
SUMOReal getSpeed() const
Returns the vehicle's current speed.
Definition: MSVehicle.h:294
#define SUMOReal
Definition: config.h:218
T MIN3(T a, T b, T c)
Definition: StdDefs.h:81
SUMOReal getVehicleMaxSpeed(const SUMOVehicle *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition: MSLane.h:354
MSLane * getLane() const
Returns the lane the vehicle is on.
Definition: MSVehicle.h:331
SUMOReal myDecel
The vehicle's maximum deceleration [m/s^2].
Definition: MSCFModel.h:348