44#define DEBUG_COND (veh->isSelected())
48#define DEBUG_COND2 (gDebugFlag1)
63 myHeadwayTime(vtype->getParameter().getCFParam(
SUMO_ATTR_TAU, 1.0)),
95 return speed * (headwayTime + 0.5 * speed / decel);
106 const int steps = int(speed / speedReduction);
107 return SPEED2DIST(steps * speed - speedReduction * steps * (steps + 1) / 2) + speed * headwayTime;
112MSCFModel::freeSpeed(
const double currentSpeed,
const double decel,
const double dist,
const double targetSpeed,
const bool onInsertion,
const double actionStepLength) {
128 const double y =
MAX2(0.0, ((sqrt((b + 2.0 * v) * (b + 2.0 * v) + 8.0 * b * dist) - b) * 0.5 - v) / b);
129 const double yFull = floor(y);
130 const double exactGap = (yFull * yFull + yFull) * 0.5 * b + yFull * v + (y > yFull ? v : 0.0);
131 const double fullSpeedGain = (yFull + (onInsertion ? 1. : 0.)) *
ACCEL2SPEED(decel);
132 return DIST2SPEED(
MAX2(0.0, dist - exactGap) / (yFull + 1)) + fullSpeedGain + targetSpeed;
147 assert(currentSpeed >= 0);
148 assert(targetSpeed >= 0);
150 const double dt = onInsertion ? 0 : actionStepLength;
151 const double v0 = currentSpeed;
152 const double vT = targetSpeed;
153 const double b = decel;
154 const double d = dist - NUMERICAL_EPS;
164 if (0.5 * (v0 + vT)*dt >= d) {
166 return v0 +
TS * (vT - v0) / actionStepLength;
168 const double q = ((dt * v0 - 2 * d) * b - vT * vT);
169 const double p = 0.5 * b * dt;
170 const double vN = -p + sqrt(p * p - q);
171 return v0 +
TS * (vN - v0) / actionStepLength;
182 const double maxDecel =
MAX2(
myDecel, leaderMaxDecel);
183 const double bgLeader =
brakeGap(leaderSpeed, maxDecel, 0);
201 const double oldV = veh->
getSpeed();
210 const double factor = fric == 1. ? 1. : -0.3491 * fric * fric + 0.8922 * fric + 0.4493;
225#ifdef DEBUG_FINALIZE_SPEED
227 std::cout <<
"\n" <<
SIMTIME <<
" FINALIZE_SPEED\n";
231 vMax =
MAX2(vMin, vMax);
233#ifdef DEBUG_FINALIZE_SPEED
234 double vDawdle = vNext;
236 assert(vNext >= vMin);
237 assert(vNext <= vMax);
240#ifdef DEBUG_FINALIZE_SPEED
241 double vPatchLC = vNext;
246 assert(vNext >= vMinEmergency);
247 assert(vNext <= vMax);
249#ifdef DEBUG_FINALIZE_SPEED
252 <<
"veh '" << veh->
getID() <<
"' oldV=" << oldV
257 <<
" vStop=" << vStop
258 <<
" vDawdle=" << vDawdle
259 <<
" vPatchLC=" << vPatchLC
260 <<
" vNext=" << vNext
276 if (remainingDelay >=
DELTA_T) {
281 return (
double)(
DELTA_T - remainingDelay) / (
double)
DELTA_T * vMax;
292 if (speed < profile[0].first) {
293 val = profile[0].second;
294 }
else if (speed > profile.back().first) {
295 val = profile.back().second;
298 while (speed > profile[x + 1].first) {
301 double diff = (profile[x + 1].second - profile[x].second) / (profile[x + 1].first - profile[x].first);
302 val = profile[x].second + diff * (speed - profile[x].first);
314 const double gap = (vNext - vL) *
387 double leaderMinDist = gap2pred +
distAfterTime(duration, predSpeed, -predMaxDecel);
392 const int a = (int)ceil(duration /
TS -
TS);
398 if (
gDebugFlag2) std::cout <<
" followSpeedTransient"
399 <<
" duration=" << duration
400 <<
" gap=" << gap2pred
401 <<
" leaderMinDist=" << leaderMinDist
406 <<
" x=" << (b + leaderMinDist) / duration
408 return (b + leaderMinDist) / duration;
413 while (bg < leaderMinDist) {
422 const double fullBrakingSeconds = sqrt(leaderMinDist * 2 /
myDecel);
423 if (fullBrakingSeconds >= duration) {
427 return leaderMinDist / duration + duration *
getMaxDecel() / 2;
429 return fullBrakingSeconds *
myDecel;
437 return (speed + 0.5 * accel * t) * t;
439 const double decel = -accel;
440 if (speed <= decel * t) {
454 const double speed2 = speed - t * decel;
455 return 0.5 * (speed + speed2) * t;
467 arrivalSpeed =
MAX2(0.0, arrivalSpeed);
469 const double accelTime = accel == 0. ? 0. : (arrivalSpeed - currentSpeed) / accel;
470 const double accelWay = accelTime * (arrivalSpeed + currentSpeed) * 0.5;
471 if (dist >= accelWay) {
472 const double nonAccelWay = dist - accelWay;
474 return TIME2STEPS(accelTime + nonAccelWay / nonAccelSpeed);
478 return TIME2STEPS(-(currentSpeed - sqrt(currentSpeed * currentSpeed + 2 * accel * dist)) / accel);
487 if (dist < NUMERICAL_EPS) {
491 if ((accel < 0. && -0.5 * speed * speed / accel < dist) || (accel <= 0. && speed == 0.)) {
496 if (fabs(accel) < NUMERICAL_EPS) {
500 double p = speed / accel;
504 return (-p - sqrt(p * p + 2 * dist / accel));
509 double t1 = (maxSpeed - speed) / accel;
511 double d1 = speed * t1 + 0.5 * accel * t1 * t1;
514 return (-p + sqrt(p * p + 2 * dist / accel));
516 return (-p + sqrt(p * p + 2 * d1 / accel)) + (dist - d1) / maxSpeed;
530 assert(accel == decel);
532 assert(initialSpeed == 0);
533 assert(arrivalSpeed == 0);
534 assert(maxSpeed > 0);
537 double accelTime = (maxSpeed - initialSpeed) / accel;
539 double accelDist = accelTime * (initialSpeed + 0.5 * (maxSpeed - initialSpeed));
541 if (accelDist >= dist * 0.5) {
543 arrivalTime = 4 * sqrt(dist / accel);
546 const double constSpeedTime = (dist - accelDist * 2) / maxSpeed;
547 arrivalTime = accelTime + constSpeedTime;
555 assert(time > 0 || dist == 0);
558 }
else if (time * speed > 2 * dist) {
561 return - 0.5 * speed * speed / dist;
565 return 2 * (dist / time - speed) / time;
579 double arrivalSpeedBraking;
582 if (dist < currentSpeed) {
590 return arrivalSpeedBraking;
597MSCFModel::gapExtrapolation(
const double duration,
const double currentGap,
double v1,
double v2,
double a1,
double a2,
const double maxV1,
const double maxV2) {
599 double newGap = currentGap;
602 for (
unsigned int steps = 1; steps *
TS <= duration; ++steps) {
603 v1 =
MIN2(
MAX2(v1 + a1, 0.), maxV1);
604 v2 =
MIN2(
MAX2(v2 + a2, 0.), maxV2);
605 newGap +=
TS * (v1 - v2);
610 double t1 = 0, t2 = 0, t3 = 0, t4 = 0;
613 if (a1 < 0 && v1 > 0) {
614 const double leaderStopTime = - v1 / a1;
615 t1 =
MIN2(leaderStopTime, duration);
616 }
else if (a1 >= 0) {
620 if (a2 < 0 && v2 > 0) {
621 const double followerStopTime = -v2 / a2;
622 t2 =
MIN2(followerStopTime, duration);
623 }
else if (a2 >= 0) {
627 if (a1 > 0 && v1 < maxV1) {
628 const double leaderMaxSpeedTime = (maxV1 - v1) / a1;
629 t3 =
MIN2(leaderMaxSpeedTime, duration);
630 }
else if (a1 <= 0) {
634 if (a2 > 0 && v2 < maxV2) {
635 const double followerMaxSpeedTime = (maxV2 - v2) / a2;
636 t4 =
MIN2(followerMaxSpeedTime, duration);
637 }
else if (a2 <= 0) {
649 std::list<double>::const_iterator i;
651 for (i = l.begin(); i != l.end(); ++i) {
653 double dt =
MIN2(*i, duration) - tLast;
656 newGap += dv * dt + da * dt * dt / 2.;
660 if (*i == t1 || *i == t3) {
665 if (*i == t2 || *i == t4) {
670 tLast =
MIN2(*i, duration);
671 if (tLast == duration) {
676 if (duration != tLast) {
678 assert(a1 == 0. && a2 == 0.);
679 double dt = duration - tLast;
691MSCFModel::passingTime(
const double lastPos,
const double passedPos,
const double currentPos,
const double lastSpeed,
const double currentSpeed) {
693 assert(passedPos <= currentPos);
694 assert(passedPos >= lastPos);
695 assert(currentPos > lastPos);
696 assert(currentSpeed >= 0);
698 if (passedPos > currentPos || passedPos < lastPos) {
699 std::stringstream ss;
703 ss <<
"passingTime(): given argument passedPos = " << passedPos <<
" doesn't lie within [lastPos, currentPos] = [" << lastPos <<
", " << currentPos <<
"]\nExtrapolating...";
704 std::cout << ss.str() <<
"\n";
707 const double lastCoveredDist = currentPos - lastPos;
708 const double extrapolated = passedPos > currentPos ?
TS * (passedPos - lastPos) / lastCoveredDist :
TS * (currentPos - passedPos) / lastCoveredDist;
710 }
else if (currentSpeed < 0) {
711 WRITE_ERROR(
"passingTime(): given argument 'currentSpeed' is negative. This case is not handled yet.");
715 const double distanceOldToPassed = passedPos - lastPos;
719 if (currentSpeed == 0) {
722 const double t = distanceOldToPassed / currentSpeed;
730 if (currentSpeed > 0) {
735 assert(currentSpeed == 0 && lastSpeed != 0);
739 a = lastSpeed * lastSpeed / (2 * (lastPos - currentPos));
746 if (fabs(a) < NUMERICAL_EPS) {
748 const double t = 2 * distanceOldToPassed / (lastSpeed + currentSpeed);
752 const double va = lastSpeed / a;
753 const double t = -va + sqrt(va * va + 2 * distanceOldToPassed / a);
754 assert(t < 1 && t >= 0);
758 const double va = lastSpeed / a;
759 const double t = -va - sqrt(va * va + 2 * distanceOldToPassed / a);
771 assert(t >= 0 && t <=
TS);
779 if (dist <
TS * v0 / 2) {
782 const double accel = - v0 * v0 / (2 * dist);
784 return v0 + accel * t;
787 const double accel = 2 * (dist /
TS - v0) /
TS;
789 return v0 + accel * t;
801 (
double)sqrt(
MAX2(0., 2 * dist * accel + v * v)));
816#ifdef DEBUG_EMERGENCYDECEL
818 std::cout <<
SIMTIME <<
" maximumSafeStopSpeed()"
820 <<
" v=" << currentSpeed
821 <<
" initial vsafe=" << vsafe <<
"(decel=" <<
SPEED2ACCEL(v - vsafe) <<
")" << std::endl;
825 double origSafeDecel =
SPEED2ACCEL(currentSpeed - vsafe);
826 if (origSafeDecel >
myDecel + NUMERICAL_EPS) {
829#ifdef DEBUG_EMERGENCYDECEL
831 std::cout <<
SIMTIME <<
" maximumSafeStopSpeed() results in emergency deceleration "
832 <<
"initial vsafe=" << vsafe <<
" egoSpeed=" << v <<
"(decel=" <<
SPEED2ACCEL(v - vsafe) <<
")" << std::endl;
840 safeDecel =
MIN2(safeDecel, origSafeDecel);
843 vsafe =
MAX2(vsafe, 0.);
846#ifdef DEBUG_EMERGENCYDECEL
848 std::cout <<
" -> corrected emergency deceleration: " <<
SPEED2ACCEL(v - vsafe) << std::endl;
862 const double g = gap - NUMERICAL_EPS;
874 const double n = floor(.5 - ((t + (sqrt(((s * s) + (4.0 * ((s * (2.0 * g / b - t)) + (t * t))))) * -0.5)) / s));
875 const double h = 0.5 * n * (n - 1) * b * s + n * b * t;
876 assert(h <= g + NUMERICAL_EPS);
879 const double r = (g - h) / (n * s + t);
880 const double x = n * b + r;
890 const double g =
MAX2(0., gap - NUMERICAL_EPS);
906 const double btau = decel * headway;
907 const double v0 = -btau + sqrt(btau * btau + 2 * decel * g);
916 const double tau = headway == 0 ?
TS : headway;
917 const double v0 =
MAX2(0., currentSpeed);
920 if (g <= v0 * tau * 0.5) {
932 const double a = -v0 * v0 / (2 * g);
949 const double btau2 = decel * tau / 2;
950 const double v1 = -btau2 + sqrt(btau2 * btau2 + decel * (2 * g - tau * v0));
951 const double a = (v1 - v0) / tau;
998 if (origSafeDecel >
myDecel + NUMERICAL_EPS) {
1005#ifdef DEBUG_EMERGENCYDECEL
1007 std::cout <<
SIMTIME <<
" initial vsafe=" << x
1008 <<
" egoSpeed=" << egoSpeed <<
" (origSafeDecel=" << origSafeDecel <<
")"
1009 <<
" predSpeed=" << predSpeed <<
" (predDecel=" << predMaxDecel <<
")"
1010 <<
" safeDecel=" << safeDecel
1017 safeDecel =
MIN2(safeDecel, origSafeDecel);
1023#ifdef DEBUG_EMERGENCYDECEL
1025 std::cout <<
" -> corrected emergency deceleration: " << safeDecel <<
" newVSafe=" << x << std::endl;
1032 assert(!std::isnan(x));
1047 const double predBrakeDist = 0.5 * predSpeed * predSpeed / predMaxDecel;
1049 const double b1 = 0.5 * egoSpeed * egoSpeed / (gap + predBrakeDist);
1051#ifdef DEBUG_EMERGENCYDECEL
1053 std::cout <<
SIMTIME <<
" calculateEmergencyDeceleration()"
1054 <<
" gap=" << gap <<
" egoSpeed=" << egoSpeed <<
" predSpeed=" << predSpeed
1055 <<
" predBrakeDist=" << predBrakeDist
1061 if (b1 <= predMaxDecel) {
1063#ifdef DEBUG_EMERGENCYDECEL
1065 std::cout <<
" case 1 ..." << std::endl;
1070#ifdef DEBUG_EMERGENCYDECEL
1072 std::cout <<
" case 2 ...";
1078 const double b2 = 0.5 * (egoSpeed * egoSpeed - predSpeed * predSpeed) / gap;
1080#ifdef DEBUG_EMERGENCYDECEL
1082 std::cout <<
" b2=" << b2 << std::endl;
1107 const double perceivedGap = veh->
getDriverState()->getPerceivedHeadway(gap, pred);
1108 const double perceivedSpeedDifference = veh->
getDriverState()->getPerceivedSpeedDifference(predSpeed - speed, gap, pred);
1110#ifdef DEBUG_DRIVER_ERRORS
1114 std::cout <<
SIMTIME <<
" veh '" << veh->
getID() <<
"' -> MSCFModel_Krauss::applyHeadwayAndSpeedDifferencePerceptionErrors()\n"
1115 <<
" speed=" << speed <<
" gap=" << gap <<
" leaderSpeed=" << predSpeed
1116 <<
"\n perceivedGap=" << perceivedGap <<
" perceivedLeaderSpeed=" << speed + perceivedSpeedDifference
1117 <<
" perceivedSpeedDifference=" << perceivedSpeedDifference
1120 const double errorFollowSpeed =
followSpeed(veh, speed, perceivedGap, speed + perceivedSpeedDifference, predMaxDecel, pred,
CalcReason::FUTURE);
1121 const double accelError =
SPEED2ACCEL(errorFollowSpeed - exactFollowSpeed);
1122 std::cout <<
" gapError=" << perceivedGap - gap <<
" dvError=" << perceivedSpeedDifference - (predSpeed - speed)
1123 <<
"\n resulting accelError: " << accelError << std::endl;
1130 predSpeed = speed + perceivedSpeedDifference;
1145 const double perceivedGap = veh->
getDriverState()->getPerceivedHeadway(gap);
1147#ifdef DEBUG_DRIVER_ERRORS
1151 std::cout <<
SIMTIME <<
" veh '" << veh->
getID() <<
"' -> MSCFModel_Krauss::applyHeadwayPerceptionError()\n"
1152 <<
" speed=" << speed <<
" gap=" << gap <<
"\n perceivedGap=" << perceivedGap << std::endl;
1155 const double accelError =
SPEED2ACCEL(errorStopSpeed - exactStopSpeed);
1156 std::cout <<
" gapError=" << perceivedGap - gap <<
"\n resulting accelError: " << accelError << std::endl;
#define EMERGENCY_DECEL_AMPLIFIER
#define WRITE_WARNINGF(...)
@ SUMO_ATTR_STARTUP_DELAY
@ SUMO_ATTR_MAXACCEL_PROFILE
@ SUMO_ATTR_APPARENTDECEL
@ SUMO_ATTR_EMERGENCYDECEL
@ SUMO_ATTR_COLLISION_MINGAP_FACTOR
@ SUMO_ATTR_DESACCEL_PROFILE
int gPrecision
the precision for floating point outputs
const double INVALID_DOUBLE
invalid double
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
static double getInterpolatedValue(const LinearApproxMap &map, double axisValue)
Get interpolated value.
virtual double getSafetyFactor() const
return factor for modifying the safety constraints of the car-following model
virtual double patchSpeed(const double min, const double wanted, const double max, const MSCFModel &cfModel)=0
Called to adapt the speed in order to allow a lane change. It uses information on LC-related desired ...
virtual void loadState(const SUMOSAXAttributes &attrs)
Loads the state of the vehicle variables from the given description.
virtual ~VehicleVariables()
virtual void saveState(OutputDevice &out, const MSCFModel &cfm) const
Saves the vehicle variables.
The car-following model abstraction.
double estimateSpeedAfterDistance(const double dist, const double v, const double accel) const
virtual double maxNextSpeed(double speed, const MSVehicle *const veh) const
Returns the maximum speed given the current speed.
virtual double getCurrentAccel(const double speed) const
Get the vehicle type's maximum acceleration [m/s^2].
static double gapExtrapolation(const double duration, const double currentGap, double v1, double v2, double a1=0, double a2=0, const double maxV1=std::numeric_limits< double >::max(), const double maxV2=std::numeric_limits< double >::max())
return the resulting gap if, starting with gap currentGap, two vehicles continue with constant accele...
virtual double minNextSpeedEmergency(double speed, const MSVehicle *const veh=0) const
Returns the minimum speed after emergency braking, given the current speed (depends on the numerical ...
virtual double followSpeedTransient(double duration, const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel) const
Computes the vehicle's follow speed that avoids a collision for the given amount of time.
virtual double applyStartupDelay(const MSVehicle *veh, const double vMin, const double vMax, const SUMOTime addTime=0) const
apply speed adaptation on startup
static double brakeGapEuler(const double speed, const double decel, const double headwayTime)
virtual double interactionGap(const MSVehicle *const veh, double vL) const
Returns the maximum gap at which an interaction between both vehicles occurs.
static double avoidArrivalAccel(double dist, double time, double speed, double maxDecel)
Computes the acceleration needed to arrive not before the given time.
double getMinimalArrivalSpeed(double dist, double currentSpeed) const
Computes the minimal possible arrival speed after covering a given distance.
virtual double patchSpeedBeforeLC(const MSVehicle *veh, double vMin, double vMax) const
apply custom speed adaptations within the given speed bounds
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.
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...
virtual double insertionFollowSpeed(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) This method is used during the insertion stage....
SUMOTime myStartupDelay
The startup delay after halting [s].
SUMOTime getMinimalArrivalTime(double dist, double currentSpeed, double arrivalSpeed) const
Computes the minimal time needed to cover a distance given the desired speed at arrival.
void applyHeadwayPerceptionError(const MSVehicle *const veh, double speed, double &gap) const
Overwrites gap by the perceived value obtained from the vehicle's driver state.
static double speedAfterTime(const double t, const double oldSpeed, const double dist)
Calculates the speed after a time t \in [0,TS] given the initial speed and the distance traveled in a...
static double passingTime(const double lastPos, const double passedPos, const double currentPos, const double lastSpeed, const double currentSpeed)
Calculates the time at which the position passedPosition has been passed In case of a ballistic updat...
virtual double finalizeSpeed(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences. Called at most once per simulation...
virtual ~MSCFModel()
Destructor.
double maximumSafeStopSpeedEuler(double gap, double decel, bool onInsertion, double headway) const
Returns the maximum next velocity for stopping within gap when using the semi-implicit Euler update.
double myEmergencyDecel
The vehicle's maximum emergency deceleration [m/s^2].
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.
@ FUTURE
the return value is used for calculating future speeds
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 calculateEmergencyDeceleration(double gap, double egoSpeed, double predSpeed, double predMaxDecel) const
Returns the minimal deceleration for following the given leader safely.
MSCFModel(const MSVehicleType *vtype)
Constructor.
double myDecel
The vehicle's maximum deceleration [m/s^2].
double getMaxAccel() const
Get the vehicle type's maximum acceleration [m/s^2].
double brakeGap(const double speed) const
Returns the distance the vehicle needs to halt including driver's reaction time tau (i....
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.
void applyOwnSpeedPerceptionError(const MSVehicle *const veh, double &speed) const
Overwrites sped by the perceived values obtained from the vehicle's driver state,.
virtual double interpolateProfile(const double speed, const std::vector< std::pair< double, double > > profile) const
Get current interpolated value from a profile.
LinearApproxHelpers::LinearApproxMap myMaxAccelProfile
The vehicle's maximum acceleration profile [m/s^2].
double myAccel
The vehicle's maximum acceleration [m/s^2].
LinearApproxHelpers::LinearApproxMap myDesAccelProfile
The vehicle's desired acceleration profile [m/s^2].
const MSVehicleType * myType
The type to which this model definition belongs to.
virtual double distAfterTime(double t, double speed, double accel) const
calculates the distance traveled after accelerating for time t
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
double maximumSafeStopSpeedBallistic(double gap, double decel, double currentSpeed, bool onInsertion=false, double headway=-1) const
Returns the maximum next velocity for stopping within gap when using the ballistic positional update.
double getMinimalArrivalSpeedEuler(double dist, double currentSpeed) const
Computes the minimal possible arrival speed after covering a given distance for Euler update.
static double estimateArrivalTime(double dist, double speed, double maxSpeed, double accel)
Computes the time needed to travel a distance dist given an initial speed and constant acceleration....
virtual 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 =0
Computes the vehicle's follow speed (no dawdling)
double myHeadwayTime
The driver's desired time headway (aka reaction time tau) [s].
double stopSpeed(const MSVehicle *const veh, const double speed, double gap, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
virtual double insertionStopSpeed(const MSVehicle *const veh, double speed, double gap) const
Computes the vehicle's safe speed for approaching an obstacle at insertion without constraints due to...
virtual double getHeadwayTime() const
Get the driver's desired headway [s].
static bool gSemiImplicitEulerUpdate
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.
Representation of a vehicle in the micro simulation.
SUMOTime getTimeSinceStartup() const
Returns the SUMOTime spent driving since startup (speed was larger than 0.1m/s)
bool hasDriverState() const
Whether this vehicle is equipped with a MSDriverState.
double getFriction() const
Returns the current friction on the road as perceived by the friction device.
MSAbstractLaneChangeModel & getLaneChangeModel()
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...
std::shared_ptr< MSSimpleDriverState > getDriverState() const
Returns the vehicle driver's state.
const MSLane * getLane() const
Returns the lane the vehicle is on.
double getSpeed() const
Returns the vehicle's current speed.
double processNextStop(double currentVelocity)
Processes stops, returns the velocity needed to reach the stop.
The car-following model and parameter.
double getMaxSpeed() const
Get vehicle's (technical) maximum speed [m/s].
const std::string & getID() const
Returns the name of the vehicle type.
const std::string & getID() const
Returns the id.
Static storage of an output device and its base (abstract) implementation.
Encapsulated SAX-Attributes.
Structure representing possible vehicle parameter.
#define UNUSED_PARAMETER(x)