Eclipse SUMO - Simulation of Urban MObility
MSDevice_ToC.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2013-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 /****************************************************************************/
18 // The ToC Device controls the transition of control between automated and manual driving.
19 //
20 /****************************************************************************/
21 
22 // ===========================================================================
23 // included modules
24 // ===========================================================================
25 #include <config.h>
26 
27 #include <algorithm>
28 #include <memory>
33 #include <utils/common/RGBColor.h>
34 #include <microsim/MSNet.h>
35 #include <microsim/MSVehicle.h>
39 #include <microsim/MSDriverState.h>
40 #include "MSDevice_ToC.h"
41 
42 
43 // ===========================================================================
44 // debug constants
45 // ===========================================================================
46 //#define DEBUG_TOC
47 //#define DEBUG_DYNAMIC_TOC
48 
49 // ===========================================================================
50 // parameter defaults
51 // ===========================================================================
52 
53 // default value for the average response time, that a driver needs to take back control
54 #define DEFAULT_RESPONSE_TIME -1.0
55 // default value for the average rate at which the driver's awareness recovers to
56 // 1.0 after a ToC has been performed
57 #define DEFAULT_RECOVERY_RATE 0.1
58 // Default value of the awareness below which no lane-changes are performed
59 #define DEFAULT_LCABSTINENCE 0.0
60 // The default value for the average awareness a driver has initially after a ToC
61 #define DEFAULT_INITIAL_AWARENESS 0.5
62 // The default value for the deceleration rate applied during a 'minimum risk maneuver'
63 #define DEFAULT_MRM_DECEL 1.5
64 // The default value for the dynamic ToC threshold indicates that the dynamic ToCs are deactivated
65 #define DEFAULT_DYNAMIC_TOC_THRESHOLD 0.0
66 // The default value for the probability of an MRM to occur after a dynamically triggered ToC
67 // (Note that these MRMs will not induce full stops in most cases)
68 #define DEFAULT_MRM_PROBABILITY 0.05
69 
70 // The factor by which the dynamic ToC threshold time is multiplied to yield the lead time given for the corresponding ToC
71 #define DYNAMIC_TOC_LEADTIME_FACTOR 0.75
72 // A factor applied to the check for the dynamic ToC condition to resist aborting an ongoing dynamic ToC (and prevent oscillations)
73 #define DYNAMIC_TOC_ABORT_RESISTANCE_FACTOR 2.0
74 
75 
76 // The default values for the openGap parameters applied for gap creation in preparation for a ToC
77 #define DEFAULT_OPENGAP_TIMEGAP -1.0
78 #define DEFAULT_OPENGAP_SPACING 0.0
79 #define DEFAULT_OPENGAP_CHANGERATE 1.0
80 #define DEFAULT_OPENGAP_MAXDECEL 1.0
81 
82 
83 #define DEFAULT_MANUAL_TYPE ""
84 #define DEFAULT_AUTOMATED_TYPE ""
85 
86 // Maximal tries to sample a positive value from the gaussian distribution
87 // used for the driver response time when a TOR is issued. (the distribution is assumed truncated at zero)
88 #define MAX_RESPONSETIME_SAMPLE_TRIES 100
89 // Maximal variance of responsetimes (returned for pMRM outside lookup table, i.e. pMRM>0.5), see interpolateVariance()
90 #define MAX_RESPONSETIME_VARIANCE 10000
91 
92 
93 // ---------------------------------------------------------------------------
94 // static members
95 // ---------------------------------------------------------------------------
96 std::set<MSDevice_ToC*, ComparatorNumericalIdLess> MSDevice_ToC::myInstances = std::set<MSDevice_ToC*, ComparatorNumericalIdLess>();
97 std::set<std::string> MSDevice_ToC::createdOutputFiles;
98 int MSDevice_ToC::LCModeMRM = 768; // = 0b001100000000 - no autonomous changes, no speed adaptation
100 
101 
102 // ===========================================================================
103 // method definitions
104 // ===========================================================================
105 // ---------------------------------------------------------------------------
106 // static initialisation methods
107 // ---------------------------------------------------------------------------
108 void
110  oc.addOptionSubTopic("ToC Device");
111  insertDefaultAssignmentOptions("toc", "ToC Device", oc);
112 
113  oc.doRegister("device.toc.manualType", new Option_String());
114  oc.addDescription("device.toc.manualType", "ToC Device", "Vehicle type for manual driving regime.");
115  oc.doRegister("device.toc.automatedType", new Option_String());
116  oc.addDescription("device.toc.automatedType", "ToC Device", "Vehicle type for automated driving regime.");
117  oc.doRegister("device.toc.responseTime", new Option_Float(DEFAULT_RESPONSE_TIME));
118  oc.addDescription("device.toc.responseTime", "ToC Device", "Average response time needed by a driver to take back control.");
119  oc.doRegister("device.toc.recoveryRate", new Option_Float(DEFAULT_RECOVERY_RATE));
120  oc.addDescription("device.toc.recoveryRate", "ToC Device", "Recovery rate for the driver's awareness after a ToC.");
121  oc.doRegister("device.toc.lcAbstinence", new Option_Float(DEFAULT_LCABSTINENCE));
122  oc.addDescription("device.toc.lcAbstinence", "ToC Device", "Attention level below which a driver restrains from performing lane changes (value in [0,1]).");
123  oc.doRegister("device.toc.initialAwareness", new Option_Float(DEFAULT_INITIAL_AWARENESS));
124  oc.addDescription("device.toc.initialAwareness", "ToC Device", "Average awareness a driver has initially after a ToC (value in [0,1]).");
125  oc.doRegister("device.toc.mrmDecel", new Option_Float(DEFAULT_MRM_DECEL));
126  oc.addDescription("device.toc.mrmDecel", "ToC Device", "Deceleration rate applied during a 'minimum risk maneuver'.");
127  oc.doRegister("device.toc.dynamicToCThreshold", new Option_Float(DEFAULT_DYNAMIC_TOC_THRESHOLD));
128  oc.addDescription("device.toc.dynamicToCThreshold", "ToC Device", "Time, which the vehicle requires to have ahead to continue in automated mode. The default value of 0 indicates no dynamic triggering of ToCs.");
129  oc.doRegister("device.toc.dynamicMRMProbability", new Option_Float(DEFAULT_MRM_PROBABILITY));
130  oc.addDescription("device.toc.dynamicMRMProbability", "ToC Device", "Probability that a dynamically triggered TOR is not answered in time.");
131  oc.doRegister("device.toc.mrmKeepRight", new Option_Bool(false));
132  oc.addDescription("device.toc.mrmKeepRight", "ToC Device", "If true, the vehicle tries to change to the right during an MRM.");
133  oc.doRegister("device.toc.maxPreparationAccel", new Option_Float(0.0));
134  oc.addDescription("device.toc.maxPreparationAccel", "ToC Device", "Maximal acceleration that may be applied during the ToC preparation phase.");
135  oc.doRegister("device.toc.ogNewTimeHeadway", new Option_Float(-1.0));
136  oc.addDescription("device.toc.ogNewTimeHeadway", "ToC Device", "Timegap for ToC preparation phase.");
137  oc.doRegister("device.toc.ogNewSpaceHeadway", new Option_Float(-1.0));
138  oc.addDescription("device.toc.ogNewSpaceHeadway", "ToC Device", "Additional spacing for ToC preparation phase.");
139  oc.doRegister("device.toc.ogMaxDecel", new Option_Float(-1.0));
140  oc.addDescription("device.toc.ogMaxDecel", "ToC Device", "Maximal deceleration applied for establishing increased gap in ToC preparation phase.");
141  oc.doRegister("device.toc.ogChangeRate", new Option_Float(-1.0));
142  oc.addDescription("device.toc.ogChangeRate", "ToC Device", "Rate of adaptation towards the increased headway during ToC preparation.");
143  oc.doRegister("device.toc.useColorScheme", new Option_Bool(true));
144  oc.addDescription("device.toc.useColorScheme", "ToC Device", "Whether a coloring scheme shall by applied to indicate the different ToC stages.");
145  oc.doRegister("device.toc.file", new Option_String());
146  oc.addDescription("device.toc.file", "ToC Device", "Switches on output by specifying an output filename.");
147 }
148 
149 
150 void
151 MSDevice_ToC::buildVehicleDevices(SUMOVehicle& v, std::vector<MSVehicleDevice*>& into) {
153  if (equippedByDefaultAssignmentOptions(oc, "toc", v, false)) {
154  std::string manualType = getManualType(v, oc);
155  std::string automatedType = getAutomatedType(v, oc);
156  SUMOTime responseTime = TIME2STEPS(getResponseTime(v, oc));
157  double recoveryRate = getRecoveryRate(v, oc);
158  double lcAbstinence = getLCAbstinence(v, oc);
159  double initialAwareness = getInitialAwareness(v, oc);
160  double mrmDecel = getMRMDecel(v, oc);
161  bool useColoring = useColorScheme(v, oc);
162  std::string deviceID = "toc_" + v.getID();
163  std::string file = getOutputFilename(v, oc);
164  OpenGapParams ogp = getOpenGapParams(v, oc);
165  const double dynamicToCThreshold = getDynamicToCThreshold(v, oc);
166  const double dynamicMRMProbability = getDynamicMRMProbability(v, oc);
167  const bool mrmKeepRight = getMRMKeepRight(v, oc);
168  const double maxPreparationAccel = getMaxPreparationAccel(v, oc);
169  // build the device
170  MSDevice_ToC* device = new MSDevice_ToC(v, deviceID, file,
171  manualType, automatedType, responseTime, recoveryRate,
172  lcAbstinence, initialAwareness, mrmDecel, dynamicToCThreshold,
173  dynamicMRMProbability, maxPreparationAccel, mrmKeepRight, useColoring, ogp);
174  into.push_back(device);
175  }
176 }
177 
178 
179 std::string
181  // Default of "" means no output
182  std::string file = "";
183  if (v.getParameter().knowsParameter("device.toc.file")) {
184  try {
185  file = v.getParameter().getParameter("device.toc.file", file);
186  } catch (...) {
187  WRITE_WARNING("Invalid value '" + v.getParameter().getParameter("device.toc.file", file) + "'for vehicle parameter 'ssm.measures'");
188  }
189  } else if (v.getVehicleType().getParameter().knowsParameter("device.toc.file")) {
190  try {
191  file = v.getVehicleType().getParameter().getParameter("device.toc.file", file);
192  } catch (...) {
193  WRITE_WARNING("Invalid value '" + v.getVehicleType().getParameter().getParameter("device.toc.file", file) + "'for vType parameter 'ssm.measures'");
194  }
195  } else {
196  file = oc.getString("device.toc.file") == "" ? file : oc.getString("device.toc.file");
197  }
198  return file;
199 }
200 
201 std::string
203  return getStringParam(v, oc, "toc.manualType", DEFAULT_MANUAL_TYPE, true);
204 }
205 
206 std::string
208  return getStringParam(v, oc, "toc.automatedType", DEFAULT_AUTOMATED_TYPE, true);
209 }
210 
211 double
213  return getFloatParam(v, oc, "toc.responseTime", DEFAULT_RESPONSE_TIME, false);
214 }
215 
216 double
218  return getFloatParam(v, oc, "toc.recoveryRate", DEFAULT_RECOVERY_RATE, false);
219 }
220 
221 double
223  return getFloatParam(v, oc, "toc.lcAbstinence", DEFAULT_LCABSTINENCE, false);
224 }
225 
226 double
228  return getFloatParam(v, oc, "toc.initialAwareness", DEFAULT_INITIAL_AWARENESS, false);
229 }
230 
231 double
233  return getFloatParam(v, oc, "toc.mrmDecel", DEFAULT_MRM_DECEL, false);
234 }
235 
236 double
238  return getFloatParam(v, oc, "toc.dynamicToCThreshold", DEFAULT_DYNAMIC_TOC_THRESHOLD, false);
239 }
240 
241 double
243  double pMRM = getFloatParam(v, oc, "toc.dynamicMRMProbability", DEFAULT_MRM_PROBABILITY, false);
244  if (pMRM < 0 || pMRM > 0.5) {
245  const double pMRMTrunc = MAX2(0.0, MIN2(0.5, pMRM));
246  WRITE_WARNING("Given value for ToC device parameter 'dynamicMRMProbability' (=" + toString(pMRM) + ") is not in the admissible range [0,0.5]. Truncated to " + toString(pMRMTrunc) + ".");
247  return pMRMTrunc;
248  }
249  return pMRM;
250 }
251 
252 double
254  return getFloatParam(v, oc, "toc.maxPreparationAccel", 0.0, false);
255 }
256 
257 bool
259  return getBoolParam(v, oc, "toc.mrmKeepRight", false, false);
260 }
261 
262 bool
264  return getBoolParam(v, oc, "toc.useColorScheme", "false", false);
265 }
266 
269  double timegap = getFloatParam(v, oc, "toc.ogNewTimeHeadway", -1.0, false);
270  double spacing = getFloatParam(v, oc, "toc.ogNewSpaceHeadway", -1.0, false);
271  double changeRate = getFloatParam(v, oc, "toc.ogChangeRate", -1.0, false);
272  double maxDecel = getFloatParam(v, oc, "toc.ogMaxDecel", -1.0, false);
273 
274  bool specifiedAny = false;
275  if (changeRate == -1.0) {
276  changeRate = DEFAULT_OPENGAP_CHANGERATE;
277  } else {
278  specifiedAny = true;
279  }
280  if (maxDecel == -1.0) {
281  maxDecel = DEFAULT_OPENGAP_MAXDECEL;
282  } else {
283  specifiedAny = true;
284  }
285  if (specifiedAny && timegap == -1 && spacing == -1) {
286  WRITE_ERROR("If any openGap parameters for the ToC model are specified, then at least one of ogTimeGap and ogSpacing must be defined.")
287  }
288  if (timegap == -1) {
289  timegap = DEFAULT_OPENGAP_TIMEGAP;
290  } else {
291  specifiedAny = true;
292  }
293  if (spacing == -1) {
294  spacing = DEFAULT_OPENGAP_SPACING;
295  } else {
296  specifiedAny = true;
297  }
298 
299 
300 #ifdef DEBUG_TOC
301  std::cout << "Parsed openGapParams: \n"
302  << " timegap=" << timegap
303  << ", spacing=" << spacing
304  << ", changeRate=" << changeRate
305  << ", maxDecel=" << maxDecel
306  << std::endl;
307 #endif
308 
309  return OpenGapParams(timegap, spacing, changeRate, maxDecel, specifiedAny);
310 }
311 
312 // ---------------------------------------------------------------------------
313 // MSDevice_ToC-methods
314 // ---------------------------------------------------------------------------
315 MSDevice_ToC::MSDevice_ToC(SUMOVehicle& holder, const std::string& id, const std::string& outputFilename,
316  std::string manualType, std::string automatedType, SUMOTime responseTime, double recoveryRate,
317  double lcAbstinence, double initialAwareness, double mrmDecel,
318  double dynamicToCThreshold, double dynamicMRMProbability, double maxPreparationAccel,
319  bool mrmKeepRight, bool useColoring, OpenGapParams ogp) :
320  MSVehicleDevice(holder, id),
321  myManualTypeID(manualType),
322  myAutomatedTypeID(automatedType),
323  myResponseTime(responseTime),
324  myRecoveryRate(recoveryRate),
325  myLCAbstinence(lcAbstinence),
326  myInitialAwareness(initialAwareness),
327  myMRMDecel(mrmDecel),
328  myCurrentAwareness(1.),
329  myUseColorScheme(useColoring),
330  myTriggerMRMCommand(nullptr),
331  myTriggerToCCommand(nullptr),
332  myRecoverAwarenessCommand(nullptr),
333  myExecuteMRMCommand(nullptr),
334  myPrepareToCCommand(nullptr),
335  myOutputFile(nullptr),
336  myEvents(),
337  myPreviousLCMode(-1),
338  myOpenGapParams(ogp),
339  myDynamicToCThreshold(dynamicToCThreshold),
340  myMRMProbability(dynamicMRMProbability),
341  myDynamicToCActive(dynamicToCThreshold > 0),
342  myIssuedDynamicToC(false),
343  myDynamicToCLane(-1),
344  myMRMKeepRight(mrmKeepRight),
345  myMaxPreparationAccel(maxPreparationAccel),
346  myOriginalMaxAccel(-1) {
347  // Take care! Holder is currently being constructed. Cast occurs before completion.
348  myHolderMS = static_cast<MSVehicle*>(&holder);
349 
350  if (outputFilename != "") {
351  myOutputFile = &OutputDevice::getDevice(outputFilename);
352  // TODO: make xsd, include header
353  // myOutputFile.writeXMLHeader("ToCDeviceLog", "ToCDeviceLog.xsd");
354  if (createdOutputFiles.count(outputFilename) == 0) {
355  myOutputFile->openTag("ToCDeviceLog");
356  createdOutputFiles.insert(outputFilename);
357  }
358  }
359 
360  // Check if the given vTypes for the ToC Device are vTypeDistributions
362  const bool automatedVTypeIsDist = vehCtrl.hasVTypeDistribution(myAutomatedTypeID);
363  const bool manualVTypeIsDist = vehCtrl.hasVTypeDistribution(myManualTypeID);
364 
365  // Check if the vType of the holder matches one of the given vTypes
366  std::string holderVTypeID = holder.getVehicleType().getID();
367  if (holderVTypeID == myManualTypeID) {
368  myState = ToCState::MANUAL;
369  } else if (holderVTypeID == myAutomatedTypeID) {
370  myState = ToCState::AUTOMATED;
371  } else if (manualVTypeIsDist && vehCtrl.getVTypeDistributionMembership(holderVTypeID).count(myManualTypeID) > 0) {
372  // Holder type id is from the given manual type distribution.
373  myState = ToCState::MANUAL;
374  myManualTypeID = holderVTypeID;
375  } else if (automatedVTypeIsDist && vehCtrl.getVTypeDistributionMembership(holderVTypeID).count(myAutomatedTypeID) > 0) {
376  // Holder type id is from the given automated type distribution.
377  myState = ToCState::AUTOMATED;
378  myAutomatedTypeID = holderVTypeID;
379  } else {
380  throw ProcessError("Vehicle type of vehicle '" + holder.getID() + "' ('" +
381  holder.getVehicleType().getID() + "') must coincide with manualType ('" +
382  manualType + "') or automatedType ('" + automatedType +
383  "') specified for its ToC-device (or drawn from the specified vTypeDistributions).");
384  }
385  if (!vehCtrl.hasVType(myAutomatedTypeID)) {
386  throw ProcessError("The automated vehicle type '" + myAutomatedTypeID +
387  "' of vehicle '" + holder.getID() + "' is not known.");
388  }
389  if (!vehCtrl.hasVType(myManualTypeID)) {
390  throw ProcessError("The manual vehicle type '" + myManualTypeID +
391  "' of vehicle '" + holder.getID() + "' is not known.");
392  }
393 
394  // Eventually instantiate given vTypes from distributions
395  if (myState == ToCState::MANUAL && automatedVTypeIsDist) {
397  } else if (myState == ToCState::AUTOMATED && manualVTypeIsDist) {
399  }
400 
401  // register at static instance container
402  myInstances.insert(this);
403  initColorScheme();
404 
405 #ifdef DEBUG_TOC
406  std::cout << "initialized device '" << id << "' with "
407  << "outputFilename=" << outputFilename << ", "
408  << "myManualType=" << myManualTypeID << ", "
409  << "myAutomatedType=" << myAutomatedTypeID << ", "
410  << "myResponseTime=" << myResponseTime << ", "
411  << "myRecoveryRate=" << myRecoveryRate << ", "
412  << "myInitialAwareness=" << myInitialAwareness << ", "
413  << "myMRMDecel=" << myMRMDecel << ", "
414  << "ogTimeHeadway=" << myOpenGapParams.newTimeHeadway << ", "
415  << "ogSpaceHeadway=" << myOpenGapParams.newSpaceHeadway << ", "
416  << "ogChangeRate=" << myOpenGapParams.changeRate << ", "
417  << "ogMaxDecel=" << myOpenGapParams.maxDecel << ", "
418  << "ogActive=" << myOpenGapParams.active << ", "
419  << "myCurrentAwareness=" << myCurrentAwareness << ", "
420  << "myState=" << _2string(myState) << std::endl;
421 #endif
422 
423  assert(myInitialAwareness <= 1.0 && myInitialAwareness >= 0.0);
424 }
425 
426 
427 
428 void
430  //RGBColor(red, green, blue)
433  myColorScheme[PREPARING_TOC] = RGBColor(200, 200, 250); // light blue
434  myColorScheme[MRM] = RGBColor(250, 50, 50); // red
435  myColorScheme[RECOVERING] = RGBColor(250, 210, 150); // light yellow
436  myColorScheme[UNDEFINED] = RGBColor(150, 150, 150); // gray
437 }
438 
439 
441  // unregister from static instance container
442  myInstances.erase(this);
443  // deschedule commands associated to this device
444  if (myTriggerMRMCommand != nullptr) {
446  }
447  if (myTriggerToCCommand != nullptr) {
449  }
450  if (myRecoverAwarenessCommand != nullptr) {
452  }
453  if (myExecuteMRMCommand != nullptr) {
456  }
457  if (myPrepareToCCommand != nullptr) {
459  }
460 }
461 
462 void
464  if (value > 1.0 || value < 0.0) {
465  std::stringstream ss;
466  ss << "Truncating invalid value for awareness (" << value << ") to lie in [0,1].";
467  WRITE_WARNING(ss.str());
468  value = MAX2(0.0, MIN2(1.0, value));
469  }
471  // Awareness is now below LC abstinence level -> prevent deliberate LCs
473  } else if (myCurrentAwareness < myLCAbstinence && value >= myLCAbstinence) {
474  // Awareness is now above LC abstinence level -> allow deliberate LCs
476  }
477  myCurrentAwareness = value;
478  myHolderMS->getDriverState()->setAwareness(value);
479 }
480 
481 
482 void
484 #ifdef DEBUG_TOC
485  std::cout << SIMTIME << " MSDevice_ToC::setState()" << std::endl;
486 #endif
487  if (myState == state) {
488  // No state change
489  return;
490  }
491 
492  if (myState == MRM) {
493  // reset the vehicle's maxAccel
496  } else if (myState == PREPARING_TOC) {
497  if (myOpenGapParams.active) {
498  // Deactivate gap control at preparation phase end
500  }
501  if (state != MRM) {
502  // Aborting preparation
505  }
506  } else if (state == PREPARING_TOC || state == MRM) {
507 #ifdef DEBUG_TOC
508  std::cout << " Entering ToC preparation... " << std::endl;
509 #endif
510  // Prevent lane changing during takeover preparation
512  // Store original value of maxAccel for restoring it after preparation phase
514  // Impose acceleration limit during preparation
516  }
517 
518  if (myIssuedDynamicToC) {
519  // Reset dynamic ToC flag
520  myIssuedDynamicToC = false;
521  }
522 
523  myState = state;
524  if (myUseColorScheme) {
525  setVehicleColor();
526  }
527 }
528 
529 void
534 }
535 
536 void
538  // Remove any preparatory process
540  // .. and any recovery process
542  // ... and any pending ToC to manual
543  descheduleToC();
544  // Immediately trigger the MRM process
545  triggerMRM(0);
546 }
547 
548 
549 void
550 MSDevice_ToC::requestToC(SUMOTime timeTillMRM, SUMOTime responseTime) {
551 #ifdef DEBUG_TOC
552  std::cout << SIMTIME << " requestToC() for vehicle '" << myHolder.getID() << "', timeTillMRM=" << timeTillMRM << ", responseTime=" << responseTime << std::endl;
553 #endif
554  if (myState == AUTOMATED) {
555  // Initialize preparation phase
556  if (responseTime == -1000) {
557  // Sample response time from distribution
558  responseTime = TIME2STEPS(sampleResponseTime(STEPS2TIME(timeTillMRM)));
559  }
560 
561  // Schedule ToC Event
564 
565  assert(myExecuteMRMCommand == nullptr);
566  assert(myTriggerMRMCommand == nullptr);
567  if (responseTime > timeTillMRM && myState != MRM) {
568  // Schedule new MRM if driver response time is higher than permitted
571  }
572 
573  // Start ToC preparation process
577  if (myOpenGapParams.active) {
578  // Start gap controller
579  double originalTau = myHolderMS->getCarFollowModel().getHeadwayTime();
583  }
584  // Record event
585  if (generatesOutput()) {
586  myEvents.push(std::make_pair(SIMSTEP, "TOR"));
587  }
588  } else {
589  // Switch to automated mode is performed immediately
590  if (timeTillMRM > 0.) {
591  std::stringstream ss;
592  ss << "[t=" << SIMTIME << "] Positive transition time (" << timeTillMRM / 1000. << "s.) for upward ToC of vehicle '" << myHolder.getID() << "' is ignored.";
593  WRITE_WARNING(ss.str());
594  }
596  }
597 }
598 
599 
600 SUMOTime
602 #ifdef DEBUG_TOC
603  std::cout << SIMTIME << " triggerMRM() for vehicle '" << myHolder.getID() << "'" << std::endl;
604 #endif
605  // Clear ongoing MRM
606  descheduleMRM();
607 
608  // Start MRM process
611  if (myState == MANUAL || myState == RECOVERING) {
613  }
614  setState(MRM);
615  setAwareness(1.);
616 
617  // Record event
618  if (generatesOutput()) {
619  myEvents.push(std::make_pair(SIMSTEP, "MRM"));
620  }
621 
622  return 0;
623 }
624 
625 
626 SUMOTime
628 #ifdef DEBUG_TOC
629  std::cout << SIMTIME << " triggerUpwardToC() for vehicle '" << myHolder.getID() << "'" << std::endl;
630 #endif
631  descheduleToC();
632  // Eventually stop ToC preparation process
634  // Eventually abort MRM
635  descheduleMRM();
636  // Eventually abort awareness recovery process
638 
639  if (myState == MANUAL || myState == RECOVERING) {
641  }
642  setAwareness(1.);
644 
645  // Record event
646  if (generatesOutput()) {
647  myEvents.push(std::make_pair(SIMSTEP, "ToCup"));
648  }
649 
650  return 0;
651 }
652 
653 
654 SUMOTime
656 #ifdef DEBUG_TOC
657  std::cout << SIMTIME << " triggerDownwardToC() for vehicle '" << myHolder.getID() << "'" << std::endl;
658 #endif
659  descheduleToC();
660  // Eventually stop ToC preparation process
662  // Eventually abort MRM
663  descheduleMRM();
664 
665 #ifdef DEBUG_TOC
666  std::cout << SIMTIME << " Initial awareness after ToC: " << myCurrentAwareness << std::endl;
667 #endif
668 
669  // Start awareness recovery process
673 
674  // @todo: Sample initial awareness
675  double initialAwareness = myInitialAwareness;
676  setAwareness(initialAwareness);
677 
679 
680  // Record event
681  if (generatesOutput()) {
682  myEvents.push(std::make_pair(SIMSTEP, "ToCdown"));
683  }
684  return 0;
685 }
686 
687 void
689  // Eventually abort scheduled MRM
690  if (myTriggerMRMCommand != nullptr) {
692  myTriggerMRMCommand = nullptr;
693  }
694  // Eventually abort ongoing MRM
695  if (myExecuteMRMCommand != nullptr) {
698  myExecuteMRMCommand = nullptr;
699  }
700 }
701 
702 
703 void
705  if (myTriggerToCCommand != nullptr) {
707  myTriggerToCCommand = nullptr;
708  }
709 }
710 
711 void
713  // Eventually stop ToC preparation process
714  if (myPrepareToCCommand != nullptr) {
716  if (myState != MRM) {
718  }
719  myPrepareToCCommand = nullptr;
720  }
721 }
722 
723 void
725  // Eventually stop ToC preparation process
726  if (myRecoverAwarenessCommand != nullptr) {
728  myRecoverAwarenessCommand = nullptr;
729  }
730 }
731 
732 
733 void
734 MSDevice_ToC::switchHolderType(const std::string& targetTypeID) {
735 #ifdef DEBUG_TOC
736  std::cout << SIMTIME << " Switching type of vehicle '" << myHolder.getID() << "' to '" << targetTypeID << "'" << std::endl;
737 #endif
738  MSVehicleType* targetType = MSNet::getInstance()->getVehicleControl().getVType(targetTypeID);
739  if (targetType == nullptr) {
740  WRITE_ERROR("vType '" + targetType->getID() + "' for vehicle '" + myHolder.getID() + "' is not known.");
741  return;
742  }
743  myHolderMS->replaceVehicleType(targetType);
744 }
745 
746 
747 SUMOTime
749 #ifdef DEBUG_TOC
750  std::cout << SIMTIME << " ToC preparation step for vehicle '" << myHolder.getID() << "'" << std::endl;
751 #endif
752  if (myState == PREPARING_TOC) {
753  return DELTA_T;
754  } else {
755 #ifdef DEBUG_TOC
756  std::cout << SIMTIME << " Aborting ToC preparation for vehicle '" << myHolder.getID() << "'" << std::endl;
757 #endif
759  return 0;
760  }
761 }
762 
763 
764 SUMOTime
767  const double currentSpeed = myHolderMS->getSpeed();
768 #ifdef DEBUG_TOC
769  std::cout << SIMTIME << " MRM step for vehicle '" << myHolder.getID() << "', currentSpeed=" << currentSpeed << std::endl;
770 #endif
771 
772  // Induce slowdown with MRMDecel
773  std::vector<std::pair<SUMOTime, double> > speedTimeLine;
774  const double nextSpeed = MAX2(0., currentSpeed - ACCEL2SPEED(myMRMDecel));
775  speedTimeLine.push_back(std::make_pair(t - DELTA_T, currentSpeed));
776  speedTimeLine.push_back(std::make_pair(t, nextSpeed));
777  myHolderMS->getInfluencer().setSpeedTimeLine(speedTimeLine);
778 
779  if (myMRMKeepRight) {
780  // Try to change to the right
781  std::vector<std::pair<SUMOTime, int> > laneTimeLine;
782  laneTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep(), 0));
783  laneTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep() + 1, 0));
784  myHolderMS->getInfluencer().setLaneTimeLine(laneTimeLine);
785 // std::cout << "Keeping right..." << std::endl;
786  }
787 
788  if (myState == MRM) {
789  return DELTA_T;
790  } else {
791 #ifdef DEBUG_TOC
792  std::cout << SIMTIME << " Aborting MRM for vehicle '" << myHolder.getID() << "'" << std::endl;
793 #endif
795  return 0;
796  }
797 }
798 
799 
800 SUMOTime
802 #ifdef DEBUG_TOC
803  std::cout << SIMTIME << " Awareness recovery step for vehicle '" << myHolder.getID() << "'" << std::endl;
804 #endif
805  // Proceed with awareness recovery
806  if (myCurrentAwareness < 1.0) {
808  }
809 
810 #ifdef DEBUG_TOC
811  std::cout << SIMTIME << " currentAwareness = " << myCurrentAwareness << std::endl;
812 #endif
813 
814  const bool awarenessRecoveryCompleted = myCurrentAwareness == 1.0;
815  if (awarenessRecoveryCompleted) {
816 #ifdef DEBUG_TOC
817  std::cout << SIMTIME << " Awareness recovery completed for veh '" << myHolder.getID() << "'" << std::endl;
818 #endif
820  myRecoverAwarenessCommand = nullptr;
821  setState(MANUAL);
822  return 0;
823  }
824  return DELTA_T;
825 }
826 
827 bool
829  double /*oldPos*/,
830  double /*newPos*/,
831  double /*newSpeed*/) {
832  if (myState == AUTOMATED && checkDynamicToC()) {
833  // Initiate a ToC
834  // Record event
835  if (generatesOutput()) {
836  myEvents.push(std::make_pair(SIMSTEP, "DYNTOR"));
837  }
838  // Leadtime for dynamic ToC is proportional to the time assumed for the dynamic ToC threshold
839  const double leadTime = myDynamicToCThreshold * 1000 * DYNAMIC_TOC_LEADTIME_FACTOR;
840  requestToC((SUMOTime) leadTime);
841  // TODO: Alter the response time according to the given lead time. Consider re-sampling it at each call of requestToC(). (Conditional to whether a non-negative response time was given in the configuration)
842  myIssuedDynamicToC = true;
844  } else if (myIssuedDynamicToC && myState == PREPARING_TOC && !checkDynamicToC()) {
845  // Abort dynamic ToC, FIXME: This could abort an externally requested ToC in rare occasions... (needs test)
846  // Record event
847  if (generatesOutput()) {
848  myEvents.push(std::make_pair(SIMSTEP, "~DYNTOR"));
849  }
850  // NOTE: This should not occur if lane changing is prevented during ToC preparation...
851  // TODO: Reset response time to the original value (unnecessary if re-sampling for each call to requestToC)
852  triggerUpwardToC(0);
853  }
854  return true;
855 }
856 
857 std::string
858 MSDevice_ToC::getParameter(const std::string& key) const {
859  if (key == "manualType") {
860  return myManualTypeID;
861  } else if (key == "automatedType") {
862  return myAutomatedTypeID;
863  } else if (key == "responseTime") {
865  } else if (key == "recoveryRate") {
866  return toString(myRecoveryRate);
867  } else if (key == "initialAwareness") {
869  } else if (key == "mrmDecel") {
870  return toString(myMRMDecel);
871  } else if (key == "currentAwareness") {
873  } else if (key == "lcAbstinence") {
874  return toString(myLCAbstinence);
875  } else if (key == "state") {
876  return _2string(myState);
877  } else if (key == "holder") {
878  return myHolder.getID();
879  } else if (key == "hasDynamicToC") {
881  } else if (key == "dynamicToCThreshold") {
883  } else if (key == "dynamicMRMProbability") {
884  return toString(myMRMProbability);
885  } else if (key == "mrmKeepRight") {
886  return toString(myMRMKeepRight);
887  } else if (key == "maxPreparationAccel") {
889  }
890  throw InvalidArgument("Parameter '" + key + "' is not supported for device of type '" + deviceName() + "'");
891 }
892 
893 
894 void
895 MSDevice_ToC::setParameter(const std::string& key, const std::string& value) {
896 #ifdef DEBUG_TOC
897  std::cout << SIMTIME << " MSDevice_ToC::setParameter(key=" << key << ", value=" << value << ")" << std::endl;
898 #endif
899  if (key == "manualType") {
900  myManualTypeID = value;
902  if (myState == MANUAL) {
903  switchHolderType(value);
904  }
905  } else if (key == "automatedType") {
906  myAutomatedTypeID = value;
908  if (myState == AUTOMATED || myState == PREPARING_TOC || myState == MRM) {
909  switchHolderType(value);
910  }
911  } else if (key == "responseTime") {
913  } else if (key == "recoveryRate") {
915  } else if (key == "initialAwareness") {
917  } else if (key == "lcAbstinence") {
919  if (isManuallyDriven()) {
920  setAwareness(myCurrentAwareness); // to eventually trigger LC-prevention
921  }
922  } else if (key == "currentAwareness") {
923  if (isManuallyDriven()) {
925  } else {
926  WRITE_WARNING("Setting device.toc.currentAwareness during automated mode has no effect.")
927  }
928  } else if (key == "mrmDecel") {
930  } else if (key == "requestToC") {
931  // setting this magic parameter gives the interface for inducing a ToC
932  const SUMOTime timeTillMRM = TIME2STEPS(StringUtils::toDouble(value));
933  requestToC(timeTillMRM, myResponseTime);
934  } else if (key == "requestMRM") {
935  // setting this magic parameter gives the interface for inducing an MRM
936  requestMRM();
937  } else if (key == "awareness") {
938  // setting this magic parameter gives the interface for setting the driverstate's awareness
940  } else if (key == "dynamicToCThreshold") {
941  const double newValue = StringUtils::toDouble(value);
942  if (newValue < 0) {
943  WRITE_WARNING("Value of dynamicToCThreshold must be non-negative. (Given value " + value + " for vehicle " + myHolderMS->getID() + " is ignored)");
944  } else if (newValue == 0) {
945  myDynamicToCThreshold = newValue;
946  myDynamicToCActive = false;
947  } else {
948  myDynamicToCThreshold = newValue;
949  myDynamicToCActive = true;
950  }
951  } else if (key == "dynamicMRMProbability") {
952  const double newValue = StringUtils::toDouble(value);
953  if (newValue < 0) {
954  WRITE_WARNING("Value of dynamicMRMProbability must be non-negative. (Given value " + value + " for vehicle " + myHolderMS->getID() + " is ignored)");
955  } else {
956  myMRMProbability = newValue;
957  }
958  } else if (key == "mrmKeepRight") {
959  const bool newValue = StringUtils::toBool(value);
960  myMRMKeepRight = newValue;
961  } else if (key == "maxPreparationAccel") {
962  const double newValue = StringUtils::toDouble(value);
963  if (newValue < 0) {
964  WRITE_WARNING("Value of maxPreparationAccel must be non-negative. (Given value " + value + " for vehicle " + myHolderMS->getID() + " is ignored)");
965  } else {
966  myMaxPreparationAccel = newValue;
967  }
968  } else {
969  throw InvalidArgument("Parameter '" + key + "' is not supported for device of type '" + deviceName() + "'");
970  }
971 }
972 
973 
975 MSDevice_ToC::_2ToCState(const std::string& str) {
976  if (str == "UNDEFINED") {
977  return UNDEFINED;
978  } else if (str == "MANUAL") {
979  return MANUAL;
980  } else if (str == "AUTOMATED") {
981  return AUTOMATED;
982  } else if (str == "PREPARING_TOC") {
983  return PREPARING_TOC;
984  } else if (str == "MRM") {
985  return MRM;
986  } else if (str == "RECOVERING") {
987  return RECOVERING;
988  } else {
989  WRITE_WARNING("Unknown ToCState '" + str + "'");
990  return UNDEFINED;
991  }
992 }
993 
994 
995 std::string
997  if (state == UNDEFINED) {
998  return "UNDEFINED";
999  } else if (state == MANUAL) {
1000  return "MANUAL";
1001  } else if (state == AUTOMATED) {
1002  return "AUTOMATED";
1003  } else if (state == PREPARING_TOC) {
1004  return "PREPARING_TOC";
1005  } else if (state == MRM) {
1006  return "MRM";
1007  } else if (state == RECOVERING) {
1008  return "RECOVERING";
1009  } else {
1010  WRITE_WARNING("Unknown ToCState '" + toString(state) + "'");
1011  return toString(state);
1012  }
1013 }
1014 
1015 
1016 void
1018  if (!generatesOutput()) {
1019  assert(myEvents.empty());
1020  return;
1021  }
1022  while (!myEvents.empty()) {
1023  std::pair<SUMOTime, std::string>& e = myEvents.front();
1024  myOutputFile->openTag(e.second);
1025  myOutputFile->writeAttr("id", myHolder.getID()).writeAttr("t", STEPS2TIME(e.first));
1027  myEvents.pop();
1028  }
1029 }
1030 
1031 
1032 void
1034  // Close xml bodies for all existing files
1035  // TODO: Check if required
1036  for (auto& fn : createdOutputFiles) {
1038  file->closeTag();
1039  }
1040 }
1041 
1042 
1043 void
1045  if (myPreviousLCMode != -1) {
1047 #ifdef DEBUG_TOC
1048  std::cout << SIMTIME << " MSDevice_ToC::resetLCMode() restoring LC Mode of vehicle '" << myHolder.getID() << "' to " << myPreviousLCMode << std::endl;
1049 #endif
1050  }
1051  myPreviousLCMode = -1;
1052 }
1053 
1054 
1055 void
1057  const int lcModeHolder = myHolderMS->getInfluencer().getLaneChangeMode();
1058  if (lcModeHolder != LCModeMRM) {
1059  myPreviousLCMode = lcModeHolder;
1060 #ifdef DEBUG_TOC
1061  std::cout << SIMTIME << " MSDevice_ToC::setLCModeMRM() setting LC Mode of vehicle '" << myHolder.getID()
1062  << "' from " << myPreviousLCMode << " to " << LCModeMRM << std::endl;
1063 #endif
1065  }
1066 }
1067 
1068 bool
1070  return (myState == MANUAL || myState == RECOVERING);
1071 }
1072 
1073 bool
1075  return (myState == AUTOMATED || myState == PREPARING_TOC || myState == MRM);
1076 }
1077 
1078 bool
1080 #ifdef DEBUG_DYNAMIC_TOC
1081  std::cout << SIMTIME << " # MSDevice_ToC::checkDynamicToC() for veh '" << myHolder.getID() << "'" << std::endl;
1082 #endif
1083  if (!myDynamicToCActive) {
1084  return false;
1085  }
1086  // The vehicle's current lane
1087  const MSLane* currentLane = myHolderMS->getLane();
1088 
1089  if (currentLane->isInternal()) {
1090  // Don't start or abort dynamic ToCs on internal lanes
1091  return myIssuedDynamicToC;
1092  }
1093 
1094  if (myIssuedDynamicToC) {
1095 #ifdef DEBUG_DYNAMIC_TOC
1096  std::cout << SIMTIME << " Dynamic ToC is ongoing." << std::endl;
1097 #endif
1098  // Dynamic ToC in progress. Resist to aborting it if lane was not changed.
1099  if (myDynamicToCLane == currentLane->getNumericalID()) {
1100  return true;
1101  }
1102  }
1103  // Length for which the current route can be followed
1104  const std::vector<MSVehicle::LaneQ>& bestLanes = myHolderMS->getBestLanes();
1105  // Maximal distance for route continuation without LCs over the possible start lanes
1106  double maximalContinuationDistance = 0;
1107  // Distance for route continuation without LCs from the vehicle's current lane
1108  double continuationDistanceOnCurrent = 0;
1109  // Lane of the next stop
1110  const MSLane* nextStopLane = nullptr;
1111 
1112  if (myHolderMS->hasStops()) {
1113  nextStopLane = myHolderMS->getNextStop().lane;
1114  }
1115  for (auto& i : bestLanes) {
1116  maximalContinuationDistance = MAX2(maximalContinuationDistance, i.length);
1117  if (currentLane == i.lane) {
1118  if (myHolderMS->hasStops()) {
1119  // Check if the next stop lies on the route continuation from the current lane
1120  for (MSLane* l : i.bestContinuations) {
1121  if (l == nextStopLane) {
1122 #ifdef DEBUG_DYNAMIC_TOC
1123  std::cout << SIMTIME << " Stop found on the route continuation from the current lane. => No ToC" << std::endl;
1124 #endif
1125  // Stop found on the route continuation from the current lane => no ToC necessary
1126  return false;
1127  }
1128  }
1129  }
1130  continuationDistanceOnCurrent = i.length;
1131  }
1132  }
1133  if (continuationDistanceOnCurrent == maximalContinuationDistance) {
1134  // There is no better lane than the current, hence no desire to change lanes,
1135  // which the driver could pursue better than the automation => no reason for ToC.
1136  return false;
1137  }
1138  const double distFromCurrent = continuationDistanceOnCurrent - myHolderMS->getPositionOnLane();
1139  const double MRMDist = 0.5 * myHolderMS->getSpeed() * myHolderMS->getSpeed() / MAX2(myMRMDecel, 0.0001);
1140  double distThreshold = myHolderMS->getSpeed() * myDynamicToCThreshold + MRMDist;
1141 #ifdef DEBUG_DYNAMIC_TOC
1142  std::cout << " speed=" << myHolderMS->getSpeed()
1143  << ", distFromCurrent=" << distFromCurrent
1144  << ", maximal dist=" << maximalContinuationDistance - myHolderMS->getPositionOnLane()
1145  << ", distThreshold=" << distThreshold
1146  << std::endl;
1147 #endif
1148 
1149  if (myIssuedDynamicToC) {
1150  // In case of an ongoing ToC, add an additional resistance to abort it.
1151  // (The lane-check above does not capture lanes subsequent to the dynamic ToC lane)
1152  distThreshold *= DYNAMIC_TOC_ABORT_RESISTANCE_FACTOR;
1153  }
1154 
1155  if (distFromCurrent < distThreshold) {
1156  // TODO: Make this more sophisticated in dealing with low speeds/stops and route ends
1157 #ifdef DEBUG_DYNAMIC_TOC
1158  std::cout << SIMTIME << " * distAlongBest is below threshold! *" << std::endl;
1159 #endif
1160  return true;
1161  }
1162 
1163  return false;
1164 }
1165 
1166 double
1167 MSDevice_ToC::sampleResponseTime(double leadTime) const {
1168 #ifdef DEBUG_DYNAMIC_TOC
1169  std::cout << "sampleResponseTime() leadTime=" << leadTime << std::endl;
1170 #endif
1171  const double mean = responseTimeMean(leadTime);
1172  const double var = interpolateVariance(leadTime, myMRMProbability);
1173  std::normal_distribution<double> d(mean, var);
1174  double rt = d(myResponseTimeRNG);
1175 #ifdef DEBUG_DYNAMIC_TOC
1176  std::cout << " mean=" << mean << ", variance=" << var << " => sampled responseTime=" << rt << std::endl;
1177 #endif
1178  int it_count = 0;
1179  while (rt < 0 && it_count < MAX_RESPONSETIME_SAMPLE_TRIES) {
1180  rt = d(myResponseTimeRNG);
1181  it_count++;
1182  }
1183  if (rt < 0) {
1184  // Didn't generate a positive random response time => use mean
1185  rt = mean;
1186  }
1187  return rt;
1188 }
1189 
1190 double
1191 MSDevice_ToC::interpolateVariance(double leadTime, double pMRM) {
1192 #ifdef DEBUG_DYNAMIC_TOC
1193  std::cout << "interpolateVariance() leadTime=" << leadTime << ", pMRM=" << pMRM << std::endl;
1194 #endif
1195  // Calculate indices for surrounding values in lookup tables
1196 
1197  // Find largest p_{i-1} < pMRM < p_{i}
1198  const auto pi = std::lower_bound(lookupResponseTimeMRMProbs.begin(), lookupResponseTimeMRMProbs.end(), pMRM);
1199  if (pi == lookupResponseTimeMRMProbs.end()) {
1200  // requested probability lies outside lookup table.
1201  // => return maximal variance value
1203  }
1204  const size_t pi1 = pi - lookupResponseTimeMRMProbs.begin();
1205  assert(pi1 > 0);
1206  const size_t pi0 = pi1 - 1;
1207  const double cp = (pMRM - * (pi - 1)) / (*pi - * (pi - 1));
1208 
1209 #ifdef DEBUG_DYNAMIC_TOC
1210  std::cout << " p[=" << pi0 << "]=" << *(pi - 1) << ", p[=" << pi1 << "]=" << *pi << " => cp=" << cp << std::endl;
1211 #endif
1212 
1213  // Find largest p_{i-1} < pMRM < p_{i}
1214  auto li = std::lower_bound(lookupResponseTimeLeadTimes.begin(), lookupResponseTimeLeadTimes.end(), leadTime);
1215  if (li == lookupResponseTimeLeadTimes.begin()) {
1216  // Given lead time smaller than minimal lookup-value.
1217  // Use minimal value from lookup table instead
1218  leadTime = *li;
1219  li = lookupResponseTimeLeadTimes.begin() + 1;
1220  } else if (li == lookupResponseTimeLeadTimes.end()) {
1221  // Given leadTime exceeds values in lookup table
1222  // => induce extrapolation
1223  li--;
1224  }
1225  const size_t li1 = li - lookupResponseTimeLeadTimes.begin();
1226  const size_t li0 = li1 - 1;
1227  const double cl = (leadTime - * (li - 1)) / (*li - * (li - 1));
1228 
1229 #ifdef DEBUG_DYNAMIC_TOC
1230  std::cout << " l[=" << li0 << "]=" << *(li - 1) << ", l[=" << li1 << "]=" << *li << " => cp=" << cl << std::endl;
1231 #endif
1232 
1233  // 2D interpolation for variance
1234  // First, interpolate (or extrapolate) variances along leadTimes
1235  const double var00 = lookupResponseTimeVariances[pi0][li0];
1236  const double var01 = lookupResponseTimeVariances[pi0][li1];
1237  const double var10 = lookupResponseTimeVariances[pi1][li0];
1238  const double var11 = lookupResponseTimeVariances[pi1][li1];
1239  const double var_0 = var00 + (var01 - var00) * cl;
1240  const double var_1 = var10 + (var11 - var10) * cl;
1241  // From these, interpolate along the pMRM-axis
1242  const double var = var_0 + (var_1 - var_0) * cp;
1243 #ifdef DEBUG_DYNAMIC_TOC
1244  std::cout << " var00=" << var00 << ", var01=" << var01 << " var10=" << var10 << ", var11=" << var11
1245  << " var_0=" << var_0 << ", var_1=" << var_1 << ", var=" << var << std::endl;
1246 #endif
1247  return var;
1248 }
1249 
1250 // Grid of the response time distribution.
1251 // Generated by the script generateResponseTimeDistributions.py, see Appendix to TransAID Deliverable 3.1v2.
1252 // Probability for an MRM to occur (start with 0.0, end with 0.5)
1253 std::vector<double> MSDevice_ToC::lookupResponseTimeMRMProbs = {0.0, 0.05, 0.1, 0.15000000000000002, 0.2, 0.25, 0.30000000000000004, 0.35000000000000003, 0.4, 0.45, 0.5};
1254 // Lead time grid
1255 std::vector<double> MSDevice_ToC::lookupResponseTimeLeadTimes = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999, 1.0999999999999999, 1.2, 1.3, 1.4, 1.5, 1.5999999999999999, 1.7, 1.8, 1.9, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0, 16.5, 17.0, 17.5, 18.0, 18.5, 19.0, 19.5, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0};
1256 
1257 // Variances of the response time distribution.
1258 std::vector<std::vector<double> > MSDevice_ToC::lookupResponseTimeVariances = {
1259  {0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001},
1260  {0.018238371642696278, 0.03647674328603705, 0.054715114926535656, 0.07295348656987645, 0.09119185821321724, 0.10943022985371582, 0.12766860149705656, 0.14590697314039733, 0.16414534478089599, 0.18238371642423673, 0.2006220880675775, 0.21886045971091828, 0.2370988313514169, 0.25533720299475765, 0.27357557463809845, 0.291813946278597, 0.3100523179219377, 0.32829068956527846, 0.3465290612057772, 0.36476743284911795, 0.4103633619560487, 0.45595929106297967, 0.5015552201670682, 0.5471511492739992, 0.59274707838093, 0.6383430074850186, 0.6839389365919495, 0.7295348656988803, 0.7751307948058112, 0.8207267239098999, 0.8663226530168309, 0.9119185821237615, 1.003110440334781, 1.0943022985486428, 1.1854941567596624, 1.2766860149735242, 1.3678778731845436, 1.4590697313984053, 1.622588042723657, 1.8236013818166044, 2.0271872430355344, 2.2329896377033402, 2.440681612959606, 2.6499766330096066, 2.8606328744048484, 3.0724517481497657, 3.285273075453899, 3.4989689745182173, 3.713437758931686, 3.928598499444084, 4.144386478335934, 4.360749535794346, 4.577645204319768, 4.795038495182951, 5.012900204026633, 5.231205620052272, 5.449933544477286, 5.669065543877604, 5.888585381094657, 6.108478580034079, 6.328732091514834, 6.5493340353396325, 6.991540386888257, 7.4350193801571836, 7.8797023900653835, 8.325528107903486, 8.772441019472117, 9.220390365425358, 9.66932940241786, 10.11921485679467, 10.570006505095746, 11.021666840703753, 11.474160800924851, 11.927455537955435, 12.381520222795276, 12.836325874663427, 13.291845210806684, 13.748052512926236, 14.204923507573522, 14.662435258383752, 15.120566068535554, 15.57929539219183, 16.03860375377652, 16.498472674274336, 16.958884603774735, 17.41982285960362, 17.881271569514066, 18.343215619413176, 18.805640605235663, 19.268532788517863, 19.731879055399546, 20.195666878723525},
1261  {0.023394708584543455, 0.04678941716973141, 0.07018412575207719, 0.09357883433726513, 0.11697354292245306, 0.14036825150764104, 0.16376296009282898, 0.18715766867517475, 0.2105523772603627, 0.23394708584555063, 0.25734179443073857, 0.2807365030130844, 0.3041312115982723, 0.3275259201834602, 0.3509206287686481, 0.37431533735099387, 0.3977100459361818, 0.42110475452136986, 0.4444994631065578, 0.46789417168890357, 0.5263809431504523, 0.5848677146120012, 0.6433544860735498, 0.7018412575350985, 0.7603280289966473, 0.8188148004581961, 0.8773015719197449, 0.9357883433784517, 0.9942751148400004, 1.0527618863015489, 1.111248657763098, 1.169735429224647, 1.2867089721477445, 1.4036825150708419, 1.520656057991097, 1.6376296009141948, 1.7546031438372918, 1.8715766867603902, 2.080324923070349, 2.3356056603653466, 2.592695753086048, 2.851065033244823, 3.110348235805368, 3.37030701064756, 3.630792243424829, 3.8917140872434826, 4.153020535352749, 4.414682984212653, 4.676686852454919, 4.939025633083471, 5.201697195938797, 5.4647015339779985, 5.728039423002128, 5.991711652753062, 6.255718611539178, 6.520060086487768, 6.784735192689795, 7.0497423770254475, 7.315079462951026, 7.580743715621537, 7.846731914823575, 8.113040428416943, 8.646602223970579, 9.181394311584102, 9.717379133745458, 10.25451769188949, 10.792770521511661, 11.332098388641393, 11.872462773672844, 12.41382619675905, 12.956152426938662, 13.499406606935544, 14.04355531739462, 14.588566598200957, 15.134409939740127, 15.681056253544272, 16.228477829207687, 16.776648282531472, 17.32554249848686, 17.875136571609353, 18.425407745596857, 18.976334353419617, 19.527895758814104, 20.080072299738145, 20.632845234156534, 21.18619668838177, 21.740109608063758, 22.294567711842525, 22.849555447666962, 23.405057951674344, 23.96106100953682, 24.517551020220964},
1262  {0.028809965676139145, 0.05761993135292278, 0.08642989702686427, 0.11523986270364789, 0.14404982838043154, 0.172859794054373, 0.20166975973115658, 0.23047972540794023, 0.2592896910818817, 0.2880996567586654, 0.31690962243544896, 0.34571958811223263, 0.37452955378617403, 0.4033395194629576, 0.4321494851397413, 0.4609594508136828, 0.4897694164904665, 0.51857938216725, 0.5473893478411916, 0.5761993135179752, 0.6482242277085132, 0.7202491418990512, 0.7922740560867471, 0.864298970277285, 0.9363238844678232, 1.0083487986555189, 1.0803737128460569, 1.152398627036595, 1.224423541227133, 1.296448455414829, 1.368473369605367, 1.4404982837959048, 1.584548112174139, 1.7285979405552145, 1.8726477689334486, 2.0166975973145242, 2.1607474256927586, 2.3047972540738346, 2.5572219533483644, 2.8623099438447785, 3.167154753839855, 3.4715923078311928, 3.775618300633292, 4.079301412505033, 4.3827364323759, 4.686020985499979, 4.989245061612653, 5.2924871133699085, 5.595813357348367, 5.89927852360174, 6.202927167199209, 6.506795109670751, 6.810910812533207, 7.115296603265157, 7.419969732096102, 7.724943265058281, 8.030226829842663, 8.33582723446787, 8.641748978492437, 8.947994674556652, 9.254565395777925, 9.561460961999748, 10.17622101728854, 10.792256328037844, 11.409539737303032, 12.02803871883203, 12.647717622463388, 13.268539213916304, 13.890465727714453, 14.513459582113466, 15.137483858085837, 15.76250261298258, 16.388481078046894, 17.015385774331957, 17.643184571383188, 18.271846706039163, 18.901342773672106, 19.531644700723955, 20.16272570482796, 20.79456024708863, 21.427123979740387, 22.06039369148417, 22.694347252144688, 23.32896355779389, 23.964222477085105, 24.600104799357926, 25.23659218482918, 25.873667117046345, 26.51131285772261, 27.149513403967962, 27.788253447896256, 28.427518338543063},
1263  {0.03496845765860337, 0.06993691531785123, 0.1049053729770991, 0.13987383063634692, 0.17484228829559478, 0.20981074595200053, 0.24477920361124836, 0.2797476612704962, 0.314716118929744, 0.34968457658899194, 0.38465303424823977, 0.41962149190748765, 0.4545899495638933, 0.48955840722314126, 0.5245268648823892, 0.5594953225416369, 0.5944637802008848, 0.6294322378601326, 0.6644006955193805, 0.6993691531757862, 0.7867902973239058, 0.8742114414720256, 0.961632585617303, 1.0490537297654225, 1.1364748739135424, 1.2238960180588196, 1.3113171622069395, 1.3987383063550594, 1.4861594505003368, 1.5735805946484562, 1.6610017387965759, 1.748422882941853, 1.9232651712352506, 2.0981074595314895, 2.272949747824887, 2.4477920361182846, 2.6226343244145234, 2.7974766127079205, 3.0926745755509586, 3.44395841916428, 3.7929654946149927, 4.140199155580832, 4.48610487276643, 4.8310499148399675, 5.175327720605737, 5.519169410160118, 5.862755881539858, 6.20622837304298, 6.549697059107542, 6.893247832651301, 7.236947584569466, 7.580848293751031, 7.924990195098607, 8.2694042393908, 8.614114010475241, 8.959137226336916, 9.30448692001335, 9.650172373181427, 9.996199857775714, 10.342573227835842, 10.689294393844476, 11.036363704475946, 11.73154213703699, 12.428090426873897, 13.125980076789245, 13.825176212794954, 14.52564028426291, 15.227331883606062, 15.930209972250445, 16.634233702118422, 17.339362959284276, 18.045558715641334, 18.752783247333983, 19.461000260660008, 20.170174953762714, 20.880274034013603, 21.591265705145904, 22.303119634055196, 23.015806904341318, 23.7292999616137, 24.443572554090043, 25.158599671023588, 25.874357480669964, 26.590823269047004, 27.30797538027189, 28.025793159035764, 28.74425689552527, 29.46334777297606, 30.183047817969005, 30.903339853423454, 31.624207454305022, 32.345634905899644},
1264  {0.04208452197242317, 0.08416904394549082, 0.12625356591855852, 0.16833808789162616, 0.21042260986469383, 0.25250713183776147, 0.294591653807987, 0.33667617578105463, 0.3787606977541223, 0.42084521972719, 0.46292974170025764, 0.5050142636733252, 0.5470987856463931, 0.5891833076194606, 0.6312678295925284, 0.6733523515627537, 0.7154368735358214, 0.7575213955088891, 0.7996059174819568, 0.8416904394550245, 0.9469017443876938, 1.0521130493203628, 1.1573243542501899, 1.2625356591828591, 1.3677469641155282, 1.472958269045355, 1.5781695739780248, 1.6833808789106937, 1.7885921838433625, 1.8938034887731896, 1.9990147937058587, 2.104226098638527, 2.314648708501024, 2.5250713183663627, 2.7354939282288586, 2.9459165380941967, 3.1563391479566936, 3.3667617578220317, 3.703839316684887, 4.098607599735211, 4.490071039515135, 4.879192386567447, 5.266673871161598, 5.6530296960510835, 6.038639278868162, 6.423784955842712, 6.808678484059117, 7.1934797498117895, 7.578310096881422, 7.9632619279700085, 8.348405702022065, 8.733795092290785, 9.119470830182808, 9.505463599150936, 9.891796234154242, 10.278485408041451, 10.665542934966393, 11.05297678524097, 11.440791880843797, 11.828990722803214, 12.217573888696098, 12.606540429161571, 13.385614043672865, 14.166184035906006, 14.948213302277296, 15.731659164963906, 16.51647601334669, 17.302617053034968, 18.09003546045466, 18.87868513730469, 19.66852119352658, 20.459500245021562, 21.251580584675224, 22.044722266798285, 22.838887132598156, 23.634038796019215, 24.430142603281702, 25.22716557558935, 26.025076341551085, 26.823845063912813, 27.62344336382784, 28.423844244828874, 29.22502201803638, 30.026952229552563, 30.82961159071451, 31.63297791152784, 32.43703003753926, 33.24174779014256, 34.047111910360435, 34.85310400598881, 35.65970650197814, 36.46690259392711},
1265  {0.05029020480396514, 0.10058040960573261, 0.15087061441034225, 0.2011608192121097, 0.2514510240167194, 0.301741228821329, 0.35203143362309647, 0.40232163842770624, 0.45261184322947356, 0.5029020480340831, 0.5531922528358507, 0.6034824576404602, 0.6537726624450699, 0.7040628672468374, 0.7543530720514469, 0.8046432768532146, 0.8549334816578241, 0.9052236864595916, 0.9555138912642014, 1.0058040960688106, 1.1315296080760717, 1.2572551200833324, 1.382980632093436, 1.5087061441006968, 1.6344316561107992, 1.7601571681180603, 1.8858826801253215, 2.0116081921354243, 2.137333704142684, 2.263059216152788, 2.3887847281600485, 2.514510240170152, 2.765961264184674, 3.017412288202038, 3.2688633122194015, 3.520314336236765, 3.7717653602541295, 4.023216384271493, 4.402923686706604, 4.840923169412718, 5.275628140231794, 5.708106387011112, 6.139096012777341, 6.569117835239806, 6.998545742885471, 7.427651941064436, 7.856636809801444, 8.28564907733453, 8.714799743029685, 9.144171870687785, 9.573827594895418, 10.00381321001211, 10.43416291693517, 10.864901615202994, 11.296047006509264, 11.72761119486633, 12.159601914603718, 12.592023480161025, 13.024877525833228, 13.458163585558754, 13.891879549849177, 14.326022027631314, 15.195568219985953, 16.066758980781113, 16.93954397110994, 17.813869202173244, 18.68967930447209, 19.566918991345418, 20.44553399181503, 21.325471630737475, 22.206681173178218, 23.089114010781095, 23.972723742457497, 24.857466184805716, 25.743299336515662, 26.63018331333154, 27.518080264958197, 28.4069542817556, 29.296771296561822, 30.187498985305254, 31.07910666877645, 31.97156521721369, 32.86484695863455, 33.75892559154721, 34.653776102328635, 35.54937468734068, 36.44569867980954, 37.34272648128694, 38.24043749755077, 39.13881207875172, 40.03783146350794, 40.937477726773984},
1266  {0.05974016468300759, 0.11948032936381749, 0.17922049404462742, 0.23896065872827943, 0.29870082340908927, 0.35844098808989927, 0.4181811527735513, 0.47792131745436117, 0.5376614821380133, 0.5974016468188231, 0.657141811499633, 0.7168819761832851, 0.7766221408640949, 0.8363623055449051, 0.8961024702285572, 0.955842634909367, 1.0155827995930191, 1.0753229642738293, 1.135063128954639, 1.1948032936382913, 1.344153705341737, 1.493504117048025, 1.6428545287514704, 1.7922049404549163, 1.9415553521612046, 2.0909057638646504, 2.2402561755709387, 2.389606587274385, 2.5389569989806726, 2.688307410684118, 2.8376578223904056, 2.987008234093852, 3.2857090575035857, 3.58440988091332, 3.8831107043230535, 4.181811527729945, 4.48051235113968, 4.779213174549414, 5.204876111923692, 5.688848562937568, 6.170159044583231, 6.6497495644421285, 7.128261753669921, 7.606142949678828, 8.083710709627423, 8.561193555361694, 9.038757543068261, 9.516524068724227, 9.99458208377549, 10.47299664830626, 10.951815027051936, 11.431071102373838, 11.910788612986488, 12.39098355983018, 12.871666012589971, 13.352841479046571, 13.834511951858257, 14.316676714667919, 14.799332966945224, 15.282476311040416, 15.766101133711286, 16.250200906162327, 17.219795978620663, 18.1911988298489, 19.164342959599296, 20.139160814458737, 21.115585503946967, 22.093551853025446, 23.07299702417972, 24.053860858945782, 25.036086036434696, 26.019618113131642, 27.004405486541614, 27.990399311257423, 28.977553386435417, 29.965824027565322, 30.95516993094154, 31.94555203660525, 32.93693339332716, 33.92927902800424, 34.92255582087156, 35.91673238727074, 36.91177896637648, 37.907667316880286, 38.90437061956949, 39.90186338652862, 40.90012137664726, 41.899121517093974, 42.89884183037187, 43.8992613666098, 44.90036014068208, 45.90211907383619},
1267  {0.07067515415184052, 0.14135030830148337, 0.2120254624511261, 0.2827006166036112, 0.35337577075325394, 0.4240509249028968, 0.49472607905538185, 0.5654012332050246, 0.6360763873575095, 0.7067515415071527, 0.7774266956567951, 0.8481018498092803, 0.9187770039589231, 0.9894521581085659, 1.060127312261051, 1.1308024664106937, 1.2014776205603366, 1.2721527747128218, 1.3428279288624643, 1.41350308301495, 1.5901909683904774, 1.7668788537660056, 1.943566739144376, 2.120254624519904, 2.2969425098982743, 2.473630395273803, 2.6503182806493313, 2.8270061660277013, 3.0036940514032295, 3.1803819367816004, 3.3570698221571273, 3.5337577075354982, 3.8871334782865548, 4.240509249040453, 4.593885019794351, 4.947260790548251, 5.300636561302148, 5.654012332053204, 6.131630444292413, 6.6672022906208355, 7.200987739963464, 7.733716006955079, 8.265882445019285, 8.797830454475601, 9.32980159851235, 9.861967438834494, 10.394450401173598, 10.927337816806162, 11.460691587201293, 11.994554966496775, 12.528957402009762, 13.06391803975272, 13.599448295828148, 14.135553763816139, 14.672235643520898, 15.209491820318211, 15.747317686564726, 16.285706770680626, 16.82465122144653, 17.364142182462015, 17.904170082649248, 18.444724862108774, 19.52737339128757, 20.612003289072593, 21.69853012990063, 22.786871401229217, 23.87694757433194, 24.968682680039276, 26.062004572321317, 27.156844995848896, 28.253139532174295, 29.350827472729005, 30.449851649907924, 31.55015824661291, 32.651696597281045, 33.75441898881355, 34.85828046658357, 35.96323864863796, 37.06925354984671, 38.176287416815526, 39.2843045737864, 40.39327127936956, 41.50315559373177, 42.613927255723794, 43.72555756930443, 44.838019298684486, 45.951286571522466, 47.065334789581065, 48.18014054623036, 49.29568155028052, 50.41193655559852, 51.52888529603219},
1268  {0.0834623671324666, 0.16692473426273555, 0.2503871013958466, 0.33384946852611547, 0.4173118356592266, 0.5007742027894957, 0.5842365699226064, 0.6676989370528754, 0.7511613041859866, 0.8346236713162553, 0.9180860384493664, 1.0015484055796355, 1.0850107727127467, 1.1684731398430155, 1.2519355069761264, 1.3353978741063957, 1.4188602412395066, 1.5023226083697758, 1.5857849755028866, 1.6692473426331556, 1.8779032604630912, 2.0865591782930264, 2.29521509612012, 2.5038710139500555, 2.7125269317799905, 2.921182849609927, 3.1298387674370196, 3.338494685266956, 3.547150603096892, 3.7558065209268268, 3.96446243875392, 4.173118356583855, 4.590430192243725, 5.007742027900754, 5.425053863557784, 5.842365699217655, 6.259677534874682, 6.676989370534554, 7.215284811865045, 7.810942636066625, 8.405713438558344, 9.000109193262631, 9.594476065866042, 10.189051324756685, 10.783998757795331, 11.379431470741277, 11.975426983124095, 12.572037465005534, 13.169296821117609, 13.767225679430393, 14.365834957075359, 14.965128442509108, 15.565104686191797, 16.165758398192054, 16.767081489665355, 17.369063854126264, 17.971693956723634, 18.574959280506526, 19.178846665295886, 19.78334256540095, 20.38843324553279, 20.994104929469565, 22.20713664504607, 23.42233029997001, 24.63958259994195, 25.858795291719396, 27.079875555554814, 28.302736078822026, 29.527294941445533, 30.75347539415742, 31.981205580215, 33.21041823195959, 34.44105036161415, 35.67304295805245, 36.90634069627536, 38.14089166337484, 39.3766471025938, 40.61356117597085, 41.851590745280404, 43.090695170440334, 44.33083612445286, 45.57197742365028, 46.814084872185866, 48.05712611949615, 49.301070529748834, 50.54588906213925, 51.79155416112571, 53.0380396556748, 54.285320666751495, 55.533373522224736, 56.782175678619716, 58.031705649011975},
1269  {0.09864342769295685, 0.19728685538371601, 0.2959302830773173, 0.39457371076807657, 0.49321713846167803, 0.5918605661524371, 0.6905039938460386, 0.7891474215367978, 0.887790849230399, 0.9864342769211584, 1.0850777046147597, 1.1837211323055188, 1.2823645599991202, 1.38100798768988, 1.4796514153834808, 1.5782948430742403, 1.6769382707678415, 1.7755816984586006, 1.874225126152202, 1.972868553842961, 2.219477123074122, 2.4660856923052834, 2.7126942615364444, 2.9593028307647646, 3.2059113999959257, 3.4525199692270867, 3.6991285384582473, 3.945737107686567, 4.192345676917727, 4.438954246148888, 4.68556281538005, 4.932171384608369, 5.425388523070691, 5.918605661530172, 6.411822799992494, 6.905039938451975, 7.398257076914296, 7.891474215373778, 8.502335361374866, 9.169831074405188, 9.837265003168877, 10.504960425335845, 11.173131332846934, 11.841919360545138, 12.511417180930938, 13.181683762841976, 13.85275456878272, 14.524648510968875, 15.197372779403622, 15.870926242469201, 16.545301871890324, 17.220488489846183, 17.896472038316816, 18.573236507380663, 19.250764617377587, 19.929038321651447, 20.608039177427425, 21.287748619021162, 21.968148158299684, 22.64921953063529, 23.330944799863957, 24.013306432352234, 25.37987095153259, 26.74878238692951, 28.119918223260417, 29.4931641334551, 30.8684136985658, 32.245567980998565, 33.624535031317535, 35.005229375702534, 36.38757151118004, 37.77148742362557, 39.156908136182956, 40.54376929127801, 41.93201076678101, 43.32157632534552, 44.712413295099445, 46.1044722794653, 47.497706893719666, 48.892073525949804, 50.2875311201024, 51.68404097903562, 53.081566585544806, 54.48007343965984, 55.87952891050276, 57.27990210130182, 58.68116372625177, 60.08328599798667, 61.48624252468206, 62.890008215820075, 64.29455919573915, 65.6998727243063},
1270 };
1271 
1272 
1273 /****************************************************************************/
1274 
MSVehicleType
The car-following model and parameter.
Definition: MSVehicleType.h:66
DEFAULT_INITIAL_AWARENESS
#define DEFAULT_INITIAL_AWARENESS
Definition: MSDevice_ToC.cpp:61
MSDevice_ToC::OpenGapParams::newTimeHeadway
double newTimeHeadway
Definition: MSDevice_ToC.h:63
MSDevice_ToC::myUseColorScheme
bool myUseColorScheme
Whether a coloring scheme shall by applied to indicate the different toc stages,.
Definition: MSDevice_ToC.h:301
SUMOTrafficObject
Representation of a vehicle or person.
Definition: SUMOTrafficObject.h:48
MSDevice_ToC::myEvents
std::queue< std::pair< SUMOTime, std::string > > myEvents
Storage for events to be written to the output.
Definition: MSDevice_ToC.h:325
MSDevice_ToC::myManualTypeID
std::string myManualTypeID
vehicle type ID for manual driving
Definition: MSDevice_ToC.h:277
MSVehicleType::getID
const std::string & getID() const
Returns the name of the vehicle type.
Definition: MSVehicleType.h:94
MSCFModel::getMaxAccel
double getMaxAccel() const
Get the vehicle type's maximum acceleration [m/s^2].
Definition: MSCFModel.h:210
MSDevice_ToC::isAutomated
bool isAutomated()
Whether the current operation mode is automated.
Definition: MSDevice_ToC.cpp:1074
MIN2
T MIN2(T a, T b)
Definition: StdDefs.h:74
MSDevice_ToC::ToCState
ToCState
Enum describing the different regimes for the device,.
Definition: MSDevice_ToC.h:111
SUMOVehicleParameter::parametersSet
int parametersSet
Information for the router which parameter were set, TraCI may modify this (whe changing color)
Definition: SUMOVehicleParameter.h:650
MSEventControl::addEvent
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
Definition: MSEventControl.cpp:53
StringUtils::toBool
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
Definition: StringUtils.cpp:342
WRITE_WARNING
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:239
MSVehicle::getBestLanes
const std::vector< LaneQ > & getBestLanes() const
Returns the description of best lanes to use in order to continue the route.
Definition: MSVehicle.cpp:4621
MSNet.h
MSDevice_ToC::myPreviousLCMode
int myPreviousLCMode
LC mode overridden during MRM, stored for restoration.
Definition: MSDevice_ToC.h:328
MSLane
Representation of a lane in the micro simulation.
Definition: MSLane.h:83
MSDevice_ToC::descheduleMRM
void descheduleMRM()
Break MRM Process or remove MRM-Trigger command from the event-queue.
Definition: MSDevice_ToC.cpp:688
MSDevice_ToC::triggerUpwardToC
SUMOTime triggerUpwardToC(SUMOTime t)
Trigger execution of a ToC X-->AUTOMATED ("upwards")
Definition: MSDevice_ToC.cpp:627
MSDevice_ToC::OpenGapParams::maxDecel
double maxDecel
Definition: MSDevice_ToC.h:66
Option_Bool
Definition: Option.h:540
MSDevice_ToC::OpenGapParams
Definition: MSDevice_ToC.h:62
DEFAULT_OPENGAP_MAXDECEL
#define DEFAULT_OPENGAP_MAXDECEL
Definition: MSDevice_ToC.cpp:80
MSDevice_ToC::generatesOutput
bool generatesOutput()
Whether this device requested to write output.
Definition: MSDevice_ToC.h:186
SUMOVehicleParameter::color
RGBColor color
The vehicle's color, TraCI may change this.
Definition: SUMOVehicleParameter.h:471
MSDevice_ToC::getMRMKeepRight
static bool getMRMKeepRight(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:258
MSVehicleControl::getVType
MSVehicleType * getVType(const std::string &id=DEFAULT_VTYPE_ID, std::mt19937 *rng=nullptr)
Returns the named vehicle type or a sample from the named distribution.
Definition: MSVehicleControl.cpp:348
SUMOVehicle::getParameter
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
MSDevice_ToC::getManualType
static std::string getManualType(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:202
OutputDevice
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:64
DEFAULT_OPENGAP_TIMEGAP
#define DEFAULT_OPENGAP_TIMEGAP
Definition: MSDevice_ToC.cpp:77
DELTA_T
SUMOTime DELTA_T
Definition: SUMOTime.cpp:35
MSDevice_ToC::myHolderMS
MSVehicle * myHolderMS
The holder vehicle casted to MSVehicle*.
Definition: MSDevice_ToC.h:309
MSDevice_ToC::sampleResponseTime
double sampleResponseTime(double leadTime) const
Samples a random driver response time from a truncated Gaussian with parameters according to the look...
Definition: MSDevice_ToC.cpp:1167
MSDevice_ToC::MRM
Definition: MSDevice_ToC.h:116
MSDevice_ToC::myExecuteMRMCommand
WrappingCommand< MSDevice_ToC > * myExecuteMRMCommand
Definition: MSDevice_ToC.h:317
OptionsCont.h
SUMOTrafficObject::getVehicleType
virtual const MSVehicleType & getVehicleType() const =0
Returns the vehicle's type.
StringUtils::toDouble
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
Definition: StringUtils.cpp:313
MSDevice_ToC::getMRMDecel
static double getMRMDecel(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:232
ACCEL2SPEED
#define ACCEL2SPEED(x)
Definition: SUMOTime.h:53
MSNet::getBeginOfTimestepEvents
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition: MSNet.h:430
SUMOTrafficObject::getID
virtual const std::string & getID() const =0
Get the vehicle's ID.
MSDevice_ToC::triggerDownwardToC
SUMOTime triggerDownwardToC(SUMOTime t)
Trigger execution of a ToC X-->MANUAL ("downwards")
Definition: MSDevice_ToC.cpp:655
MSDevice_ToC::requestToC
void requestToC(SUMOTime timeTillMRM, SUMOTime responseTime=-1000)
Request a ToC. If the device is in AUTOMATED or MRM state, a driver response time is sampled and the ...
Definition: MSDevice_ToC.cpp:550
WrappingCommand.h
MSDevice_ToC::myCurrentAwareness
double myCurrentAwareness
Current awareness-level of the driver in [0,1].
Definition: MSDevice_ToC.h:295
MSVehicle::Influencer::setLaneTimeLine
void setLaneTimeLine(const std::vector< std::pair< SUMOTime, int > > &laneTimeLine)
Sets a new lane timeline.
Definition: MSVehicle.cpp:408
MSDevice_ToC::descheduleRecovery
void descheduleRecovery()
Remove ongoing awareness recovery process from the event-queue.
Definition: MSDevice_ToC.cpp:724
OptionsCont::getString
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
Definition: OptionsCont.cpp:202
WrappingCommand::deschedule
void deschedule()
Marks this Command as being descheduled.
Definition: WrappingCommand.h:79
MSDevice_ToC::deviceName
const std::string deviceName() const override
return the name for this type of device
Definition: MSDevice_ToC.h:147
MSDevice_ToC::getResponseTime
static double getResponseTime(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:212
MSDevice_ToC::myMaxPreparationAccel
double myMaxPreparationAccel
Maximal acceleration that may be applied during the ToC preparation phase TODO: Make effective.
Definition: MSDevice_ToC.h:354
SUMOTime
long long int SUMOTime
Definition: SUMOTime.h:35
SUMOVehicle
Representation of a vehicle.
Definition: SUMOVehicle.h:61
MSDevice_ToC::responseTimeMean
static double responseTimeMean(double leadTime)
Mean of the response time distribution. (Only depends on given lead time)
Definition: MSDevice_ToC.h:363
WrappingCommand< MSDevice_ToC >
MSVehicle::Influencer::activateGapController
void activateGapController(double originalTau, double newTimeHeadway, double newSpaceHeadway, double duration, double changeRate, double maxDecel, MSVehicle *refVeh=nullptr)
Activates the gap control with the given parameters,.
Definition: MSVehicle.cpp:393
OptionsCont::getOptions
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:58
MSDevice_ToC::myResponseTimeRNG
static std::mt19937 myResponseTimeRNG
Random generator for ToC devices.
Definition: MSDevice_ToC.h:372
SUMOVehicleParameter
Structure representing possible vehicle parameter.
Definition: SUMOVehicleParameter.h:291
MSDevice_ToC::_2ToCState
static ToCState _2ToCState(const std::string &)
Definition: MSDevice_ToC.cpp:975
MSDevice_ToC::setVehicleColor
void setVehicleColor()
Definition: MSDevice_ToC.cpp:530
MSVehicleDevice::myHolder
SUMOVehicle & myHolder
The vehicle that stores the device.
Definition: MSVehicleDevice.h:85
MSDevice_ToC::getLCAbstinence
static double getLCAbstinence(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:222
MSDevice_ToC::buildVehicleDevices
static void buildVehicleDevices(SUMOVehicle &v, std::vector< MSVehicleDevice * > &into)
Build devices for the given vehicle, if needed.
Definition: MSDevice_ToC.cpp:151
MSVehicle::getNextStop
Stop & getNextStop()
Definition: MSVehicle.cpp:5807
DEFAULT_RESPONSE_TIME
#define DEFAULT_RESPONSE_TIME
Definition: MSDevice_ToC.cpp:54
MSVehicle::getCarFollowModel
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
Definition: MSVehicle.h:894
MSDevice_ToC::getDynamicMRMProbability
static double getDynamicMRMProbability(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:242
MSDevice_ToC::UNDEFINED
Definition: MSDevice_ToC.h:112
MSDevice_ToC::setState
void setState(ToCState state)
Set the ToC device's state.
Definition: MSDevice_ToC.cpp:483
RGBColor.h
Parameterised::getParameter
const std::string getParameter(const std::string &key, const std::string &defaultValue="") const
Returns the value for a given key.
Definition: Parameterised.cpp:71
MSVehicle.h
OutputDevice::closeTag
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
Definition: OutputDevice.cpp:254
MSDevice_ToC::initColorScheme
void initColorScheme()
Initialize vehicle colors for different states.
Definition: MSDevice_ToC.cpp:429
MSDevice_ToC::resetDeliberateLCs
void resetDeliberateLCs()
Resets the holder's LC mode to the last differing to LCModeMRM.
Definition: MSDevice_ToC.cpp:1044
MSDevice_ToC::OpenGapParams::active
bool active
Definition: MSDevice_ToC.h:67
MAX2
T MAX2(T a, T b)
Definition: StdDefs.h:80
MSDevice_ToC
The ToC Device controls transition of control between automated and manual driving.
Definition: MSDevice_ToC.h:55
MSDevice_ToC::~MSDevice_ToC
~MSDevice_ToC()
Destructor.
Definition: MSDevice_ToC.cpp:440
OutputDevice::writeAttr
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:256
RGBColor
Definition: RGBColor.h:40
SUMOVehicle.h
MSDevice_ToC::lookupResponseTimeLeadTimes
static std::vector< double > lookupResponseTimeLeadTimes
Definition: MSDevice_ToC.h:361
OptionsCont::addDescription
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
Definition: OptionsCont.cpp:473
MSDevice_ToC::switchHolderType
void switchHolderType(const std::string &targetTypeID)
Switch the device holder's vehicle type.
Definition: MSDevice_ToC.cpp:734
SIMTIME
#define SIMTIME
Definition: SUMOTime.h:64
MSVehicle::getPositionOnLane
double getPositionOnLane() const
Get the vehicle's position along the lane.
Definition: MSVehicle.h:397
MSVehicleControl::getVTypeDistributionMembership
const std::set< std::string > getVTypeDistributionMembership(const std::string &id) const
Return the distribution IDs the vehicle type is a member of.
Definition: MSVehicleControl.cpp:379
MSDevice_ToC::myDynamicToCThreshold
double myDynamicToCThreshold
Duration in s. for which the vehicle needs to be able to follow its route without a lane change to co...
Definition: MSDevice_ToC.h:338
MSVehicle::getDriverState
std::shared_ptr< MSSimpleDriverState > getDriverState() const
Returns the vehicle driver's state.
Definition: MSVehicle.cpp:6129
MSDevice_ToC::getDynamicToCThreshold
static double getDynamicToCThreshold(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:237
MSVehicleType::getCarFollowModel
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
Definition: MSVehicleType.h:141
MSDevice_ToC::lookupResponseTimeMRMProbs
static std::vector< double > lookupResponseTimeMRMProbs
Grid of the response time distribution.
Definition: MSDevice_ToC.h:360
MSDevice_ToC::RECOVERING
Definition: MSDevice_ToC.h:117
MSDevice::insertDefaultAssignmentOptions
static void insertDefaultAssignmentOptions(const std::string &deviceName, const std::string &optionsTopic, OptionsCont &oc, const bool isPerson=false)
Adds common command options that allow to assign devices to vehicles.
Definition: MSDevice.cpp:126
MSVehicleControl::hasVTypeDistribution
bool hasVTypeDistribution(const std::string &id) const
Asks for a vehicle type distribution.
Definition: MSVehicleControl.cpp:342
TIME2STEPS
#define TIME2STEPS(x)
Definition: SUMOTime.h:59
MSDevice_ToC::triggerMRM
SUMOTime triggerMRM(SUMOTime t)
Trigger execution of an MRM.
Definition: MSDevice_ToC.cpp:601
MSDevice_ToC::myMRMProbability
double myMRMProbability
Probability of an MRM to occur after a dynamically triggered ToC.
Definition: MSDevice_ToC.h:341
TS
#define TS
Definition: SUMOTime.h:44
VEHPARS_COLOR_SET
const int VEHPARS_COLOR_SET
Definition: SUMOVehicleParameter.h:46
MSDevice_ToC::myInitialAwareness
double myInitialAwareness
Average awareness the driver has initially after a ToC.
Definition: MSDevice_ToC.h:289
STEPS2TIME
#define STEPS2TIME(x)
Definition: SUMOTime.h:57
MSVehicle::Influencer::setSpeedTimeLine
void setSpeedTimeLine(const std::vector< std::pair< SUMOTime, double > > &speedTimeLine)
Sets a new velocity timeline.
Definition: MSVehicle.cpp:387
MSDevice_ToC::myColorScheme
std::map< ToCState, RGBColor > myColorScheme
Coloring scheme,.
Definition: MSDevice_ToC.h:298
MSDevice_ToC::interpolateVariance
static double interpolateVariance(double leadTime, double pMRM)
Two-dimensional interpolation of variance from lookup table assumes pMRM >= 0, leadTime >= 0.
Definition: MSDevice_ToC.cpp:1191
MSDevice_ToC::lookupResponseTimeVariances
static std::vector< std::vector< double > > lookupResponseTimeVariances
Variances of the response time distribution. Given the lead time and the MRM probability the variance...
Definition: MSDevice_ToC.h:365
MSVehicleType::getColor
const RGBColor & getColor() const
Returns this type's color.
Definition: MSVehicleType.h:202
MSDevice_ToC::myState
ToCState myState
Current state of the device.
Definition: MSDevice_ToC.h:304
OptionsCont::doRegister
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:75
ProcessError
Definition: UtilExceptions.h:40
MSDevice_ToC::AUTOMATED
Definition: MSDevice_ToC.h:114
MSDevice_ToC::getInitialAwareness
static double getInitialAwareness(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:227
DEFAULT_OPENGAP_CHANGERATE
#define DEFAULT_OPENGAP_CHANGERATE
Definition: MSDevice_ToC.cpp:79
MSDevice_ToC::setAwareness
void setAwareness(double value)
Set the awareness to the given value.
Definition: MSDevice_ToC.cpp:463
MSDevice_ToC::myOutputFile
OutputDevice * myOutputFile
The file the devices output goes to.
Definition: MSDevice_ToC.h:322
Option_String
Definition: Option.h:401
MSDevice_ToC::myOriginalMaxAccel
double myOriginalMaxAccel
Storage for original maximal acceleration of vehicle.
Definition: MSDevice_ToC.h:357
MSVehicle::Stop::lane
const MSLane * lane
The lane to stop at.
Definition: MSVehicle.h:927
DEFAULT_MRM_PROBABILITY
#define DEFAULT_MRM_PROBABILITY
Definition: MSDevice_ToC.cpp:68
OptionsCont
A storage for options typed value containers)
Definition: OptionsCont.h:90
MSCFModel::setMaxAccel
virtual void setMaxAccel(double accel)
Sets a new value for maximum acceleration [m/s^2].
Definition: MSCFModel.h:466
SIMSTEP
#define SIMSTEP
Definition: SUMOTime.h:63
MSDevice_ToC::getAutomatedType
static std::string getAutomatedType(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:207
MSDevice_ToC::ToCPreparationStep
SUMOTime ToCPreparationStep(SUMOTime t)
Continue the ToC preparation for one time step.
Definition: MSDevice_ToC.cpp:748
MSLane::getNumericalID
int getNumericalID() const
Returns this lane's numerical id.
Definition: MSLane.h:470
MSDevice::getFloatParam
static double getFloatParam(const SUMOVehicle &v, const OptionsCont &oc, std::string paramName, double deflt, bool required)
Definition: MSDevice.cpp:186
DEFAULT_RECOVERY_RATE
#define DEFAULT_RECOVERY_RATE
Definition: MSDevice_ToC.cpp:57
DEFAULT_DYNAMIC_TOC_THRESHOLD
#define DEFAULT_DYNAMIC_TOC_THRESHOLD
Definition: MSDevice_ToC.cpp:65
MSDevice_ToC::MRMExecutionStep
SUMOTime MRMExecutionStep(SUMOTime t)
Continue the MRM for one time step.
Definition: MSDevice_ToC.cpp:765
MSDevice_ToC::myMRMKeepRight
bool myMRMKeepRight
Whether vehicle tries to change to the right during an MRM.
Definition: MSDevice_ToC.h:350
MSDevice_ToC::descheduleToCPreparation
void descheduleToCPreparation()
Remove ongoing ToC-Preparation process from the event-queue.
Definition: MSDevice_ToC.cpp:712
MSDevice_ToC::myInstances
static std::set< MSDevice_ToC *, ComparatorNumericalIdLess > myInstances
Definition: MSDevice_ToC.h:58
OptionsCont::addOptionSubTopic
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
Definition: OptionsCont.cpp:523
MSVehicle::getLane
MSLane * getLane() const
Returns the lane the vehicle is on.
Definition: MSVehicle.h:561
MSDevice_ToC::insertOptions
static void insertOptions(OptionsCont &oc)
Inserts MSDevice_ToC-options.
Definition: MSDevice_ToC.cpp:109
DEFAULT_MANUAL_TYPE
#define DEFAULT_MANUAL_TYPE
Definition: MSDevice_ToC.cpp:83
MSDevice_ToC::getRecoveryRate
static double getRecoveryRate(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:217
MSVehicle::getInfluencer
Influencer & getInfluencer()
Returns the velocity/lane influencer.
Definition: MSVehicle.cpp:5817
OutputDevice::openTag
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
Definition: OutputDevice.cpp:240
toString
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:48
StringUtils.h
MSDevice_ToC::descheduleToC
void descheduleToC()
Remove scheduled ToC-Trigger command from the event-queue.
Definition: MSDevice_ToC.cpp:704
MSDriverState.h
OutputDevice::getDevice
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
Definition: OutputDevice.cpp:55
MSDevice_ToC::notifyMove
bool notifyMove(SUMOTrafficObject &veh, double oldPos, double newPos, double newSpeed) override
Return value indicates whether the device still wants to be notified about the vehicle movement.
Definition: MSDevice_ToC.cpp:828
MSNet::getInstance
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:168
MSDevice::equippedByDefaultAssignmentOptions
static bool equippedByDefaultAssignmentOptions(const OptionsCont &oc, const std::string &deviceName, DEVICEHOLDER &v, bool outputOptionSet, const bool isPerson=false)
Determines whether a vehicle should get a certain device.
Definition: MSDevice.h:204
MSDevice_ToC::isManuallyDriven
bool isManuallyDriven()
Whether the current operation mode is manual.
Definition: MSDevice_ToC.cpp:1069
MSCFModel::getHeadwayTime
virtual double getHeadwayTime() const
Get the driver's desired headway [s].
Definition: MSCFModel.h:259
DEFAULT_LCABSTINENCE
#define DEFAULT_LCABSTINENCE
Definition: MSDevice_ToC.cpp:59
MSDevice_ToC::_2string
static std::string _2string(ToCState state)
Definition: MSDevice_ToC.cpp:996
MSDevice_ToC::checkDynamicToC
bool checkDynamicToC()
Check if the vehicle should induce a ToC due to internal reasons. That is, if the route cannot be fol...
Definition: MSDevice_ToC.cpp:1079
InvalidArgument
Definition: UtilExceptions.h:57
MSDevice_ToC::getOpenGapParams
static OpenGapParams getOpenGapParams(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:268
Option_Float
Definition: Option.h:472
MSVehicle::Influencer::setLaneChangeMode
void setLaneChangeMode(int value)
Sets lane changing behavior.
Definition: MSVehicle.cpp:768
MSRouteHandler::getParsingRNG
static std::mt19937 * getParsingRNG()
get parsing RNG
Definition: MSRouteHandler.h:63
MSDevice::getStringParam
static std::string getStringParam(const SUMOVehicle &v, const OptionsCont &oc, std::string paramName, std::string deflt, bool required)
Definition: MSDevice.cpp:153
MSDevice_ToC::MANUAL
Definition: MSDevice_ToC.h:113
MSBaseVehicle::getSingularType
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
Definition: MSBaseVehicle.cpp:702
MSVehicleType::getParameter
const SUMOVTypeParameter & getParameter() const
Definition: MSVehicleType.h:556
MAX_RESPONSETIME_SAMPLE_TRIES
#define MAX_RESPONSETIME_SAMPLE_TRIES
Definition: MSDevice_ToC.cpp:88
MSDevice_ToC::getParameter
std::string getParameter(const std::string &key) const override
try to retrieve the given parameter from this device. Throw exception for unsupported key
Definition: MSDevice_ToC.cpp:858
MSBaseVehicle::getID
const std::string & getID() const
Returns the name of the vehicle.
Definition: MSBaseVehicle.cpp:137
MSVehicle::Influencer::getLaneChangeMode
int getLaneChangeMode() const
return the current lane change mode
Definition: MSVehicle.cpp:437
MSDevice_ToC::useColorScheme
static bool useColorScheme(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:263
MSDevice_ToC::requestMRM
void requestMRM()
Request an MRM to be initiated immediately. No downward ToC will be scheduled.
Definition: MSDevice_ToC.cpp:537
DYNAMIC_TOC_LEADTIME_FACTOR
#define DYNAMIC_TOC_LEADTIME_FACTOR
Definition: MSDevice_ToC.cpp:71
MSDevice_ToC::deactivateDeliberateLCs
void deactivateDeliberateLCs()
Resets the holder's LC mode to the operational LC-mode of the ToC Device (.
Definition: MSDevice_ToC.cpp:1056
config.h
MSVehicleControl
The class responsible for building and deletion of vehicles.
Definition: MSVehicleControl.h:72
DEFAULT_AUTOMATED_TYPE
#define DEFAULT_AUTOMATED_TYPE
Definition: MSDevice_ToC.cpp:84
MSLane::isInternal
bool isInternal() const
Definition: MSLane.cpp:1999
MSDevice_ToC::createdOutputFiles
static std::set< std::string > createdOutputFiles
Definition: MSDevice_ToC.h:60
MSDevice_ToC::myDynamicToCLane
int myDynamicToCLane
Lane, on which the ongoing dynamic ToC was issued. It can only be aborted if the lane was changed.
Definition: MSDevice_ToC.h:347
MSVehicle::getSpeed
double getSpeed() const
Returns the vehicle's current speed.
Definition: MSVehicle.h:477
MSDevice_ToC::getOutputFilename
static std::string getOutputFilename(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:180
MSDevice_ToC::myPrepareToCCommand
WrappingCommand< MSDevice_ToC > * myPrepareToCCommand
Definition: MSDevice_ToC.h:318
MSDevice_ToC::myTriggerMRMCommand
WrappingCommand< MSDevice_ToC > * myTriggerMRMCommand
Definition: MSDevice_ToC.h:314
MSDevice_ToC::PREPARING_TOC
Definition: MSDevice_ToC.h:115
fn
static double fn[10]
Definition: odrSpiral.cpp:82
MSVehicleControl::hasVType
bool hasVType(const std::string &id) const
Asks for existence of a vehicle type.
Definition: MSVehicleControl.cpp:336
MSVehicle::Influencer::deactivateGapController
void deactivateGapController()
Deactivates the gap control.
Definition: MSVehicle.cpp:401
MSDevice_ToC::OpenGapParams::changeRate
double changeRate
Definition: MSDevice_ToC.h:65
MSDevice_ToC::myOpenGapParams
OpenGapParams myOpenGapParams
Parameters for the openGap mechanism applied during ToC preparation phase.
Definition: MSDevice_ToC.h:334
MSDevice_ToC::myMRMDecel
double myMRMDecel
Deceleration rate applied during MRM.
Definition: MSDevice_ToC.h:292
MSEventControl.h
MSDevice_ToC::myAutomatedTypeID
std::string myAutomatedTypeID
vehicle type ID for automated driving
Definition: MSDevice_ToC.h:279
MAX_RESPONSETIME_VARIANCE
#define MAX_RESPONSETIME_VARIANCE
Definition: MSDevice_ToC.cpp:90
DEFAULT_MRM_DECEL
#define DEFAULT_MRM_DECEL
Definition: MSDevice_ToC.cpp:63
MSDevice_ToC::myRecoveryRate
double myRecoveryRate
Recovery rate for the driver's awareness after a ToC.
Definition: MSDevice_ToC.h:285
MSDevice_ToC::setParameter
void setParameter(const std::string &key, const std::string &value) override
try to set the given parameter for this device. Throw exception for unsupported key
Definition: MSDevice_ToC.cpp:895
MSDevice_ToC::myDynamicToCActive
bool myDynamicToCActive
Switch for considering dynamic ToCs,.
Definition: MSDevice_ToC.h:343
MSDevice_ToC::myRecoverAwarenessCommand
WrappingCommand< MSDevice_ToC > * myRecoverAwarenessCommand
Definition: MSDevice_ToC.h:316
MSRouteHandler.h
MSDevice_ToC::writeOutput
void writeOutput()
Write output to file given by option device.toc.file.
Definition: MSDevice_ToC.cpp:1017
MSDevice_ToC::getMaxPreparationAccel
static double getMaxPreparationAccel(const SUMOVehicle &v, const OptionsCont &oc)
Definition: MSDevice_ToC.cpp:253
MSVehicleControl.h
WRITE_ERROR
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:245
MSDevice_ToC::myTriggerToCCommand
WrappingCommand< MSDevice_ToC > * myTriggerToCCommand
Definition: MSDevice_ToC.h:315
MSDevice_ToC::OpenGapParams::newSpaceHeadway
double newSpaceHeadway
Definition: MSDevice_ToC.h:64
MSDevice_ToC::LCModeMRM
static int LCModeMRM
LC mode operational during an MRM.
Definition: MSDevice_ToC.h:331
MSNet::getVehicleControl
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:337
MSDevice_ToC.h
MSDevice_ToC::MSDevice_ToC
MSDevice_ToC(SUMOVehicle &holder, const std::string &id, const std::string &outputFilename, std::string manualType, std::string automatedType, SUMOTime responseTime, double recoveryRate, double lcAbstinence, double initialAwareness, double mrmDecel, double dynamicToCThreshold, double dynamicMRMProbability, double maxPreparationAccel, bool mrmKeepRight, bool useColorScheme, OpenGapParams ogp)
Constructor.
Definition: MSDevice_ToC.cpp:315
MSDevice_ToC::cleanup
static void cleanup()
Closes root tags of output files.
Definition: MSDevice_ToC.cpp:1033
MSDevice::getBoolParam
static bool getBoolParam(const SUMOVehicle &v, const OptionsCont &oc, std::string paramName, bool deflt, bool required)
Definition: MSDevice.cpp:219
Parameterised::knowsParameter
bool knowsParameter(const std::string &key) const
Returns whether the parameter is known.
Definition: Parameterised.cpp:65
MSDevice_ToC::awarenessRecoveryStep
SUMOTime awarenessRecoveryStep(SUMOTime t)
Continue the awareness recovery for one time step.
Definition: MSDevice_ToC.cpp:801
MSDevice_ToC::myIssuedDynamicToC
bool myIssuedDynamicToC
Flag to indicate that a dynamically triggered ToC is in preparation.
Definition: MSDevice_ToC.h:345
DYNAMIC_TOC_ABORT_RESISTANCE_FACTOR
#define DYNAMIC_TOC_ABORT_RESISTANCE_FACTOR
Definition: MSDevice_ToC.cpp:73
MSBaseVehicle::replaceVehicleType
void replaceVehicleType(MSVehicleType *type)
Replaces the current vehicle type by the one given.
Definition: MSBaseVehicle.cpp:692
MSVehicle::hasStops
bool hasStops() const
Returns whether the vehicle has to stop somewhere.
Definition: MSVehicle.h:995
DEFAULT_OPENGAP_SPACING
#define DEFAULT_OPENGAP_SPACING
Definition: MSDevice_ToC.cpp:78
MSDevice_ToC::myResponseTime
SUMOTime myResponseTime
Average response time needed by the driver to take back control.
Definition: MSDevice_ToC.h:283
MSVehicleDevice
Abstract in-vehicle device.
Definition: MSVehicleDevice.h:55
MSDevice_ToC::myLCAbstinence
double myLCAbstinence
Level of the awareness below which no lane-changes are performed.
Definition: MSDevice_ToC.h:287