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
67 #define DEFAULT_EMERGENCY_OVERRIDE_THRESHOLD 2.0
70 {
"0", CACC_NO_OVERRIDE},
71 {
"1", CACC_MODE_NO_LEADER},
72 {
"2", CACC_MODE_LEADER_NO_CAV},
73 {
"3", CACC_MODE_LEADER_CAV}
79 {CACC_GAP_CLOSING_MODE,
"CACC_GAP_CL"},
80 {CACC_GAP_MODE,
"CACC_GAP"},
81 {CACC_COLLISION_AVOIDANCE_MODE,
"CACC_CA"}
120 const double vCACC =
_v(veh, pred, gap2pred, speed, predSpeed, desSpeed,
true);
126 <<
" v=" << speed <<
" vL=" << predSpeed <<
" gap=" << gap2pred
127 <<
" predDecel=" << predMaxDecel <<
" vCACC=" << vCACC <<
" vSafe=" << vSafe <<
"\n";
133 if (vSafe + speedOverride < vCACC) {
136 std::cout <<
"Apply Safe speed, override=" << speedOverride <<
"\n";
139 return vSafe + speedOverride;
169 #if DEBUG_CACC_SECURE_GAP == 1
170 std::cout <<
SIMTIME <<
"MSCFModel_ACC::getSecureGap speed=" << speed <<
" leaderSpeed=" << leaderSpeed
171 <<
" desSpacing=" << desSpacing <<
" desSpacingDefault=" << desSpacingDefault <<
"\n";
173 return MAX2(desSpacing, desSpacingDefault);
179 #if DEBUG_CACC_INSERTION_FOLLOW_SPEED == 1
181 std::cout <<
"MSCFModel_ACC::insertionFollowSpeed(), speed=" << speed <<
" gap2pred=" << gap2pred <<
" predSpeed=" << predSpeed <<
"\n";
186 const int max_iter = 50;
188 const double tol = 0.1;
189 double damping = 0.8;
192 while (n_iter < max_iter) {
194 const double vCACC =
_v(veh, pred, gap2pred, res, predSpeed, speed,
true);
196 const double a =
MIN2(vCACC, vSafe) - res;
197 res = res + damping * a;
198 #if DEBUG_CACC_INSERTION_FOLLOW_SPEED == 1
200 std::cout <<
" n_iter=" << n_iter <<
" vSafe=" << vSafe <<
" vCACC=" << vCACC <<
" a=" << a <<
" damping=" << damping <<
" res=" << res << std::endl;
228 if (key.compare(
"caccCommunicationsOverrideMode") == 0) {
241 if (key.compare(
"caccCommunicationsOverrideMode") == 0) {
245 throw InvalidArgument(
"Invalid value '" + value +
"' for parameter '" + key +
"' for vehicle '" + veh->
getID() +
"'");
261 const double speed,
const double predSpeed,
const double desSpeed,
double vErr,
264 double newSpeed = 0.0;
266 if (pred !=
nullptr) {
269 newSpeed =
acc_CFM.
_v(veh, gap2pred, speed, predSpeed, desSpeed,
true);
272 std::cout <<
" acc control mode" << std::endl;
278 std::cout <<
" CACC control mode" << std::endl;
283 double spacingErr = gap - desSpacing;
285 double spacingErr1 = predSpeed - speed +
myHeadwayTime * accel;
287 if ((spacingErr > 0 && spacingErr < 0.2) && (vErr < 0.1)) {
292 std::cout <<
" applying gap control" << std::endl;
298 }
else if (spacingErr < 0) {
303 std::cout <<
" applying collision avoidance err=" << spacingErr <<
" err1=" << spacingErr1 <<
"\n";
312 std::cout <<
" applying gap closing err=" << spacingErr <<
" err1=" << spacingErr1 <<
" predSpeed=" << predSpeed <<
" speed=" << speed <<
" accel=" << accel <<
"\n";
324 std::cout <<
" no leader" << std::endl;
335 const double predSpeed,
const double desSpeed,
const bool )
const {
336 double newSpeed = 0.0;
341 std::cout <<
SIMTIME <<
" MSCFModel_CACC::_v() for veh '" << veh->
getID()
342 <<
" gap=" << gap2pred <<
" speed=" << speed <<
" predSpeed=" << predSpeed
343 <<
" desSpeed=" << desSpeed << std::endl;
348 double vErr = speed - desSpeed;
349 bool setControlMode =
false;
353 setControlMode =
true;
359 double time_gap = gap2pred / speed;
364 std::cout <<
" applying speedControl" << std::endl;
370 if (setControlMode) {
373 }
else if (time_gap < 1.5) {
377 std::cout <<
" speedGapControl" << std::endl;
381 newSpeed =
speedGapControl(veh, gap2pred, speed, predSpeed, desSpeed, vErr, pred, vehMode);
383 if (setControlMode) {
394 std::cout <<
" applying speedControl (previous)" << std::endl;
402 std::cout <<
" previous speedGapControl (previous)" << std::endl;
405 newSpeed =
speedGapControl(veh, gap2pred, speed, predSpeed, desSpeed, vErr, pred, vehMode);
411 newSpeed =
acc_CFM.
_v(veh, gap2pred, speed, predSpeed, desSpeed,
true);
416 double spacingErr = gap - desSpacing;
418 double spacingErr1 = predSpeed - speed +
myHeadwayTime * accel;
420 if ((spacingErr > 0 && spacingErr < 0.2) && (vErr < 0.1)) {
425 }
else if (spacingErr < 0) {
446 double newSpeedScaled = newSpeed;
448 const double accel01 = (newSpeed - speed) * 10;
454 std::cout <<
" result: rawAccel=" <<
SPEED2ACCEL(newSpeed - speed) <<
" newSpeed=" << newSpeed <<
" newSpeedScaled=" << newSpeedScaled <<
"\n";
458 return MAX2(0., newSpeedScaled);
#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_HEADWAYTIME_ACC
#define DEFAULT_CA_GAIN_GAP_CACC
#define DEFAULT_EMERGENCY_OVERRIDE_THRESHOLD
#define DEFAULT_GCC_GAIN_GAP_CACC
#define DEFAULT_GCC_GAIN_GAP_DOT_CACC
@ 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
#define UNUSED_PARAMETER(x)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
The ACC car-following model.
double myGapControlGainSpace
double myGapControlGainSpeed
double _v(const MSVehicle *const veh, const double gap2pred, const double mySpeed, const double predSpeed, const double desSpeed, const bool respectMinGap=true) const
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.
MSCFModel_CACC(const MSVehicleType *vtype)
Constructor.
double myGapControlGainGap
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
MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0) const
Computes the vehicle's safe speed (no dawdling)
double speedSpeedControl(const double speed, double vErr, VehicleMode &vehMode) const
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=true) const
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 stopSpeed(const MSVehicle *const veh, const double speed, double gap2pred, double decel) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
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
static std::map< VehicleMode, std::string > VehicleModeNames
Vehicle mode name map.
double freeSpeed(const MSVehicle *const veh, double speed, double seen, double maxSpeed, const bool onInsertion=false) const
Computes the vehicle's safe speed without a leader.
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 getSecureGap(const MSVehicle *const, 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 maximumSafeStopSpeed(double gap, double decel, double currentSpeed, bool onInsertion=false, double headway=-1) const
Returns the maximum next velocity for stopping within gap.
virtual void setHeadwayTime(double headwayTime)
Sets a new value for desired headway [s].
void applyHeadwayPerceptionError(const MSVehicle *const veh, double speed, double &gap) const
Overwrites gap by the perceived value obtained from the vehicle's driver state.
virtual double freeSpeed(const MSVehicle *const veh, double speed, double seen, double maxSpeed, const bool onInsertion=false) const
Computes the vehicle's safe speed without a leader.
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.
double myCollisionMinGapFactor
The factor of minGap that must be maintained to avoid a collision event.
virtual int getModelID() const =0
Returns the model's ID; the XML-Tag number is used.
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...
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle's car following model variables.
const MSLane * getLane() const
Returns the lane the vehicle is on.
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
The car-following model and parameter.
double getMinGap() const
Get the free space in front of vehicles of this class.
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.
double getCFParam(const SumoXMLAttr attr, const double defaultValue) const
Returns the named value from the map, or the default if it is not contained there.
Structure representing possible vehicle parameter.