41 #ifdef CHECK_MEMORY_LEAKS 43 #endif // CHECK_MEMORY_LEAKS 50 #define LOOK_FORWARD_SPEED_DIVIDER (SUMOReal)14. 52 #define LOOK_FORWARD_RIGHT (SUMOReal)10. 53 #define LOOK_FORWARD_LEFT (SUMOReal)20. 55 #define JAM_FACTOR (SUMOReal)1. 57 #define LCA_RIGHT_IMPATIENCE (SUMOReal)-1. 58 #define CUT_IN_LEFT_SPEED_THRESHOLD (SUMOReal)27. 60 #define LOOK_AHEAD_MIN_SPEED (SUMOReal)0.0 61 #define LOOK_AHEAD_SPEED_MEMORY (SUMOReal)0.9 62 #define LOOK_AHEAD_SPEED_DECREMENT 6. 64 #define HELP_DECEL_FACTOR (SUMOReal)1.0 66 #define HELP_OVERTAKE (SUMOReal)(10.0 / 3.6) 67 #define MIN_FALLBEHIND (SUMOReal)(7.0 / 3.6) 69 #define RELGAIN_NORMALIZATION_MIN_SPEED (SUMOReal)10.0 70 #define URGENCY (SUMOReal)2.0 72 #define KEEP_RIGHT_TIME (SUMOReal)5.0 // the number of seconds after which a vehicle should move to the right lane 73 #define KEEP_RIGHT_ACCEPTANCE (SUMOReal)7.0 // calibration factor for determining the desire to keep right 74 #define ROUNDABOUT_DIST_BONUS (SUMOReal)100.0 77 #define KEEP_RIGHT_HEADWAY (SUMOReal)2.0 78 #define MAX_ONRAMP_LENGTH (SUMOReal)200. 79 #define TURN_LANE_DIST (SUMOReal)200.0 // the distance at which a lane leading elsewhere is considered to be a turn-lane that must be avoided 92 #define DEBUG_COND (myVehicle.getID() == "disabled") 99 mySpeedGainProbability(0),
100 myKeepRightProbability(0),
101 myLeadingBlockerLength(0),
108 myChangeProbThresholdRight(2.0 * myKeepRightParam /
MAX2(
NUMERICAL_EPS, mySpeedGainParam)),
110 #ifdef DEBUG_CONSTRUCTOR 139 const std::pair<MSVehicle*, SUMOReal>& leader,
140 const std::pair<MSVehicle*, SUMOReal>& neighLead,
141 const std::pair<MSVehicle*, SUMOReal>& neighFollow,
143 const std::vector<MSVehicle::LaneQ>& preb,
147 #ifdef DEBUG_WANTS_CHANGE 156 <<
" considerChangeTo=" << (laneOffset == -1 ?
"right" :
"left")
161 const int result =
_wantsChange(laneOffset, msgPass, blocked, leader, neighLead, neighFollow, neighLane, preb, lastBlocked, firstBlocked);
163 #ifdef DEBUG_WANTS_CHANGE 168 <<
" wantsChangeTo=" << (laneOffset == -1 ?
"right" :
"left")
175 << ((result &
LCA_TRACI) ?
" (traci)" :
"")
191 #ifdef DEBUG_PATCH_SPEED 193 const std::string patched = (wanted != newSpeed ?
" patched=" +
toString(newSpeed) :
"");
199 <<
" wanted=" << wanted
212 #ifdef DEBUG_PATCH_SPEED 222 #ifdef DEBUG_PATCH_SPEED 233 #ifdef DEBUG_PATCH_SPEED 235 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" slowing down for leading blocker, safe=" << safe << (safe +
NUMERICAL_EPS < min ?
" (not enough)" :
"") <<
"\n";
238 return MAX2(min, safe);
245 for (std::vector<SUMOReal>::const_iterator i =
myVSafes.begin(); i !=
myVSafes.end(); ++i) {
247 if (v >= min && v <= max) {
250 #ifdef DEBUG_PATCH_SPEED 252 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" got nVSafe=" << nVSafe <<
"\n";
257 #ifdef DEBUG_PATCH_SPEED 259 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" ignoring low nVSafe=" << v <<
" min=" << min <<
"\n";
263 #ifdef DEBUG_PATCH_SPEED 265 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" ignoring high nVSafe=" << v <<
" max=" << max <<
"\n";
273 #ifdef DEBUG_PATCH_SPEED 275 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" got vSafe\n";
286 #ifdef DEBUG_PATCH_SPEED 288 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_WANTS_LANECHANGE (strat, no vSafe)\n";
291 return (max + wanted) / (
SUMOReal) 2.0;
295 #ifdef DEBUG_PATCH_SPEED 297 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_BLOCKED_BY_LEADER (coop)\n";
300 return (min + wanted) / (
SUMOReal) 2.0;
303 #ifdef DEBUG_PATCH_SPEED 305 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_BLOCKED_BY_FOLLOWER (coop)\n";
308 return (max + wanted) / (
SUMOReal) 2.0;
349 #ifdef DEBUG_PATCH_SPEED 351 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_AMBLOCKINGLEADER\n";
354 return (max + wanted) / (
SUMOReal) 2.0;
358 #ifdef DEBUG_PATCH_SPEED 360 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_AMBLOCKINGFOLLOWER_DONTBRAKE\n";
383 if (pinfo->first >= 0) {
388 #ifdef DEBUG_INFORMED 392 <<
" informedBy=" << sender->
getID()
393 <<
" info=" << pinfo->second
394 <<
" vSafe=" << pinfo->first
407 const std::pair<MSVehicle*, SUMOReal>& neighLead,
411 for (std::vector<SUMOReal>::const_iterator i =
myVSafes.begin(); i !=
myVSafes.end(); ++i) {
414 plannedSpeed =
MIN2(plannedSpeed, v);
417 #ifdef DEBUG_INFORMER 419 std::cout <<
" informLeader speed=" <<
myVehicle.
getSpeed() <<
" planned=" << plannedSpeed <<
"\n";
424 assert(neighLead.first != 0);
426 #ifdef DEBUG_INFORMER 428 std::cout <<
" blocked by leader nv=" << nv->
getID() <<
" nvSpeed=" << nv->
getSpeed() <<
" needGap=" 434 const SUMOReal overtakeDist = (neighLead.second
446 || dv * remainingSeconds < overtakeDist) {
458 #ifdef DEBUG_INFORMER 461 <<
" cannot overtake leader nv=" << nv->
getID()
463 <<
" remainingSeconds=" << remainingSeconds
464 <<
" targetSpeed=" << targetSpeed
465 <<
" nextSpeed=" << nextSpeed
473 #ifdef DEBUG_INFORMER 476 <<
" cannot overtake fast leader nv=" << nv->
getID()
478 <<
" remainingSeconds=" << remainingSeconds
479 <<
" targetSpeed=" << targetSpeed
488 #ifdef DEBUG_INFORMER 491 <<
" wants to overtake leader nv=" << nv->
getID()
493 <<
" remainingSeconds=" << remainingSeconds
494 <<
" currentGap=" << neighLead.second
496 <<
" overtakeDist=" << overtakeDist
503 }
else if (neighLead.first != 0) {
511 #ifdef DEBUG_INFORMER 513 std::cout <<
" not blocked by leader nv=" << nv->
getID()
515 <<
" gap=" << neighLead.second
516 <<
" nextGap=" << neighLead.second - dv
518 <<
" targetSpeed=" << targetSpeed
522 return MIN2(targetSpeed, plannedSpeed);
534 const std::pair<MSVehicle*, SUMOReal>& neighFollow,
538 assert(neighFollow.first != 0);
540 #ifdef DEBUG_INFORMER 542 std::cout <<
" blocked by follower nv=" << nv->
getID() <<
" nvSpeed=" << nv->
getSpeed() <<
" needGap=" 550 if ((neededGap - neighFollow.second) / remainingSeconds < (plannedSpeed - nv->
getSpeed())) {
551 #ifdef DEBUG_INFORMER 553 std::cout <<
" wants to cut in before nv=" << nv->
getID() <<
" without any help neededGap=" << neededGap <<
"\n";
573 const SUMOReal dv = plannedSpeed - neighNewSpeed1s;
575 const SUMOReal decelGap = neighFollow.second + dv;
577 #ifdef DEBUG_INFORMER 581 <<
" egoNV=" << plannedSpeed
582 <<
" nvNewSpeed=" << neighNewSpeed
583 <<
" nvNewSpeed1s=" << neighNewSpeed1s
584 <<
" deltaGap=" << dv
585 <<
" decelGap=" << decelGap
586 <<
" secGap=" << secureGap
590 if (decelGap > 0 && decelGap >= secureGap) {
603 #ifdef DEBUG_INFORMER 605 std::cout <<
" wants to cut in before nv=" << nv->
getID()
606 <<
" vsafe1=" << vsafe1
607 <<
" vsafe=" << vsafe
612 }
else if (dv > 0 && dv * remainingSeconds > (secureGap - decelGap +
POSITION_EPS)) {
615 #ifdef DEBUG_INFORMER 617 std::cout <<
" wants to cut in before nv=" << nv->
getID() <<
" (eventually)\n";
623 #ifdef DEBUG_INFORMER 625 std::cout <<
" wants to cut in before nv=" << nv->
getID() <<
" (nv cannot overtake right)\n";
639 #ifdef DEBUG_INFORMER 641 std::cout <<
" wants right follower to slow down a bit\n";
645 #ifdef DEBUG_INFORMER 647 std::cout <<
" wants to cut in before right follower nv=" << nv->
getID() <<
" (eventually)\n";
656 const SUMOReal overtakeDist = (neighFollow.second
662 const SUMOReal needDV = overtakeDist / remainingSeconds;
666 #ifdef DEBUG_INFORMER 670 <<
" wants to be overtaken by=" << nv->
getID()
671 <<
" overtakeDist=" << overtakeDist
673 <<
" vhelp=" << vhelp
674 <<
" needDV=" << needDV
680 }
else if (neighFollow.first != 0) {
688 #ifdef DEBUG_INFORMER 690 std::cout <<
" wants to cut in before non-blocking follower nv=" << nv->
getID() <<
"\n";
733 const std::pair<MSVehicle*, SUMOReal>& leader,
734 const std::pair<MSVehicle*, SUMOReal>& neighLead,
735 const std::pair<MSVehicle*, SUMOReal>& neighFollow,
737 const std::vector<MSVehicle::LaneQ>& preb,
740 assert(laneOffset == 1 || laneOffset == -1);
744 int bestLaneOffset = 0;
754 const int prebOffset = (checkOpposite ? 0 : laneOffset);
755 for (
int p = 0; p < (int) preb.size(); ++p) {
756 if (preb[p].lane == prebLane && p + laneOffset >= 0) {
757 assert(p + prebOffset < (
int)preb.size());
759 neigh = preb[p + prebOffset];
760 currentDist = curr.
length;
762 bestLaneOffset = curr.bestLaneOffset;
764 if (bestLaneOffset == 0 && preb[p + prebOffset].bestLaneOffset == 0) {
765 #ifdef DEBUG_WANTS_CHANGE 769 <<
" bestLaneOffsetOld=" << bestLaneOffset
770 <<
" bestLaneOffsetNew=" << laneOffset
774 bestLaneOffset = prebOffset;
776 best = preb[p + bestLaneOffset];
782 const bool right = (laneOffset == -1);
784 neigh = preb[preb.size() - 1];
790 currentDist = curr.
length;
796 const bool changeToBest = (right && bestLaneOffset < 0) || (!right && bestLaneOffset > 0);
817 #ifdef DEBUG_WANTS_CHANGE 826 <<
" leaderGap=" << leader.second
828 <<
" neighLeadGap=" << neighLead.second
830 <<
" neighFollowGap=" << neighFollow.second
837 if (lastBlocked != firstBlocked) {
870 if (bestLaneOffset == 0 && leader.first != 0 && leader.first->isStopped()) {
873 + leader.first->getVehicleType().getLengthWithGap());
884 int roundaboutEdgesAhead = 0;
886 if ((*it) != 0 && (*it)->getEdge().isRoundabout()) {
887 roundaboutEdgesAhead += 1;
888 }
else if (roundaboutEdgesAhead > 0) {
893 int roundaboutEdgesAheadNeigh = 0;
895 if ((*it) != 0 && (*it)->getEdge().isRoundabout()) {
896 roundaboutEdgesAheadNeigh += 1;
897 }
else if (roundaboutEdgesAheadNeigh > 0) {
902 if (roundaboutEdgesAhead > 1) {
906 #ifdef DEBUG_WANTS_CHANGE 908 if (roundaboutEdgesAhead > 0) {
909 std::cout <<
" roundaboutEdgesAhead=" << roundaboutEdgesAhead <<
" roundaboutEdgesAheadNeigh=" << roundaboutEdgesAheadNeigh <<
"\n";
916 const SUMOReal maxJam =
MAX2(preb[currIdx + prebOffset].occupation, preb[currIdx].occupation);
919 #ifdef DEBUG_WANTS_CHANGE 924 <<
" laDist=" << laDist
925 <<
" currentDist=" << currentDist
926 <<
" usableDist=" << usableDist
927 <<
" bestLaneOffset=" << bestLaneOffset
929 <<
" best.length=" << best.
length 930 <<
" maxJam=" << maxJam
931 <<
" neighLeftPlace=" << neighLeftPlace
953 #ifdef DEBUG_WANTS_CHANGE 956 <<
" avoid overtaking on the right nv=" << nv->
getID()
959 <<
" plannedSpeed=" <<
myVSafes.back()
973 #ifdef DEBUG_WANTS_CHANGE 975 std::cout <<
" veh=" <<
myVehicle.
getID() <<
" could not change back and forth in time (1) neighLeftPlace=" << neighLeftPlace <<
"\n";
979 }
else if (bestLaneOffset == 0 && (neighLeftPlace * 2. < laDist)) {
984 #ifdef DEBUG_WANTS_CHANGE 986 std::cout <<
" veh=" <<
myVehicle.
getID() <<
" could not change back and forth in time (2) neighLeftPlace=" << neighLeftPlace <<
"\n";
990 }
else if (bestLaneOffset == 0
991 && (leader.first == 0 || !leader.first->isStopped())
993 && roundaboutEdgesAhead == 0
998 #ifdef DEBUG_WANTS_CHANGE 1000 std::cout <<
" veh=" <<
myVehicle.
getID() <<
" does not want to leave the bestLane (neighDist=" << neighDist <<
")\n";
1007 #ifdef DEBUG_WANTS_CHANGE 1013 if ((ret & lcaCounter) != 0) {
1017 #ifdef DEBUG_WANTS_CHANGE 1019 std::cout <<
" retAfterInfluence=" << ret <<
"\n";
1030 if (changeToBest &&
abs(bestLaneOffset) > 1) {
1032 #ifdef DEBUG_WANTS_CHANGE 1034 std::cout <<
" reserving space for unseen blockers\n";
1043 if (*firstBlocked != neighLead.first) {
1050 const SUMOReal plannedSpeed =
informLeader(msgPass, blocked, mLca, neighLead, remainingSeconds);
1051 if (plannedSpeed >= 0) {
1053 informFollower(msgPass, blocked, mLca, neighFollow, remainingSeconds, plannedSpeed);
1056 #ifdef DEBUG_WANTS_CHANGE 1061 <<
" remainingSeconds=" << remainingSeconds
1062 <<
" plannedSpeed=" << plannedSpeed
1070 if (roundaboutEdgesAhead > 1) {
1087 #ifdef DEBUG_WANTS_CHANGE 1089 std::cout <<
" veh=" <<
myVehicle.
getID() <<
" does not want to get stranded on the on-ramp of a highway\n";
1116 #ifdef DEBUG_WANTS_CHANGE 1120 <<
" wantsChangeToHelp=" << (right ?
"right" :
"left")
1122 << (((
myOwnState & lcaCounter) != 0) ?
" (counter)" :
"")
1155 if (neighLead.first == 0) {
1160 &
myVehicle, correctedSpeed, neighLead.second, neighLead.first->
getSpeed(), neighLead.first->getCarFollowModel().getMaxDecel()));
1162 if (leader.first == 0) {
1168 #ifdef DEBUG_WANTS_CHANGE 1172 <<
" currentDist=" << currentDist
1173 <<
" neighDist=" << neighDist
1179 thisLaneVSafe =
MIN2(thisLaneVSafe, vMax);
1180 neighLaneVSafe =
MIN2(neighLaneVSafe, vMax);
1181 const SUMOReal relativeGain = (neighLaneVSafe - thisLaneVSafe) /
MAX2(neighLaneVSafe,
1186 if (thisLaneVSafe - 5 / 3.6 > neighLaneVSafe) {
1197 if (mySpeedGainProbability < 0 || relativeGain > 0) {
1206 SUMOReal fullSpeedDrivingSeconds =
MIN2(acceptanceTime, fullSpeedGap / vMax);
1207 if (neighLead.first != 0 && neighLead.first->getSpeed() < vMax) {
1210 vMax, neighLead.first->getSpeed(), neighLead.first->getCarFollowModel().getMaxDecel())));
1211 fullSpeedDrivingSeconds =
MIN2(fullSpeedDrivingSeconds, fullSpeedGap / (vMax - neighLead.first->getSpeed()));
1218 #ifdef DEBUG_WANTS_CHANGE 1223 <<
" neighDist=" << neighDist
1225 <<
" leaderSpeed=" << (neighLead.first == 0 ? -1 : neighLead.first->getSpeed())
1227 myVehicle.
getSpeed(), neighLead.first->getSpeed(), neighLead.first->getCarFollowModel().getMaxDecel()))
1228 <<
" acceptanceTime=" << acceptanceTime
1229 <<
" fullSpeedGap=" << fullSpeedGap
1230 <<
" fullSpeedDrivingSeconds=" << fullSpeedDrivingSeconds
1231 <<
" dProb=" << deltaProb
1244 #ifdef DEBUG_WANTS_CHANGE 1250 <<
" thisLaneVSafe=" << thisLaneVSafe
1251 <<
" neighLaneVSafe=" << neighLaneVSafe
1252 <<
" relativeGain=" << relativeGain
1253 <<
" blocked=" << blocked
1267 if (thisLaneVSafe > neighLaneVSafe) {
1286 #ifdef DEBUG_WANTS_CHANGE 1292 <<
" thisLaneVSafe=" << thisLaneVSafe
1293 <<
" neighLaneVSafe=" << neighLaneVSafe
1294 <<
" relativeGain=" << relativeGain
1295 <<
" blocked=" << blocked
1308 && (right ? mySpeedGainProbability < 0 : mySpeedGainProbability > 0)) {
1315 #ifdef DEBUG_WANTS_CHANGE 1321 <<
" thisLaneVSafe=" << thisLaneVSafe
1322 <<
" neighLaneVSafe=" << neighLaneVSafe
1333 if ((*blocked) != 0) {
1335 #ifdef DEBUG_SLOW_DOWN 1359 (*blocked)->getCarFollowModel().getMaxDecel()));
1370 #ifdef DEBUG_SAVE_BLOCKER_LENGTH 1386 #ifdef DEBUG_SAVE_BLOCKER_LENGTH 1398 #ifdef DEBUG_SAVE_BLOCKER_LENGTH 1404 <<
" potential=" << potential
void * inform(void *info, MSVehicle *sender)
#define LOOK_AHEAD_MIN_SPEED
const SUMOReal myCooperativeParam
int _wantsChange(int laneOffset, MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, const std::pair< MSVehicle *, SUMOReal > &leader, const std::pair< MSVehicle *, SUMOReal > &neighLead, const std::pair< MSVehicle *, SUMOReal > &neighFollow, const MSLane &neighLane, const std::vector< MSVehicle::LaneQ > &preb, MSVehicle **lastBlocked, MSVehicle **firstBlocked)
helper function for doing the actual work
MSEdge & getEdge() const
Returns the lane's edge.
bool debugVehicle() const
whether the current vehicles shall be debugged
Representation of a vehicle in the micro simulation.
SUMOReal getMaxSpeed() const
Get vehicle's maximum speed [m/s].
The action is due to the default of keeping right "Rechtsfahrgebot".
The action is done to help someone else.
int slowDownForBlocked(MSVehicle **blocked, int state)
compute useful slowdowns for blocked vehicles
const SUMOReal myChangeProbThresholdLeft
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
bool currentDistAllows(SUMOReal dist, int laneOffset, SUMOReal lookForwardDist)
SUMOReal getLengthWithGap() const
Get vehicle's length including the minimum gap [m].
int bestLaneOffset
The (signed) number of lanes to be crossed to get to the lane which allows to continue the drive...
virtual SUMOReal followSpeed(const MSVehicle *const veh, SUMOReal speed, SUMOReal gap2pred, SUMOReal predSpeed, SUMOReal predMaxDecel) const =0
Computes the vehicle's follow speed (no dawdling)
SUMOReal getLength() const
Returns the lane's length.
SUMOReal myLeadingBlockerLength
The car-following model abstraction.
void * informNeighFollower(void *info, MSVehicle *sender)
Informs the follower on the desired lane.
SUMOReal getLength() const
Get vehicle's length [m].
int wantsChange(int laneOffset, MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, const std::pair< MSVehicle *, SUMOReal > &leader, const std::pair< MSVehicle *, SUMOReal > &neighLead, const std::pair< MSVehicle *, SUMOReal > &neighFollow, const MSLane &neighLane, const std::vector< MSVehicle::LaneQ > &preb, MSVehicle **lastBlocked, MSVehicle **firstBlocked)
Called to examine whether the vehicle wants to change using the given laneOffset. This method gets th...
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
static std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
MSLCM_JE2013(MSVehicle &v)
std::vector< SUMOReal > myVSafes
SUMOReal getSecureGap(const SUMOReal speed, const SUMOReal leaderSpeed, const SUMOReal leaderMaxDecel) const
Returns the minimum gap to reserve if the leader is braking at maximum.
SUMOReal getPositionOnLane() const
Get the vehicle's position along the lane.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
The action is due to the wish to be faster (tactical lc)
SUMOReal length
The overall length which may be driven when using this lane without a lane change.
#define UNUSED_PARAMETER(x)
MSAbstractLaneChangeModel & getLaneChangeModel()
void informFollower(MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, int dir, const std::pair< MSVehicle *, SUMOReal > &neighFollow, SUMOReal remainingSeconds, SUMOReal plannedSpeed)
decide whether we will try cut in before the follower or allow to be overtaken
#define LCA_RIGHT_IMPATIENCE
SUMOReal getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
Needs to stay on the current lane.
std::pair< SUMOReal, int > Info
information regarding save velocity (unused) and state flags of the ego vehicle
static bool myAllowOvertakingRight
whether overtaking on the right is permitted
const SUMOReal myStrategicParam
A class responsible for exchanging messages between cars involved in lane-change interaction.
const std::string & getID() const
Returns the id.
bool cancelRequest(int state)
whether the influencer cancels the given request
SUMOReal brakeGap(const SUMOReal speed) const
Returns the distance the vehicle needs to halt including driver's reaction time.
#define CUT_IN_LEFT_SPEED_THRESHOLD
The action is urgent (to be defined by lc-model)
SUMOReal mySpeedGainProbability
a value for tracking the probability that a change to the offset with the same sign is beneficial ...
SUMOReal getMinGap() const
Get the free space in front of vehicles of this class.
#define RELGAIN_NORMALIZATION_MIN_SPEED
#define LOOK_FORWARD_RIGHT
bool amBlockingFollowerPlusNB()
SUMOReal informLeader(MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, int dir, const std::pair< MSVehicle *, SUMOReal > &neighLead, SUMOReal remainingSeconds)
SUMOReal _patchSpeed(const SUMOReal min, const SUMOReal wanted, const SUMOReal max, const MSCFModel &cfModel)
void saveBlockerLength(MSVehicle *blocker, int lcaCounter)
save space for vehicles which need to counter-lane-change
#define MAX_ONRAMP_LENGTH
The action is needed to follow the route (navigational lc)
virtual SUMOReal stopSpeed(const MSVehicle *const veh, const SUMOReal speed, SUMOReal gap2pred) const =0
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling) ...
SUMOReal getSpeedLimit() const
Returns the lane's maximum allowed speed.
A structure representing the best lanes for continuing the route.
SUMOReal getMaxDecel() const
Get the vehicle type's maximum deceleration [m/s^2].
SUMOReal changeRequestRemainingSeconds(const SUMOTime currentTime) const
Return the remaining number of seconds of the current laneTimeLine assuming one exists.
int myOwnState
The current state of the vehicle.
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
const SUMOReal myKeepRightParam
virtual void saveBlockerLength(SUMOReal length)
reserve space at the end of the lane to avoid dead locks
SUMOReal getMaxAccel() const
Get the vehicle type's maximum acceleration [m/s^2].
#define HELP_DECEL_FACTOR
MSVehicle & myVehicle
The vehicle this lane-changer belongs to.
void * informNeighLeader(void *info, MSVehicle *sender)
Informs the leader on the desired lane.
EdgeBasicFunction getPurpose() const
Returns the edge type (EdgeBasicFunction)
Influencer & getInfluencer()
Returns the velocity/lane influencer.
SUMOReal myKeepRightProbability
#define LOOK_AHEAD_SPEED_MEMORY
#define ROUNDABOUT_DIST_BONUS
SUMOReal occupation
The overall vehicle sum on consecutive lanes which can be passed without a lane change.
std::vector< MSLane * > bestContinuations
Consecutive lane that can be followed without a lane change (contribute to length and occupation) ...
SUMOReal myLookAheadSpeed
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
const SUMOReal SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
SUMOReal getSpeed() const
Returns the vehicle's current speed.
SUMOReal getWaitingSeconds() const
Returns the number of seconds waited (speed was lesser than 0.1m/s)
The action is due to a TraCI request.
#define KEEP_RIGHT_ACCEPTANCE
const SUMOReal myChangeProbThresholdRight
#define LOOK_FORWARD_LEFT
const MSLinkCont & getLinkCont() const
returns the container with all links !!!
SUMOReal getVehicleMaxSpeed(const SUMOVehicle *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
MSLane * getLane() const
Returns the lane the vehicle is on.
int influenceChangeDecision(int state)
allow TraCI to influence a lane change decision
The edge is an internal edge.
Representation of a lane in the micro simulation.
const MSCFModel & myCarFollowModel
The vehicle's car following model.
bool currentDistDisallows(SUMOReal dist, int laneOffset, SUMOReal lookForwardDist)
const SUMOReal mySpeedGainParam
Interface for lane-change models.
int getBestLaneOffset() const
returns the current offset from the best lane
bool hasLaneChanger() const
SUMOReal patchSpeed(const SUMOReal min, const SUMOReal wanted, const SUMOReal max, const MSCFModel &cfModel)
Called to adapt the speed in order to allow a lane change.
const std::string & getID() const
Returns the name of the vehicle.