 |
Eclipse SUMO - Simulation of Urban MObility
|
Go to the documentation of this file.
35 #define sgn(x) ((x > 0) - (x < 0))
63 std::cerr <<
"The number of lanes needs to be specified in the attributes of carFollowing-CC with the \"lanesCount\" attribute\n";
64 WRITE_ERROR(
"The number of lanes needs to be specified in the attributes of carFollowing-CC with the \"lanesCount\" attribute");
116 int traciState = state.first;
122 for (
auto m = vars->
members.begin(); m != vars->
members.end(); m++) {
131 for (
auto m = vars->
members.begin(); m != vars->
members.end(); m++) {
139 traciState = state.first;
145 for (
auto m = vars->
members.begin(); m != vars->
members.end(); m++) {
154 for (
auto m = vars->
members.begin(); m != vars->
members.end(); m++) {
168 double controllerAcceleration;
170 double engineAcceleration;
196 controllerAcceleration = std::min(vars->
uMax, std::max(vars->
uMin, controllerAcceleration));
216 return _v(veh, gap2pred, speed, predSpeed);
237 double gap2pred, relSpeed;
239 if (gap2pred == -1) {
240 gap2pred = std::numeric_limits<double>().max();
242 return _v(veh, gap2pred, speed, speed + relSpeed);
251 double gap2pred, relSpeed;
253 if (gap2pred == -1) {
254 gap2pred = std::numeric_limits<double>().max();
256 return _v(veh, gap2pred, speed, speed + relSpeed);
305 double ccAcceleration;
307 double accAcceleration;
309 double caccAcceleration;
311 double predAcceleration, leaderAcceleration, leaderSpeed;
325 if (gap2pred > 250 || ccAcceleration < accAcceleration) {
326 controllerAcceleration = ccAcceleration;
328 controllerAcceleration = accAcceleration;
354 controllerAcceleration =
_cacc(veh, egoSpeed, predSpeed, predAcceleration, gap2pred, leaderSpeed, leaderAcceleration, vars->
caccSpacing);
358 controllerAcceleration = 0;
383 controllerAcceleration = std::min(ccAcceleration, caccAcceleration);
404 controllerAcceleration = 0;
433 controllerAcceleration = 0;
439 std::cerr <<
"Switching to normal driver behavior still not implemented in MSCFModel_CC\n";
444 std::cerr <<
"Invalid controller selected in MSCFModel_CC\n";
452 speed =
MAX2(
double(0), egoSpeed +
ACCEL2SPEED(controllerAcceleration));
471 return -1.0 / headwayTime * (egoSpeed - predSpeed + vars->
accLambda * (-gap2pred + headwayTime * egoSpeed + 2));
476 MSCFModel_CC::_cacc(
const MSVehicle* veh,
double egoSpeed,
double predSpeed,
double predAcceleration,
double gap2pred,
double leaderSpeed,
double leaderAcceleration,
double spacing)
const {
479 double epsilon = -gap2pred + spacing;
481 double epsilon_dot = egoSpeed - predSpeed;
491 return (1 / vars->
ploegH * (
513 for (k = min_i; k <= max_i; k++) {
514 d += h[k] * vehicles[0].
speed + vehicles[k].
length + 15;
532 int nCars = vars->
nCars;
540 double actualDistance = 0;
542 double desiredDistance = 0;
544 double speedError = 0;
564 speedError = -vars->
b[
index] * (egoSpeed - vehicles[0].
speed);
567 for (j = 0; j < nCars; j++) {
574 desiredDistance = desiredDistance / d_i;
577 for (j = 0; j < nCars; j++) {
583 double dt =
time - vehicles[j].
time;
588 actualDistance -= vars->
K[
index][j] * vars->
L[
index][j] * distance;
591 actualDistance = actualDistance / (d_i);
594 u_i = (speedError + desiredDistance + actualDistance) / 1000;
601 double gap2pred,
double leaderSpeed)
const {
605 vars->
flatbedKv * (predSpeed - egoSpeed) +
701 std::stringstream warn;
702 warn <<
"MSCFModel_CC: setting a number of cars of " << vars->
nCars <<
" out of a maximum of " <<
MAX_N_CARS <<
703 ". The CONSENSUS controller will not work properly if chosen. If you are using a different controller " <<
704 "you can ignore this warning";
712 buf >>
id >> position;
717 for (
auto item = vars->
members.begin(); item != vars->
members.end(); item++)
718 if (item->second.compare(value) == 0) {
794 switch (engineModel) {
849 std::string leaderId, frontId;
856 throw InvalidArgument(
"Trying to enable auto feeding without providing leader vehicle id");
864 throw InvalidArgument(
"Trying to enable auto feeding without providing front vehicle id");
881 throw InvalidArgument(
"Invalid value '" + value +
"' for parameter '" + key +
"' for vehicle '" + veh->
getID() +
"'");
898 velocity.
x() << velocity.
y() << veh->
getAngle();
902 return vars->
crashed ?
"1" :
"0";
905 double distance, relSpeed;
907 buf << distance << relSpeed;
918 const MSEdge* currentEdge;
922 double positionOnEdge;
924 double distanceToEnd;
928 lastEdge = route->
getEdges().back();
932 buf << distanceToEnd;
939 const MSEdge* currentEdge;
943 double positionOnEdge;
945 double distanceFromBegin;
949 firstEdge = route->
getEdges().front();
951 distanceFromBegin = route->
getDistanceBetween(0, positionOnEdge, firstEdge, currentEdge);
953 buf << distanceFromBegin;
1002 buf << (gear + 1) << rpm;
1042 distance = l.second;
1050 double distance, relSpeed;
The car-following model and parameter.
double processNextStop(double currentVelocity)
Processes stops, returns the velocity needed to reach the stop.
double controllerAcceleration
acceleration as computed by the controller, to be sent to other vehicles
double frontDataReadTime
when front vehicle data has been readed from GPS
double K[MAX_N_CARS][MAX_N_CARS]
K matrix.
double accHeadwayTime
headway time for ACC
#define UNUSED_PARAMETER(x)
Position frontPosition
current front vehicle position
void getEngineData(double speed_mps, int &gear, double &rpm)
double frontSpeed
current front vehicle speed
double leaderAngle
platoon's leader angle in radians
#define CC_PAR_VEHICLES_FILE
double getMaxAccel() const
Get the vehicle type's maximum acceleration [m/s^2].
virtual std::string getParameter(const MSVehicle *veh, const std::string &key) const
set the information about a generic car. This method should be invoked by TraCI when a wireless messa...
virtual double minNextSpeed(double speed, const MSVehicle *const veh=0) const
Returns the minimum speed given the current speed (depends on the numerical update scheme and its ste...
bool leaderInitialized
@did we receive at least one packet?
#define WRITE_WARNING(msg)
enum Plexe::ACTIVE_CONTROLLER getActiveController(const MSVehicle *veh) const
return the currently active controller
std::list< Stop > getMyStops()
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.
Position leaderPosition
platoon's leader position
#define CC_PAR_FLATBED_KV
bool autoFeed
determines whether CACC should automatically fetch data about other vehicles
double leaderDataReadTime
when leader data has been readed from GPS
double caccSpacing
fixed spacing for CACC
static std::pair< int, int > getLaneChangeState(const std::string &vehicleID, int direction)
double _flatbed(const MSVehicle *veh, double egoAcceleration, double egoSpeed, double predSpeed, double gap2pred, double leaderSpeed) const
flatbed platoon towing model
void getRadarMeasurements(const MSVehicle *veh, double &distance, double &relativeSpeed) const
return the data that is currently being measured by the radar
#define CC_PAR_ENGINE_TAU
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
void setx(double x)
set position x
void getVehicleInformation(const MSVehicle *veh, double &speed, double &acceleration, double &controllerAcceleration, Position &position, double &time) const
get the information about a vehicle. This can be used by TraCI in order to get speed and acceleration...
void resetConsensus(const MSVehicle *veh) const
Resets the consensus controller. In particular, sets the "initialized" vector all to false....
Krauss car-following model, with acceleration decrease and faster start.
Representation of a vehicle.
double caccXi
controller related parameters
const MSRoute & getRoute() const
Returns the current route.
double d_i_j(const struct Plexe::VEHICLE_DATA *vehicles, const double h[MAX_N_CARS], int i, int j) const
computes the desired distance between vehicle i and vehicle j
bool frontInitialized
@did we receive at least one packet?
The action is due to the wish to be faster (tactical lc)
#define PAR_DISTANCE_FROM_BEGIN
#define PAR_USE_CONTROLLER_ACCELERATION
double leaderControllerAcceleration
const ConstMSEdgeVector & getEdges() const
const double myPloegH
Ploeg's CACC parameters.
const double myOmegaN
design constant for CACC
void recomputeParameters(const MSVehicle *veh) const
Recomputes controller related parameters after setting them.
const int myLanesCount
number of lanes in the highway, in the absence of on-/off-ramps. This is used to move to the correct ...
MSCFModel::VehicleVariables * getCarFollowVariables() const
Returns the vehicle's car following model variables.
double frontAcceleration
current front vehicle acceleration (used by CACC)
double ccDesiredSpeed
CC desired speed.
virtual double finalizeSpeed(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences. Called at most once per simulation...
int nCars
number of cars in the platoon
const double myC1
design constant for CACC
GenericEngineModel * engine
engine model employed by this car
void setMaximumDeceleration(double maxAcceleration_mpsps)
virtual double getRealAcceleration(double speed_mps, double accel_mps2, double reqAccel_mps2, SUMOTime timeStep=0)=0
const double myKp
design constant for CC
double _v(const MSVehicle *const veh, double gap2pred, double egoSpeed, double predSpeed) const
#define PAR_ACC_ACCELERATION
virtual double interactionGap(const MSVehicle *const veh, double vL) const
Returns the maximum gap at which an interaction between both vehicles occurs.
const double myConstantSpacing
the constant gap for CACC
double h[MAX_N_CARS]
vector of time headways h
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
enum Plexe::ACTIVE_CONTROLLER activeController
currently active controller
struct Plexe::VEHICLE_DATA vehicles[MAX_N_CARS]
data about vehicles in the platoon
const double myLambda
design constant for ACC
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
virtual double insertionFollowSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0) const
Overload base MSCFModel::insertionFollowSpeed method to inject automated vehicles as soon as they are...
#define ENGINE_PAR_VEHICLE
bool useControllerAcceleration
determines whether PATH's CACC should use the real vehicle acceleration or the controller computed on...
#define CC_PAR_CACC_OMEGA_N
const double myFlatbedKa
flatbed CACC parameters
struct FAKE_CONTROLLER_DATA fakeData
fake controller data.
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.
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
double frontControllerAcceleration
virtual double maxNextSpeed(double speed, const MSVehicle *const veh) const
Returns the maximum speed given the current speed.
double getPositionOnLane() const
Get the vehicle's position along the lane.
double _cc(const MSVehicle *veh, double egoSpeed, double desSpeed) const
controller for the CC which computes the acceleration to be applied. the value needs to be passed to ...
void setMaximumAcceleration(double maxAcceleration_mpsps)
double frontAngle
front vehicle angle in radians
#define CC_ENGINE_MODEL_FOLM
#define CC_PAR_FLATBED_KP
void setChosenSpeedFactor(const double factor)
Returns the precomputed factor by which the driver wants to be faster than the speed limit.
#define CC_PAR_VEHICLE_POSITION
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)
int position
my position within the platoon (0 = first car)
void set(double x, double y)
set positions x and y
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
#define PAR_REMOVE_MEMBER
bool initialized[MAX_N_CARS]
tells whether data about a certain vehicle has been initialized
double _consensus(const MSVehicle *veh, double egoSpeed, Position egoPosition, double time) const
controller based on consensus strategy
Position getVelocityVector() const
Returns the vehicle's direction in radians.
const double myCcAccel
The maximum acceleration that the CC can output.
~MSCFModel_CC()
Destructor.
const double myTau
engine time constant used for actuation lag
double getAngle() const
Returns the vehicle's direction in radians.
A point in 2D or 3D with translation and scaling methods.
Position frontVelocity
front vehicle velocity vector
double x() const
Returns the x-position.
#define PAR_USE_AUTO_FEEDING
int L[MAX_N_CARS][MAX_N_CARS]
L matrix.
#define PAR_ENABLE_AUTO_LANE_CHANGE
#define CC_PAR_VEHICLE_MODEL
void switchOnACC(const MSVehicle *veh, double ccDesiredSpeed) const
switch on the ACC, so disabling the human driver car control
A road/street connecting two junctions.
#define PAR_SPEED_AND_ACCELERATION
MSVehicle * frontVehicle
front sumo id, used for auto feeding
#define PAR_CC_DESIRED_SPEED
virtual void setParameter(const std::string parameter, const std::string &value)=0
static void changeLane(const std::string &vehicleID, int laneIndex, double duration)
MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
#define PAR_ACTIVE_CONTROLLER
Definition of vehicle stop (position and duration)
MSLane * getLane() const
Returns the lane the vehicle is on.
MSEdge & getEdge() const
Returns the lane's edge.
VehicleVariables * createVehicleVariables() const
Returns model specific values which are stored inside a vehicle and must be used with casting.
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
double _ploeg(const MSVehicle *veh, double egoSpeed, double predSpeed, double predAcceleration, double gap2pred) const
controller for the Ploeg's CACC which computes the control input variation. Opposed to other controll...
double b[MAX_N_CARS]
vector of damping ratios b
Influencer & getInfluencer()
Returns the velocity/lane influencer.
const double myCcDecel
The maximum deceleration that the CC can output.
#define CC_PAR_FLATBED_KA
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
virtual double minNextSpeed(double speed, const MSVehicle *const veh=0) const
Returns the minimum speed given the current speed (depends on the numerical update scheme and its ste...
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
double y() const
Returns the y-position.
#define PAR_DISTANCE_TO_END
#define ENGINE_PAR_XMLFILE
double getCACCConstantSpacing(const MSVehicle *veh) const
returns CACC desired constant spacing
bool autoLaneChange
automatic whole platoon lane change
virtual double stopSpeed(const MSVehicle *const veh, const double speed, double gap) const =0
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
double myDecel
The vehicle's maximum deceleration [m/s^2].
double leaderAcceleration
virtual double finalizeSpeed(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
double _cacc(const MSVehicle *veh, double egoSpeed, double predSpeed, double predAcceleration, double gap2pred, double leaderSpeed, double leaderAcceleration, double spacing) const
controller for the CACC which computes the acceleration to be applied. the value needs to be passed t...
#define PAR_ACC_HEADWAY_TIME
const std::string & getID() const
Returns the name of the vehicle.
#define CC_ENGINE_MODEL_REALISTIC
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
const double myXi
design constant for CACC
double getAcceleration() const
Returns the vehicle's acceleration in m/s (this is computed as the last step's mean acceleration in c...
The car-following model abstraction.
double leaderAcceleration
platoon's leader acceleration (used by CACC)
Position leaderVelocity
platoon's leader velocity vector
std::map< int, std::string > members
list of members belonging to my platoon
ACTIVE_CONTROLLER
Determines the currently active controller, i.e., ACC, CACC, or the driver. In future we might need t...
#define CC_PAR_VEHICLE_DATA
double _acc(const MSVehicle *veh, double egoSpeed, double predSpeed, double gap2pred, double headwayTime) const
controller for the ACC which computes the acceleration to be applied. the value needs to be passed to...
double interactionGap(const MSVehicle *const, double vL) const
Returns the maximum gap at which an interaction between both vehicles occurs.
double getSpeed() const
Returns the vehicle's current speed.
double leaderControllerAcceleration
platoon's leader controller acceleration (used by CACC)
int engineModel
numeric value indicating the employed model
double getACCAcceleration(const MSVehicle *veh) const
returns the ACC computed acceleration when the faked CACC is controlling the car. This can be used to...
The action is due to the default of keeping right "Rechtsfahrgebot".
#define CC_PAR_VEHICLE_ENGINE_MODEL
bool usePrediction
enable/disable data prediction (interpolation) for missing data
#define PAR_LEADER_FAKE_DATA
#define PAR_FRONT_FAKE_DATA
#define CC_PAR_PLATOON_SIZE
double myAccel
The vehicle's maximum acceleration [m/s^2].
#define PAR_LEADER_SPEED_AND_ACCELERATION
int nInitialized
count of initialized vehicles
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
void sety(double y)
set position y
MSCFModel_CC(const MSVehicleType *vtype)
Constructor.
MSCFModel * myHumanDriver
the car following model which drives the car when automated cruising is disabled, i....
void setSpeedMode(int speedMode)
Sets speed-constraining behaviors.
double getDistanceBetween(double fromPos, double toPos, const MSEdge *fromEdge, const MSEdge *toEdge, bool includeInternal=true, int routePosition=0) const
Compute the distance between 2 given edges on this route, including the length of internal lanes....
double frontControllerAcceleration
front vehicle controller acceleration (used by CACC)
static std::pair< std::string, double > getLeader(const std::string &vehicleID, double dist=0.)
#define PAR_PRECEDING_SPEED_AND_ACCELERATION
virtual double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0) const =0
Computes the vehicle's follow speed (no dawdling)
#define PAR_USE_PREDICTION
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
void performAutoLaneChange(MSVehicle *const veh) const
virtual void setParameter(MSVehicle *veh, const std::string &key, const std::string &value) const
try to set the given parameter for this carFollowingModel
int getMyLanesCount() const
returns the number of lanes set in the configuration file
virtual double getSpeed() const =0
Returns the vehicle's current speed.
blocked in all directions
double leaderSpeed
platoon's leader speed (used by CACC)
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)
Representation of a vehicle in the micro simulation.
MSVehicle * leaderVehicle
leader vehicle, used for auto feeding
#define PAR_FIXED_ACCELERATION