SUMO - Simulation of Urban MObility
MSVehicleType.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-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 /****************************************************************************/
19 // The car-following model and parameter
20 /****************************************************************************/
21 
22 
23 // ===========================================================================
24 // included modules
25 // ===========================================================================
26 #include <config.h>
27 
28 #include <cassert>
36 #include "MSNet.h"
37 #include "cfmodels/MSCFModel_IDM.h"
47 #include "cfmodels/MSCFModel_ACC.h"
49 #include "MSVehicleControl.h"
50 #include "MSVehicleType.h"
51 
52 
53 // ===========================================================================
54 // static members
55 // ===========================================================================
57 
58 
59 // ===========================================================================
60 // method definitions
61 // ===========================================================================
63  : myParameter(parameter), myWarnedActionStepLengthTauOnce(false), myIndex(myNextIndex++), myCarFollowModel(nullptr), myOriginalType(nullptr) {
64  assert(getLength() > 0);
65  assert(getMaxSpeed() > 0);
66 
67  // Check if actionStepLength was set by user, if not init to global default
70  }
72 }
73 
74 
76  delete myCarFollowModel;
77 }
78 
79 
80 double
81 MSVehicleType::computeChosenSpeedDeviation(std::mt19937* rng, const double minDev) const {
82  return MAX2(minDev, myParameter.speedFactor.sample(rng));
83 }
84 
85 
86 // ------------ Setter methods
87 void
88 MSVehicleType::setLength(const double& length) {
89  if (myOriginalType != nullptr && length < 0) {
91  } else {
92  myParameter.length = length;
93  }
95 }
96 
97 
98 void
99 MSVehicleType::setHeight(const double& height) {
100  if (myOriginalType != nullptr && height < 0) {
102  } else {
103  myParameter.height = height;
104  }
106 }
107 
108 
109 void
110 MSVehicleType::setMinGap(const double& minGap) {
111  if (myOriginalType != nullptr && minGap < 0) {
113  } else {
114  myParameter.minGap = minGap;
115  }
117 }
118 
119 
120 void
121 MSVehicleType::setMinGapLat(const double& minGapLat) {
122  if (myOriginalType != nullptr && minGapLat < 0) {
124  } else {
125  myParameter.minGapLat = minGapLat;
126  }
128 }
129 
130 
131 void
132 MSVehicleType::setMaxSpeed(const double& maxSpeed) {
133  if (myOriginalType != nullptr && maxSpeed < 0) {
135  } else {
136  myParameter.maxSpeed = maxSpeed;
137  }
139 }
140 
141 
142 void
143 MSVehicleType::setMaxSpeedLat(const double& maxSpeedLat) {
144  if (myOriginalType != nullptr && maxSpeedLat < 0) {
146  } else {
147  myParameter.maxSpeedLat = maxSpeedLat;
148  }
150 }
151 
152 
153 void
155  myParameter.vehicleClass = vclass;
157 }
158 
159 void
161  myParameter.latAlignment = latAlignment;
163 }
164 
165 
166 void
168  if (myOriginalType != nullptr && prob < 0) {
170  } else {
172  }
174 }
175 
176 
177 void
178 MSVehicleType::setSpeedFactor(const double& factor) {
179  if (myOriginalType != nullptr && factor < 0) {
181  } else {
182  myParameter.speedFactor.getParameter()[0] = factor;
183  }
185 }
186 
187 
188 void
190  if (myOriginalType != nullptr && dev < 0) {
192  } else {
194  }
196 }
197 
198 
199 void
200 MSVehicleType::setActionStepLength(const SUMOTime actionStepLength, bool resetActionOffset) {
201  assert(actionStepLength >= 0.);
203 
204  if (myParameter.actionStepLength == actionStepLength) {
205  return;
206  }
207 
208  SUMOTime previousActionStepLength = myParameter.actionStepLength;
209  myParameter.actionStepLength = actionStepLength;
211  check();
212 
213  if (isVehicleSpecific()) {
214  // don't perform vehicle lookup for singular vtype
215  return;
216  }
217 
218  // For non-singular vType reset all vehicle's actionOffsets
219  // Iterate through vehicles
221  for (auto vehIt = vc.loadedVehBegin(); vehIt != vc.loadedVehEnd(); ++vehIt) {
222  MSVehicle* veh = static_cast<MSVehicle*>(vehIt->second);
223  if (&veh->getVehicleType() == this) {
224  // Found vehicle of this type. Perform requested actionOffsetReset
225  if (resetActionOffset) {
226  veh->resetActionOffset();
227  } else {
228  veh->updateActionOffset(previousActionStepLength, actionStepLength);
229  }
230  }
231  }
232 }
233 
234 
235 void
237  myParameter.emissionClass = eclass;
239 }
240 
241 
242 void
244  myParameter.color = color;
246 }
247 
248 
249 void
250 MSVehicleType::setWidth(const double& width) {
251  if (myOriginalType != nullptr && width < 0) {
253  } else {
254  myParameter.width = width;
255  }
257 }
258 
259 void
260 MSVehicleType::setImpatience(const double impatience) {
261  if (myOriginalType != nullptr && impatience < 0) {
263  } else {
264  myParameter.impatience = impatience;
265  }
267 }
268 
269 
270 void
272  myParameter.shape = shape;
274 }
275 
276 
277 
278 // ------------ Static methods for building vehicle types
281  MSVehicleType* vtype = new MSVehicleType(from);
284  // by default decel and apparentDecel are identical
285  const double apparentDecel = from.getCFParam(SUMO_ATTR_APPARENTDECEL, decel);
286 
287  if (emergencyDecel < decel) {
288  WRITE_WARNING("Value of 'emergencyDecel' (" + toString(emergencyDecel) + ") should be higher than 'decel' (" + toString(decel) + ") for vType '" + from.id + "'.");
289  }
290  if (emergencyDecel < apparentDecel) {
291  WRITE_WARNING("Value of 'emergencyDecel' (" + toString(emergencyDecel) + ") is lower than 'apparentDecel' (" + toString(apparentDecel) + ") for vType '" + from.id + "' may cause collisions.");
292  }
293 
294  switch (from.cfModel) {
295  case SUMO_TAG_CF_IDM:
296  vtype->myCarFollowModel = new MSCFModel_IDM(vtype, false);
297  break;
298  case SUMO_TAG_CF_IDMM:
299  vtype->myCarFollowModel = new MSCFModel_IDM(vtype, true);
300  break;
301  case SUMO_TAG_CF_BKERNER:
302  vtype->myCarFollowModel = new MSCFModel_Kerner(vtype);
303  break;
305  vtype->myCarFollowModel = new MSCFModel_KraussOrig1(vtype);
306  break;
308  vtype->myCarFollowModel = new MSCFModel_KraussPS(vtype);
309  break;
310  case SUMO_TAG_CF_KRAUSSX:
311  vtype->myCarFollowModel = new MSCFModel_KraussX(vtype);
312  break;
314  vtype->myCarFollowModel = new MSCFModel_SmartSK(vtype);
315  break;
316  case SUMO_TAG_CF_DANIEL1:
317  vtype->myCarFollowModel = new MSCFModel_Daniel1(vtype);
318  break;
320  vtype->myCarFollowModel = new MSCFModel_PWag2009(vtype);
321  break;
323  vtype->myCarFollowModel = new MSCFModel_Wiedemann(vtype);
324  break;
325  case SUMO_TAG_CF_RAIL:
326  vtype->myCarFollowModel = new MSCFModel_Rail(vtype);
327  break;
328  case SUMO_TAG_CF_ACC:
329  vtype->myCarFollowModel = new MSCFModel_ACC(vtype);
330  break;
331  case SUMO_TAG_CF_CACC:
332  vtype->myCarFollowModel = new MSCFModel_CACC(vtype);
333  break;
334  case SUMO_TAG_CF_KRAUSS:
335  default:
336  vtype->myCarFollowModel = new MSCFModel_Krauss(vtype);
337  break;
338  }
339  vtype->check();
340  return vtype;
341 }
342 
343 
345 MSVehicleType::buildSingularType(const std::string& id) const {
346  return duplicateType(id, false);
347 }
348 
349 
351 MSVehicleType::duplicateType(const std::string& id, bool persistent) const {
353  vtype->myParameter.id = id;
355  if (!persistent) {
356  vtype->myOriginalType = this;
357  }
358  if (!MSNet::getInstance()->getVehicleControl().addVType(vtype)) {
359  std::string singular = persistent ? "" : "singular ";
360  throw ProcessError("could not add " + singular + "type " + vtype->getID());
361  }
362  return vtype;
363 }
364 
365 void
371  std::stringstream s;
372  s << "Given action step length " << STEPS2TIME(myParameter.actionStepLength) << " for vehicle type '" << getID()
373  << "' is larger than its parameter tau (=" << getCarFollowModel().getHeadwayTime() << ")!"
374  << " This may lead to collisions. (This warning is only issued once per vehicle type).";
375  WRITE_WARNING(s.str());
376  }
377 }
378 
379 void
380 MSVehicleType::setAccel(double accel) {
381  if (myOriginalType != nullptr && accel < 0) {
383  }
386 }
387 
388 void
389 MSVehicleType::setDecel(double decel) {
390  if (myOriginalType != nullptr && decel < 0) {
392  }
395 }
396 
397 void
398 MSVehicleType::setEmergencyDecel(double emergencyDecel) {
399  if (myOriginalType != nullptr && emergencyDecel < 0) {
400  emergencyDecel = myOriginalType->getCarFollowModel().getEmergencyDecel();
401  }
402  myCarFollowModel->setEmergencyDecel(emergencyDecel);
404 }
405 
406 void
407 MSVehicleType::setApparentDecel(double apparentDecel) {
408  if (myOriginalType != nullptr && apparentDecel < 0) {
410  }
411  myCarFollowModel->setApparentDecel(apparentDecel);
413 }
414 
415 void
416 MSVehicleType::setImperfection(double imperfection) {
417  if (myOriginalType != nullptr && imperfection < 0) {
419  }
420  myCarFollowModel->setImperfection(imperfection);
422 }
423 
424 void
426  if (myOriginalType != nullptr && tau < 0) {
428  }
431 }
432 
433 
434 /****************************************************************************/
435 
const int VTYPEPARS_MAXSPEED_SET
The Wiedemann Model car-following model.
double getApparentDecel() const
Get the vehicle type&#39;s apparent deceleration [m/s^2] (the one regarded by its followers.
Definition: MSCFModel.h:234
const int VTYPEPARS_MINGAP_SET
void setMinGap(const double &minGap)
Set a new value for this type&#39;s minimum gap.
SumoXMLTag cfModel
The enum-representation of the car-following model to use.
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:79
const int VTYPEPARS_LATALIGNMENT_SET
long long int SUMOTime
Definition: SUMOTime.h:36
car-following model by B. Kerner
double impatience
The vehicle&#39;s impatience (willingness to obstruct others)
constVehIt loadedVehBegin() const
Returns the begin of the internal vehicle map.
void setDefaultProbability(const double &prob)
Set a new value for this type&#39;s default probability.
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types...
void setTau(double tau)
Set a new value for this type&#39;s headway.
void setShape(SUMOVehicleShape shape)
Set a new value for this type&#39;s shape.
SUMOVehicleShape shape
This class&#39; shape.
Structure representing possible vehicle parameter.
const int VTYPEPARS_MINGAP_LAT_SET
virtual MSCFModel * duplicate(const MSVehicleType *vtype) const =0
Duplicates the car-following model.
virtual double getImperfection() const
Get the driver&#39;s imperfection.
Definition: MSCFModel.h:251
double defaultProbability
The probability when being added to a distribution without an explicit probability.
std::vector< double > & getParameter()
Returns the parameters of this distribution.
The Intelligent Driver Model (IDM) car-following model.
Definition: MSCFModel_IDM.h:41
void setDecel(double decel)
Set a new value for this type&#39;s deceleration.
Krauss car-following model, changing accel and speed by slope.
SUMOVehicleClass vehicleClass
The vehicle&#39;s class.
The original Krauss (1998) car-following model and parameter.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:165
T MAX2(T a, T b)
Definition: StdDefs.h:76
double getMinGapLat() const
Get the minimum lateral gap that vehicles of this type maintain.
const MSVehicleType * myOriginalType
The original type.
void setApparentDecel(double apparentDecel)
Set a new value for this type&#39;s apparent deceleration.
The CACC car-following model.
void setLength(const double &length)
Set a new value for this type&#39;s length.
void setMaxSpeed(const double &maxSpeed)
Set a new value for this type&#39;s maximum speed.
const int VTYPEPARS_MAXSPEED_LAT_SET
const int VTYPEPARS_PROBABILITY_SET
void setImperfection(double imperfection)
Set a new value for this type&#39;s imperfection.
MSVehicleType * duplicateType(const std::string &id, bool persistent) const
Duplicates the microsim vehicle type giving the newly created type the given id.
virtual void setApparentDecel(double decel)
Sets a new value for the apparent deceleration [m/s^2].
Definition: MSCFModel.h:490
static MSVehicleType * build(SUMOVTypeParameter &from)
Builds the microsim vehicle type described by the given parameter.
LateralAlignment
Numbers representing special SUMO-XML-attribute values Information how vehicles align themselves with...
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:241
The car-following model and parameter.
Definition: MSVehicleType.h:66
double height
This class&#39; height.
bool isVehicleSpecific() const
Returns whether this type belongs to a single vehicle only (was modified)
double getMaxAccel() const
Get the vehicle type&#39;s maximum acceleration [m/s^2].
Definition: MSCFModel.h:210
double getDefaultProbability() const
Get the default probability of this vehicle type.
void setMinGapLat(const double &minGapLat)
Set a new value for this type&#39;s minimum lataral gap.
bool wasSet(int what) const
Returns whether the given parameter was set.
double maxSpeed
The vehicle type&#39;s maximum speed [m/s].
double width
This class&#39; width.
const MSCFModel & getCarFollowModel() const
Returns the vehicle type&#39;s car following model definition (const version)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:49
const int VTYPEPARS_ACTIONSTEPLENGTH_SET
void setAccel(double accel)
Set a new value for this type&#39;s acceleration.
void check()
Checks whether vehicle type parameters may be problematic (Currently, only the value for the action s...
MSVehicleType * buildSingularType(const std::string &id) const
Duplicates the microsim vehicle type giving the newly created type the given id, marking it as vehicl...
The original Krauss (1998) car-following model and parameter.
int SUMOEmissionClass
double getEmergencyDecel() const
Get the vehicle type&#39;s maximal phisically possible deceleration [m/s^2].
Definition: MSCFModel.h:226
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:316
virtual void setHeadwayTime(double headwayTime)
Sets a new value for desired headway [s].
Definition: MSCFModel.h:506
void setHeight(const double &height)
Set a new value for this type&#39;s height.
The ACC car-following model.
Definition: MSCFModel_ACC.h:49
#define STEPS2TIME(x)
Definition: SUMOTime.h:58
static double gDefaultEmergencyDecel
encoding of the string-option default.emergencydecel
Definition: MSGlobals.h:115
virtual ~MSVehicleType()
Destructor.
double getMaxSpeed() const
Get vehicle&#39;s maximum speed [m/s].
void resetActionOffset(const SUMOTime timeUntilNextAction=0)
Resets the action offset for the vehicle.
Definition: MSVehicle.cpp:1884
void setImpatience(const double impatience)
Set a new value for this type&#39;s impatience.
static double getDefaultDecel(const SUMOVehicleClass vc=SVC_IGNORING)
Returns the default deceleration for the given vehicle class This needs to be a function because the ...
void setEmissionClass(SUMOEmissionClass eclass)
Set a new value for this type&#39;s emission class.
double getMinGap() const
Get the free space in front of vehicles of this class.
double getMaxDecel() const
Get the vehicle type&#39;s maximal comfortable deceleration [m/s^2].
Definition: MSCFModel.h:218
void setSpeedDeviation(const double &dev)
Set a new value for this type&#39;s speed deviation.
void setSpeedFactor(const double &factor)
Set a new value for this type&#39;s speed factor.
const int VTYPEPARS_SPEEDFACTOR_SET
void setActionStepLength(const SUMOTime actionStepLength, bool resetActionOffset)
Set a new value for this type&#39;s action step length.
Scalable model based on Krauss by Peter Wagner.
double maxSpeedLat
The vehicle type&#39;s maximum lateral speed [m/s].
double getCFParam(const SumoXMLAttr attr, const double defaultValue) const
Returns the named value from the map, or the default if it is not contained there.
int parametersSet
Information for the router which parameter were set.
The original Krauss (1998) car-following model and parameter.
SUMOVTypeParameter myParameter
the parameter container
double getMaxSpeedLat() const
Get vehicle&#39;s maximum lateral speed [m/s].
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
MSCFModel * myCarFollowModel
instance of the car following model.
double getHeight() const
Get the height which vehicles of this class shall have when being drawn.
static SUMOTime gActionStepLength
default value for the interval between two action points for MSVehicle (defaults to DELTA_T) ...
Definition: MSGlobals.h:112
double minGapLat
The vehicle type&#39;s minimum lateral gap [m].
void setEmergencyDecel(double emergencyDecel)
Set a new value for this type&#39;s emergency deceleration.
virtual void setMaxDecel(double decel)
Sets a new value for maximal comfortable deceleration [m/s^2].
Definition: MSCFModel.h:474
SUMOVehicleShape
Definition of vehicle classes to differ between different appearences.
const MSVehicleType & getVehicleType() const
Returns the vehicle&#39;s type definition.
virtual void setMaxAccel(double accel)
Sets a new value for maximum acceleration [m/s^2].
Definition: MSCFModel.h:466
virtual double getHeadwayTime() const
Get the driver&#39;s desired headway [s].
Definition: MSCFModel.h:259
virtual void setImperfection(double imperfection)
Sets a new value for driver imperfection.
Definition: MSCFModel.h:498
SubParams cfParameter
Car-following parameter.
RGBColor color
The color.
static int myNextIndex
next value for the running index
const std::string & getID() const
Returns the name of the vehicle type.
Definition: MSVehicleType.h:94
void setWidth(const double &width)
Set a new value for this type&#39;s width.
std::string id
The vehicle type&#39;s id.
void updateActionOffset(const SUMOTime oldActionStepLength, const SUMOTime newActionStepLength)
Process an updated action step length value (only affects the vehicle&#39;s action offset, The actionStepLength is stored in the (singular) vtype)
Definition: MSVehicle.cpp:1889
double getLength() const
Get vehicle&#39;s length [m].
MSVehicleType(const SUMOVTypeParameter &parameter)
Constructor.
static double getDefaultEmergencyDecel(const SUMOVehicleClass vc, double decel, double defaultOption)
Returns the default emergency deceleration for the given vehicle class This needs to be a function be...
void setVClass(SUMOVehicleClass vclass)
Set a new value for this type&#39;s vehicle class.
LateralAlignment latAlignment
The vehicles desired lateral alignment.
SUMOTime actionStepLength
The vehicle type&#39;s default actionStepLength [ms], i.e. the interval between two control actions...
double minGap
This class&#39; free space in front of the vehicle itself.
const int VTYPEPARS_HEIGHT_SET
void setColor(const RGBColor &color)
Set a new value for this type&#39;s color.
double sample(std::mt19937 *which=0) const
Draw a sample of the distribution.
virtual void setEmergencyDecel(double decel)
Sets a new value for maximal physically possible deceleration [m/s^2].
Definition: MSCFModel.h:482
bool myWarnedActionStepLengthTauOnce
Indicator whether the user was already warned once about an action step length larger than the desire...
const int VTYPEPARS_WIDTH_SET
double getImpatience() const
Returns this type&#39;s impatience.
The class responsible for building and deletion of vehicles.
double computeChosenSpeedDeviation(std::mt19937 *rng, const double minDev=-1.) const
Computes and returns the speed deviation.
void setMaxSpeedLat(const double &maxSpeedLat)
Set a new value for this type&#39;s maximum lateral speed.
void setPreferredLateralAlignment(LateralAlignment latAlignment)
Set vehicle&#39;s preferred lateral alignment.
Krauss car-following model, with acceleration decrease and faster start.
const int VTYPEPARS_LENGTH_SET
const int VTYPEPARS_VEHICLECLASS_SET
Krauss car-following model, changing accel and speed by slope.
const int VTYPEPARS_EMISSIONCLASS_SET
const int VTYPEPARS_COLOR_SET
Distribution_Parameterized speedFactor
The factor by which the maximum speed may deviate from the allowed max speed on the street...
const int VTYPEPARS_SHAPE_SET
double length
The physical vehicle length.
SUMOEmissionClass emissionClass
The emission class of this vehicle.
constVehIt loadedVehEnd() const
Returns the end of the internal vehicle map.
double myCachedActionStepLengthSecs
the vtypes actionsStepLength in seconds (cached because needed very often)
const int VTYPEPARS_IMPATIENCE_SET