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"}
116 const double vCACC =
_v(veh, pred, gap2pred, speed, predSpeed, desSpeed,
true);
122 <<
" v=" << speed <<
" vL=" << predSpeed <<
" gap=" << gap2pred
123 <<
" predDecel=" << predMaxDecel <<
" vCACC=" << vCACC <<
" vSafe=" << vSafe <<
"\n";
129 if (vSafe + speedOverride < vCACC) {
132 std::cout <<
"Apply Safe speed, override=" << speedOverride <<
"\n";
135 return vSafe + speedOverride;
162 #if DEBUG_CACC_SECURE_GAP == 1
163 std::cout <<
SIMTIME <<
"MSCFModel_ACC::getSecureGap speed=" << speed <<
" leaderSpeed=" << leaderSpeed
164 <<
" desSpacing=" << desSpacing <<
" desSpacingDefault=" << desSpacingDefault <<
"\n";
166 return MAX2(desSpacing, desSpacingDefault);
172 #if DEBUG_CACC_INSERTION_FOLLOW_SPEED == 1
174 std::cout <<
"MSCFModel_ACC::insertionFollowSpeed(), speed=" << speed <<
" gap2pred=" << gap2pred <<
" predSpeed=" << predSpeed <<
"\n";
179 const int max_iter = 50;
181 const double tol = 0.1;
182 double damping = 0.8;
185 while (n_iter < max_iter) {
187 const double vCACC =
_v(veh, pred, gap2pred, res, predSpeed, speed,
true);
189 const double a =
MIN2(vCACC, vSafe) - res;
190 res = res + damping * a;
191 #if DEBUG_CACC_INSERTION_FOLLOW_SPEED == 1
193 std::cout <<
" n_iter=" << n_iter <<
" vSafe=" << vSafe <<
" vCACC=" << vCACC <<
" a=" << a <<
" damping=" << damping <<
" res=" << res << std::endl;
221 if (key.compare(
"caccCommunicationsOverrideMode") == 0) {
234 if (key.compare(
"caccCommunicationsOverrideMode") == 0) {
238 throw InvalidArgument(
"Invalid value '" + value +
"' for parameter '" + key +
"' for vehicle '" + veh->
getID() +
"'");
254 const double speed,
const double predSpeed,
const double desSpeed,
double vErr,
257 double newSpeed = 0.0;
259 if (pred !=
nullptr) {
262 newSpeed =
acc_CFM.
_v(veh, gap2pred, speed, predSpeed, desSpeed,
true);
265 std::cout <<
" acc control mode" << std::endl;
271 std::cout <<
" CACC control mode" << std::endl;
276 double spacingErr = gap - desSpacing;
278 double spacingErr1 = predSpeed - speed +
myHeadwayTime * accel;
280 if ((spacingErr > 0 && spacingErr < 0.2) && (vErr < 0.1)) {
285 std::cout <<
" applying gap control" << std::endl;
291 }
else if (spacingErr < 0) {
296 std::cout <<
" applying collision avoidance err=" << spacingErr <<
" err1=" << spacingErr1 <<
"\n";
305 std::cout <<
" applying gap closing" << std::endl;
317 std::cout <<
" no leader" << std::endl;
328 const double predSpeed,
const double desSpeed,
const bool )
const {
329 double newSpeed = 0.0;
334 std::cout <<
SIMTIME <<
" MSCFModel_CACC::_v() for veh '" << veh->
getID()
335 <<
" gap=" << gap2pred <<
" speed=" << speed <<
" predSpeed=" << predSpeed
336 <<
" desSpeed=" << desSpeed << std::endl;
341 double vErr = speed - desSpeed;
342 bool setControlMode =
false;
346 setControlMode =
true;
352 double time_gap = gap2pred / speed;
357 std::cout <<
" applying speedControl" << std::endl;
363 if (setControlMode) {
366 }
else if (time_gap < 1.5) {
370 std::cout <<
" speedGapControl" << std::endl;
374 newSpeed =
speedGapControl(veh, gap2pred, speed, predSpeed, desSpeed, vErr, pred, vehMode);
376 if (setControlMode) {
387 std::cout <<
" applying speedControl (previous)" << std::endl;
395 std::cout <<
" previous speedGapControl (previous)" << std::endl;
398 newSpeed =
speedGapControl(veh, gap2pred, speed, predSpeed, desSpeed, vErr, pred, vehMode);
404 newSpeed =
acc_CFM.
_v(veh, gap2pred, speed, predSpeed, desSpeed,
true);
409 double spacingErr = gap - desSpacing;
411 double spacingErr1 = predSpeed - speed +
myHeadwayTime * accel;
413 if ((spacingErr > 0 && spacingErr < 0.2) && (vErr < 0.1)) {
418 }
else if (spacingErr < 0) {
439 std::cout <<
" result: accel=" <<
SPEED2ACCEL(newSpeed - speed) <<
" newSpeed=" << newSpeed << std::endl;
443 return MAX2(0., newSpeed);
#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_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 stopSpeed(const MSVehicle *const veh, const double speed, double gap2pred) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
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
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 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)
virtual void setHeadwayTime(double headwayTime)
Sets a new value for desired headway [s].
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.
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 maximumSafeStopSpeed(double gap, double currentSpeed, bool onInsertion=false, double headway=-1) const
Returns the maximum next velocity for stopping within gap.
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.