Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSCFModel_CACC.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
19// CACC car-following model based on [1], [2].
20// [1] Milanes, V., and S. E. Shladover. Handling Cut-In Vehicles in Strings
21// of Cooperative Adaptive Cruise Control Vehicles. Journal of Intelligent
22// Transportation Systems, Vol. 20, No. 2, 2015, pp. 178-191.
23// [2] Xiao, L., M. Wang and B. van Arem. Realistic Car-Following Models for
24// Microscopic Simulation of Adaptive and Cooperative Adaptive Cruise
25// Control Vehicles. Transportation Research Record: Journal of the
26// Transportation Research Board, No. 2623, 2017. (DOI: 10.3141/2623-01).
27/****************************************************************************/
28#include <config.h>
29
30#include <stdio.h>
31#include <iostream>
32
33#include "MSCFModel_CACC.h"
34#include <microsim/MSVehicle.h>
35#include <microsim/MSLane.h>
40#include <math.h>
41#include <microsim/MSNet.h>
42
43// ===========================================================================
44// debug flags
45// ===========================================================================
46#define DEBUG_CACC 0
47#define DEBUG_CACC_INSERTION_FOLLOW_SPEED 0
48#define DEBUG_CACC_SECURE_GAP 0
49#define DEBUG_COND (veh->isSelected())
50//#define DEBUG_COND (veh->getID() == "flow.0")
51//#define DEBUG_COND (veh->getID() == "CVflowToC2.11")
52
53
54// ===========================================================================
55// defaults
56// ===========================================================================
57#define DEFAULT_SC_GAIN_CACC -0.4
58#define DEFAULT_GCC_GAIN_GAP_CACC 0.005
59#define DEFAULT_GCC_GAIN_GAP_DOT_CACC 0.05
60#define DEFAULT_GC_GAIN_GAP_CACC 0.45
61#define DEFAULT_GC_GAIN_GAP_DOT_CACC 0.0125
62#define DEFAULT_CA_GAIN_GAP_CACC 0.45
63#define DEFAULT_CA_GAIN_GAP_DOT_CACC 0.05
64#define DEFAULT_HEADWAYTIME_ACC 1.0
65#define DEFAULT_SC_MIN_GAP 1.66
66
67// override followSpeed when deemed unsafe by the given margin (the value was selected to reduce the number of necessary interventions)
68#define DEFAULT_EMERGENCY_OVERRIDE_THRESHOLD 2.0
69
70std::map<std::string, MSCFModel_CACC::CommunicationsOverrideMode> MSCFModel_CACC::CommunicationsOverrideModeMap = {
71 {"0", CACC_NO_OVERRIDE},
72 {"1", CACC_MODE_NO_LEADER},
73 {"2", CACC_MODE_LEADER_NO_CAV},
74 {"3", CACC_MODE_LEADER_CAV}
75};
76
77std::map<MSCFModel_CACC::VehicleMode, std::string> MSCFModel_CACC::VehicleModeNames = {
78 {CC_MODE, "CC"},
79 {ACC_MODE, "ACC"},
80 {CACC_GAP_CLOSING_MODE, "CACC_GAP_CL"},
81 {CACC_GAP_MODE, "CACC_GAP"},
82 {CACC_COLLISION_AVOIDANCE_MODE, "CACC_CA"}
83};
84
85// ===========================================================================
86// method definitions
87// ===========================================================================
89 MSCFModel(vtype), acc_CFM(MSCFModel_ACC(vtype)),
102 acc_CFM.setHeadwayTime(myHeadwayTimeACC);
103}
104
106
107
108void
111 out.writeAttr(SUMO_ATTR_ID, "CACC");
112 std::ostringstream internals;
113 internals << CACC_ControlMode << " ";
115 out.writeAttr(SUMO_ATTR_STATE, internals.str());
116 out.closeTag();
117}
118
119
120void
122 bool ok = true;
123 const std::string cfmID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
124 if (cfmID != "CACC") {
125 throw ProcessError(TLF("incompatible carFollowModel '%' when loading state for CACC", cfmID));
126 }
127 std::istringstream bis(attrs.getString(SUMO_ATTR_STATE));
128 bis >> CACC_ControlMode;
129 int mode;
130 bis >> mode;
132}
133
134double
135MSCFModel_CACC::freeSpeed(const MSVehicle* const veh, double speed, double seen, double maxSpeed, const bool onInsertion, const CalcReason usage) const {
138 if (vars->lastUpdateTime != MSNet::getInstance()->getCurrentTimeStep()) {
139 // _v was not called in this step
140 const_cast<SUMOVehicleParameter&>(veh->getParameter()).setParameter("caccVehicleMode", VehicleModeNames[CC_MODE]);
141 }
142 }
143 return MSCFModel::freeSpeed(veh, speed, seen, maxSpeed, onInsertion, usage);
144}
145
146double
147MSCFModel_CACC::followSpeed(const MSVehicle* const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle* const pred, const CalcReason usage) const {
148 if (myApplyDriverstate) {
149 applyHeadwayAndSpeedDifferencePerceptionErrors(veh, speed, gap2pred, predSpeed, predMaxDecel, pred);
150 }
151
152 const double desSpeed = veh->getLane()->getVehicleMaxSpeed(veh);
153 const double vCACC = _v(veh, pred, gap2pred, speed, predSpeed, desSpeed, true, usage);
154 // using onInsertion=true disables emergencyOverides emergency deceleration smoothing
155 const double vSafe = maximumSafeFollowSpeed(gap2pred, speed, predSpeed, predMaxDecel, true);
156
157#if DEBUG_CACC == 1
158 if (DEBUG_COND) {
159 std::cout << SIMTIME << " veh=" << veh->getID() << " pred=" << Named::getIDSecure(pred)
160 << " v=" << speed << " vL=" << predSpeed << " gap=" << gap2pred
161 << " predDecel=" << predMaxDecel << " vCACC=" << vCACC << " vSafe=" << vSafe << "\n";
162 }
163#else
164 UNUSED_PARAMETER(pred);
165#endif
166 const double speedOverride = MIN2(myEmergencyThreshold, gap2pred);
167 if (vSafe + speedOverride < vCACC) {
168#if DEBUG_CACC == 1
169 if (DEBUG_COND) {
170 std::cout << "Apply Safe speed, override=" << speedOverride << "\n";
171 }
172#endif
173 return MAX2(0.0, vSafe + speedOverride);
174 }
175 return vCACC;
176}
177
178double
179MSCFModel_CACC::stopSpeed(const MSVehicle* const veh, const double speed, double gap, double decel, const CalcReason /*usage*/) const {
180 if (myApplyDriverstate) {
181 applyHeadwayPerceptionError(veh, speed, gap);
182 }
183
184 // NOTE: This allows return of smaller values than minNextSpeed().
185 // Only relevant for the ballistic update: We give the argument headway=TS, to assure that
186 // the stopping position is approached with a uniform deceleration also for tau!=TS.
187 return MIN2(maximumSafeStopSpeed(gap, decel, speed, false, veh->getActionStepLengthSecs()), maxNextSpeed(speed, veh));
188}
189
190double
191MSCFModel_CACC::getSecureGap(const MSVehicle* const veh, const MSVehicle* const pred, const double speed, const double leaderSpeed, const double leaderMaxDecel) const {
192 // Accel in gap mode should vanish:
193 double desSpacing;
195 // 0 = myGapControlGainSpeed * (leaderSpeed - speed) + myGapControlGainSpace * (g - myHeadwayTime * speed);
196 // <=> myGapControlGainSpace * g = - myGapControlGainSpeed * (leaderSpeed - speed) + myGapControlGainSpace * myHeadwayTime * speed;
197 // <=> g = - myGapControlGainSpeed * (leaderSpeed - speed) / myGapControlGainSpace + myHeadwayTime * speed;
198 desSpacing = acc_CFM.myGapControlGainSpeed * (speed - leaderSpeed) / acc_CFM.myGapControlGainSpace + myHeadwayTimeACC * speed; // MSCFModel_ACC::accelGapControl
199 } else {
200 desSpacing = myHeadwayTime * speed; // speedGapControl
201 }
202 const double desSpacingDefault = MSCFModel::getSecureGap(veh, pred, speed, leaderSpeed, leaderMaxDecel);
203#if DEBUG_CACC_SECURE_GAP == 1
204 std::cout << SIMTIME << "MSCFModel_ACC::getSecureGap speed=" << speed << " leaderSpeed=" << leaderSpeed
205 << " desSpacing=" << desSpacing << " desSpacingDefault=" << desSpacingDefault << "\n";
206#endif
207 return MAX2(desSpacing, desSpacingDefault);
208}
209
210
211double
212MSCFModel_CACC::insertionFollowSpeed(const MSVehicle* const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle* const pred) const {
213#if DEBUG_CACC_INSERTION_FOLLOW_SPEED == 1
214 if (DEBUG_COND) {
215 std::cout << "MSCFModel_ACC::insertionFollowSpeed(), speed=" << speed << " gap2pred=" << gap2pred << " predSpeed=" << predSpeed << "\n";
216 }
217#endif
218 // iterate to find a stationary value for
219 // speed = followSpeed(v, speed, gap2pred, predSpeed, predMaxDecel, nullptr, CalcReason::FUTURE)
220 const int max_iter = 50;
221 int n_iter = 0;
222 const double tol = 0.1;
223 double damping = 0.8;
224
225 double res = speed;
226 while (n_iter < max_iter) {
227 // proposed acceleration
228 const double vCACC = _v(veh, pred, gap2pred, res, predSpeed, speed, true);
229 const double vSafe = maximumSafeFollowSpeed(gap2pred, res, predSpeed, predMaxDecel, true);
230 const double a = MIN2(vCACC, vSafe) - res;
231 res = res + damping * a;
232#if DEBUG_CACC_INSERTION_FOLLOW_SPEED == 1
233 if (DEBUG_COND) {
234 std::cout << " n_iter=" << n_iter << " vSafe=" << vSafe << " vCACC=" << vCACC << " a=" << a << " damping=" << damping << " res=" << res << std::endl;
235 }
236#endif
237 damping *= 0.9;
238 if (fabs(a) < tol) {
239 break;
240 } else {
241 n_iter++;
242 }
243 }
244 return res;
245}
246
247
248
249
251double
252MSCFModel_CACC::interactionGap(const MSVehicle* const /* veh */, double /* vL */) const {
253 /*maximum radar range is CACC is enabled*/
254 return 250;
255}
256
257
258std::string
259MSCFModel_CACC::getParameter(const MSVehicle* veh, const std::string& key) const {
261
262 if (key.compare("caccCommunicationsOverrideMode") == 0) {
264 }
265
266 return "";
267}
268
269
270void
271MSCFModel_CACC::setParameter(MSVehicle* veh, const std::string& key, const std::string& value) const {
273
274 try {
275 if (key.compare("caccCommunicationsOverrideMode") == 0) {
277 }
278 } catch (NumberFormatException&) {
279 throw InvalidArgument("Invalid value '" + value + "' for parameter '" + key + "' for vehicle '" + veh->getID() + "'");
280 }
281}
282
283
284double
285MSCFModel_CACC::speedSpeedControl(const double speed, double vErr, VehicleMode& vehMode) const {
286 // Speed control law
287 vehMode = CC_MODE;
288 double sclAccel = mySpeedControlGain * vErr;
289 double newSpeed = speed + ACCEL2SPEED(sclAccel);
290 return newSpeed;
291}
292
293double
294MSCFModel_CACC::speedGapControl(const MSVehicle* const veh, const double gap2pred,
295 const double speed, const double predSpeed, const double desSpeed, double vErr,
296 const MSVehicle* const pred, VehicleMode& vehMode) const {
297 // Gap control law
298 double newSpeed = 0.0;
299
300 if (pred != nullptr) {
302 vehMode = ACC_MODE;
303 newSpeed = acc_CFM._v(veh, gap2pred, speed, predSpeed, desSpeed, true);
304#if DEBUG_CACC == 1
305 if (DEBUG_COND) {
306 std::cout << " acc control mode" << std::endl;
307 }
308#endif
309 } else {
310#if DEBUG_CACC == 1
311 if (DEBUG_COND) {
312 std::cout << " CACC control mode" << std::endl;
313 }
314#endif
315 double desSpacing = myHeadwayTime * speed;
316 double spacingErr = gap2pred - desSpacing;
317 double accel = veh->getAcceleration();
318 double speedErr = predSpeed - speed - myHeadwayTime * accel;
319
320 if ((spacingErr > 0 && spacingErr < 0.2) && (vErr < 0.1)) {
321 // gap mode
322 //newSpeed = speed + 0.45 * spacingErr + 0.0125 *speedErr;
323#if DEBUG_CACC == 1
324 if (DEBUG_COND) {
325 std::cout << " applying gap control: err=" << spacingErr << " speedErr=" << speedErr << std::endl;
326 }
327#endif
328 newSpeed = speed + myGapControlGainGap * spacingErr + myGapControlGainGapDot * speedErr;
329
330 vehMode = CACC_GAP_MODE;
331 } else if (spacingErr < 0) {
332 // collision avoidance mode
333 //newSpeed = speed + 0.45 * spacingErr + 0.05 *speedErr;
334#if DEBUG_CACC == 1
335 if (DEBUG_COND) {
336 std::cout << " applying collision avoidance: err=" << spacingErr << " speedErr=" << speedErr << "\n";
337 }
338#endif
339 newSpeed = speed + myCollisionAvoidanceGainGap * spacingErr + myCollisionAvoidanceGainGapDot * speedErr;
341 } else {
342 // gap closing mode
343#if DEBUG_CACC == 1
344 if (DEBUG_COND) {
345 std::cout << " applying gap closing err=" << spacingErr << " speedErr=" << speedErr << " predSpeed=" << predSpeed << " speed=" << speed << " accel=" << accel << "\n";
346 }
347#endif
348 newSpeed = speed + myGapClosingControlGainGap * spacingErr + myGapClosingControlGainGapDot * speedErr;
349
350 vehMode = CACC_GAP_CLOSING_MODE;
351 }
352 }
353 } else {
354 /* no leader */
355#if DEBUG_CACC == 1
356 if (DEBUG_COND) {
357 std::cout << " no leader" << std::endl;
358 }
359#endif
360 newSpeed = speedSpeedControl(speed, vErr, vehMode);
361 }
362
363 return newSpeed;
364}
365
366double
367MSCFModel_CACC::_v(const MSVehicle* const veh, const MSVehicle* const pred, const double gap2pred, const double speed,
368 const double predSpeed, const double desSpeed, const bool /* respectMinGap */, const CalcReason usage) const {
369 double newSpeed = 0.0;
370 VehicleMode vehMode = CC_MODE;
371
372#if DEBUG_CACC == 1
373 if (DEBUG_COND) {
374 std::cout << SIMTIME << " MSCFModel_CACC::_v() for veh '" << veh->getID()
375 << " gap=" << gap2pred << " speed=" << speed << " predSpeed=" << predSpeed
376 << " desSpeed=" << desSpeed << std::endl;
377 }
378#endif
379
380 /* Velocity error */
381 double vErr = speed - desSpeed;
382 bool setControlMode = false;
384 if (vars->lastUpdateTime != MSNet::getInstance()->getCurrentTimeStep()) {
386 setControlMode = true;
387 }
388
390
391 if (commMode == CACC_NO_OVERRIDE) { // old CACC logic (rely on time gap from predecessor)
392 // @note: using (gap2pred + minGap) here increases oscillations but may
393 // actually be a good idea once the acceleration-spike-problem is fixed
394 double time_gap = gap2pred / MAX2(NUMERICAL_EPS, speed);
395 double spacingErr = gap2pred - myHeadwayTime * speed;
396
397 if (time_gap > 2 && spacingErr > mySpeedControlMinGap) {
398#if DEBUG_CACC == 1
399 if (DEBUG_COND) {
400 std::cout << " applying speedControl" << " time_gap=" << time_gap << std::endl;
401 }
402#endif
403 // Find acceleration - Speed control law
404 newSpeed = speedSpeedControl(speed, vErr, vehMode);
405 // Set cl to vehicle parameters
406 if (setControlMode) {
407 vars->CACC_ControlMode = 0;
408 }
409 } else if (time_gap < 1.5) {
410 // Find acceleration - Gap control law
411#if DEBUG_CACC == 1
412 if (DEBUG_COND) {
413 std::cout << " speedGapControl" << " time_gap=" << time_gap << std::endl;
414 }
415#endif
416
417 newSpeed = speedGapControl(veh, gap2pred, speed, predSpeed, desSpeed, vErr, pred, vehMode);
418 // Set cl to vehicle parameters
419 if (setControlMode) {
420 vars->CACC_ControlMode = 1;
421 }
422 } else {
423 // Follow previous applied law
424 int cm = vars->CACC_ControlMode;
425 if (!cm) {
426 // CACC_ControlMode = speed control
427
428#if DEBUG_CACC == 1
429 if (DEBUG_COND) {
430 std::cout << " applying speedControl (previous)" << " time_gap=" << time_gap << std::endl;
431 }
432#endif
433 newSpeed = speedSpeedControl(speed, vErr, vehMode);
434 } else {
435 // CACC_ControlMode = gap control
436#if DEBUG_CACC == 1
437 if (DEBUG_COND) {
438 std::cout << " previous speedGapControl (previous)" << " time_gap=" << time_gap << std::endl;
439 }
440#endif
441 newSpeed = speedGapControl(veh, gap2pred, speed, predSpeed, desSpeed, vErr, pred, vehMode);
442 }
443 }
444 } else if (commMode == CACC_MODE_NO_LEADER) {
445 newSpeed = speedSpeedControl(speed, vErr, vehMode);
446 } else if (commMode == CACC_MODE_LEADER_NO_CAV) {
447 newSpeed = acc_CFM._v(veh, gap2pred, speed, predSpeed, desSpeed, true);
448 vehMode = ACC_MODE;
449 } else if (commMode == CACC_MODE_LEADER_CAV) {
450 double desSpacing = myHeadwayTime * speed;
451 double spacingErr = gap2pred - desSpacing;
452 double accel = veh->getAcceleration();
453 double speedErr = predSpeed - speed - myHeadwayTime * accel;
454
455 if ((spacingErr > 0 && spacingErr < 0.2) && (vErr < 0.1)) {
456 // gap mode
457 //newSpeed = speed + 0.45 * spacingErr + 0.0125 *speedErr;
458 if (DEBUG_COND) {
459 std::cout << " applying CACC_GAP_MODE " << std::endl;
460 }
461 newSpeed = speed + myGapControlGainGap * spacingErr + myGapControlGainGapDot * speedErr;
462 vehMode = CACC_GAP_MODE;
463 } else if (spacingErr < 0) {
464 // collision avoidance mode
465 //newSpeed = speed + 0.45 * spacingErr + 0.05 *speedErr;
466 if (DEBUG_COND) {
467 std::cout << " applying CACC_COLLISION_AVOIDANCE_MODE " << std::endl;
468 }
469 newSpeed = speed + myCollisionAvoidanceGainGap * spacingErr + myCollisionAvoidanceGainGapDot * speedErr;
471 } else {
472 // gap closing mode
473 if (DEBUG_COND) {
474 std::cout << " applying CACC_GAP_CLOSING_MODE " << std::endl;
475 }
476 newSpeed = speed + myGapClosingControlGainGap * spacingErr + myGapClosingControlGainGapDot * speedErr;
477 vehMode = CACC_GAP_CLOSING_MODE;
478 }
479 }
480
481 if (setControlMode && !MSGlobals::gComputeLC && usage == CalcReason::CURRENT) {
482 const_cast<SUMOVehicleParameter&>(veh->getParameter()).setParameter("caccVehicleMode", VehicleModeNames[vehMode]);
483 }
484
485 //std::cout << veh->getID() << " commMode: " << commMode << ", caccVehicleMode: " << VehicleModeNames[vehMode]
486 // << ", gap2pred: " << gap2pred << ", newSpeed: " << newSpeed << std::endl;
487
488 // newSpeed is meant for step length 0.1 but this would cause extreme
489 // accelerations at lower step length
490 double newSpeedScaled = newSpeed;
491 if (DELTA_T < 100) {
492 const double accel01 = (newSpeed - speed) * 10;
493 newSpeedScaled = speed + ACCEL2SPEED(accel01);
494 }
495
496#if DEBUG_CACC == 1
497 if (DEBUG_COND) {
498 std::cout << " result: rawAccel=" << SPEED2ACCEL(newSpeed - speed) << " newSpeed=" << newSpeed << " newSpeedScaled=" << newSpeedScaled << "\n";
499 }
500#endif
501
502 return MAX2(0., newSpeedScaled);
503}
504
505
506
509 return new MSCFModel_CACC(vtype);
510}
#define DEFAULT_EMERGENCY_OVERRIDE_THRESHOLD
#define DEFAULT_GC_GAIN_GAP_DOT_CACC
#define DEFAULT_CA_GAIN_GAP_DOT_CACC
#define DEFAULT_SC_GAIN_CACC
#define DEFAULT_GC_GAIN_GAP_CACC
#define DEFAULT_SC_MIN_GAP
#define DEFAULT_HEADWAYTIME_ACC
#define DEFAULT_CA_GAIN_GAP_CACC
#define DEFAULT_GCC_GAIN_GAP_CACC
#define DEFAULT_GCC_GAIN_GAP_DOT_CACC
#define TLF(string,...)
Definition MsgHandler.h:306
const std::string invalid_return< std::string >::value
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
#define ACCEL2SPEED(x)
Definition SUMOTime.h:54
#define SIMTIME
Definition SUMOTime.h:65
#define SPEED2ACCEL(x)
Definition SUMOTime.h:56
@ SUMO_TAG_CF_CACC
@ SUMO_TAG_CFM_VARIABLES
@ SUMO_ATTR_GCC_GAIN_GAP_DOT_CACC
@ SUMO_ATTR_CA_GAIN_GAP_CACC
@ SUMO_ATTR_GC_GAIN_GAP_DOT_CACC
@ SUMO_ATTR_CA_GAIN_GAP_DOT_CACC
@ SUMO_ATTR_HEADWAY_TIME_CACC_TO_ACC
@ SUMO_ATTR_GC_GAIN_GAP_CACC
@ SUMO_ATTR_CA_OVERRIDE
@ SUMO_ATTR_COLLISION_MINGAP_FACTOR
@ SUMO_ATTR_APPLYDRIVERSTATE
@ SUMO_ATTR_ID
@ SUMO_ATTR_GCC_GAIN_GAP_CACC
@ SUMO_ATTR_STATE
The state of a link.
@ SUMO_ATTR_SC_GAIN_CACC
@ SUMO_ATTR_SC_MIN_GAP
T MIN2(T a, T b)
Definition StdDefs.h:80
T MAX2(T a, T b)
Definition StdDefs.h:86
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition).
The ACC car-following model.
CommunicationsOverrideMode CACC_CommunicationsOverrideMode
void loadState(const SUMOSAXAttributes &attrs)
Loads the state of the vehicle variables from the given description.
int CACC_ControlMode
The vehicle's CACC precious time step gap error.
void saveState(OutputDevice &out, const MSCFModel &cfm) const
Saves the vehicle variables.
virtual std::string getParameter(const MSVehicle *veh, const std::string &key) const
try to get the given parameter for this carFollowingModel
MSCFModel_ACC acc_CFM
double getSecureGap(const MSVehicle *const veh, const MSVehicle *const pred, const double speed, const double leaderSpeed, const double leaderMaxDecel) const
Returns the a gap such that the gap mode acceleration of the follower is zero.
double freeSpeed(const MSVehicle *const veh, double speed, double seen, double maxSpeed, const bool onInsertion=false, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed without a leader.
double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed (no dawdling).
MSCFModel_CACC(const MSVehicleType *vtype)
Constructor.
double myGapControlGainGap
double stopSpeed(const MSVehicle *const veh, const double speed, double gap2pred, double decel, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling).
double myApplyDriverstate
virtual void setParameter(MSVehicle *veh, const std::string &key, const std::string &value) const
try to set the given parameter for this carFollowingModel
double myGapClosingControlGainGap
double _v(const MSVehicle *const veh, const MSVehicle *const pred, const double gap2pred, const double mySpeed, const double predSpeed, const double desSpeed, const bool respectMinGap, const CalcReason usage=CalcReason::CURRENT) const
MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
double speedSpeedControl(const double speed, double vErr, VehicleMode &vehMode) const
double myEmergencyThreshold
double insertionFollowSpeed(const MSVehicle *const v, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0) const
Computes the vehicle's acceptable speed at insertion.
double myGapClosingControlGainGapDot
static std::map< std::string, CommunicationsOverrideMode > CommunicationsOverrideModeMap
double mySpeedControlGain
double myCollisionAvoidanceGainGapDot
double speedGapControl(const MSVehicle *const veh, const double gap2pred, const double speed, const double predSpeed, const double desSpeed, double vErr, const MSVehicle *const pred, VehicleMode &vehMode) const
double myGapControlGainGapDot
~MSCFModel_CACC()
Destructor.
VehicleMode
Vehicle mode (default is CACC) Switch to ACC mode if CACC_ControlMode = 1 (gap control mode) and lead...
double mySpeedControlMinGap
static std::map< VehicleMode, std::string > VehicleModeNames
Vehicle mode name map.
double myCollisionAvoidanceGainGap
double interactionGap(const MSVehicle *const, double vL) const
Returns the maximum gap at which an interaction between both vehicles occurs.
The car-following model abstraction.
Definition MSCFModel.h:59
virtual double maxNextSpeed(double speed, const MSVehicle *const veh) const
Returns the maximum speed given the current speed.
virtual double freeSpeed(const MSVehicle *const veh, double speed, double seen, double maxSpeed, const bool onInsertion=false, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed without a leader.
void applyHeadwayPerceptionError(const MSVehicle *const veh, double speed, double &gap) const
Overwrites gap by the perceived value obtained from the vehicle's driver state.
void applyHeadwayAndSpeedDifferencePerceptionErrors(const MSVehicle *const veh, double speed, double &gap, double &predSpeed, double predMaxDecel, const MSVehicle *const pred) const
Overwrites gap2pred and predSpeed by the perceived values obtained from the vehicle's driver state,...
double maximumSafeFollowSpeed(double gap, double egoSpeed, double predSpeed, double predMaxDecel, bool onInsertion=false) const
Returns the maximum safe velocity for following the given leader.
CalcReason
What the return value of stop/follow/free-Speed is used for.
Definition MSCFModel.h:95
@ CURRENT
the return value is used for calculating the next speed
Definition MSCFModel.h:97
virtual double getSecureGap(const MSVehicle *const veh, const MSVehicle *const, const double speed, const double leaderSpeed, const double leaderMaxDecel) const
Returns the minimum gap to reserve if the leader is braking at maximum (>=0).
double myCollisionMinGapFactor
The factor of minGap that must be maintained to avoid a collision event.
Definition MSCFModel.h:768
MSCFModel(const MSVehicleType *vtype)
Constructor.
Definition MSCFModel.cpp:55
virtual int getModelID() const =0
Returns the model's ID; the XML-Tag number is used.
double maximumSafeStopSpeed(double gap, double decel, double currentSpeed, bool onInsertion=false, double headway=-1, bool relaxEmergency=true) const
Returns the maximum next velocity for stopping within gap.
double myHeadwayTime
The driver's desired time headway (aka reaction time tau) [s].
Definition MSCFModel.h:771
static bool gComputeLC
whether the simulationLoop is in the lane changing phase
Definition MSGlobals.h:140
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition MSLane.h:575
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:199
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
double getActionStepLengthSecs() const
Returns the vehicle's action step length in secs, i.e. the interval between two action points.
Definition MSVehicle.h:533
double getAcceleration() const
Returns the vehicle's acceleration in m/s (this is computed as the last step's mean acceleration in c...
Definition MSVehicle.h:514
const MSLane * getLane() const
Returns the lane the vehicle is on.
Definition MSVehicle.h:581
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
Definition MSVehicle.h:973
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle's car following model variables.
Definition MSVehicle.h:994
The car-following model and parameter.
const SUMOVTypeParameter & getParameter() const
static std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
Definition Named.h:66
const std::string & getID() const
Returns the id.
Definition Named.h:73
Static storage of an output device and its base (abstract) implementation.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false)
writes a named attribute
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
Structure representing possible vehicle parameter.
#define UNUSED_PARAMETER(x)
#define DEBUG_COND