47#define DEBUG_CACC_INSERTION_FOLLOW_SPEED 0
48#define DEBUG_CACC_SECURE_GAP 0
49#define DEBUG_COND (veh->isSelected())
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
68#define DEFAULT_EMERGENCY_OVERRIDE_THRESHOLD 2.0
71 {
"0", CACC_NO_OVERRIDE},
72 {
"1", CACC_MODE_NO_LEADER},
73 {
"2", CACC_MODE_LEADER_NO_CAV},
74 {
"3", CACC_MODE_LEADER_CAV}
80 {CACC_GAP_CLOSING_MODE,
"CACC_GAP_CL"},
81 {CACC_GAP_MODE,
"CACC_GAP"},
82 {CACC_COLLISION_AVOIDANCE_MODE,
"CACC_CA"}
126 const double vCACC =
_v(veh, pred, gap2pred, speed, predSpeed, desSpeed,
true, usage);
133 <<
" v=" << speed <<
" vL=" << predSpeed <<
" gap=" << gap2pred
134 <<
" predDecel=" << predMaxDecel <<
" vCACC=" << vCACC <<
" vSafe=" << vSafe <<
"\n";
140 if (vSafe + speedOverride < vCACC) {
143 std::cout <<
"Apply Safe speed, override=" << speedOverride <<
"\n";
146 return MAX2(0.0, vSafe + speedOverride);
176#if DEBUG_CACC_SECURE_GAP == 1
177 std::cout <<
SIMTIME <<
"MSCFModel_ACC::getSecureGap speed=" << speed <<
" leaderSpeed=" << leaderSpeed
178 <<
" desSpacing=" << desSpacing <<
" desSpacingDefault=" << desSpacingDefault <<
"\n";
180 return MAX2(desSpacing, desSpacingDefault);
186#if DEBUG_CACC_INSERTION_FOLLOW_SPEED == 1
188 std::cout <<
"MSCFModel_ACC::insertionFollowSpeed(), speed=" << speed <<
" gap2pred=" << gap2pred <<
" predSpeed=" << predSpeed <<
"\n";
193 const int max_iter = 50;
195 const double tol = 0.1;
196 double damping = 0.8;
199 while (n_iter < max_iter) {
201 const double vCACC =
_v(veh, pred, gap2pred, res, predSpeed, speed,
true);
203 const double a =
MIN2(vCACC, vSafe) - res;
204 res = res + damping * a;
205#if DEBUG_CACC_INSERTION_FOLLOW_SPEED == 1
207 std::cout <<
" n_iter=" << n_iter <<
" vSafe=" << vSafe <<
" vCACC=" << vCACC <<
" a=" << a <<
" damping=" << damping <<
" res=" << res << std::endl;
235 if (key.compare(
"caccCommunicationsOverrideMode") == 0) {
248 if (key.compare(
"caccCommunicationsOverrideMode") == 0) {
268 const double speed,
const double predSpeed,
const double desSpeed,
double vErr,
271 double newSpeed = 0.0;
273 if (pred !=
nullptr) {
276 newSpeed =
acc_CFM._v(veh, gap2pred, speed, predSpeed, desSpeed,
true);
279 std::cout <<
" acc control mode" << std::endl;
285 std::cout <<
" CACC control mode" << std::endl;
289 double spacingErr = gap2pred - desSpacing;
293 if ((spacingErr > 0 && spacingErr < 0.2) && (vErr < 0.1)) {
298 std::cout <<
" applying gap control: err=" << spacingErr <<
" speedErr=" << speedErr << std::endl;
304 }
else if (spacingErr < 0) {
309 std::cout <<
" applying collision avoidance: err=" << spacingErr <<
" speedErr=" << speedErr <<
"\n";
318 std::cout <<
" applying gap closing err=" << spacingErr <<
" speedErr=" << speedErr <<
" predSpeed=" << predSpeed <<
" speed=" << speed <<
" accel=" << accel <<
"\n";
330 std::cout <<
" no leader" << std::endl;
341 const double predSpeed,
const double desSpeed,
const bool ,
const CalcReason usage)
const {
342 double newSpeed = 0.0;
347 std::cout <<
SIMTIME <<
" MSCFModel_CACC::_v() for veh '" << veh->
getID()
348 <<
" gap=" << gap2pred <<
" speed=" << speed <<
" predSpeed=" << predSpeed
349 <<
" desSpeed=" << desSpeed << std::endl;
354 double vErr = speed - desSpeed;
355 bool setControlMode =
false;
359 setControlMode =
true;
367 double time_gap = gap2pred /
MAX2(NUMERICAL_EPS, speed);
373 std::cout <<
" applying speedControl" <<
" time_gap=" << time_gap << std::endl;
379 if (setControlMode) {
382 }
else if (time_gap < 1.5) {
386 std::cout <<
" speedGapControl" <<
" time_gap=" << time_gap << std::endl;
390 newSpeed =
speedGapControl(veh, gap2pred, speed, predSpeed, desSpeed, vErr, pred, vehMode);
392 if (setControlMode) {
403 std::cout <<
" applying speedControl (previous)" <<
" time_gap=" << time_gap << std::endl;
411 std::cout <<
" previous speedGapControl (previous)" <<
" time_gap=" << time_gap << std::endl;
414 newSpeed =
speedGapControl(veh, gap2pred, speed, predSpeed, desSpeed, vErr, pred, vehMode);
420 newSpeed =
acc_CFM._v(veh, gap2pred, speed, predSpeed, desSpeed,
true);
424 double spacingErr = gap2pred - desSpacing;
428 if ((spacingErr > 0 && spacingErr < 0.2) && (vErr < 0.1)) {
432 std::cout <<
" applying CACC_GAP_MODE " << std::endl;
436 }
else if (spacingErr < 0) {
440 std::cout <<
" applying CACC_COLLISION_AVOIDANCE_MODE " << std::endl;
447 std::cout <<
" applying CACC_GAP_CLOSING_MODE " << std::endl;
463 double newSpeedScaled = newSpeed;
465 const double accel01 = (newSpeed - speed) * 10;
471 std::cout <<
" result: rawAccel=" <<
SPEED2ACCEL(newSpeed - speed) <<
" newSpeed=" << newSpeed <<
" newSpeedScaled=" << newSpeedScaled <<
"\n";
475 return MAX2(0., newSpeedScaled);
#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
const std::string invalid_return< std::string >::value
@ 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_COLLISION_MINGAP_FACTOR
@ SUMO_ATTR_APPLYDRIVERSTATE
@ SUMO_ATTR_GCC_GAIN_GAP_CACC
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition).
The ACC car-following model.
CommunicationsOverrideMode CACC_CommunicationsOverrideMode
int CACC_ControlMode
The vehicle's CACC precious time step gap error.
virtual std::string getParameter(const MSVehicle *veh, const std::string &key) const
try to get the given parameter for this carFollowingModel
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...
@ CACC_COLLISION_AVOIDANCE_MODE
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.
CommunicationsOverrideMode
@ CACC_MODE_LEADER_NO_CAV
The car-following model abstraction.
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.
@ CURRENT
the return value is used for calculating the next speed
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.
MSCFModel(const MSVehicleType *vtype)
Constructor.
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].
static bool gComputeLC
whether the simulationLoop is in the lane changing phase
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Representation of a vehicle in the micro simulation.
double getActionStepLengthSecs() const
Returns the vehicle's action step length in secs, i.e. the interval between two action points.
double getAcceleration() const
Returns the vehicle's acceleration in m/s (this is computed as the last step's mean acceleration in c...
const MSLane * getLane() const
Returns the lane the vehicle is on.
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle's car following model variables.
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
const std::string & getID() const
Returns the id.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
Structure representing possible vehicle parameter.
#define UNUSED_PARAMETER(x)