111#define DEBUG_COND (isSelected())
113#define DEBUG_COND2(obj) (obj->isSelected())
118#define STOPPING_PLACE_OFFSET 0.5
120#define CRLL_LOOK_AHEAD 5
122#define JUNCTION_BLOCKAGE_TIME 5
125#define DIST_TO_STOPLINE_EXPECT_PRIORITY 1.0
127#define NUMERICAL_EPS_SPEED (0.1 * NUMERICAL_EPS * TS)
165 return (myPos != state.
myPos ||
175 myPos(pos), mySpeed(speed), myPosLat(posLat), myBackPos(backPos), myPreviousSpeed(previousSpeed), myLastCoveredDist(
SPEED2DIST(speed)) {}
187 assert(memorySpan <= myMemorySize);
188 if (memorySpan == -1) {
189 memorySpan = myMemorySize;
192 for (
const auto& interval : myWaitingIntervals) {
193 if (interval.second >= memorySpan) {
194 if (interval.first >= memorySpan) {
197 totalWaitingTime += memorySpan - interval.first;
200 totalWaitingTime += interval.second - interval.first;
203 return totalWaitingTime;
209 auto i = myWaitingIntervals.begin();
210 const auto end = myWaitingIntervals.end();
211 const bool startNewInterval = i == end || (i->first != 0);
214 if (i->first >= myMemorySize) {
222 auto d = std::distance(i, end);
224 myWaitingIntervals.pop_back();
230 }
else if (!startNewInterval) {
231 myWaitingIntervals.begin()->first = 0;
233 myWaitingIntervals.push_front(std::make_pair(0, dt));
241 std::ostringstream state;
242 state << myMemorySize <<
" " << myWaitingIntervals.size();
243 for (
const auto& interval : myWaitingIntervals) {
244 state <<
" " << interval.first <<
" " << interval.second;
252 std::istringstream is(state);
255 is >> myMemorySize >> numIntervals;
256 while (numIntervals-- > 0) {
258 myWaitingIntervals.emplace_back(begin, end);
277 if (GapControlState::refVehMap.find(msVeh) != end(GapControlState::refVehMap)) {
279 GapControlState::refVehMap[msVeh]->deactivate();
289std::map<const MSVehicle*, MSVehicle::Influencer::GapControlState*>
295 tauOriginal(-1), tauCurrent(-1), tauTarget(-1), addGapCurrent(-1), addGapTarget(-1),
296 remainingDuration(-1), changeRate(-1), maxDecel(-1), referenceVeh(nullptr), active(false), gapAttained(false), prevLeader(nullptr),
297 lastUpdate(-1), timeHeadwayIncrement(0.0), spaceHeadwayIncrement(0.0) {}
307 if (myVehStateListener ==
nullptr) {
313 WRITE_ERROR(
"MSVehicle::Influencer::GapControlState::init(): No MSNet instance found!")
319 if (myVehStateListener !=
nullptr) {
321 delete myVehStateListener;
322 myVehStateListener =
nullptr;
333 tauOriginal = tauOrig;
334 tauCurrent = tauOrig;
337 addGapTarget = additionalGap;
338 remainingDuration = dur;
341 referenceVeh = refVeh;
344 prevLeader =
nullptr;
346 timeHeadwayIncrement = changeRate *
TS * (tauTarget - tauOriginal);
347 spaceHeadwayIncrement = changeRate *
TS * addGapTarget;
349 if (referenceVeh !=
nullptr) {
359 if (referenceVeh !=
nullptr) {
362 referenceVeh =
nullptr;
397 GapControlState::init();
402 GapControlState::cleanup();
407 mySpeedAdaptationStarted =
true;
408 mySpeedTimeLine = speedTimeLine;
413 if (myGapControlState ==
nullptr) {
414 myGapControlState = std::make_shared<GapControlState>();
417 myGapControlState->activate(originalTau, newTimeHeadway, newSpaceHeadway, duration, changeRate, maxDecel, refVeh);
422 if (myGapControlState !=
nullptr && myGapControlState->active) {
423 myGapControlState->deactivate();
429 myLaneTimeLine = laneTimeLine;
435 for (
auto& item : myLaneTimeLine) {
436 item.second += indexShift;
448 return (1 * myConsiderSafeVelocity +
449 2 * myConsiderMaxAcceleration +
450 4 * myConsiderMaxDeceleration +
451 8 * myRespectJunctionPriority +
452 16 * myEmergencyBrakeRedLight +
453 32 * !myRespectJunctionLeaderPriority +
454 64 * !myConsiderSpeedLimit
461 return (1 * myStrategicLC +
462 4 * myCooperativeLC +
464 64 * myRightDriveLC +
465 256 * myTraciLaneChangePriority +
472 for (std::vector<std::pair<SUMOTime, int>>::iterator i = myLaneTimeLine.begin(); i != myLaneTimeLine.end(); ++i) {
476 duration -= i->first;
484 if (!myLaneTimeLine.empty()) {
485 return myLaneTimeLine.back().first;
495 while (mySpeedTimeLine.size() == 1 || (mySpeedTimeLine.size() > 1 && currentTime > mySpeedTimeLine[1].first)) {
496 mySpeedTimeLine.erase(mySpeedTimeLine.begin());
499 if (!(mySpeedTimeLine.size() < 2 || currentTime < mySpeedTimeLine[0].first)) {
501 if (!mySpeedAdaptationStarted) {
502 mySpeedTimeLine[0].second = speed;
503 mySpeedAdaptationStarted =
true;
506 const double td =
MIN2(1.0,
STEPS2TIME(currentTime - mySpeedTimeLine[0].first) /
MAX2(
TS,
STEPS2TIME(mySpeedTimeLine[1].first - mySpeedTimeLine[0].first)));
508 speed = mySpeedTimeLine[0].second - (mySpeedTimeLine[0].second - mySpeedTimeLine[1].second) * td;
509 if (myConsiderSafeVelocity) {
510 speed =
MIN2(speed, vSafe);
512 if (myConsiderMaxAcceleration) {
513 speed =
MIN2(speed, vMax);
515 if (myConsiderMaxDeceleration) {
516 speed =
MAX2(speed, vMin);
526 std::cout << currentTime <<
" Influencer::gapControlSpeed(): speed=" << speed
527 <<
", vSafe=" << vSafe
533 double gapControlSpeed = speed;
534 if (myGapControlState !=
nullptr && myGapControlState->active) {
536 const double currentSpeed = veh->
getSpeed();
538 assert(msVeh !=
nullptr);
539 const double desiredTargetTimeSpacing = myGapControlState->tauTarget * currentSpeed;
540 std::pair<const MSVehicle*, double> leaderInfo;
541 if (myGapControlState->referenceVeh ==
nullptr) {
544 leaderInfo = msVeh->
getLeader(
MAX2(desiredTargetTimeSpacing, myGapControlState->addGapCurrent) +
MAX2(brakeGap, 20.0));
547 std::cout <<
" --- no refVeh; myGapControlState->addGapCurrent: " << myGapControlState->addGapCurrent <<
", brakeGap: " << brakeGap <<
" in simstep: " <<
SIMSTEP << std::endl;
552 const MSVehicle* leader = myGapControlState->referenceVeh;
560 if (dist < -100000) {
562 std::cout <<
" Ego and reference vehicle are not in CF relation..." << std::endl;
564 std::cout <<
" Reference vehicle is behind ego..." << std::endl;
571 const double fakeDist =
MAX2(0.0, leaderInfo.second - myGapControlState->addGapCurrent);
574 const double desiredCurrentSpacing = myGapControlState->tauCurrent * currentSpeed;
575 std::cout <<
" Gap control active:"
576 <<
" currentSpeed=" << currentSpeed
577 <<
", desiredTargetTimeSpacing=" << desiredTargetTimeSpacing
578 <<
", desiredCurrentSpacing=" << desiredCurrentSpacing
579 <<
", leader=" << (leaderInfo.first ==
nullptr ?
"NULL" : leaderInfo.first->getID())
580 <<
", dist=" << leaderInfo.second
581 <<
", fakeDist=" << fakeDist
582 <<
",\n tauOriginal=" << myGapControlState->tauOriginal
583 <<
", tauTarget=" << myGapControlState->tauTarget
584 <<
", tauCurrent=" << myGapControlState->tauCurrent
588 if (leaderInfo.first !=
nullptr) {
589 if (myGapControlState->prevLeader !=
nullptr && myGapControlState->prevLeader != leaderInfo.first) {
593 myGapControlState->prevLeader = leaderInfo.first;
599 gapControlSpeed =
MIN2(gapControlSpeed,
600 cfm->
followSpeed(msVeh, currentSpeed, fakeDist, leaderInfo.first->
getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first));
604 std::cout <<
" -> gapControlSpeed=" << gapControlSpeed;
605 if (myGapControlState->maxDecel > 0) {
606 std::cout <<
", with maxDecel bound: " <<
MAX2(gapControlSpeed, currentSpeed -
TS * myGapControlState->maxDecel);
608 std::cout << std::endl;
611 if (myGapControlState->maxDecel > 0) {
612 gapControlSpeed =
MAX2(gapControlSpeed, currentSpeed -
TS * myGapControlState->maxDecel);
619 if (myGapControlState->lastUpdate < currentTime) {
622 std::cout <<
" Updating GapControlState." << std::endl;
625 if (myGapControlState->tauCurrent == myGapControlState->tauTarget && myGapControlState->addGapCurrent == myGapControlState->addGapTarget) {
626 if (!myGapControlState->gapAttained) {
628 myGapControlState->gapAttained = leaderInfo.first ==
nullptr || leaderInfo.second >
MAX2(desiredTargetTimeSpacing, myGapControlState->addGapTarget) - POSITION_EPS;
631 if (myGapControlState->gapAttained) {
632 std::cout <<
" Target gap was established." << std::endl;
638 myGapControlState->remainingDuration -=
TS;
641 std::cout <<
" Gap control remaining duration: " << myGapControlState->remainingDuration << std::endl;
644 if (myGapControlState->remainingDuration <= 0) {
647 std::cout <<
" Gap control duration expired, deactivating control." << std::endl;
651 myGapControlState->deactivate();
656 myGapControlState->tauCurrent =
MIN2(myGapControlState->tauCurrent + myGapControlState->timeHeadwayIncrement, myGapControlState->tauTarget);
657 myGapControlState->addGapCurrent =
MIN2(myGapControlState->addGapCurrent + myGapControlState->spaceHeadwayIncrement, myGapControlState->addGapTarget);
660 if (myConsiderSafeVelocity) {
661 gapControlSpeed =
MIN2(gapControlSpeed, vSafe);
663 if (myConsiderMaxAcceleration) {
664 gapControlSpeed =
MIN2(gapControlSpeed, vMax);
666 if (myConsiderMaxDeceleration) {
667 gapControlSpeed =
MAX2(gapControlSpeed, vMin);
669 return MIN2(speed, gapControlSpeed);
677 return myOriginalSpeed;
682 myOriginalSpeed = speed;
689 while (myLaneTimeLine.size() == 1 || (myLaneTimeLine.size() > 1 && currentTime > myLaneTimeLine[1].first)) {
690 myLaneTimeLine.erase(myLaneTimeLine.begin());
694 if (myLaneTimeLine.size() >= 2 && currentTime >= myLaneTimeLine[0].first) {
695 const int destinationLaneIndex = myLaneTimeLine[1].second;
696 if (destinationLaneIndex < (
int)currentEdge.
getLanes().size()) {
697 if (currentLaneIndex > destinationLaneIndex) {
699 }
else if (currentLaneIndex < destinationLaneIndex) {
704 }
else if (currentEdge.
getLanes().back()->getOpposite() !=
nullptr) {
713 if ((state &
LCA_TRACI) != 0 && myLatDist != 0) {
722 mode = myStrategicLC;
724 mode = myCooperativeLC;
726 mode = mySpeedGainLC;
728 mode = myRightDriveLC;
738 state &= ~LCA_WANTS_LANECHANGE_OR_STAY;
739 state &= ~LCA_URGENT;
742 state &= ~LCA_CHANGE_REASONS |
LCA_TRACI;
750 state &= ~LCA_WANTS_LANECHANGE_OR_STAY;
751 state &= ~LCA_URGENT;
771 switch (changeRequest) {
787 assert(myLaneTimeLine.size() >= 2);
788 assert(currentTime >= myLaneTimeLine[0].first);
789 return STEPS2TIME(myLaneTimeLine[1].first - currentTime);
795 myConsiderSafeVelocity = ((speedMode & 1) != 0);
796 myConsiderMaxAcceleration = ((speedMode & 2) != 0);
797 myConsiderMaxDeceleration = ((speedMode & 4) != 0);
798 myRespectJunctionPriority = ((speedMode & 8) != 0);
799 myEmergencyBrakeRedLight = ((speedMode & 16) != 0);
800 myRespectJunctionLeaderPriority = ((speedMode & 32) == 0);
801 myConsiderSpeedLimit = ((speedMode & 64) == 0);
818 myRemoteXYPos = xyPos;
821 myRemotePosLat = posLat;
822 myRemoteAngle = angle;
823 myRemoteEdgeOffset = edgeOffset;
824 myRemoteRoute = route;
825 myLastRemoteAccess = t;
837 return myLastRemoteAccess >= t -
TIME2STEPS(10);
843 if (myRemoteRoute.size() != 0 && myRemoteRoute != v->
getRoute().
getEdges()) {
846#ifdef DEBUG_REMOTECONTROL
859 const bool wasOnRoad = v->
isOnRoad();
860 const bool withinLane = myRemoteLane !=
nullptr && fabs(myRemotePosLat) < 0.5 * (myRemoteLane->getWidth() + v->
getVehicleType().
getWidth());
861 const bool keepLane = wasOnRoad && v->
getLane() == myRemoteLane;
862 if (v->
isOnRoad() && !(keepLane && withinLane)) {
863 if (myRemoteLane !=
nullptr && &v->
getLane()->
getEdge() == &myRemoteLane->getEdge()) {
870 if (myRemoteRoute.size() != 0 && myRemoteRoute != v->
getRoute().
getEdges()) {
872#ifdef DEBUG_REMOTECONTROL
873 std::cout <<
SIMSTEP <<
" postProcessRemoteControl veh=" << v->
getID()
877 <<
" newRoute=" <<
toString(myRemoteRoute)
878 <<
" newRouteEdge=" << myRemoteRoute[myRemoteEdgeOffset]->getID()
884 myRemoteRoute.clear();
887 if (myRemoteLane !=
nullptr && myRemotePos > myRemoteLane->getLength()) {
888 myRemotePos = myRemoteLane->getLength();
890 if (myRemoteLane !=
nullptr && withinLane) {
896 if (needFurtherUpdate) {
906 myRemoteLane->forceVehicleInsertion(v, myRemotePos, notify, myRemotePosLat);
913 myRemoteLane->requireCollisionCheck();
941 if (myRemoteLane !=
nullptr) {
947 if (distAlongRoute != std::numeric_limits<double>::max()) {
948 dist = distAlongRoute;
952 const double minSpeed = myConsiderMaxDeceleration ?
954 const double maxSpeed = (myRemoteLane !=
nullptr
955 ? myRemoteLane->getVehicleMaxSpeed(veh)
966 if (myRemoteLane ==
nullptr) {
976 if (dist == std::numeric_limits<double>::max()) {
980 WRITE_WARNINGF(
TL(
"Vehicle '%' moved by TraCI from % to % (dist %) with implied speed of % (exceeding maximum speed %). time=%."),
1046 further->resetPartialOccupation(
this);
1047 if (further->getBidiLane() !=
nullptr
1048 && (!
isRailway(
getVClass()) || (further->getPermissions() & ~SVC_RAIL_CLASSES) != 0)) {
1049 further->getBidiLane()->resetPartialOccupation(
this);
1066#ifdef DEBUG_ACTIONSTEPS
1068 std::cout <<
SIMTIME <<
" Removing vehicle '" <<
getID() <<
"' (reason: " <<
toString(reason) <<
")" << std::endl;
1093 if (!(*myCurrEdge)->isTazConnector()) {
1096 if ((*myCurrEdge)->getDepartLane(*
this) ==
nullptr) {
1097 msg =
"Invalid departLane definition for vehicle '" +
getID() +
"'.";
1107 msg =
"Vehicle '" +
getID() +
"' is not allowed to depart on any lane of edge '" + (*myCurrEdge)->
getID() +
"'.";
1113 msg =
"Departure speed for vehicle '" +
getID() +
"' is too high for the vehicle type '" +
myType->
getID() +
"'.";
1144 updateBestLanes(
true, onInit ? (*myCurrEdge)->getLanes().front() : 0);
1147 myStopDist = std::numeric_limits<double>::max();
1165 if (!rem->first->notifyMove(*
this, oldPos + rem->second, newPos + rem->second,
MAX2(0., newSpeed))) {
1167 if (myTraceMoveReminders) {
1168 traceMoveReminder(
"notifyMove", rem->first, rem->second,
false);
1174 if (myTraceMoveReminders) {
1175 traceMoveReminder(
"notifyMove", rem->first, rem->second,
true);
1194 rem.first->notifyIdle(*
this);
1199 rem->notifyIdle(*
this);
1210 rem.second += oldLaneLength;
1214 if (myTraceMoveReminders) {
1215 traceMoveReminder(
"adaptedPos", rem.first, rem.second,
true);
1229 return getStops().begin()->parkingarea->getVehicleSlope(*
this);
1237 int furtherIndex = 0;
1238 while (centerPos < 0 && furtherIndex < (
int)
myFurtherLanes.size()) {
1278 if (
myStops.begin()->parkingarea !=
nullptr) {
1279 return myStops.begin()->parkingarea->getVehiclePosition(*
this);
1289 if (offset == 0. && !changingLanes) {
1312 double relOffset = fabs(posLat) / centerDist;
1313 double newZ = (1 - relOffset) * pos.
z() + relOffset * shadowPos.
z();
1324 return MAX2(0.0, result);
1342 auto nextBestLane = bestLanes.begin();
1347 bool success =
true;
1349 while (offset > 0) {
1354 lane = lane->
getLinkCont()[0]->getViaLaneOrLane();
1356 if (lane ==
nullptr) {
1366 while (nextBestLane != bestLanes.end() && *nextBestLane ==
nullptr) {
1371 assert(lane == *nextBestLane);
1375 assert(nextBestLane == bestLanes.end() || *nextBestLane != 0);
1376 if (nextBestLane == bestLanes.end()) {
1381 assert(link !=
nullptr);
1412 int furtherIndex = 0;
1421 offset += lastLength;
1431ConstMSEdgeVector::const_iterator
1457 return angleDiff == 0
1458 ? std::numeric_limits<double>::max()
1467 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
" setAngle(" << angle <<
") straightenFurther=" << straightenFurther << std::endl;
1476 if (link !=
nullptr) {
1491 const bool newActionStepLength = actionStepLengthMillisecs != previousActionStepLength;
1492 if (newActionStepLength) {
1522 if (
myStops.begin()->parkingarea !=
nullptr) {
1523 return myStops.begin()->parkingarea->getVehicleAngle(*
this);
1560 double result = (p1 != p2 ? p2.
angleTo2D(p1) :
1627 ||
myStops.front().pars.breakDown || (
myStops.front().getSpeed() > 0
1639 return myStops.front().duration;
1667 return currentVelocity;
1672 std::cout <<
"\nPROCESS_NEXT_STOP\n" <<
SIMTIME <<
" vehicle '" <<
getID() <<
"'" << std::endl;
1682 if (stop.
busstop !=
nullptr) {
1701 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' reached stop.\n"
1735 if (taxiDevice !=
nullptr) {
1739 return currentVelocity;
1745 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' resumes from stopping." << std::endl;
1769 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' registers as waiting for person." << std::endl;
1784 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' registers as waiting for container." << std::endl;
1807 return currentVelocity;
1823 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' hasn't reached next stop." << std::endl;
1833 if (noExits && noEntries) {
1844 bool fitsOnStoppingPlace =
true;
1846 if (stop.
busstop !=
nullptr) {
1856 fitsOnStoppingPlace =
false;
1860 if (rem->isParkingRerouter()) {
1864 if (
myStops.empty() ||
myStops.front().parkingarea != oldParkingArea) {
1866 return currentVelocity;
1869 fitsOnStoppingPlace =
false;
1871 fitsOnStoppingPlace =
false;
1884 std::cout <<
" pos=" <<
myState.
pos() <<
" speed=" << currentVelocity <<
" targetPos=" << targetPos <<
" fits=" << fitsOnStoppingPlace
1885 <<
" reachedThresh=" << reachedThreshold
1886 <<
" posReached=" << posReached
1903 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' reached next stop." << std::endl;
1930 if (stop.
busstop !=
nullptr) {
1956 if (splitVeh ==
nullptr) {
1987 return currentVelocity;
2010 bool unregister =
false;
2040 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' unregisters as waiting for transportable." << std::endl;
2055 myStops.begin()->joinTriggered =
false;
2074 double skippedLaneLengths = 0;
2089 std::string warn =
TL(
"Cannot join vehicle '%' to vehicle '%' due to incompatible routes. time=%.");
2096 std::string warn =
TL(
"Cannot join vehicle '%' to vehicle '%' due to incompatible routes. time=%.");
2109 myStops.begin()->joinTriggered =
false;
2146 if (timeSinceLastAction == 0) {
2148 timeSinceLastAction = oldActionStepLength;
2150 if (timeSinceLastAction >= newActionStepLength) {
2154 SUMOTime timeUntilNextAction = newActionStepLength - timeSinceLastAction;
2163#ifdef DEBUG_PLAN_MOVE
2169 <<
" veh=" <<
getID()
2185#ifdef DEBUG_ACTIONSTEPS
2187 std::cout <<
STEPS2TIME(t) <<
" vehicle '" <<
getID() <<
"' skips action." << std::endl;
2195#ifdef DEBUG_ACTIONSTEPS
2197 std::cout <<
STEPS2TIME(t) <<
" vehicle = '" <<
getID() <<
"' takes action." << std::endl;
2205#ifdef DEBUG_PLAN_MOVE
2207 DriveItemVector::iterator i;
2210 <<
" vPass=" << (*i).myVLinkPass
2211 <<
" vWait=" << (*i).myVLinkWait
2212 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
2213 <<
" request=" << (*i).mySetRequest
2242 const bool result = (
overlap > POSITION_EPS
2259#ifdef DEBUG_PLAN_MOVE
2267 <<
" result=" << result <<
"\n";
2278 newStopDist = std::numeric_limits<double>::max();
2288 double lateralShift = 0;
2292 laneMaxV =
MIN2(laneMaxV, l->getVehicleMaxSpeed(
this, maxVD));
2293#ifdef DEBUG_PLAN_MOVE
2295 std::cout <<
" laneMaxV=" << laneMaxV <<
" lane=" << l->getID() <<
"\n";
2301 laneMaxV =
MAX2(laneMaxV, vMinComfortable);
2303 laneMaxV = std::numeric_limits<double>::max();
2317 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" speedBeforeTraci=" << v;
2323 std::cout <<
" influencedSpeed=" << v;
2329 std::cout <<
" gapControlSpeed=" << v <<
"\n";
2337#ifdef DEBUG_PLAN_MOVE
2339 std::cout <<
" dist=" << dist <<
" bestLaneConts=" <<
toString(bestLaneConts)
2340 <<
"\n maxV=" << maxV <<
" laneMaxV=" << laneMaxV <<
" v=" << v <<
"\n";
2343 assert(bestLaneConts.size() > 0);
2344 bool hadNonInternal =
false;
2347 nextTurn.first = seen;
2348 nextTurn.second =
nullptr;
2350 double seenNonInternal = 0;
2355 bool slowedDownForMinor =
false;
2356 double mustSeeBeforeReversal = 0;
2361 bool foundRailSignal = !
isRail();
2362 bool planningToStop =
false;
2363#ifdef PARALLEL_STOPWATCH
2369 if (v > vMinComfortable &&
hasStops() &&
myStops.front().pars.arrival >= 0 && sfp > 0
2371 && !
myStops.front().reached) {
2373 v =
MIN2(v, vSlowDown);
2375 auto stopIt =
myStops.begin();
2386 const double gapOffset = leaderLane ==
myLane ? 0 : seen - leaderLane->
getLength();
2392 if (cand.first != 0) {
2393 if ((cand.first->myLaneChangeModel->isOpposite() && cand.first->getLaneChangeModel().getShadowLane() != leaderLane)
2394 || (!cand.first->myLaneChangeModel->isOpposite() && cand.first->getLaneChangeModel().getShadowLane() == leaderLane)) {
2396 oppositeLeaders.
addLeader(cand.first, cand.second + gapOffset -
getVehicleType().getMinGap() + cand.first->getVehicleType().
getMinGap() - cand.first->getVehicleType().getLength());
2399 const bool assumeStopped = cand.first->isStopped() || cand.first->getWaitingSeconds() > 1;
2400 const double predMaxDist = cand.first->getSpeed() + (assumeStopped ? 0 : cand.first->getCarFollowModel().getMaxAccel()) * minTimeToLeaveLane;
2401 if (cand.second >= 0 && (cand.second - v * minTimeToLeaveLane - predMaxDist < 0 || assumeStopped)) {
2407#ifdef DEBUG_PLAN_MOVE
2409 std::cout <<
" leaderLane=" << leaderLane->
getID() <<
" gapOffset=" << gapOffset <<
" minTimeToLeaveLane=" << minTimeToLeaveLane
2410 <<
" cands=" << cands.
toString() <<
" oppositeLeaders=" << oppositeLeaders.
toString() <<
"\n";
2418 const bool outsideLeft = leftOL > lane->
getWidth();
2419#ifdef DEBUG_PLAN_MOVE
2421 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" lane=" << lane->
getID() <<
" rightOL=" << rightOL <<
" leftOL=" << leftOL <<
"\n";
2424 if (rightOL < 0 || outsideLeft) {
2428 int sublaneOffset = 0;
2435#ifdef DEBUG_PLAN_MOVE
2437 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" lane=" << lane->
getID() <<
" sublaneOffset=" << sublaneOffset <<
" outsideLeft=" << outsideLeft <<
"\n";
2442 && ((!outsideLeft && cand->getLeftSideOnEdge() < 0)
2443 || (outsideLeft && cand->getLeftSideOnEdge() > lane->
getEdge().
getWidth()))) {
2445#ifdef DEBUG_PLAN_MOVE
2447 std::cout <<
" outsideLeader=" << cand->getID() <<
" ahead=" << outsideLeaders.
toString() <<
"\n";
2454 adaptToLeaders(outsideLeaders, lateralShift, seen, lastLink, leaderLane, v, vLinkPass);
2458 adaptToLeaders(ahead, lateralShift, seen, lastLink, leaderLane, v, vLinkPass);
2460 if (lastLink !=
nullptr) {
2463#ifdef DEBUG_PLAN_MOVE
2465 std::cout <<
"\nv = " << v <<
"\n";
2473 if (shadowLane !=
nullptr
2487#ifdef DEBUG_PLAN_MOVE
2489 std::cout <<
SIMTIME <<
" opposite veh=" <<
getID() <<
" shadowLane=" << shadowLane->
getID() <<
" latOffset=" << latOffset <<
" shadowLeaders=" << shadowLeaders.
toString() <<
"\n";
2497 adaptToLeaders(shadowLeaders, latOffset, seen - turningDifference, lastLink, shadowLane, v, vLinkPass);
2502 const double latOffset = 0;
2503#ifdef DEBUG_PLAN_MOVE
2505 std::cout <<
SIMTIME <<
" opposite shadows veh=" <<
getID() <<
" shadowLane=" << shadowLane->
getID()
2506 <<
" latOffset=" << latOffset <<
" shadowLeaders=" << shadowLeaders.
toString() <<
"\n";
2510#ifdef DEBUG_PLAN_MOVE
2512 std::cout <<
" shadowLeadersFixed=" << shadowLeaders.
toString() <<
"\n";
2521 const double relativePos = lane->
getLength() - seen;
2522#ifdef DEBUG_PLAN_MOVE
2524 std::cout <<
SIMTIME <<
" adapt to pedestrians on lane=" << lane->
getID() <<
" relPos=" << relativePos <<
"\n";
2530 if (leader.first != 0) {
2532 v =
MIN2(v, stopSpeed);
2533#ifdef DEBUG_PLAN_MOVE
2535 std::cout <<
SIMTIME <<
" pedLeader=" << leader.first->getID() <<
" dist=" << leader.second <<
" v=" << v <<
"\n";
2544 const double relativePos = seen;
2545#ifdef DEBUG_PLAN_MOVE
2547 std::cout <<
SIMTIME <<
" adapt to pedestrians on lane=" << lane->
getID() <<
" relPos=" << relativePos <<
"\n";
2554 if (leader.first != 0) {
2556 v =
MIN2(v, stopSpeed);
2557#ifdef DEBUG_PLAN_MOVE
2559 std::cout <<
SIMTIME <<
" pedLeader=" << leader.first->getID() <<
" dist=" << leader.second <<
" v=" << v <<
"\n";
2568#ifdef DEBUG_PLAN_MOVE
2570 std::cout <<
SIMTIME <<
" applying cooperativeHelpSpeed v=" << vHelp <<
"\n";
2577 bool foundRealStop =
false;
2578 while (stopIt !=
myStops.end()
2579 && ((&stopIt->lane->getEdge() == &lane->
getEdge())
2580 || (stopIt->isOpposite && stopIt->lane->getEdge().getOppositeEdge() == &lane->
getEdge()))
2583 double stopDist = std::numeric_limits<double>::max();
2584 const MSStop& stop = *stopIt;
2585 const bool isFirstStop = stopIt ==
myStops.begin();
2589 bool isWaypoint = stop.
getSpeed() > 0;
2590 double endPos = stop.
getEndPos(*
this) + NUMERICAL_EPS;
2595 }
else if (isWaypoint && !stop.
reached) {
2598 stopDist = seen + endPos - lane->
getLength();
2601 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" stopDist=" << stopDist <<
" stopLane=" << stop.
lane->
getID() <<
" stopEndPos=" << endPos <<
"\n";
2604 double stopSpeed = laneMaxV;
2606 bool waypointWithStop =
false;
2619 if (stop.
getUntil() > t + time2end) {
2621 double distToEnd = stopDist;
2626 waypointWithStop =
true;
2628 const_cast<MSStop&
>(stop).waypointWithStop =
true;
2635 stopDist = std::numeric_limits<double>::max();
2642 if (lastLink !=
nullptr) {
2650 stopSpeed =
MAX2(stopSpeed, vMinComfortable);
2652 std::vector<std::pair<SUMOTime, double> > speedTimeLine;
2654 speedTimeLine.push_back(std::make_pair(
SIMSTEP +
DELTA_T, stopSpeed));
2657 if (lastLink !=
nullptr) {
2663 newStopSpeed =
MIN2(newStopSpeed, stopSpeed);
2666 newStopSpeed = std::numeric_limits<double>::max();
2668 v =
MIN2(v, stopSpeed);
2670 std::vector<MSLink*>::const_iterator exitLink =
MSLane::succLinkSec(*
this, view + 1, *lane, bestLaneConts);
2672 bool dummySetRequest;
2673 double dummyVLinkWait;
2677#ifdef DEBUG_PLAN_MOVE
2679 std::cout <<
"\n" <<
SIMTIME <<
" next stop: distance = " << stopDist <<
" requires stopSpeed = " << stopSpeed <<
"\n";
2684 newStopDist = stopDist;
2688 planningToStop =
true;
2690 lfLinks.emplace_back(v, stopDist);
2691 foundRealStop =
true;
2698 if (foundRealStop) {
2704 std::vector<MSLink*>::const_iterator link =
MSLane::succLinkSec(*
this, view + 1, *lane, bestLaneConts);
2707 const int currentIndex = lane->
getIndex();
2708 const MSLane* bestJump =
nullptr;
2710 if (preb.allowsContinuation &&
2711 (bestJump ==
nullptr
2712 || abs(currentIndex - preb.lane->getIndex()) < abs(currentIndex - bestJump->
getIndex()))) {
2713 bestJump = preb.lane;
2716 if (bestJump !=
nullptr) {
2718 for (
auto cand_it = bestJump->
getLinkCont().begin(); cand_it != bestJump->
getLinkCont().end(); cand_it++) {
2719 if (&(*cand_it)->getLane()->getEdge() == nextEdge) {
2728 if (!encounteredTurn) {
2736 nextTurn.first = seen;
2737 nextTurn.second = *link;
2738 encounteredTurn =
true;
2739#ifdef DEBUG_NEXT_TURN
2742 <<
" at " << nextTurn.first <<
"m." << std::endl;
2757 const double va =
MAX2(NUMERICAL_EPS, cfModel.
freeSpeed(
this,
getSpeed(), distToArrival, arrivalSpeed));
2759 if (lastLink !=
nullptr) {
2768 || (opposite && (*link)->getViaLaneOrLane()->getParallelOpposite() ==
nullptr
2771 if (lastLink !=
nullptr) {
2779#ifdef DEBUG_PLAN_MOVE
2781 std::cout <<
" braking for link end lane=" << lane->
getID() <<
" seen=" << seen
2787 lfLinks.emplace_back(v, seen);
2791 lateralShift += (*link)->getLateralShift();
2792 const bool yellowOrRed = (*link)->haveRed() || (*link)->haveYellow();
2801 double laneStopOffset;
2806 const bool canBrakeBeforeLaneEnd = seen >= brakeDist;
2810 laneStopOffset = majorStopOffset;
2811 }
else if ((*link)->havePriority()) {
2813 laneStopOffset =
MIN2((*link)->getFoeVisibilityDistance() - POSITION_EPS, majorStopOffset);
2817#ifdef DEBUG_PLAN_MOVE
2819 std::cout <<
" minorStopOffset=" << minorStopOffset <<
" distToFoePedCrossing=" << (*link)->getDistToFoePedCrossing() <<
"\n";
2828 laneStopOffset =
MIN2((*link)->getFoeVisibilityDistance() - POSITION_EPS, minorStopOffset);
2830#ifdef DEBUG_PLAN_MOVE
2832 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" desired stopOffset on lane '" << lane->
getID() <<
"' is " << laneStopOffset <<
"\n";
2835 if (canBrakeBeforeLaneEnd) {
2837 laneStopOffset =
MIN2(laneStopOffset, seen - brakeDist);
2839 laneStopOffset =
MAX2(POSITION_EPS, laneStopOffset);
2840 double stopDist =
MAX2(0., seen - laneStopOffset);
2844 stopDist = std::numeric_limits<double>::max();
2846 if (newStopDist != std::numeric_limits<double>::max()) {
2847 stopDist =
MAX2(stopDist, newStopDist);
2849#ifdef DEBUG_PLAN_MOVE
2851 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" effective stopOffset on lane '" << lane->
getID()
2852 <<
"' is " << laneStopOffset <<
" (-> stopDist=" << stopDist <<
")" << std::endl;
2861 mustSeeBeforeReversal = 2 * seen +
getLength();
2863 v =
MIN2(v, vMustReverse);
2866 foundRailSignal |= ((*link)->getTLLogic() !=
nullptr
2871 if (!planningToStop) {
2873 bool canReverseEventually =
false;
2874 const double vReverse =
checkReversal(canReverseEventually, laneMaxV, seen);
2875 v =
MIN2(v, vReverse);
2876#ifdef DEBUG_PLAN_MOVE
2878 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" canReverseEventually=" << canReverseEventually <<
" v=" << v <<
"\n";
2892 assert(timeRemaining != 0);
2895 (seen - POSITION_EPS) / timeRemaining);
2896#ifdef DEBUG_PLAN_MOVE
2898 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" slowing down to finish continuous change before"
2899 <<
" link=" << (*link)->getViaLaneOrLane()->getID()
2900 <<
" timeRemaining=" << timeRemaining
2913 const bool abortRequestAfterMinor = slowedDownForMinor && (*link)->getInternalLaneBefore() ==
nullptr;
2915 bool setRequest = (v >
NUMERICAL_EPS_SPEED && !abortRequestAfterMinor) || (leavingCurrentIntersection);
2918 double vLinkWait =
MIN2(v, stopSpeed);
2919#ifdef DEBUG_PLAN_MOVE
2922 <<
" stopDist=" << stopDist
2923 <<
" stopDecel=" << stopDecel
2924 <<
" vLinkWait=" << vLinkWait
2925 <<
" brakeDist=" << brakeDist
2927 <<
" leaveIntersection=" << leavingCurrentIntersection
2928 <<
" setRequest=" << setRequest
2937 if (yellowOrRed && canBrakeBeforeStopLine && !
ignoreRed(*link, canBrakeBeforeStopLine) && seen >= mustSeeBeforeReversal) {
2944 lfLinks.push_back(
DriveProcessItem(*link, v, vLinkWait,
false, arrivalTime, vLinkWait, 0, seen, -1));
2955#ifdef DEBUG_PLAN_MOVE
2957 <<
" ignoreRed spent=" <<
STEPS2TIME(t - (*link)->getLastStateChange())
2958 <<
" redSpeed=" << redSpeed
2967 if (lastLink !=
nullptr) {
2970 double arrivalSpeed = vLinkPass;
2976 const double visibilityDistance = (*link)->getFoeVisibilityDistance();
2977 const double determinedFoePresence = seen <= visibilityDistance;
2982#ifdef DEBUG_PLAN_MOVE
2984 std::cout <<
" approaching link=" << (*link)->getViaLaneOrLane()->getID() <<
" prio=" << (*link)->havePriority() <<
" seen=" << seen <<
" visibilityDistance=" << visibilityDistance <<
" brakeDist=" << brakeDist <<
"\n";
2988 const bool couldBrakeForMinor = !(*link)->havePriority() && brakeDist < seen && !(*link)->lastWasContMajor();
2989 if (couldBrakeForMinor && !determinedFoePresence) {
2994 arrivalSpeed =
MIN2(vLinkPass, maxArrivalSpeed);
2995 slowedDownForMinor =
true;
2996#ifdef DEBUG_PLAN_MOVE
2998 std::cout <<
" slowedDownForMinor maxSpeedAtVisDist=" << maxSpeedAtVisibilityDist <<
" maxArrivalSpeed=" << maxArrivalSpeed <<
" arrivalSpeed=" << arrivalSpeed <<
"\n";
3004 std::pair<const SUMOVehicle*, const MSLink*> blocker = (*link)->getFirstApproachingFoe(*link);
3007 while (blocker.second !=
nullptr && blocker.second != *link && n > 0) {
3008 blocker = blocker.second->getFirstApproachingFoe(*link);
3016 if (blocker.second == *link) {
3026 if (couldBrakeForMinor && determinedFoePresence && (*link)->getLane()->getEdge().isRoundabout()) {
3027 const bool wasOpened = (*link)->opened(arrivalTime, arrivalSpeed, arrivalSpeed,
3031 nullptr,
false,
this);
3033 slowedDownForMinor =
true;
3035#ifdef DEBUG_PLAN_MOVE
3037 std::cout <<
" slowedDownForMinor at roundabout=" << (!wasOpened) <<
"\n";
3044 double arrivalSpeedBraking = 0;
3045 const double bGap = cfModel.
brakeGap(v);
3046 if (seen < bGap && !
isStopped() && !planningToStop) {
3051 arrivalSpeedBraking =
MIN2(arrivalSpeedBraking, arrivalSpeed);
3060 const double estimatedLeaveSpeed =
MIN2((*link)->getViaLaneOrLane()->getVehicleMaxSpeed(
this, maxVD),
3063 arrivalTime, arrivalSpeed,
3064 arrivalSpeedBraking,
3065 seen, estimatedLeaveSpeed));
3066 if ((*link)->getViaLane() ==
nullptr) {
3067 hadNonInternal =
true;
3070#ifdef DEBUG_PLAN_MOVE
3072 std::cout <<
" checkAbort setRequest=" << setRequest <<
" v=" << v <<
" seen=" << seen <<
" dist=" << dist
3073 <<
" seenNonInternal=" << seenNonInternal
3074 <<
" seenInternal=" << seenInternal <<
" length=" << vehicleLength <<
"\n";
3078 if ((!setRequest || v <= 0 || seen > dist) && hadNonInternal && seenNonInternal >
MAX2(vehicleLength *
CRLL_LOOK_AHEAD, vehicleLength + seenInternal) && foundRailSignal) {
3082 lane = (*link)->getViaLaneOrLane();
3085 laneMaxV = std::numeric_limits<double>::max();
3091 const double va =
MAX2(cfModel.
freeSpeed(
this,
getSpeed(), seen, laneMaxV), vMinComfortable - NUMERICAL_EPS);
3093#ifdef DEBUG_PLAN_MOVE
3095 std::cout <<
" laneMaxV=" << laneMaxV <<
" freeSpeed=" << va <<
" v=" << v <<
"\n";
3105 if (leaderLane ==
nullptr) {
3112 lastLink = &lfLinks.back();
3121#ifdef PARALLEL_STOPWATCH
3145 const double s = timeDist.second;
3152 const double radicand = 4 * t * t * b * b - 8 * s * b;
3153 const double x = radicand >= 0 ? t * b - sqrt(radicand) * 0.5 : vSlowDownMin;
3154 double vSlowDown = x < vSlowDownMin ? vSlowDownMin : x;
3155#ifdef DEBUG_PLAN_MOVE
3157 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" ad=" << arrivalDelay <<
" t=" << t <<
" vsm=" << vSlowDownMin
3158 <<
" r=" << radicand <<
" vs=" << vSlowDown <<
"\n";
3192 const MSLane*
const lane,
double& v,
double& vLinkPass)
const {
3195 ahead.
getSubLanes(
this, latOffset, rightmost, leftmost);
3196#ifdef DEBUG_PLAN_MOVE
3198 <<
"\nADAPT_TO_LEADERS\nveh=" <<
getID()
3199 <<
" lane=" << lane->
getID()
3200 <<
" latOffset=" << latOffset
3201 <<
" rm=" << rightmost
3202 <<
" lm=" << leftmost
3217 for (
int sublane = rightmost; sublane <= leftmost; ++sublane) {
3219 if (pred !=
nullptr && pred !=
this) {
3222 double gap = (lastLink ==
nullptr
3225 bool oncoming =
false;
3229 gap = (lastLink ==
nullptr
3234 gap = (lastLink ==
nullptr
3243#ifdef DEBUG_PLAN_MOVE
3245 std::cout <<
" fixedGap=" << gap <<
" predMaxDist=" << predMaxDist <<
"\n";
3255#ifdef DEBUG_PLAN_MOVE
3257 std::cout <<
" pred=" << pred->
getID() <<
" predLane=" << pred->
getLane()->
getID() <<
" predPos=" << pred->
getPositionOnLane() <<
" gap=" << gap <<
" predBack=" << predBack <<
" seen=" << seen <<
" lane=" << lane->
getID() <<
" myLane=" <<
myLane->
getID() <<
" lastLink=" << (lastLink ==
nullptr ?
"NULL" : lastLink->
myLink->
getDescription()) <<
" oncoming=" << oncoming <<
"\n";
3260 if (oncoming && gap >= 0) {
3263 adaptToLeader(std::make_pair(pred, gap), seen, lastLink, v, vLinkPass);
3273 double& v,
double& vLinkPass)
const {
3276 ahead.
getSubLanes(
this, latOffset, rightmost, leftmost);
3277#ifdef DEBUG_PLAN_MOVE
3279 <<
"\nADAPT_TO_LEADERS_DISTANCE\nveh=" <<
getID()
3280 <<
" latOffset=" << latOffset
3281 <<
" rm=" << rightmost
3282 <<
" lm=" << leftmost
3286 for (
int sublane = rightmost; sublane <= leftmost; ++sublane) {
3289 if (pred !=
nullptr && pred !=
this) {
3290#ifdef DEBUG_PLAN_MOVE
3292 std::cout <<
" pred=" << pred->
getID() <<
" predLane=" << pred->
getLane()->
getID() <<
" predPos=" << pred->
getPositionOnLane() <<
" gap=" << predDist.second <<
"\n";
3305 double& v,
double& vLinkPass)
const {
3306 if (leaderInfo.first != 0) {
3308#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3310 std::cout <<
" foe ignored\n";
3316 double vsafeLeader = 0;
3318 vsafeLeader = -std::numeric_limits<double>::max();
3320 bool backOnRoute =
true;
3321 if (leaderInfo.second < 0 && lastLink !=
nullptr && lastLink->
myLink !=
nullptr) {
3322 backOnRoute =
false;
3327 if (leaderInfo.first->getBackLane() == current) {
3331 if (lane == current) {
3334 if (leaderInfo.first->getBackLane() == lane) {
3339#ifdef DEBUG_PLAN_MOVE
3341 std::cout <<
SIMTIME <<
" current=" << current->
getID() <<
" leaderBackLane=" << leaderInfo.first->getBackLane()->getID() <<
" backOnRoute=" << backOnRoute <<
"\n";
3345 double stopDist = seen - current->
getLength() - POSITION_EPS;
3354 vsafeLeader = cfModel.
followSpeed(
this,
getSpeed(), leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first);
3356 if (lastLink !=
nullptr) {
3359#ifdef DEBUG_PLAN_MOVE
3361 std::cout <<
" vlinkpass=" << lastLink->
myVLinkPass <<
" futureVSafe=" << futureVSafe <<
"\n";
3365 v =
MIN2(v, vsafeLeader);
3366 vLinkPass =
MIN2(vLinkPass, vsafeLeader);
3367#ifdef DEBUG_PLAN_MOVE
3371 <<
" veh=" <<
getID()
3372 <<
" lead=" << leaderInfo.first->getID()
3373 <<
" leadSpeed=" << leaderInfo.first->getSpeed()
3374 <<
" gap=" << leaderInfo.second
3375 <<
" leadLane=" << leaderInfo.first->getLane()->getID()
3376 <<
" predPos=" << leaderInfo.first->getPositionOnLane()
3379 <<
" vSafeLeader=" << vsafeLeader
3380 <<
" vLinkPass=" << vLinkPass
3390 const MSLane*
const lane,
double& v,
double& vLinkPass,
3391 double distToCrossing)
const {
3392 if (leaderInfo.first != 0) {
3394#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3396 std::cout <<
" junction foe ignored\n";
3402 double vsafeLeader = 0;
3404 vsafeLeader = -std::numeric_limits<double>::max();
3406 if (leaderInfo.second >= 0) {
3408 vsafeLeader = cfModel.
followSpeed(
this,
getSpeed(), leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first);
3411 vsafeLeader = cfModel.
insertionFollowSpeed(
this,
getSpeed(), leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first);
3413 }
else if (leaderInfo.first !=
this) {
3417#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3419 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" stopping before junction: lane=" << lane->
getID() <<
" seen=" << seen
3421 <<
" stopDist=" << seen - lane->
getLength() - POSITION_EPS
3422 <<
" vsafeLeader=" << vsafeLeader
3423 <<
" distToCrossing=" << distToCrossing
3428 if (distToCrossing >= 0) {
3431 if (leaderInfo.first ==
this) {
3433 const double vStopCrossing = cfModel.
stopSpeed(
this,
getSpeed(), distToCrossing);
3434 vsafeLeader = vStopCrossing;
3435#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3437 std::cout <<
" breaking for pedestrian distToCrossing=" << distToCrossing <<
" vStopCrossing=" << vStopCrossing <<
"\n";
3440 if (lastLink !=
nullptr) {
3443 }
else if (leaderInfo.second == -std::numeric_limits<double>::max()) {
3445#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3447 std::cout <<
" stop at crossing point for critical leader vStop=" << vStop <<
"\n";
3450 vsafeLeader =
MAX2(vsafeLeader, vStop);
3452 const double leaderDistToCrossing = distToCrossing - leaderInfo.second;
3460 vsafeLeader =
MAX2(vsafeLeader,
MIN2(v2, vStop));
3461#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3463 std::cout <<
" driving up to the crossing point (distToCrossing=" << distToCrossing <<
")"
3464 <<
" leaderPastCPTime=" << leaderPastCPTime
3465 <<
" vFinal=" << vFinal
3467 <<
" vStop=" << vStop
3468 <<
" vsafeLeader=" << vsafeLeader <<
"\n";
3473 if (lastLink !=
nullptr) {
3476 v =
MIN2(v, vsafeLeader);
3477 vLinkPass =
MIN2(vLinkPass, vsafeLeader);
3478#ifdef DEBUG_PLAN_MOVE
3482 <<
" veh=" <<
getID()
3483 <<
" lead=" << leaderInfo.first->getID()
3484 <<
" leadSpeed=" << leaderInfo.first->getSpeed()
3485 <<
" gap=" << leaderInfo.second
3486 <<
" leadLane=" << leaderInfo.first->getLane()->getID()
3487 <<
" predPos=" << leaderInfo.first->getPositionOnLane()
3489 <<
" lane=" << lane->
getID()
3491 <<
" dTC=" << distToCrossing
3493 <<
" vSafeLeader=" << vsafeLeader
3494 <<
" vLinkPass=" << vLinkPass
3504 double& v,
double& vLinkPass)
const {
3505 if (leaderInfo.first != 0) {
3507#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3509 std::cout <<
" oncoming foe ignored\n";
3515 const MSVehicle* lead = leaderInfo.first;
3520 const double gapSum = leaderBrakeGap + egoBrakeGap;
3524 double gap = leaderInfo.second;
3525 if (egoExit + leaderExit < gap) {
3526 gap -= egoExit + leaderExit;
3531 const double freeGap =
MAX2(0.0, gap - gapSum);
3532 const double splitGap =
MIN2(gap, gapSum);
3534 const double gapRatio = gapSum > 0 ? egoBrakeGap / gapSum : 0.5;
3535 const double vsafeLeader = cfModel.
stopSpeed(
this,
getSpeed(), splitGap * gapRatio + egoExit + 0.5 * freeGap);
3536 if (lastLink !=
nullptr) {
3539#ifdef DEBUG_PLAN_MOVE
3541 std::cout <<
" vlinkpass=" << lastLink->
myVLinkPass <<
" futureVSafe=" << futureVSafe <<
"\n";
3545 v =
MIN2(v, vsafeLeader);
3546 vLinkPass =
MIN2(vLinkPass, vsafeLeader);
3547#ifdef DEBUG_PLAN_MOVE
3551 <<
" veh=" <<
getID()
3552 <<
" oncomingLead=" << lead->
getID()
3553 <<
" leadSpeed=" << lead->
getSpeed()
3554 <<
" gap=" << leaderInfo.second
3556 <<
" gapRatio=" << gapRatio
3561 <<
" vSafeLeader=" << vsafeLeader
3562 <<
" vLinkPass=" << vLinkPass
3571 DriveProcessItem*
const lastLink,
double& v,
double& vLinkPass,
double& vLinkWait,
bool& setRequest)
const {
3574 checkLinkLeader(link, lane, seen, lastLink, v, vLinkPass, vLinkWait, setRequest);
3577 if (parallelLink !=
nullptr) {
3578 checkLinkLeader(parallelLink, lane, seen, lastLink, v, vLinkPass, vLinkWait, setRequest,
true);
3587 DriveProcessItem*
const lastLink,
double& v,
double& vLinkPass,
double& vLinkWait,
bool& setRequest,
3588 bool isShadowLink)
const {
3589#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3595#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3600 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
3602 const MSVehicle* leader = (*it).vehAndGap.first;
3603 if (leader ==
nullptr) {
3605#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3607 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" is blocked on link to " << link->
getViaLaneOrLane()->
getID() <<
" by pedestrian. dist=" << it->distToCrossing <<
"\n";
3612#ifdef DEBUG_PLAN_MOVE
3614 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" is ignoring pedestrian (jmIgnoreJunctionFoeProb)\n";
3619 adaptToJunctionLeader(std::make_pair(
this, -1), seen, lastLink, lane, v, vLinkPass, it->distToCrossing);
3623#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3625 std::cout <<
" aborting request\n";
3629 }
else if (
isLeader(link, leader, (*it).vehAndGap.second) || (*it).inTheWay()) {
3632#ifdef DEBUG_PLAN_MOVE
3634 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" is ignoring linkLeader=" << leader->
getID() <<
" (jmIgnoreJunctionFoeProb)\n";
3645 linkLeadersAhead.
addLeader(leader,
false, 0);
3649#ifdef DEBUG_PLAN_MOVE
3653 <<
" isShadowLink=" << isShadowLink
3654 <<
" lane=" << lane->
getID()
3655 <<
" foe=" << leader->
getID()
3657 <<
" latOffset=" << latOffset
3659 <<
" linkLeadersAhead=" << linkLeadersAhead.
toString()
3664#ifdef DEBUG_PLAN_MOVE
3666 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" linkLeader=" << leader->
getID() <<
" gap=" << it->vehAndGap.second
3675 if (lastLink !=
nullptr) {
3689#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3691 std::cout <<
" aborting request\n";
3698#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3700 std::cout <<
" aborting previous request\n";
3706#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3709 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" ignoring leader " << leader->
getID() <<
" gap=" << (*it).vehAndGap.second <<
" dtC=" << (*it).distToCrossing
3719 vLinkWait =
MIN2(vLinkWait, v);
3750 double vSafeZipper = std::numeric_limits<double>::max();
3753 bool canBrakeVSafeMin =
false;
3758 MSLink*
const link = dpi.myLink;
3760#ifdef DEBUG_EXEC_MOVE
3764 <<
" veh=" <<
getID()
3766 <<
" req=" << dpi.mySetRequest
3767 <<
" vP=" << dpi.myVLinkPass
3768 <<
" vW=" << dpi.myVLinkWait
3769 <<
" d=" << dpi.myDistance
3776 if (link !=
nullptr && dpi.mySetRequest) {
3785 const bool ignoreRedLink =
ignoreRed(link, canBrake) || beyondStopLine;
3786 if (yellow && canBrake && !ignoreRedLink) {
3787 vSafe = dpi.myVLinkWait;
3789#ifdef DEBUG_CHECKREWINDLINKLANES
3791 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (yellow)\n";
3798 bool opened = (yellow || influencerPrio
3799 || link->
opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
3805 ignoreRedLink,
this, dpi.myDistance));
3808 if (parallelLink !=
nullptr) {
3811 opened = yellow || influencerPrio || (opened && parallelLink->
opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
3816 ignoreRedLink,
this, dpi.myDistance));
3817#ifdef DEBUG_EXEC_MOVE
3820 <<
" veh=" <<
getID()
3824 <<
" opened=" << opened
3831#ifdef DEBUG_EXEC_MOVE
3834 <<
" opened=" << opened
3835 <<
" influencerPrio=" << influencerPrio
3838 <<
" isCont=" << link->
isCont()
3839 <<
" ignoreRed=" << ignoreRedLink
3840 <<
" canBrake=" << canBrake
3845 bool determinedFoePresence = dpi.myDistance <= visibilityDistance;
3847 if (!determinedFoePresence && (canBrake || !yellow)) {
3848 vSafe = dpi.myVLinkWait;
3850#ifdef DEBUG_CHECKREWINDLINKLANES
3852 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (minor)\n";
3868 vSafeMinDist = dpi.myDistance;
3874 canBrakeVSafeMin = canBrake;
3875#ifdef DEBUG_EXEC_MOVE
3877 std::cout <<
" vSafeMin=" << vSafeMin <<
" vSafeMinDist=" << vSafeMinDist <<
" canBrake=" << canBrake <<
"\n";
3884 vSafe = dpi.myVLinkPass;
3888#ifdef DEBUG_CHECKREWINDLINKLANES
3890 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (very slow)\n";
3898 vSafeZipper =
MIN2(vSafeZipper,
3899 link->
getZipperSpeed(
this, dpi.myDistance, dpi.myVLinkPass, dpi.myArrivalTime, &collectFoes));
3900 }
else if (!canBrake
3905#ifdef DEBUG_EXEC_MOVE
3907 std::cout <<
SIMTIME <<
" too fast to brake for closed link\n";
3910 vSafe = dpi.myVLinkPass;
3912 vSafe = dpi.myVLinkWait;
3914#ifdef DEBUG_CHECKREWINDLINKLANES
3916 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (closed)\n";
3919#ifdef DEBUG_EXEC_MOVE
3935#ifdef DEBUG_EXEC_MOVE
3937 std::cout <<
SIMTIME <<
" resetting junctionEntryTime at junction '" << link->
getJunction()->
getID() <<
"' beause of non-request exitLink\n";
3944 vSafe = dpi.myVLinkWait;
3948#ifdef DEBUG_CHECKREWINDLINKLANES
3950 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (no request, braking) vSafe=" << vSafe <<
"\n";
3955#ifdef DEBUG_CHECKREWINDLINKLANES
3957 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (no request, stopping)\n";
3993#ifdef DEBUG_EXEC_MOVE
3995 std::cout <<
"vSafeMin Problem? vSafe=" << vSafe <<
" vSafeMin=" << vSafeMin <<
" vSafeMinDist=" << vSafeMinDist << std::endl;
3998 if (canBrakeVSafeMin && vSafe <
getSpeed()) {
4004#ifdef DEBUG_CHECKREWINDLINKLANES
4006 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (vSafe=" << vSafe <<
" < vSafeMin=" << vSafeMin <<
")\n";
4024 vSafe =
MIN2(vSafe, vSafeZipper);
4034 std::cout <<
SIMTIME <<
" MSVehicle::processTraCISpeedControl() for vehicle '" <<
getID() <<
"'"
4035 <<
" vSafe=" << vSafe <<
" (init)vNext=" << vNext <<
" keepStopping=" <<
keepStopping();
4044 vMin =
MAX2(0., vMin);
4053 std::cout <<
" (processed)vNext=" << vNext << std::endl;
4063#ifdef DEBUG_ACTIONSTEPS
4065 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" removePassedDriveItems()\n"
4066 <<
" Current items: ";
4068 if (j.myLink == 0) {
4069 std::cout <<
"\n Stop at distance " << j.myDistance;
4071 const MSLane* to = j.myLink->getViaLaneOrLane();
4072 const MSLane* from = j.myLink->getLaneBefore();
4073 std::cout <<
"\n Link at distance " << j.myDistance <<
": '"
4074 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
4077 std::cout <<
"\n myNextDriveItem: ";
4084 std::cout <<
"\n Link at distance " <<
myNextDriveItem->myDistance <<
": '"
4085 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
4088 std::cout << std::endl;
4092#ifdef DEBUG_ACTIONSTEPS
4094 std::cout <<
" Removing item: ";
4095 if (j->myLink == 0) {
4096 std::cout <<
"Stop at distance " << j->myDistance;
4098 const MSLane* to = j->myLink->getViaLaneOrLane();
4099 const MSLane* from = j->myLink->getLaneBefore();
4100 std::cout <<
"Link at distance " << j->myDistance <<
": '"
4101 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
4103 std::cout << std::endl;
4106 if (j->myLink !=
nullptr) {
4107 j->myLink->removeApproaching(
this);
4117#ifdef DEBUG_ACTIONSTEPS
4119 std::cout <<
SIMTIME <<
" updateDriveItems(), veh='" <<
getID() <<
"' (lane: '" <<
getLane()->
getID() <<
"')\nCurrent drive items:" << std::endl;
4122 <<
" vPass=" << dpi.myVLinkPass
4123 <<
" vWait=" << dpi.myVLinkWait
4124 <<
" linkLane=" << (dpi.myLink == 0 ?
"NULL" : dpi.myLink->getViaLaneOrLane()->getID())
4125 <<
" request=" << dpi.mySetRequest
4128 std::cout <<
" myNextDriveItem's linked lane: " << (
myNextDriveItem->myLink == 0 ?
"NULL" :
myNextDriveItem->myLink->getViaLaneOrLane()->getID()) << std::endl;
4135 const MSLink* nextPlannedLink =
nullptr;
4138 while (i !=
myLFLinkLanes.end() && nextPlannedLink ==
nullptr) {
4139 nextPlannedLink = i->myLink;
4143 if (nextPlannedLink ==
nullptr) {
4145#ifdef DEBUG_ACTIONSTEPS
4147 std::cout <<
"Found no link-related drive item." << std::endl;
4155#ifdef DEBUG_ACTIONSTEPS
4157 std::cout <<
"Continuing on planned lane sequence, no update required." << std::endl;
4179#ifdef DEBUG_ACTIONSTEPS
4181 std::cout <<
"Changed lane. Drive items will be updated along the current lane continuation." << std::endl;
4193 MSLink* newLink =
nullptr;
4195 if (driveItemIt->myLink ==
nullptr) {
4205#ifdef DEBUG_ACTIONSTEPS
4207 std::cout <<
"Reached end of the new continuation sequence. Erasing leftover link-items." << std::endl;
4211 if (driveItemIt->myLink ==
nullptr) {
4222 const MSLane*
const target = *bestLaneIt;
4226 if (link->getLane() == target) {
4232 if (newLink == driveItemIt->myLink) {
4234#ifdef DEBUG_ACTIONSTEPS
4236 std::cout <<
"Old and new continuation sequences merge at link\n"
4238 <<
"\nNo update beyond merge required." << std::endl;
4244#ifdef DEBUG_ACTIONSTEPS
4246 std::cout <<
"lane=" << lane->
getID() <<
"\nUpdating link\n '" << driveItemIt->myLink->getLaneBefore()->getID() <<
"'->'" << driveItemIt->myLink->getViaLaneOrLane()->getID() <<
"'"
4250 newLink->
setApproaching(
this, driveItemIt->myLink->getApproaching(
this));
4251 driveItemIt->myLink->removeApproaching(
this);
4252 driveItemIt->myLink = newLink;
4259#ifdef DEBUG_ACTIONSTEPS
4261 std::cout <<
"Updated drive items:" << std::endl;
4264 <<
" vPass=" << dpi.myVLinkPass
4265 <<
" vWait=" << dpi.myVLinkWait
4266 <<
" linkLane=" << (dpi.myLink == 0 ?
"NULL" : dpi.myLink->getViaLaneOrLane()->getID())
4267 <<
" request=" << dpi.mySetRequest
4284 brakelightsOn =
true;
4326#ifdef DEBUG_REVERSE_BIDI
4330 <<
" speedThreshold=" << speedThreshold
4332 <<
" isRail=" <<
isRail()
4338 <<
" stopOk=" << stopOk
4357 if (remainingRoute < neededFutureRoute) {
4358#ifdef DEBUG_REVERSE_BIDI
4370#ifdef DEBUG_REVERSE_BIDI
4381 const double stopPos =
myStops.front().getEndPos(*
this);
4384 if (newPos > stopPos) {
4385#ifdef DEBUG_REVERSE_BIDI
4390 if (seen >
MAX2(brakeDist, 1.0)) {
4393#ifdef DEBUG_REVERSE_BIDI
4395 std::cout <<
" train is too long, skipping stop at " << stopPos <<
" cannot be avoided\n";
4409 if (!further->getEdge().isInternal()) {
4410 if (further->getEdge().getBidiEdge() != *(
myCurrEdge + view)) {
4411#ifdef DEBUG_REVERSE_BIDI
4413 std::cout <<
" noBidi view=" << view <<
" further=" << further->
getID() <<
" furtherBidi=" <<
Named::getIDSecure(further->getEdge().getBidiEdge()) <<
" future=" << (*(
myCurrEdge + view))->getID() <<
"\n";
4420 if (toNext ==
nullptr) {
4425#ifdef DEBUG_REVERSE_BIDI
4427 std::cout <<
" do not reverse on a red signal\n";
4435 const double stopPos =
myStops.front().getEndPos(*
this);
4437 if (newPos > stopPos) {
4438#ifdef DEBUG_REVERSE_BIDI
4440 std::cout <<
" reversal would go past stop on further-opposite lane " << further->getBidiLane()->getID() <<
"\n";
4443 if (seen >
MAX2(brakeDist, 1.0)) {
4447#ifdef DEBUG_REVERSE_BIDI
4449 std::cout <<
" train is too long, skipping stop at " << stopPos <<
" cannot be avoided\n";
4460#ifdef DEBUG_REVERSE_BIDI
4462 std::cout <<
SIMTIME <<
" seen=" << seen <<
" vReverseOK=" << vMinComfortable <<
"\n";
4466 return vMinComfortable;
4475 passedLanes.push_back(*i);
4477 if (passedLanes.size() == 0 || passedLanes.back() !=
myLane) {
4478 passedLanes.push_back(
myLane);
4481 bool reverseTrain =
false;
4489#ifdef DEBUG_REVERSE_BIDI
4514 if (link !=
nullptr) {
4520 emergencyReason =
" because it must reverse direction";
4521 approachedLane =
nullptr;
4537 if (link->
haveRed() && !
ignoreRed(link,
false) && !beyondStopLine && !reverseTrain) {
4538 emergencyReason =
" because of a red traffic light";
4542 if (reverseTrain && approachedLane->
isInternal()) {
4550 }
else if (reverseTrain) {
4551 approachedLane = (*(
myCurrEdge + 1))->getLanes()[0];
4559 emergencyReason =
" because there is no connection to the next edge";
4560 approachedLane =
nullptr;
4563 if (approachedLane !=
myLane && approachedLane !=
nullptr) {
4584#ifdef DEBUG_PLAN_MOVE_LEADERINFO
4608 passedLanes.push_back(approachedLane);
4613#ifdef DEBUG_ACTIONSTEPS
4615 std::cout <<
"Updated drive items:" << std::endl;
4618 <<
" vPass=" << (*i).myVLinkPass
4619 <<
" vWait=" << (*i).myVLinkWait
4620 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
4621 <<
" request=" << (*i).mySetRequest
4638#ifdef DEBUG_EXEC_MOVE
4640 std::cout <<
"\nEXECUTE_MOVE\n"
4642 <<
" veh=" <<
getID()
4650 double vSafe = std::numeric_limits<double>::max();
4652 double vSafeMin = -std::numeric_limits<double>::max();
4655 double vSafeMinDist = 0;
4660#ifdef DEBUG_ACTIONSTEPS
4662 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"'\n"
4663 " vsafe from processLinkApproaches(): vsafe " << vSafe << std::endl;
4669#ifdef DEBUG_ACTIONSTEPS
4671 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' skips processLinkApproaches()\n"
4673 <<
"speed: " <<
getSpeed() <<
" -> " << vSafe << std::endl;
4687 double vNext = vSafe;
4707 vNext =
MAX2(vNext, vSafeMin);
4716#ifdef DEBUG_EXEC_MOVE
4718 std::cout <<
SIMTIME <<
" finalizeSpeed vSafe=" << vSafe <<
" vSafeMin=" << (vSafeMin == -std::numeric_limits<double>::max() ?
"-Inf" :
toString(vSafeMin))
4719 <<
" vNext=" << vNext <<
" (i.e. accel=" <<
SPEED2ACCEL(vNext -
getSpeed()) <<
")" << std::endl;
4736 vNext =
MAX2(vNext, 0.);
4746 if (elecHybridOfVehicle !=
nullptr) {
4748 elecHybridOfVehicle->
setConsum(elecHybridOfVehicle->
consumption(*
this, (vNext - this->getSpeed()) /
TS, vNext));
4752 if (elecHybridOfVehicle->
getConsum() /
TS > maxPower) {
4757 vNext =
MAX2(vNext, 0.);
4759 elecHybridOfVehicle->
setConsum(elecHybridOfVehicle->
consumption(*
this, (vNext - this->getSpeed()) /
TS, vNext));
4777 std::vector<MSLane*> passedLanes;
4781 std::string emergencyReason;
4789 if (emergencyReason ==
"") {
4790 emergencyReason =
TL(
" for unknown reasons");
4792 WRITE_WARNINGF(
TL(
"Vehicle '%' performs emergency stop at the end of lane '%'% (decel=%, offset=%), time=%."),
4803 passedLanes.clear();
4805#ifdef DEBUG_ACTIONSTEPS
4807 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
"' updates further lanes." << std::endl;
4811 if (passedLanes.size() > 1 &&
isRail()) {
4812 for (
auto pi = passedLanes.rbegin(); pi != passedLanes.rend(); ++pi) {
4844#ifdef DEBUG_ACTIONSTEPS
4846 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
"' skips LCM->prepareStep()." << std::endl;
4854#ifdef DEBUG_EXEC_MOVE
4862 MSLane* newOpposite =
nullptr;
4864 if (newOppositeEdge !=
nullptr) {
4866#ifdef DEBUG_EXEC_MOVE
4868 std::cout <<
SIMTIME <<
" newOppositeEdge=" << newOppositeEdge->
getID() <<
" oldLaneOffset=" << oldLaneOffset <<
" leftMost=" << newOppositeEdge->
getNumLanes() - 1 <<
" newOpposite=" <<
Named::getIDSecure(newOpposite) <<
"\n";
4872 if (newOpposite ==
nullptr) {
4875 WRITE_WARNINGF(
TL(
"Unexpected end of opposite lane for vehicle '%' at lane '%', time=%."),
4882 if (oldOpposite !=
nullptr) {
4895 oldLane = oldLaneMaybeOpposite;
4908 return myLane != oldLane;
4919 for (
int i = 0; i < (int)lanes.size(); i++) {
4921 if (i + 1 < (
int)lanes.size()) {
4922 const MSLane*
const to = lanes[i + 1];
4924 for (
MSLink*
const l : lanes[i]->getLinkCont()) {
4925 if ((internal && l->getViaLane() == to) || (!internal && l->getLane() == to)) {
4934 std::vector<MSLane*> passedLanes;
4936 if (lanes.size() > 1) {
4939 std::string emergencyReason;
4941#ifdef DEBUG_EXTRAPOLATE_DEPARTPOS
4943 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" executeFractionalMove dist=" << dist
4944 <<
" passedLanes=" <<
toString(passedLanes) <<
" lanes=" <<
toString(lanes)
4952 if (lanes.size() > 1) {
4956 std::cout <<
SIMTIME <<
" leaveLane \n";
4959 (*i)->resetPartialOccupation(
this);
4984#ifdef DEBUG_EXEC_MOVE
4986 std::cout <<
SIMTIME <<
" updateState() for veh '" <<
getID() <<
"': deltaPos=" << deltaPos
4991 if (decelPlus > 0) {
4995 decelPlus += 2 * NUMERICAL_EPS;
4998 WRITE_WARNINGF(
TL(
"Vehicle '%' performs emergency braking on lane '%' with decel=%, wished=%, severity=%, time=%."),
5035 dev->notifyParking();
5060 const std::vector<MSLane*>& passedLanes) {
5061#ifdef DEBUG_SETFURTHER
5063 <<
" updateFurtherLanes oldFurther=" <<
toString(furtherLanes)
5064 <<
" oldFurtherPosLat=" <<
toString(furtherLanesPosLat)
5065 <<
" passed=" <<
toString(passedLanes)
5068 for (
MSLane* further : furtherLanes) {
5070 if (further->getBidiLane() !=
nullptr
5071 && (!
isRailway(
getVClass()) || (further->getPermissions() & ~SVC_RAIL_CLASSES) != 0)) {
5072 further->getBidiLane()->resetPartialOccupation(
this);
5076 std::vector<MSLane*> newFurther;
5077 std::vector<double> newFurtherPosLat;
5080 if (passedLanes.size() > 1) {
5082 std::vector<MSLane*>::const_iterator fi = furtherLanes.begin();
5083 std::vector<double>::const_iterator fpi = furtherLanesPosLat.begin();
5084 for (
auto pi = passedLanes.rbegin() + 1; pi != passedLanes.rend() && backPosOnPreviousLane < 0; ++pi) {
5087 newFurther.push_back(further);
5093 if (fi != furtherLanes.end() && further == *fi) {
5095 newFurtherPosLat.push_back(*fpi);
5103 if (newFurtherPosLat.size() == 0) {
5110 newFurtherPosLat.push_back(newFurtherPosLat.back());
5113#ifdef DEBUG_SETFURTHER
5115 std::cout <<
SIMTIME <<
" updateFurtherLanes \n"
5116 <<
" further lane '" << further->
getID() <<
"' backPosOnPreviousLane=" << backPosOnPreviousLane
5121 furtherLanes = newFurther;
5122 furtherLanesPosLat = newFurtherPosLat;
5124 furtherLanes.clear();
5125 furtherLanesPosLat.clear();
5127#ifdef DEBUG_SETFURTHER
5129 <<
" newFurther=" <<
toString(furtherLanes)
5130 <<
" newFurtherPosLat=" <<
toString(furtherLanesPosLat)
5131 <<
" newBackPos=" << backPosOnPreviousLane
5134 return backPosOnPreviousLane;
5143 <<
" getBackPositionOnLane veh=" <<
getID()
5145 <<
" cbgP=" << calledByGetPosition
5200 leftLength -= (*i)->getLength();
5213 leftLength -= (*i)->getLength();
5226 auto j = furtherTargetLanes.begin();
5227 while (leftLength > 0 && j != furtherTargetLanes.end()) {
5228 leftLength -= (*i)->getLength();
5238 WRITE_WARNINGF(
"Request backPos of vehicle '%' for invalid lane '%' time=%.",
5261 double seenSpace = -lengthsInFront;
5262#ifdef DEBUG_CHECKREWINDLINKLANES
5264 std::cout <<
"\nCHECK_REWIND_LINKLANES\n" <<
" veh=" <<
getID() <<
" lengthsInFront=" << lengthsInFront <<
"\n";
5267 bool foundStopped =
false;
5270 for (
int i = 0; i < (int)lfLinks.size(); ++i) {
5273#ifdef DEBUG_CHECKREWINDLINKLANES
5276 <<
" foundStopped=" << foundStopped;
5278 if (item.
myLink ==
nullptr || foundStopped) {
5279 if (!foundStopped) {
5284#ifdef DEBUG_CHECKREWINDLINKLANES
5293 if (approachedLane !=
nullptr) {
5296 if (approachedLane ==
myLane) {
5303#ifdef DEBUG_CHECKREWINDLINKLANES
5305 <<
" approached=" << approachedLane->
getID()
5308 <<
" seenSpace=" << seenSpace
5310 <<
" lengthsInFront=" << lengthsInFront
5317 if (last ==
nullptr || last ==
this) {
5320 seenSpace += approachedLane->
getLength();
5323#ifdef DEBUG_CHECKREWINDLINKLANES
5329 bool foundStopped2 =
false;
5335 const double oncomingBGap = oncomingVeh->
getBrakeGap(
true);
5338 const double spaceTillOncoming = oncomingGap - oncomingBGap - oncomingMove;
5339 spaceTillLastStanding =
MIN2(spaceTillLastStanding, spaceTillOncoming);
5341 foundStopped =
true;
5343#ifdef DEBUG_CHECKREWINDLINKLANES
5345 std::cout <<
" oVeh=" << oncomingVeh->
getID()
5346 <<
" oGap=" << oncomingGap
5347 <<
" bGap=" << oncomingBGap
5348 <<
" mGap=" << oncomingMove
5349 <<
" sto=" << spaceTillOncoming;
5354 seenSpace += spaceTillLastStanding;
5355 if (foundStopped2) {
5356 foundStopped =
true;
5361 foundStopped =
true;
5364#ifdef DEBUG_CHECKREWINDLINKLANES
5366 <<
" approached=" << approachedLane->
getID()
5367 <<
" last=" << last->
getID()
5374 <<
" stls=" << spaceTillLastStanding
5376 <<
" seenSpace=" << seenSpace
5377 <<
" foundStopped=" << foundStopped
5378 <<
" foundStopped2=" << foundStopped2
5385 for (
int i = ((
int)lfLinks.size() - 1); i > 0; --i) {
5389 const bool opened = (item.
myLink !=
nullptr
5390 && (canLeaveJunction || (
5401#ifdef DEBUG_CHECKREWINDLINKLANES
5404 <<
" canLeave=" << canLeaveJunction
5405 <<
" opened=" << opened
5406 <<
" allowsContinuation=" << allowsContinuation
5407 <<
" foundStopped=" << foundStopped
5410 if (!opened && item.
myLink !=
nullptr) {
5411 foundStopped =
true;
5415 allowsContinuation =
true;
5419 if (allowsContinuation) {
5421#ifdef DEBUG_CHECKREWINDLINKLANES
5431 int removalBegin = -1;
5432 for (
int i = 0; foundStopped && i < (int)lfLinks.size() && removalBegin < 0; ++i) {
5435 if (item.
myLink ==
nullptr) {
5446#ifdef DEBUG_CHECKREWINDLINKLANES
5449 <<
" veh=" <<
getID()
5452 <<
" leftSpace=" << leftSpace
5455 if (leftSpace < 0/* && item.myLink->willHaveBlockedFoe()*/) {
5456 double impatienceCorrection = 0;
5463 if (leftSpace < -impatienceCorrection / 10. &&
keepClear(item.
myLink)) {
5472 while (removalBegin < (
int)(lfLinks.size())) {
5474 if (dpi.
myLink ==
nullptr) {
5478#ifdef DEBUG_CHECKREWINDLINKLANES
5483 if (dpi.
myDistance >= brakeGap + POSITION_EPS) {
5485 if (!dpi.
myLink->
isExitLink() || !lfLinks[removalBegin - 1].mySetRequest) {
5503 if (dpi.myLink !=
nullptr) {
5507 dpi.myLink->setApproaching(
this, dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
5513 if (dpi.myLink !=
nullptr && dpi.myLink->getTLLogic() !=
nullptr && dpi.myLink->getTLLogic()->getLogicType() ==
TrafficLightType::RAIL_SIGNAL) {
5521 if (dpi.myLink !=
nullptr) {
5527 if (parallelLink !=
nullptr) {
5529 parallelLink->
setApproaching(
this, dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
5530 dpi.mySetRequest, dpi.myArrivalSpeedBraking,
getWaitingTimeFor(dpi.myLink), dpi.myDistance,
5537#ifdef DEBUG_PLAN_MOVE
5540 <<
" veh=" <<
getID()
5541 <<
" after checkRewindLinkLanes\n";
5544 <<
" vPass=" << dpi.myVLinkPass
5545 <<
" vWait=" << dpi.myVLinkWait
5546 <<
" linkLane=" << (dpi.myLink == 0 ?
"NULL" : dpi.myLink->getViaLaneOrLane()->getID())
5547 <<
" request=" << dpi.mySetRequest
5548 <<
" atime=" << dpi.myArrivalTime
5594 if (!onTeleporting) {
5599 assert(oldLane !=
nullptr);
5601 if (link !=
nullptr) {
5646 int deleteFurther = 0;
5647#ifdef DEBUG_SETFURTHER
5658 if (lane !=
nullptr) {
5661#ifdef DEBUG_SETFURTHER
5663 std::cout <<
" enterLaneAtLaneChange i=" << i <<
" lane=" <<
Named::getIDSecure(lane) <<
" leftLength=" << leftLength <<
"\n";
5666 if (leftLength > 0) {
5667 if (lane !=
nullptr) {
5683#ifdef DEBUG_SETFURTHER
5696#ifdef DEBUG_SETFURTHER
5711 if (deleteFurther > 0) {
5712#ifdef DEBUG_SETFURTHER
5714 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" shortening myFurtherLanes by " << deleteFurther <<
"\n";
5720#ifdef DEBUG_SETFURTHER
5735 MSLane* clane = enteredLane;
5737 while (leftLength > 0) {
5738 bool guessed =
false;
5742 const MSEdge* fromRouteEdge =
myRoute->getEdges()[routeIndex];
5746 if (ili.lane->getEdge().getNormalBefore() == fromRouteEdge) {
5774#ifdef DEBUG_SETFURTHER
5782#ifdef DEBUG_SETFURTHER
5784 std::cout <<
SIMTIME <<
" opposite: resetPartialOccupation " << further->getID() <<
" \n";
5787 further->resetPartialOccupation(
this);
5788 if (further->getBidiLane() !=
nullptr
5789 && (!
isRailway(
getVClass()) || (further->getPermissions() & ~SVC_RAIL_CLASSES) != 0)) {
5790 further->getBidiLane()->resetPartialOccupation(
this);
5809 if (enteredLane->
getIncomingLanes().front().viaLink->isConflictEntryLink()) {
5834 &&
myStops.front().pars.endPos < pos) {
5860 if (further->mustCheckJunctionCollisions()) {
5871 if (rem->first->notifyLeave(*
this,
myState.
myPos + rem->second, reason, approachedLane)) {
5873 if (myTraceMoveReminders) {
5874 traceMoveReminder(
"notifyLeave", rem->first, rem->second,
true);
5880 if (myTraceMoveReminders) {
5881 traceMoveReminder(
"notifyLeave", rem->first, rem->second,
false);
5903 std::cout <<
SIMTIME <<
" leaveLane \n";
5906 further->resetPartialOccupation(
this);
5907 if (further->getBidiLane() !=
nullptr
5908 && (!
isRailway(
getVClass()) || (further->getPermissions() & ~SVC_RAIL_CLASSES) != 0)) {
5909 further->getBidiLane()->resetPartialOccupation(
this);
5920 myStopDist = std::numeric_limits<double>::max();
5927 if (
myStops.front().getSpeed() <= 0) {
5945 if (stop.
busstop !=
nullptr) {
5961 myStopDist = std::numeric_limits<double>::max();
5970 if (rem->first->notifyLeaveBack(*
this, reason, leftLane)) {
5972 if (myTraceMoveReminders) {
5973 traceMoveReminder(
"notifyLeaveBack", rem->first, rem->second,
true);
5979 if (myTraceMoveReminders) {
5980 traceMoveReminder(
"notifyLeaveBack", rem->first, rem->second,
false);
5986#ifdef DEBUG_MOVEREMINDERS
5988 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" myReminders:";
5990 std::cout << rem.first->getDescription() <<
" ";
6016const std::vector<MSVehicle::LaneQ>&
6024#ifdef DEBUG_BESTLANES
6029 if (startLane ==
nullptr) {
6032 assert(startLane != 0);
6040 assert(startLane != 0);
6041#ifdef DEBUG_BESTLANES
6043 std::cout <<
" startLaneIsOpposite newStartLane=" << startLane->
getID() <<
"\n";
6054#ifdef DEBUG_BESTLANES
6056 std::cout <<
" only updateOccupancyAndCurrentBestLane\n";
6067#ifdef DEBUG_BESTLANES
6069 std::cout <<
" nothing to do on internal\n";
6079 std::vector<LaneQ>& lanes = *it;
6080 assert(lanes.size() > 0);
6081 if (&(lanes[0].lane->getEdge()) == nextEdge) {
6083 std::vector<LaneQ> oldLanes = lanes;
6085 const std::vector<MSLane*>& sourceLanes = startLane->
getEdge().
getLanes();
6086 for (std::vector<MSLane*>::const_iterator it_source = sourceLanes.begin(); it_source != sourceLanes.end(); ++it_source) {
6087 for (std::vector<LaneQ>::iterator it_lane = oldLanes.begin(); it_lane != oldLanes.end(); ++it_lane) {
6088 if ((*it_source)->getLinkCont()[0]->getLane() == (*it_lane).lane) {
6089 lanes.push_back(*it_lane);
6096 for (
int i = 0; i < (int)lanes.size(); ++i) {
6097 if (i + lanes[i].bestLaneOffset < 0) {
6098 lanes[i].bestLaneOffset = -i;
6100 if (i + lanes[i].bestLaneOffset >= (
int)lanes.size()) {
6101 lanes[i].bestLaneOffset = (int)lanes.size() - i - 1;
6103 assert(i + lanes[i].bestLaneOffset >= 0);
6104 assert(i + lanes[i].bestLaneOffset < (
int)lanes.size());
6105 if (lanes[i].bestContinuations[0] != 0) {
6107 lanes[i].bestContinuations.insert(lanes[i].bestContinuations.begin(), (
MSLane*)
nullptr);
6109 if (startLane->
getLinkCont()[0]->getLane() == lanes[i].lane) {
6112 assert(&(lanes[i].lane->getEdge()) == nextEdge);
6116#ifdef DEBUG_BESTLANES
6118 std::cout <<
" updated for internal\n";
6136 const MSLane* nextStopLane =
nullptr;
6137 double nextStopPos = 0;
6140 nextStopLane = nextStop.
lane;
6145 nextStopEdge = nextStop.
edge;
6150 nextStopEdge = (
myRoute->end() - 1);
6154 if (nextStopEdge !=
myRoute->end()) {
6157 nextStopPos =
MAX2(POSITION_EPS,
MIN2((
double)nextStopPos, (
double)(nextStopLane->
getLength() - 2 * POSITION_EPS)));
6160 nextStopPos = (*nextStopEdge)->getLength();
6169 double seenLength = 0;
6170 bool progress =
true;
6175 std::vector<LaneQ> currentLanes;
6176 const std::vector<MSLane*>* allowed =
nullptr;
6177 const MSEdge* nextEdge =
nullptr;
6179 nextEdge = *(ce + 1);
6182 const std::vector<MSLane*>& lanes = (*ce)->getLanes();
6183 for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
6192 q.
allowsContinuation = allowed ==
nullptr || std::find(allowed->begin(), allowed->end(), cl) != allowed->end();
6195 currentLanes.push_back(q);
6198 if (nextStopEdge == ce
6202 for (std::vector<LaneQ>::iterator q = currentLanes.begin(); q != currentLanes.end(); ++q) {
6203 if (nextStopLane !=
nullptr && normalStopLane != (*q).lane) {
6204 (*q).allowsContinuation =
false;
6205 (*q).length = nextStopPos;
6206 (*q).currentLength = (*q).length;
6213 seenLength += currentLanes[0].lane->
getLength();
6215 if (lookahead >= 0) {
6216 progress &= (seen <= 2 || seenLength < lookahead);
6218 progress &= (seen <= 4 || seenLength <
MAX2(maxBrakeDist, 3000.0));
6221 progress &= ce !=
myRoute->end();
6231 double bestLength = -1;
6233 int bestThisIndex = 0;
6234 int bestThisMaxIndex = 0;
6237 for (std::vector<LaneQ>::iterator j = last.begin(); j != last.end(); ++j, ++index) {
6238 if ((*j).length > bestLength) {
6239 bestLength = (*j).length;
6240 bestThisIndex = index;
6241 bestThisMaxIndex = index;
6242 }
else if ((*j).length == bestLength) {
6243 bestThisMaxIndex = index;
6247 bool requiredChangeRightForbidden =
false;
6248 int requireChangeToLeftForbidden = -1;
6249 for (std::vector<LaneQ>::iterator j = last.begin(); j != last.end(); ++j, ++index) {
6250 if ((*j).length < bestLength) {
6251 if (abs(bestThisIndex - index) < abs(bestThisMaxIndex - index)) {
6252 (*j).bestLaneOffset = bestThisIndex - index;
6254 (*j).bestLaneOffset = bestThisMaxIndex - index;
6256 if (!(*j).allowsContinuation) {
6257 if ((*j).bestLaneOffset < 0 && (!(*j).lane->allowsChangingRight(
getVClass())
6258 || !(*j).lane->getParallelLane(-1,
false)->allowsVehicleClass(
getVClass())
6259 || requiredChangeRightForbidden)) {
6261 requiredChangeRightForbidden =
true;
6263 }
else if ((*j).bestLaneOffset > 0 && (!(*j).lane->allowsChangingLeft(
getVClass())
6264 || !(*j).lane->getParallelLane(1,
false)->allowsVehicleClass(
getVClass()))) {
6266 requireChangeToLeftForbidden = (*j).lane->getIndex();
6271 for (
int i = requireChangeToLeftForbidden; i >= 0; i--) {
6272 if (last[i].bestLaneOffset > 0) {
6276#ifdef DEBUG_BESTLANES
6278 std::cout <<
" last edge=" << last.front().lane->getEdge().getID() <<
" (bestIndex=" << bestThisIndex <<
" bestMaxIndex=" << bestThisMaxIndex <<
"):\n";
6280 for (std::vector<LaneQ>::iterator j = laneQs.begin(); j != laneQs.end(); ++j) {
6281 std::cout <<
" lane=" << (*j).lane->getID() <<
" length=" << (*j).length <<
" bestOffset=" << (*j).bestLaneOffset <<
"\n";
6288 for (std::vector<std::vector<LaneQ> >::reverse_iterator i =
myBestLanes.rbegin() + 1; i !=
myBestLanes.rend(); ++i) {
6289 std::vector<LaneQ>& nextLanes = (*(i - 1));
6290 std::vector<LaneQ>& clanes = (*i);
6291 MSEdge*
const cE = &clanes[0].lane->getEdge();
6293 double bestConnectedLength = -1;
6294 double bestLength = -1;
6295 for (
const LaneQ& j : nextLanes) {
6296 if (j.lane->isApproachedFrom(cE) && bestConnectedLength < j.length) {
6297 bestConnectedLength = j.length;
6299 if (bestLength < j.length) {
6300 bestLength = j.length;
6304 int bestThisIndex = 0;
6305 int bestThisMaxIndex = 0;
6306 if (bestConnectedLength > 0) {
6308 for (
LaneQ& j : clanes) {
6309 const LaneQ* bestConnectedNext =
nullptr;
6310 if (j.allowsContinuation) {
6311 for (
const LaneQ& m : nextLanes) {
6312 if ((m.lane->allowsVehicleClass(
getVClass()) || m.lane->hadPermissionChanges())
6313 && m.lane->isApproachedFrom(j.lane,
getVClass())) {
6315 bestConnectedNext = &m;
6319 if (bestConnectedNext !=
nullptr) {
6320 if (bestConnectedNext->
length == bestConnectedLength && abs(bestConnectedNext->
bestLaneOffset) < 2) {
6323 j.length += bestConnectedNext->
length;
6331 j.allowsContinuation =
false;
6333 if (clanes[bestThisIndex].length < j.length
6334 || (clanes[bestThisIndex].length == j.length && abs(clanes[bestThisIndex].bestLaneOffset) > abs(j.bestLaneOffset))
6335 || (clanes[bestThisIndex].length == j.length && abs(clanes[bestThisIndex].bestLaneOffset) == abs(j.bestLaneOffset) &&
6338 bestThisIndex = index;
6339 bestThisMaxIndex = index;
6340 }
else if (clanes[bestThisIndex].length == j.length
6341 && abs(clanes[bestThisIndex].bestLaneOffset) == abs(j.bestLaneOffset)
6343 bestThisMaxIndex = index;
6351 for (
const LaneQ& j : clanes) {
6353 if (overheadWireSegmentID !=
"") {
6354 bestThisIndex = index;
6355 bestThisMaxIndex = index;
6363 int bestNextIndex = 0;
6364 int bestDistToNeeded = (int) clanes.size();
6366 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
6367 if ((*j).allowsContinuation) {
6369 for (std::vector<LaneQ>::const_iterator m = nextLanes.begin(); m != nextLanes.end(); ++m, ++nextIndex) {
6370 if ((*m).lane->isApproachedFrom((*j).lane,
getVClass())) {
6371 if (bestDistToNeeded > abs((*m).bestLaneOffset)) {
6372 bestDistToNeeded = abs((*m).bestLaneOffset);
6373 bestThisIndex = index;
6374 bestThisMaxIndex = index;
6375 bestNextIndex = nextIndex;
6381 clanes[bestThisIndex].length += nextLanes[bestNextIndex].length;
6382 copy(nextLanes[bestNextIndex].bestContinuations.begin(), nextLanes[bestNextIndex].bestContinuations.end(), back_inserter(clanes[bestThisIndex].bestContinuations));
6387 bool requiredChangeRightForbidden =
false;
6388 int requireChangeToLeftForbidden = -1;
6389 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
6390 if ((*j).length < clanes[bestThisIndex].length
6391 || ((*j).length == clanes[bestThisIndex].length && abs((*j).bestLaneOffset) > abs(clanes[bestThisIndex].bestLaneOffset))
6394 if (abs(bestThisIndex - index) < abs(bestThisMaxIndex - index)) {
6395 (*j).bestLaneOffset = bestThisIndex - index;
6397 (*j).bestLaneOffset = bestThisMaxIndex - index;
6401 (*j).length = (*j).currentLength;
6403 if (!(*j).allowsContinuation) {
6404 if ((*j).bestLaneOffset < 0 && (!(*j).lane->allowsChangingRight(
getVClass())
6405 || !(*j).lane->getParallelLane(-1,
false)->allowsVehicleClass(
getVClass())
6406 || requiredChangeRightForbidden)) {
6408 requiredChangeRightForbidden =
true;
6409 if ((*j).length == (*j).currentLength) {
6412 }
else if ((*j).bestLaneOffset > 0 && (!(*j).lane->allowsChangingLeft(
getVClass())
6413 || !(*j).lane->getParallelLane(1,
false)->allowsVehicleClass(
getVClass()))) {
6415 requireChangeToLeftForbidden = (*j).lane->getIndex();
6419 (*j).bestLaneOffset = 0;
6422 for (
int idx = requireChangeToLeftForbidden; idx >= 0; idx--) {
6423 if (clanes[idx].length == clanes[idx].currentLength) {
6424 clanes[idx].length = 0;
6432 if (overheadWireID !=
"") {
6433 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
6434 (*j).bestLaneOffset = bestThisIndex - index;
6439#ifdef DEBUG_BESTLANES
6441 std::cout <<
" edge=" << cE->
getID() <<
" (bestIndex=" << bestThisIndex <<
" bestMaxIndex=" << bestThisMaxIndex <<
"):\n";
6442 std::vector<LaneQ>& laneQs = clanes;
6443 for (std::vector<LaneQ>::iterator j = laneQs.begin(); j != laneQs.end(); ++j) {
6444 std::cout <<
" lane=" << (*j).lane->getID() <<
" length=" << (*j).length <<
" bestOffset=" << (*j).bestLaneOffset <<
" allowCont=" << (*j).allowsContinuation <<
"\n";
6450 if (
myBestLanes.front().front().lane->isInternal()) {
6460#ifdef DEBUG_BESTLANES
6476 if (bestConnectedNext ==
nullptr) {
6503 if (conts.size() < 2) {
6506 const MSLink*
const link = conts[0]->getLinkTo(conts[1]);
6507 if (link !=
nullptr) {
6519 std::vector<LaneQ>& currLanes = *
myBestLanes.begin();
6520 std::vector<LaneQ>::iterator i;
6524 for (i = currLanes.begin(); i != currLanes.end(); ++i) {
6525 double nextOccupation = 0;
6526 for (std::vector<MSLane*>::const_iterator j = (*i).bestContinuations.begin() + 1; j != (*i).bestContinuations.end(); ++j) {
6527 nextOccupation += (*j)->getBruttoVehLenSum();
6529 (*i).nextOccupation = nextOccupation;
6530#ifdef DEBUG_BESTLANES
6532 std::cout <<
" lane=" << (*i).lane->getID() <<
" nextOccupation=" << nextOccupation <<
"\n";
6535 if ((*i).lane == startLane) {
6548const std::vector<MSLane*>&
6553 return (*myCurrentLaneInBestLanes).bestContinuations;
6557const std::vector<MSLane*>&
6569 if ((*i).lane == lane) {
6570 return (*i).bestContinuations;
6576const std::vector<const MSLane*>
6578 std::vector<const MSLane*> lanes;
6591 while (lane->
isInternal() && (distance > 0.)) {
6592 lanes.insert(lanes.end(), lane);
6594 lane = lane->
getLinkCont().front()->getViaLaneOrLane();
6598 if (contLanes.empty()) {
6601 auto contLanesIt = contLanes.begin();
6603 while (distance > 0.) {
6605 if (contLanesIt != contLanes.end()) {
6608 assert(l->
getEdge().
getID() == (*routeIt)->getLanes().front()->getEdge().getID());
6617 }
else if (routeIt !=
myRoute->end()) {
6619 l = (*routeIt)->getLanes().back();
6625 assert(l !=
nullptr);
6629 while ((internalLane !=
nullptr) && internalLane->
isInternal() && (distance > 0.)) {
6630 lanes.insert(lanes.end(), internalLane);
6632 internalLane = internalLane->
getLinkCont().front()->getViaLaneOrLane();
6634 if (distance <= 0.) {
6638 lanes.insert(lanes.end(), l);
6645const std::vector<const MSLane*>
6647 std::vector<const MSLane*> lanes;
6649 if (distance <= 0.) {
6661 while (lane->
isInternal() && (distance > 0.)) {
6662 lanes.insert(lanes.end(), lane);
6667 while (distance > 0.) {
6669 MSLane* l = (*routeIt)->getLanes().back();
6673 const MSLane* internalLane = internalEdge !=
nullptr ? internalEdge->
getLanes().front() :
nullptr;
6674 std::vector<const MSLane*> internalLanes;
6675 while ((internalLane !=
nullptr) && internalLane->
isInternal()) {
6676 internalLanes.insert(internalLanes.begin(), internalLane);
6677 internalLane = internalLane->
getLinkCont().front()->getViaLaneOrLane();
6679 for (
auto it = internalLanes.begin(); (it != internalLanes.end()) && (distance > 0.); ++it) {
6680 lanes.insert(lanes.end(), *it);
6681 distance -= (*it)->getLength();
6683 if (distance <= 0.) {
6687 lanes.insert(lanes.end(), l);
6692 if (routeIt !=
myRoute->begin()) {
6703const std::vector<MSLane*>
6706 std::vector<MSLane*> result;
6707 for (
const MSLane* lane : routeLanes) {
6709 if (opposite !=
nullptr) {
6710 result.push_back(opposite);
6724 return (*myCurrentLaneInBestLanes).bestLaneOffset;
6733 return (*myCurrentLaneInBestLanes).length;
6741 std::vector<MSVehicle::LaneQ>& preb =
myBestLanes.front();
6742 assert(laneIndex < (
int)preb.size());
6743 preb[laneIndex].occupation = density + preb[laneIndex].nextOccupation;
6754std::pair<const MSLane*, double>
6756 if (distance == 0) {
6761 for (
const MSLane* lane : lanes) {
6762 if (lane->getLength() > distance) {
6763 return std::make_pair(lane, distance);
6765 distance -= lane->getLength();
6767 return std::make_pair(
nullptr, -1);
6773 if (
isOnRoad() && destLane !=
nullptr) {
6776 return std::numeric_limits<double>::max();
6780std::pair<const MSVehicle* const, double>
6783 return std::make_pair(
static_cast<const MSVehicle*
>(
nullptr), -1);
6792 MSLane::VehCont::const_iterator it = std::find(vehs.begin(), vehs.end(),
this);
6793 if (it != vehs.end() && it + 1 != vehs.end()) {
6796 if (lead !=
nullptr) {
6797 std::pair<const MSVehicle* const, double> result(
6810std::pair<const MSVehicle* const, double>
6813 return std::make_pair(
static_cast<const MSVehicle*
>(
nullptr), -1);
6825 std::pair<const MSVehicle* const, double> leaderInfo =
getLeader(-1);
6826 if (leaderInfo.first ==
nullptr ||
getSpeed() == 0) {
6838 if (
myStops.front().triggered &&
myStops.front().numExpectedPerson > 0) {
6839 myStops.front().numExpectedPerson -= (int)
myStops.front().pars.awaitedPersons.count(transportable->
getID());
6842 if (
myStops.front().pars.containerTriggered &&
myStops.front().numExpectedContainer > 0) {
6843 myStops.front().numExpectedContainer -= (int)
myStops.front().pars.awaitedContainers.count(transportable->
getID());
6855 const bool blinkerManoeuvre = (((state &
LCA_SUBLANE) == 0) && (
6863 if ((state &
LCA_LEFT) != 0 && blinkerManoeuvre) {
6865 }
else if ((state &
LCA_RIGHT) != 0 && blinkerManoeuvre) {
6877 switch ((*link)->getDirection()) {
6894 && (
myStops.begin()->reached ||
6897 if (
myStops.begin()->lane->getIndex() > 0 &&
myStops.begin()->lane->getParallelLane(-1)->allowsVehicleClass(
getVClass())) {
6915 if (currentTime % 1000 == 0) {
7012 for (
int i = 0; i < (int)shadowFurther.size(); ++i) {
7014 if (shadowFurther[i] == lane) {
7018 }
else if (shadowFurther[i]->getBidiLane() == lane) {
7065 for (
int i = 0; i < (int)shadowFurther.size(); ++i) {
7066 if (shadowFurther[i] == lane) {
7070 <<
" lane=" << lane->
getID()
7078 }
else if (shadowFurther[i]->getBidiLane() == lane) {
7091 MSLane* targetLane = furtherTargets[i];
7092 if (targetLane == lane) {
7095#ifdef DEBUG_TARGET_LANE
7097 std::cout <<
" getLatOffset veh=" <<
getID()
7103 <<
" targetDir=" << targetDir
7104 <<
" latOffset=" << latOffset
7109 }
else if (targetLane !=
nullptr && targetLane->
getBidiLane() == lane) {
7117 return -2 * latOffset;
7130 assert(offset == 0 || offset == 1 || offset == -1);
7131 assert(
myLane !=
nullptr);
7134 const double halfVehWidth = 0.5 * (
getWidth() + NUMERICAL_EPS);
7137 double leftLimit = halfCurrentLaneWidth - halfVehWidth - oppositeSign * latPos;
7138 double rightLimit = -halfCurrentLaneWidth + halfVehWidth - oppositeSign * latPos;
7139 double latLaneDist = 0;
7141 if (latPos + halfVehWidth > halfCurrentLaneWidth) {
7143 latLaneDist = halfCurrentLaneWidth - latPos - halfVehWidth;
7144 }
else if (latPos - halfVehWidth < -halfCurrentLaneWidth) {
7146 latLaneDist = -halfCurrentLaneWidth - latPos + halfVehWidth;
7148 latLaneDist *= oppositeSign;
7149 }
else if (offset == -1) {
7150 latLaneDist = rightLimit - (
getWidth() + NUMERICAL_EPS);
7151 }
else if (offset == 1) {
7152 latLaneDist = leftLimit + (
getWidth() + NUMERICAL_EPS);
7154#ifdef DEBUG_ACTIONSTEPS
7157 <<
" veh=" <<
getID()
7158 <<
" halfCurrentLaneWidth=" << halfCurrentLaneWidth
7159 <<
" halfVehWidth=" << halfVehWidth
7160 <<
" latPos=" << latPos
7161 <<
" latLaneDist=" << latLaneDist
7162 <<
" leftLimit=" << leftLimit
7163 <<
" rightLimit=" << rightLimit
7191 if (dpi.myLink !=
nullptr) {
7192 dpi.myLink->removeApproaching(
this);
7210 std::vector<MSLink*>::const_iterator link =
MSLane::succLinkSec(*
this, view, *lane, bestLaneConts);
7212 while (!lane->
isLinkEnd(link) && seen <= dist) {
7214 && (((*link)->getState() ==
LINKSTATE_ZIPPER && seen < (*link)->getFoeVisibilityDistance())
7215 || !(*link)->havePriority()))
7220 if ((*di).myLink !=
nullptr) {
7221 const MSLane* diPredLane = (*di).myLink->getLaneBefore();
7222 if (diPredLane !=
nullptr) {
7233 const SUMOTime leaveTime = (*link)->getLeaveTime((*di).myArrivalTime, (*di).myArrivalSpeed,
7246 lane = (*link)->getViaLaneOrLane();
7262 centerLine.push_back(pos);
7271 centerLine.push_back(lane->getShape().back());
7283 backPos = pos +
Position(l * cos(a), l * sin(a));
7285 centerLine.push_back(backPos);
7318 result.push_back(line1[0]);
7319 result.push_back(line2[0]);
7320 result.push_back(line2[1]);
7321 result.push_back(line1[1]);
7324 result.push_back(line1[1]);
7325 result.push_back(line2[1]);
7326 result.push_back(line2[0]);
7327 result.push_back(line1[0]);
7339 if (&(*i)->getEdge() == edge) {
7365 if (destParkArea ==
nullptr) {
7367 errorMsg =
"Vehicle " +
getID() +
" is not driving to a parking area so it cannot be rerouted.";
7380 if (newParkingArea ==
nullptr) {
7381 errorMsg =
"Parking area ID " +
toString(parkingAreaID) +
" not found in the network.";
7394 if (!newDestination) {
7405 if (edgesFromPark.size() > 0) {
7406 edges.insert(edges.end(), edgesFromPark.begin() + 1, edgesFromPark.end());
7420 const bool onInit =
myLane ==
nullptr;
7423 WRITE_WARNINGF(
"Vehicle '%' could not reroute to new parkingArea '%' reason=%, time=%.",
7433 const int numStops = (int)
myStops.size();
7478 if (stop.
busstop !=
nullptr) {
7507 rem.first->notifyStopEnded();
7516 const bool wasWaypoint = stop.
getSpeed() > 0;
7520 myStopDist = std::numeric_limits<double>::max();
7530 return !wasWaypoint;
7620#ifdef DEBUG_IGNORE_RED
7625 if (ignoreRedTime < 0) {
7627 if (ignoreYellowTime > 0 && link->
haveYellow()) {
7631 return !canBrake || ignoreYellowTime > yellowDuration;
7641#ifdef DEBUG_IGNORE_RED
7645 <<
" ignoreRedTime=" << ignoreRedTime
7646 <<
" spentRed=" << redDuration
7647 <<
" canBrake=" << canBrake <<
"\n";
7651 return !canBrake || ignoreRedTime > redDuration;
7668 if (
id == foe->
getID()) {
7694 if (veh ==
nullptr) {
7721 assert(logic !=
nullptr);
7738#ifdef DEBUG_PLAN_MOVE_LEADERINFO
7740 std::cout <<
" foeGap=" << foeGap <<
" foeBGap=" << foeBrakeGap <<
"\n";
7744 if (foeGap < foeBrakeGap) {
7768#ifdef DEBUG_PLAN_MOVE_LEADERINFO
7771 <<
" foeLane=" << foeLane->
getID()
7773 <<
" linkIndex=" << link->
getIndex()
7774 <<
" foeLinkIndex=" << foeLink->
getIndex()
7777 <<
" response=" << response
7778 <<
" response2=" << response2
7786 }
else if (response && response2) {
7792 if (egoET == foeET) {
7796#ifdef DEBUG_PLAN_MOVE_LEADERINFO
7798 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" equal ET " << egoET <<
" with foe " << veh->
getID()
7799 <<
" foeIsLeaderByID=" << (
getID() < veh->
getID()) <<
"\n";
7804#ifdef DEBUG_PLAN_MOVE_LEADERINFO
7806 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" equal ET " << egoET <<
" with foe " << veh->
getID()
7816#ifdef DEBUG_PLAN_MOVE_LEADERINFO
7818 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" egoET " << egoET <<
" with foe " << veh->
getID()
7819 <<
" foeET=" << foeET <<
" isLeader=" << (egoET > foeET) <<
"\n";
7822 return egoET > foeET;
7838 std::vector<std::string> internals;
7864 stop.write(out,
false);
7872 stop.writeParams(out);
7882 dev->saveState(out);
7893 throw ProcessError(
TL(
"Error: Invalid vehicles in state (may be a meso state)!"));
7910 bis >> stopDuration;
7927 while (pastStops > 0) {
7937 rem.first->notifyStopEnded();
7949 myLane = (*myCurrEdge)->getLanes()[0];
7969 myStops.front().startedFromState =
true;
7970 if (entryPos != realPos) {
7971 myStops.front().entryPos = entryPos;
7982 myStops.front().duration = stopDuration;
7994 SUMOTime arrivalTime,
double arrivalSpeed,
7995 double arrivalSpeedBraking,
7996 double dist,
double leaveSpeed) {
7999 arrivalTime, arrivalSpeed, arrivalSpeedBraking, dist, leaveSpeed));
8004std::shared_ptr<MSSimpleDriverState>
8020 if (prevAcceleration != std::numeric_limits<double>::min()) {
8080 return (myGUIIncrement);
8086 return (myManoeuvreType);
8104 myManoeuvreType = mType;
8119 if (abs(GUIAngle) < 0.1) {
8122 myManoeuvreVehicleID = veh->
getID();
8125 myManoeuvreStartTime = currentTime;
8127 myGUIIncrement = GUIAngle / (
STEPS2TIME(myManoeuvreCompleteTime - myManoeuvreStartTime) /
TS);
8131 std::cout <<
"ENTRY manoeuvre start: vehicle=" << veh->
getID() <<
" Manoeuvre Angle=" << manoeuverAngle <<
" Rotation angle=" <<
RAD2DEG(GUIAngle) <<
" Road Angle" <<
RAD2DEG(veh->
getAngle()) <<
" increment=" <<
RAD2DEG(myGUIIncrement) <<
" currentTime=" << currentTime <<
8132 " endTime=" << myManoeuvreCompleteTime <<
" manoeuvre time=" << myManoeuvreCompleteTime - currentTime <<
" parkArea=" << myManoeuvreStop << std::endl;
8158 if (abs(GUIAngle) < 0.1) {
8162 myManoeuvreVehicleID = veh->
getID();
8165 myManoeuvreStartTime = currentTime;
8167 myGUIIncrement = -GUIAngle / (
STEPS2TIME(myManoeuvreCompleteTime - myManoeuvreStartTime) /
TS);
8174 std::cout <<
"EXIT manoeuvre start: vehicle=" << veh->
getID() <<
" Manoeuvre Angle=" << manoeuverAngle <<
" increment=" <<
RAD2DEG(myGUIIncrement) <<
" currentTime=" << currentTime
8175 <<
" endTime=" << myManoeuvreCompleteTime <<
" manoeuvre time=" << myManoeuvreCompleteTime - currentTime <<
" parkArea=" << myManoeuvreStop << std::endl;
8193 if (configureEntryManoeuvre(veh)) {
8210 if (checkType != myManoeuvreType) {
8234std::pair<double, double>
8238 if (lane ==
nullptr) {
8249 travelTime += (*it)->getMinimumTravelTime(
this);
8250 dist += (*it)->getLength();
8255 dist += stopEdgeDist;
8262 const double d = dist;
8268 const double maxVD =
MAX2(c, ((sqrt(
MAX2(0.0, pow(2 * c * b, 2) + (4 * ((b * ((a * (2 * d * (b + a) + (vs * vs) - (c * c))) - (b * (c * c))))
8269 + pow((a * vs), 2))))) * 0.5) + (c * b)) / (b + a));
8273 double timeLossAccel = 0;
8274 double timeLossDecel = 0;
8275 double timeLossLength = 0;
8277 double v =
MIN2(maxVD, (*it)->getVehicleMaxSpeed(
this));
8279 if (edgeLength <= len && v0Stable && v0 < v) {
8280 const double lengthDist =
MIN2(len, edgeLength);
8281 const double dTL = lengthDist / v0 - lengthDist / v;
8283 timeLossLength += dTL;
8285 if (edgeLength > len) {
8286 const double dv = v - v0;
8289 const double dTA = dv / a - dv * (v + v0) / (2 * a * v);
8291 timeLossAccel += dTA;
8293 }
else if (dv < 0) {
8295 const double dTD = -dv / b + dv * (v + v0) / (2 * b * v0);
8297 timeLossDecel += dTD;
8306 const double dv = v - v0;
8309 const double dTA = dv / a - dv * (v + v0) / (2 * a * v);
8311 timeLossAccel += dTA;
8313 }
else if (dv < 0) {
8315 const double dTD = -dv / b + dv * (v + v0) / (2 * b * v0);
8317 timeLossDecel += dTD;
8319 const double result = travelTime + timeLossAccel + timeLossDecel + timeLossLength;
8322 return {
MAX2(0.0, result), dist};
8383 return nextInternal ? nextInternal : nextNormal;
8395 bool resultInternal;
8398 if (furtherIndex % 2 == 0) {
8399 routeIndex -= (furtherIndex + 0) / 2;
8400 resultInternal =
false;
8402 routeIndex -= (furtherIndex + 1) / 2;
8403 resultInternal =
false;
8406 if (furtherIndex % 2 != 0) {
8407 routeIndex -= (furtherIndex + 1) / 2;
8408 resultInternal =
false;
8410 routeIndex -= (furtherIndex + 2) / 2;
8411 resultInternal =
true;
8415 routeIndex -= furtherIndex;
8416 resultInternal =
false;
8419 if (routeIndex >= 0) {
8420 if (resultInternal) {
8423 for (
MSLink* link : cand->getLinkCont()) {
8424 if (link->getLane() == current) {
8425 if (link->getViaLane() !=
nullptr) {
8426 return link->getViaLane();
8428 return const_cast<MSLane*
>(link->getLaneBefore());
8434 return myRoute->getEdges()[routeIndex]->getLanes()[0];
8450 bool diverged =
false;
8454 if (dpi.myLink !=
nullptr) {
8456 const MSEdge* next = route[ri + 1];
8457 if (&dpi.myLink->getLane()->getEdge() != next) {
8460 if (dpi.myLink->getViaLane() ==
nullptr) {
8466 dpi.myLink->removeApproaching(
this);
std::vector< const MSEdge * > ConstMSEdgeVector
std::vector< MSEdge * > MSEdgeVector
std::pair< const MSVehicle *, double > CLeaderDist
std::pair< const MSPerson *, double > PersonDist
ConstMSEdgeVector::const_iterator MSRouteIterator
#define NUMERICAL_EPS_SPEED
#define STOPPING_PLACE_OFFSET
#define JUNCTION_BLOCKAGE_TIME
#define DIST_TO_STOPLINE_EXPECT_PRIORITY
#define WRITE_WARNINGF(...)
std::shared_ptr< const MSRoute > ConstMSRoutePtr
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
constexpr SUMOTime TIME2STEPS(double x)
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permissions is a (exclusive) railway edge.
@ RAIL_CARGO
render as a cargo train
@ PASSENGER_VAN
render as a van
@ PASSENGER
render as a passenger vehicle
@ RAIL_CAR
render as a (city) rail without locomotive
@ PASSENGER_HATCHBACK
render as a hatchback passenger vehicle ("Fliessheck")
@ BUS_FLEXIBLE
render as a flexible city bus
@ TRUCK_1TRAILER
render as a transport vehicle with one trailer
@ PASSENGER_SEDAN
render as a sedan passenger vehicle ("Stufenheck")
@ PASSENGER_WAGON
render as a wagon passenger vehicle ("Combi")
@ TRUCK_SEMITRAILER
render as a semi-trailer transport vehicle ("Sattelschlepper")
@ SVC_RAIL_CLASSES
classes which drive on tracks
@ SVC_EMERGENCY
public emergency vehicles
const long long int VEHPARS_FORCE_REROUTE
@ GIVEN
The lane is given.
@ DEFAULT
No information given; use default.
@ GIVEN
The speed is given.
@ SPLIT_FRONT
depart position for a split vehicle is in front of the continuing vehicle
const long long int VEHPARS_CFMODEL_PARAMS_SET
@ GIVEN
The arrival lane is given.
@ GIVEN
The speed is given.
@ GIVEN
The arrival position is given.
@ DEFAULT
No information given; use default.
const int STOP_STARTED_SET
@ SUMO_TAG_PARKING_AREA_REROUTE
entry for an alternative parking zone
@ SUMO_TAG_PARKING_AREA
A parking area.
@ SUMO_TAG_OVERHEAD_WIRE_SEGMENT
An overhead wire segment.
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)....
@ PARTLEFT
The link is a partial left direction.
@ RIGHT
The link is a (hard) right direction.
@ TURN
The link is a 180 degree turn.
@ LEFT
The link is a (hard) left direction.
@ STRAIGHT
The link is a straight direction.
@ TURN_LEFTHAND
The link is a 180 degree turn (left-hand network)
@ PARTRIGHT
The link is a partial right direction.
@ NODIR
The link has no direction (is a dead end link)
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_ALLWAY_STOP
This is an uncontrolled, all-way stop link.
@ LINKSTATE_EQUAL
This is an uncontrolled, right-before-left link.
@ LINKSTATE_ZIPPER
This is an uncontrolled, zipper-merge link.
@ LCA_KEEPRIGHT
The action is due to the default of keeping right "Rechtsfahrgebot".
@ LCA_BLOCKED
blocked in all directions
@ LCA_URGENT
The action is urgent (to be defined by lc-model)
@ LCA_STAY
Needs to stay on the current lane.
@ LCA_SUBLANE
used by the sublane model
@ LCA_WANTS_LANECHANGE_OR_STAY
lane can change or stay
@ LCA_COOPERATIVE
The action is done to help someone else.
@ LCA_OVERLAPPING
The vehicle is blocked being overlapping.
@ LCA_LEFT
Wants go to the left.
@ LCA_STRATEGIC
The action is needed to follow the route (navigational lc)
@ LCA_TRACI
The action is due to a TraCI request.
@ LCA_SPEEDGAIN
The action is due to the wish to be faster (tactical lc)
@ LCA_RIGHT
Wants go to the right.
@ SUMO_ATTR_JM_STOPLINE_GAP_MINOR
@ SUMO_ATTR_JM_STOPLINE_CROSSING_GAP
@ SUMO_ATTR_JM_IGNORE_KEEPCLEAR_TIME
@ SUMO_ATTR_MAXIMUMPOWER
Maximum Power.
@ SUMO_ATTR_CF_IGNORE_IDS
@ SUMO_ATTR_JM_STOPLINE_GAP
@ SUMO_ATTR_JM_DRIVE_AFTER_RED_TIME
@ SUMO_ATTR_JM_DRIVE_AFTER_YELLOW_TIME
@ SUMO_ATTR_LCA_CONTRIGHT
@ SUMO_ATTR_CF_IGNORE_TYPES
@ SUMO_ATTR_ARRIVALPOS_RANDOMIZED
@ SUMO_ATTR_JM_IGNORE_JUNCTION_FOE_PROB
@ SUMO_ATTR_STATE
The state of a link.
@ SUMO_ATTR_JM_DRIVE_RED_SPEED
int gPrecision
the precision for floating point outputs
bool gDebugFlag1
global utility flags for debugging
const double INVALID_DOUBLE
invalid double
const double SUMO_const_laneWidth
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
#define SOFT_ASSERT(expr)
define SOFT_ASSERT raise an assertion in debug mode everywhere except on the windows test server
double getDoubleOptional(SumoXMLAttr attr, const double def) const
Returns the value for a given key with an optional default. SUMO_ATTR_MASS and SUMO_ATTR_FRONTSURFACE...
void setDynamicValues(const SUMOTime stopDuration, const bool parking, const SUMOTime waitingTime, const double angleDiff)
Sets the values which change possibly in every simulation step and are relevant for emsssion calculat...
static double naviDegree(const double angle)
static double fromNaviDegree(const double angle)
static double angleDiff(const double angle1, const double angle2)
Returns the difference of the second angle to the first angle in radiants.
Interface for lane-change models.
double getLaneChangeCompletion() const
Get the current lane change completion ratio.
MSLane * updateTargetLane()
bool hasBlueLight() const
const std::vector< double > & getShadowFurtherLanesPosLat() const
double getCommittedSpeed() const
virtual void resetSpeedLat()
double getManeuverDist() const
Returns the remaining unblocked distance for the current maneuver. (only used by sublane model)
int getLaneChangeDirection() const
return the direction of the current lane change maneuver
virtual void prepareStep()
void resetChanged()
reset the flag whether a vehicle already moved to false
MSLane * getShadowLane() const
Returns the lane the vehicle's shadow is on during continuous/sublane lane change.
virtual void saveState(OutputDevice &out) const
Save the state of the laneChangeModel.
void endLaneChangeManeuver(const MSMoveReminder::Notification reason=MSMoveReminder::NOTIFICATION_LANE_CHANGE)
void setNoShadowPartialOccupator(MSLane *lane)
MSLane * getTargetLane() const
Returns the lane the vehicle has committed to enter during a sublane lane change.
double getStrategicLookahead() const
SUMOTime remainingTime() const
Compute the remaining time until LC completion.
void setShadowApproachingInformation(MSLink *link) const
set approach information for the shadow vehicle
double getCooperativeHelpSpeed(const MSLane *lane, double distToLaneEnd) const
return speed for helping a vehicle that is blocked from changing
static MSAbstractLaneChangeModel * build(LaneChangeModel lcm, MSVehicle &vehicle)
Factory method for instantiating new lane changing models.
void changedToOpposite()
called when a vehicle changes between lanes in opposite directions
int getShadowDirection() const
return the direction in which the current shadow lane lies
virtual void loadState(const SUMOSAXAttributes &attrs)
Loads the state of the laneChangeModel from the given attributes.
double calcAngleOffset()
return the angle offset during a continuous change maneuver
void setPreviousAngleOffset(const double angleOffset)
set the angle offset of the previous time step
const std::vector< MSLane * > & getFurtherTargetLanes() const
virtual void resetState()
double getAngleOffset() const
return the angle offset resulting from lane change and sigma
const std::vector< MSLane * > & getShadowFurtherLanes() const
bool isChangingLanes() const
return true if the vehicle currently performs a lane change maneuver
void removeShadowApproachingInformation() const
void setExtraImpatience(double value)
Sets routing behavior.
The base class for microscopic and mesoscopic vehicles.
double getMaxSpeed() const
Returns the maximum speed (the minimum of desired and technical maximum speed)
bool haveValidStopEdges(bool silent=false) const
check whether all stop.edge MSRouteIterators are valid and in order
virtual bool isSelected() const
whether this vehicle is selected in the GUI
std::list< MSStop > myStops
The vehicle's list of stops.
double getImpatience() const
Returns this vehicles impatience.
const std::vector< MSTransportable * > & getPersons() const
retrieve riding persons
virtual void initDevices()
const MSEdge * succEdge(int nSuccs) const
Returns the nSuccs'th successor of edge the vehicle is currently at.
void calculateArrivalParams(bool onInit)
(Re-)Calculates the arrival position and lane from the vehicle parameters
virtual double getArrivalPos() const
Returns this vehicle's desired arrivalPos for its current route (may change on reroute)
MoveReminderCont myMoveReminders
Currently relevant move reminders.
double myDepartPos
The real depart position.
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
void replaceParameter(const SUMOVehicleParameter *newParameter)
replace the vehicle parameter (deleting the old one)
double getChosenSpeedFactor() const
Returns the precomputed factor by which the driver wants to be faster than the speed limit.
std::vector< MSVehicleDevice * > myDevices
The devices this vehicle has.
virtual void addTransportable(MSTransportable *transportable)
Adds a person or container to this vehicle.
const SUMOVehicleParameter::Stop * getNextStopParameter() const
return parameters for the next stop (SUMOVehicle Interface)
virtual bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addRouteStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
const MSVehicleType * myType
This vehicle's type.
void cleanupParkingReservation()
unregisters from a parking reservation when changing or skipping stops
double getLength() const
Returns the vehicle's length.
bool isParking() const
Returns whether the vehicle is parking.
MSParkingArea * getCurrentParkingArea()
get the current parking area stop or nullptr
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
int getPersonNumber() const
Returns the number of persons.
MSRouteIterator myCurrEdge
Iterator to current route-edge.
StopParVector myPastStops
The list of stops that the vehicle has already reached.
bool hasDeparted() const
Returns whether this vehicle has already departed.
bool ignoreTransientPermissions() const
Returns whether this object is ignoring transient permission changes (during routing)
ConstMSRoutePtr myRoute
This vehicle's route.
double getWidth() const
Returns the vehicle's width.
MSDevice_Transportable * myContainerDevice
The containers this vehicle may have.
const std::list< MSStop > & getStops() const
double getDesiredMaxSpeed() const
void addReminder(MSMoveReminder *rem, double pos=0)
Adds a MoveReminder dynamically.
SUMOTime getDeparture() const
Returns this vehicle's real departure time.
EnergyParams * getEmissionParameters() const
retrieve parameters for the energy consumption model
MSDevice_Transportable * myPersonDevice
The passengers this vehicle may have.
bool hasStops() const
Returns whether the vehicle has to stop somewhere.
virtual void activateReminders(const MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
"Activates" all current move reminder
const MSStop & getNextStop() const
@ ROUTE_START_INVALID_LANE
@ ROUTE_START_INVALID_PERMISSIONS
void addStops(const bool ignoreStopErrors, MSRouteIterator *searchStart=nullptr, bool addRouteStops=true)
Adds stops to the built vehicle.
SUMOVehicleClass getVClass() const
Returns the vehicle's access class.
MSParkingArea * getNextParkingArea()
get the upcoming parking area stop or nullptr
int myArrivalLane
The destination lane where the vehicle stops.
SUMOTime myDeparture
The real departure time.
bool isStoppedTriggered() const
Returns whether the vehicle is on a triggered stop.
void onDepart()
Called when the vehicle is inserted into the network.
virtual bool addTraciStop(SUMOVehicleParameter::Stop stop, std::string &errorMsg)
const MSRoute & getRoute() const
Returns the current route.
int getRoutePosition() const
return index of edge within route
bool replaceParkingArea(MSParkingArea *parkingArea, std::string &errorMsg)
replace the current parking area stop with a new stop with merge duration
static const SUMOTime NOT_YET_DEPARTED
bool myAmRegisteredAsWaiting
Whether this vehicle is registered as waiting for a person or container (for deadlock-recognition)
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT() const
returns the router according to the current routing mode of the vehicle
EnergyParams * myEnergyParams
The emission parameters this vehicle may have.
const SUMOVehicleParameter * myParameter
This vehicle's parameter.
int myRouteValidity
status of the current vehicle route
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
bool isStopped() const
Returns whether the vehicle is at a stop.
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists, nullptr otherwise.
int myNumberReroutes
The number of reroutings.
double myArrivalPos
The position on the destination lane where the vehicle stops.
virtual void saveState(OutputDevice &out)
Saves the (common) state of a vehicle.
virtual void replaceVehicleType(const MSVehicleType *type)
Replaces the current vehicle type by the one given.
double myOdometer
A simple odometer to keep track of the length of the route already driven.
int getContainerNumber() const
Returns the number of containers.
bool replaceRouteEdges(ConstMSEdgeVector &edges, double cost, double savings, const std::string &info, bool onInit=false, bool check=false, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given edges.
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 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 VehicleVariables * createVehicleVariables() const
Returns model specific values which are stored inside a vehicle and must be used with casting.
double getEmergencyDecel() const
Get the vehicle type's maximal physically possible deceleration [m/s^2].
SUMOTime getStartupDelay() const
Get the vehicle type's startupDelay.
double getMinimalArrivalSpeed(double dist, double currentSpeed) const
Computes the minimal possible arrival speed after covering a given distance.
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 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 getMinimalArrivalTime(double dist, double currentSpeed, double arrivalSpeed) const
Computes the minimal time needed to cover a distance given the desired speed at arrival.
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 bool startupDelayStopped() const
whether startupDelay should be applied after stopping
@ FUTURE
the return value is used for calculating future speeds
@ CURRENT_WAIT
the return value is used for calculating junction stop speeds
virtual double maxNextSafeMin(double speed, const MSVehicle *const veh=0) const
Returns the maximum speed given the current speed and regarding driving dynamics.
double getApparentDecel() const
Get the vehicle type's apparent deceleration [m/s^2] (the one regarded by its followers.
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....
virtual double maximumLaneSpeedCF(const MSVehicle *const veh, double maxSpeed, double maxSpeedLane) const
Returns the maximum velocity the CF-model wants to achieve in the next step.
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.
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
double getMinimalArrivalSpeedEuler(double dist, double currentSpeed) const
Computes the minimal possible arrival speed after covering a given distance for Euler update.
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 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 getHeadwayTime() const
Get the driver's desired headway [s].
The ToC Device controls transition of control between automated and manual driving.
std::shared_ptr< MSSimpleDriverState > getDriverState() const
return internal state
void update()
update internal state
A device which collects info on the vehicle trip (mainly on departure and arrival)
double consumption(SUMOVehicle &veh, double a, double newSpeed)
return energy consumption in Wh (power multiplied by TS)
void setConsum(const double consumption)
double acceleration(SUMOVehicle &veh, double power, double oldSpeed)
double getConsum() const
Get consum.
A device which collects info on current friction Coefficient on the road.
double getMeasuredFriction()
A device which collects info on the vehicle trip (mainly on departure and arrival)
A device which collects info on the vehicle trip (mainly on departure and arrival)
void cancelCurrentCustomers()
remove the persons the taxi is currently waiting for from reservations
bool notifyMove(SUMOTrafficObject &veh, double oldPos, double newPos, double newSpeed)
Checks whether the vehicle is at a stop and transportable action is needed.
bool anyLeavingAtStop(const MSStop &stop) const
void transferAtSplitOrJoin(MSBaseVehicle *otherVeh)
transfers transportables that want to continue in the other train part (without boarding/loading dela...
void checkCollisionForInactive(MSLane *l)
trigger collision checking for inactive lane
A road/street connecting two junctions.
static void clear()
Clears the dictionary.
static DepartLaneDefinition & getDefaultDepartLaneDefinition()
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersons() const
Returns this edge's persons set.
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
const MSEdge * getOppositeEdge() const
Returns the opposite direction edge if on exists else a nullptr.
bool isFringe() const
return whether this edge is at the fringe of the network
const MSEdge * getNormalSuccessor() const
if this edge is an internal edge, return its first normal successor, otherwise the edge itself
const std::vector< MSLane * > * allowedLanes(const MSEdge &destination, SUMOVehicleClass vclass=SVC_IGNORING, bool ignoreTransientPermissions=false) const
Get the allowed lanes to reach the destination-edge.
const MSEdge * getBidiEdge() const
return opposite superposable/congruent edge, if it exist and 0 else
bool isNormal() const
return whether this edge is an internal edge
double getSpeedLimit() const
Returns the speed limit of the edge @caution The speed limit of the first lane is returned; should pr...
bool hasChangeProhibitions(SUMOVehicleClass svc, int index) const
return whether this edge prohibits changing for the given vClass when starting on the given lane inde...
bool hasLaneChanger() const
const MSJunction * getToJunction() const
const MSJunction * getFromJunction() const
double getMinimumTravelTime(const SUMOVehicle *const veh) const
returns the minimum travel time for the given vehicle
bool isRoundabout() const
bool isInternal() const
return whether this edge is an internal edge
double getWidth() const
Returns the edges's width (sum over all lanes)
bool isVaporizing() const
Returns whether vehicles on this edge shall be vaporized.
void addWaiting(SUMOVehicle *vehicle) const
Adds a vehicle to the list of waiting vehicles.
const MSEdge * getInternalFollowingEdge(const MSEdge *followerAfterInternal, SUMOVehicleClass vClass) const
void removeWaiting(const SUMOVehicle *vehicle) const
Removes a vehicle from the list of waiting vehicles.
const MSEdgeVector & getSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Returns the following edges, restricted by vClass.
static bool gModelParkingManoeuver
whether parking simulation includes manoeuver time and any associated lane blocking
static bool gUseStopStarted
static SUMOTime gStartupWaitThreshold
The minimum waiting time before applying startupDelay.
static double gTLSYellowMinDecel
The minimum deceleration at a yellow traffic light (only overruled by emergencyDecel)
static double gLateralResolution
static bool gSemiImplicitEulerUpdate
static bool gSlopeCentered
whether to use a simplified slope computation (for compatibility with other simulations)
static bool gLefthand
Whether lefthand-drive is being simulated.
static bool gSublane
whether sublane simulation is enabled (sublane model or continuous lanechanging)
static SUMOTime gLaneChangeDuration
static bool gUseStopEnded
whether the simulation should replay previous stop times
static double gEmergencyDecelWarningThreshold
threshold for warning about strong deceleration
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
void add(SUMOVehicle *veh)
Adds a single vehicle for departure.
virtual const MSJunctionLogic * getLogic() const
virtual const MSLogicJunction::LinkBits & getResponseFor(int linkIndex) const
Returns the response for the given link.
Representation of a lane in the micro simulation.
std::vector< StopWatch< std::chrono::nanoseconds > > & getStopWatch()
const std::vector< MSMoveReminder * > & getMoveReminders() const
Return the list of this lane's move reminders.
std::pair< const MSPerson *, double > nextBlocking(double minPos, double minRight, double maxLeft, double stopTime=0, bool bidi=false) const
This is just a wrapper around MSPModel::nextBlocking. You should always check using hasPedestrians be...
MSLane * getParallelLane(int offset, bool includeOpposite=true) const
Returns the lane with the given offset parallel to this one or 0 if it does not exist.
virtual MSVehicle * removeVehicle(MSVehicle *remVehicle, MSMoveReminder::Notification notification, bool notify=true)
int getVehicleNumber() const
Returns the number of vehicles on this lane (for which this lane is responsible)
MSVehicle * getFirstAnyVehicle() const
returns the first vehicle that is fully or partially on this lane
const MSLink * getEntryLink() const
Returns the entry link if this is an internal lane, else nullptr.
int getVehicleNumberWithPartials() const
Returns the number of vehicles on this lane (including partial occupators)
double getBruttoVehLenSum() const
Returns the sum of lengths of vehicles, including their minGaps, which were on the lane during the la...
std::pair< MSVehicle *const, double > getFollower(const MSVehicle *ego, double egoPos, double dist, MinorLinkMode mLinkMode, bool maxSearchDist=false) const
Find follower vehicle for the given ego vehicle (which may be on the opposite direction lane)
static std::vector< MSLink * >::const_iterator succLinkSec(const SUMOVehicle &veh, int nRouteSuccs, const MSLane &succLinkSource, const std::vector< MSLane * > &conts)
void markRecalculateBruttoSum()
Set a flag to recalculate the brutto (including minGaps) occupancy of this lane (used if mingap is ch...
const MSLink * getLinkTo(const MSLane *const) const
returns the link to the given lane or nullptr, if it is not connected
const MSLeaderInfo getLastVehicleInformation(const MSVehicle *ego, double latOffset, double minPos=0, bool allowCached=true, const MSVehicle *ignore=nullptr) const
Returns the last vehicles on the lane.
MSLeaderDistanceInfo getFollowersOnConsecutive(const MSVehicle *ego, double backOffset, bool allSublanes, double searchDist=-1, MinorLinkMode mLinkMode=FOLLOW_ALWAYS, bool maxSearchDist=false) const
return the sublane followers with the largest missing rear gap among all predecessor lanes (within di...
void forceVehicleInsertion(MSVehicle *veh, double pos, MSMoveReminder::Notification notification, double posLat=0)
Inserts the given vehicle at the given position.
double getVehicleStopOffset(const MSVehicle *veh) const
Returns vehicle class specific stopOffset for the vehicle.
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
std::vector< MSVehicle * > VehCont
Container for vehicles.
const MSEdge * getNextNormal() const
Returns the lane's follower if it is an internal lane, the edge of the lane otherwise.
SVCPermissions getPermissions() const
Returns the vehicle class permissions for this lane.
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
MSLane * getCanonicalPredecessorLane() const
double getLength() const
Returns the lane's length.
double getMaximumBrakeDist() const
compute maximum braking distance on this lane
const MSLane * getInternalFollowingLane(const MSLane *const) const
returns the internal lane leading to the given lane or nullptr, if there is none
std::pair< MSVehicle *const, double > getLeaderOnConsecutive(double dist, double seen, double speed, const MSVehicle &veh, const std::vector< MSLane * > &bestLaneConts, bool considerCrossingFoes=true) const
Returns the immediate leader and the distance to him.
bool isLinkEnd(std::vector< MSLink * >::const_iterator &i) const
bool allowsVehicleClass(SUMOVehicleClass vclass) const
virtual double setPartialOccupation(MSVehicle *v)
Sets the information about a vehicle lapping into this lane.
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
double getRightSideOnEdge() const
bool hasPedestrians() const
whether the lane has pedestrians on it
int getIndex() const
Returns the lane's index.
MSLane * getCanonicalSuccessorLane() const
double getOppositePos(double pos) const
return the corresponding position on the opposite lane
MSLane * getLogicalPredecessorLane() const
get the most likely predecessor lane (sorted using by_connections_to_sorter). The result is cached in...
double getCenterOnEdge() const
MSVehicle * getLastAnyVehicle() const
returns the last vehicle that is fully or partially on this lane
virtual void resetPartialOccupation(MSVehicle *v)
Removes the information about a vehicle lapping into this lane.
MSLane * getOpposite() const
return the neighboring opposite direction lane for lane changing or nullptr
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
bool mustCheckJunctionCollisions() const
whether this lane must check for junction collisions
double interpolateLanePosToGeometryPos(double lanePos) const
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
virtual const PositionVector & getShape(bool) const
MSLane * getParallelOpposite() const
return the opposite direction lane of this lanes edge or nullptr
MSEdge & getEdge() const
Returns the lane's edge.
double getSpaceTillLastStanding(const MSVehicle *ego, bool &foundStopped) const
return the empty space up to the last standing vehicle or the empty space on the whole lane if no veh...
const MSLane * getNormalPredecessorLane() const
get normal lane leading to this internal lane, for normal lanes, the lane itself is returned
double getWidth() const
Returns the lane's width.
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
MSVehicle * getFirstFullVehicle() const
returns the first vehicle for which this lane is responsible or 0
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
static CollisionAction getCollisionAction()
saves leader/follower vehicles and their distances relative to an ego vehicle
virtual std::string toString() const
print a debugging representation
void fixOppositeGaps(bool isFollower)
subtract vehicle length from all gaps if the leader vehicle is driving in the opposite direction
virtual int addLeader(const MSVehicle *veh, double gap, double latOffset=0, int sublane=-1)
void setSublaneOffset(int offset)
set number of sublanes by which to shift positions
void removeOpposite(const MSLane *lane)
remove vehicles that are driving in the opposite direction (fully or partially) on the given lane
virtual int addLeader(const MSVehicle *veh, bool beyond, double latOffset=0.)
virtual std::string toString() const
print a debugging representation
virtual void clear()
discard all information
int getSublaneOffset() const
void getSubLanes(const MSVehicle *veh, double latOffset, int &rightmost, int &leftmost) const
bool fromInternalLane() const
return whether the fromLane of this link is an internal lane
bool isIndirect() const
whether this link is the start of an indirect turn
const MSLane * getInternalLaneBefore() const
return myInternalLaneBefore (always 0 when compiled without internal lanes)
LinkState getState() const
Returns the current state of the link.
bool hasApproachingFoe(SUMOTime arrivalTime, SUMOTime leaveTime, double speed, double decel) const
Returns the information whether a vehicle is approaching on one of the link's foe streams.
MSJunction * getJunction() const
void setApproaching(const SUMOVehicle *approaching, const SUMOTime arrivalTime, const double arrivalSpeed, const double leaveSpeed, const bool setRequest, const double arrivalSpeedBraking, const SUMOTime waitingTime, double dist, double latOffset)
Sets the information about an approaching vehicle.
SUMOTime getLastStateChange() const
MSLane * getLane() const
Returns the connected lane.
bool opened(SUMOTime arrivalTime, double arrivalSpeed, double leaveSpeed, double vehicleLength, double impatience, double decel, SUMOTime waitingTime, double posLat=0, BlockingFoes *collectFoes=nullptr, bool ignoreRed=false, const SUMOTrafficObject *ego=nullptr, double dist=-1) const
Returns the information whether the link may be passed.
bool isConflictEntryLink() const
return whether this link enters the conflict area (not a continuation link)
int getIndex() const
Returns the respond index (for visualization)
bool havePriority() const
Returns whether this link is a major link.
const LinkLeaders getLeaderInfo(const MSVehicle *ego, double dist, std::vector< const MSPerson * > *collectBlockers=0, bool isShadowLink=false) const
Returns all potential link leaders (vehicles on foeLanes) Valid during the planMove() phase.
bool isEntryLink() const
return whether the toLane of this link is an internal lane and fromLane is a normal lane
const MSLane * getLaneBefore() const
return the internalLaneBefore if it exists and the laneBefore otherwise
bool isInternalJunctionLink() const
return whether the fromLane and the toLane of this link are internal lanes
bool isExitLink() const
return whether the fromLane of this link is an internal lane and toLane is a normal lane
std::vector< LinkLeader > LinkLeaders
MSLane * getViaLane() const
Returns the following inner lane.
std::string getDescription() const
get string description for this link
bool hasFoes() const
Returns whether this link belongs to a junction where more than one edge is incoming.
const MSLink * getCorrespondingEntryLink() const
returns the corresponding entry link for exitLinks to a junction.
void removeApproaching(const SUMOVehicle *veh)
removes the vehicle from myApproachingVehicles
bool isExitLinkAfterInternalJunction() const
return whether the fromLane of this link is an internal lane and its incoming lane is also an interna...
MSLink * getParallelLink(int direction) const
return the link that is parallel to this link or 0
MSLane * getViaLaneOrLane() const
return the via lane if it exists and the lane otherwise
std::vector< const SUMOTrafficObject * > BlockingFoes
double getLateralShift() const
return lateral shift that must be applied when passing this link
double getFoeVisibilityDistance() const
Returns the distance on the approaching lane from which an approaching vehicle is able to see all rel...
bool lastWasContMajor() const
whether this is a link past an internal junction which currently has priority
const MSTrafficLightLogic * getTLLogic() const
Returns the TLS index.
double getZipperSpeed(const MSVehicle *ego, const double dist, double vSafe, SUMOTime arrivalTime, const BlockingFoes *foes) const
return the speed at which ego vehicle must approach the zipper link
MSLink * getOppositeDirectionLink() const
return the link that is the opposite entry link to this one
LinkDirection getDirection() const
Returns the direction the vehicle passing this link take.
bool keepClear() const
whether the junction after this link must be kept clear
bool haveRed() const
Returns whether this link is blocked by a red (or redyellow) traffic light.
Something on a lane to be noticed about vehicle movement.
Notification
Definition of a vehicle state.
@ NOTIFICATION_TELEPORT_ARRIVED
The vehicle was teleported out of the net.
@ NOTIFICATION_PARKING_REROUTE
The vehicle needs another parking area.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NOTIFICATION_LANE_CHANGE
The vehicle changes lanes (micro only)
@ NOTIFICATION_VAPORIZED_VAPORIZER
The vehicle got vaporized with a vaporizer.
@ NOTIFICATION_JUNCTION
The vehicle arrived at a junction.
@ NOTIFICATION_PARKING
The vehicle starts or ends parking.
@ NOTIFICATION_VAPORIZED_COLLISION
The vehicle got removed by a collision.
@ NOTIFICATION_LOAD_STATE
The vehicle has been loaded from a state file.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
@ NOTIFICATION_TELEPORT_CONTINUATION
The vehicle continues being teleported past an edge.
The simulated network and simulation perfomer.
void removeVehicleStateListener(VehicleStateListener *listener)
Removes a vehicle states listener.
VehicleState
Definition of a vehicle state.
@ STARTING_STOP
The vehicles starts to stop.
@ STARTING_PARKING
The vehicles starts to park.
@ STARTING_TELEPORT
The vehicle started to teleport.
@ ENDING_STOP
The vehicle ends to stop.
@ ARRIVED
The vehicle arrived at his destination (is deleted)
@ EMERGENCYSTOP
The vehicle had to brake harder than permitted.
@ MANEUVERING
Vehicle maneuvering either entering or exiting a parking space.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
virtual MSTransportableControl & getContainerControl()
Returns the container control.
std::string getStoppingPlaceID(const MSLane *lane, const double pos, const SumoXMLTag category) const
Returns the stop of the given category close to the given position.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
static bool hasInstance()
Returns whether the network was already constructed.
MSStoppingPlace * getStoppingPlace(const std::string &id, const SumoXMLTag category) const
Returns the named stopping place of the given category.
void addVehicleStateListener(VehicleStateListener *listener)
Adds a vehicle states listener.
bool hasContainers() const
Returns whether containers are simulated.
void informVehicleStateListener(const SUMOVehicle *const vehicle, VehicleState to, const std::string &info="")
Informs all added listeners about a vehicle's state change.
bool hasPersons() const
Returns whether persons are simulated.
MSInsertionControl & getInsertionControl()
Returns the insertion control.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
virtual MSTransportableControl & getPersonControl()
Returns the person control.
MSEdgeControl & getEdgeControl()
Returns the edge control.
bool hasInternalLinks() const
return whether the network contains internal links
bool hasElevation() const
return whether the network contains elevation data
static const double SAFETY_GAP
A lane area vehicles can halt at.
int getOccupancyIncludingReservations(const SUMOVehicle *forVehicle) const
void enter(SUMOVehicle *veh, const bool parking) override
Called if a vehicle enters this stop.
void leaveFrom(SUMOVehicle *what) override
Called if a vehicle leaves this stop.
int getCapacity() const
Returns the area capacity.
int getLotIndex(const SUMOVehicle *veh) const
compute lot for this vehicle
int getLastFreeLotAngle() const
Return the angle of myLastFreeLot - the next parking lot only expected to be called after we have est...
bool parkOnRoad() const
whether vehicles park on the road
double getLastFreePosWithReservation(SUMOTime t, const SUMOVehicle &forVehicle, double brakePos)
Returns the last free position on this stop including reservations from the current lane and time ste...
double getLastFreeLotGUIAngle() const
Return the GUI angle of myLastFreeLot - the angle the GUI uses to rotate into the next parking lot as...
int getManoeuverAngle(const SUMOVehicle &forVehicle) const
Return the manoeuver angle of the lot where the vehicle is parked.
int getOccupancy() const
Returns the area occupancy.
double getGUIAngle(const SUMOVehicle &forVehicle) const
Return the GUI angle of the lot where the vehicle is parked.
void notifyApproach(const MSLink *link)
switch rail signal to active
static MSRailSignalControl & getInstance()
const ConstMSEdgeVector & getEdges() const
const MSEdge * getLastEdge() const
returns the destination edge
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
const MSLane * lane
The lane to stop at (microsim only)
bool triggered
whether an arriving person lets the vehicle continue
bool containerTriggered
whether an arriving container lets the vehicle continue
SUMOTime timeToLoadNextContainer
The time at which the vehicle is able to load another container.
MSStoppingPlace * containerstop
(Optional) container stop if one is assigned to the stop
double getSpeed() const
return speed for passing waypoint / skipping on-demand stop
bool joinTriggered
whether coupling another vehicle (train) the vehicle continue
bool isOpposite
whether this an opposite-direction stop
SUMOTime getMinDuration(SUMOTime time) const
return minimum stop duration when starting stop at time
int numExpectedContainer
The number of still expected containers.
bool reached
Information whether the stop has been reached.
MSRouteIterator edge
The edge in the route to stop at.
SUMOTime timeToBoardNextPerson
The time at which the vehicle is able to board another person.
bool skipOnDemand
whether the decision to skip this stop has been made
const MSEdge * getEdge() const
double entryPos
the exact position when entering the stop (for state saving)
double getReachedThreshold() const
return startPos taking into account opposite stopping
SUMOTime endBoarding
the maximum time at which persons may board this vehicle
double getEndPos(const SUMOVehicle &veh) const
return halting position for upcoming stop;
int numExpectedPerson
The number of still expected persons.
MSParkingArea * parkingarea
(Optional) parkingArea if one is assigned to the stop
bool startedFromState
whether the 'started' value was loaded from simulaton state
MSStoppingPlace * chargingStation
(Optional) charging station if one is assigned to the stop
SUMOTime duration
The stopping duration.
SUMOTime getUntil() const
return until / ended time
const SUMOVehicleParameter::Stop pars
The stop parameter.
MSStoppingPlace * busstop
(Optional) bus stop if one is assigned to the stop
void stopBlocked(const SUMOVehicle *veh, SUMOTime time)
void stopNotStarted(const SUMOVehicle *veh)
void stopStarted(const SUMOVehicle *veh, int numPersons, int numContainers, SUMOTime time)
static MSStopOut * getInstance()
void stopEnded(const SUMOVehicle *veh, const MSStop &stop, bool simEnd=false)
double getBeginLanePosition() const
Returns the begin position of this stop.
virtual void enter(SUMOVehicle *veh, const bool parking)
Called if a vehicle enters this stop.
bool fits(double pos, const SUMOVehicle &veh) const
return whether the given vehicle fits at the given position
double getEndLanePosition() const
Returns the end position of this stop.
const MSLane & getLane() const
Returns the lane this stop is located at.
virtual void leaveFrom(SUMOVehicle *what)
Called if a vehicle leaves this stop.
bool hasAnyWaiting(const MSEdge *edge, SUMOVehicle *vehicle) const
check whether any transportables are waiting for the given vehicle
bool loadAnyWaiting(const MSEdge *edge, SUMOVehicle *vehicle, SUMOTime &timeToLoadNext, SUMOTime &stopDuration, MSTransportable *const force=nullptr)
load any applicable transportables Loads any person / container that is waiting on that edge for the ...
bool isPerson() const override
Whether it is a person.
A static instance of this class in GapControlState deactivates gap control for vehicles whose referen...
void vehicleStateChanged(const SUMOVehicle *const vehicle, MSNet::VehicleState to, const std::string &info="")
Called if a vehicle changes its state.
Changes the wished vehicle speed / lanes.
void setLaneChangeMode(int value)
Sets lane changing behavior.
TraciLaneChangePriority myTraciLaneChangePriority
flags for determining the priority of traci lane change requests
bool getEmergencyBrakeRedLight() const
Returns whether red lights shall be a reason to brake.
SUMOTime getLaneTimeLineEnd()
void adaptLaneTimeLine(int indexShift)
Adapts lane timeline when moving to a new lane and the lane index changes.
void setRemoteControlled(Position xyPos, MSLane *l, double pos, double posLat, double angle, int edgeOffset, const ConstMSEdgeVector &route, SUMOTime t)
bool isRemoteAffected(SUMOTime t) const
int getSpeedMode() const
return the current speed mode
void deactivateGapController()
Deactivates the gap control.
void setSpeedMode(int speedMode)
Sets speed-constraining behaviors.
std::shared_ptr< GapControlState > myGapControlState
The gap control state.
bool myConsiderMaxDeceleration
Whether the maximum deceleration shall be regarded.
void setLaneTimeLine(const std::vector< std::pair< SUMOTime, int > > &laneTimeLine)
Sets a new lane timeline.
bool hasSpeedTimeLine(SUMOTime t) const
bool myRespectJunctionLeaderPriority
Whether the junction priority rules are respected (within)
void setOriginalSpeed(double speed)
Stores the originally longitudinal speed.
double myOriginalSpeed
The velocity before influence.
bool myConsiderSpeedLimit
Whether the speed limit shall be regarded.
double implicitDeltaPosRemote(const MSVehicle *veh)
return the change in longitudinal position that is implicit in the new remote position
double implicitSpeedRemote(const MSVehicle *veh, double oldSpeed)
return the speed that is implicit in the new remote position
void postProcessRemoteControl(MSVehicle *v)
update position from remote control
double gapControlSpeed(SUMOTime currentTime, const SUMOVehicle *veh, double speed, double vSafe, double vMin, double vMax)
Applies gap control logic on the speed.
void setSublaneChange(double latDist)
Sets a new sublane-change request.
double getOriginalSpeed() const
Returns the originally longitudinal speed to use.
SUMOTime myLastRemoteAccess
bool getRespectJunctionLeaderPriority() const
Returns whether junction priority rules within the junction shall be respected (concerns vehicles wit...
LaneChangeMode myStrategicLC
lane changing which is necessary to follow the current route
LaneChangeMode mySpeedGainLC
lane changing to travel with higher speed
void init()
Static initalization.
LaneChangeMode mySublaneLC
changing to the prefered lateral alignment
bool getRespectJunctionPriority() const
Returns whether junction priority rules shall be respected (concerns approaching vehicles outside the...
static void cleanup()
Static cleanup.
int getLaneChangeMode() const
return the current lane change mode
SUMOTime getLaneTimeLineDuration()
double influenceSpeed(SUMOTime currentTime, double speed, double vSafe, double vMin, double vMax)
Applies stored velocity information on the speed to use.
double changeRequestRemainingSeconds(const SUMOTime currentTime) const
Return the remaining number of seconds of the current laneTimeLine assuming one exists.
bool myConsiderSafeVelocity
Whether the safe velocity shall be regarded.
bool mySpeedAdaptationStarted
Whether influencing the speed has already started.
void setSignals(int signals)
double myLatDist
The requested lateral change.
bool considerSpeedLimit() const
Returns whether speed limits shall be considered.
bool myEmergencyBrakeRedLight
Whether red lights are a reason to brake.
LaneChangeMode myRightDriveLC
changing to the rightmost lane
void setSpeedTimeLine(const std::vector< std::pair< SUMOTime, double > > &speedTimeLine)
Sets a new velocity timeline.
void updateRemoteControlRoute(MSVehicle *v)
update route if provided by remote control
bool considerMaxDeceleration() const
Returns whether safe velocities shall be considered.
SUMOTime getLastAccessTimeStep() const
bool myConsiderMaxAcceleration
Whether the maximum acceleration shall be regarded.
LaneChangeMode myCooperativeLC
lane changing with the intent to help other vehicles
bool isRemoteControlled() const
bool myRespectJunctionPriority
Whether the junction priority rules are respected (approaching)
int influenceChangeDecision(const SUMOTime currentTime, const MSEdge ¤tEdge, const int currentLaneIndex, int state)
Applies stored LaneChangeMode information and laneTimeLine.
void activateGapController(double originalTau, double newTimeHeadway, double newSpaceHeadway, double duration, double changeRate, double maxDecel, MSVehicle *refVeh=nullptr)
Activates the gap control with the given parameters,.
Container for manouevering time associated with stopping.
SUMOTime myManoeuvreCompleteTime
Time at which this manoeuvre should complete.
MSVehicle::ManoeuvreType getManoeuvreType() const
Accessor (get) for manoeuvre type.
std::string myManoeuvreStop
The name of the stop associated with the Manoeuvre - for debug output.
bool manoeuvreIsComplete() const
Check if any manoeuver is ongoing and whether the completion time is beyond currentTime.
bool configureExitManoeuvre(MSVehicle *veh)
Setup the myManoeuvre for exiting (Sets completion time and manoeuvre type)
void setManoeuvreType(const MSVehicle::ManoeuvreType mType)
Accessor (set) for manoeuvre type.
Manoeuvre & operator=(const Manoeuvre &manoeuvre)
Assignment operator.
ManoeuvreType myManoeuvreType
Manoeuvre type - currently entry, exit or none.
double getGUIIncrement() const
Accessor for GUI rotation step when parking (radians)
SUMOTime myManoeuvreStartTime
Time at which the Manoeuvre for this stop started.
bool operator!=(const Manoeuvre &manoeuvre)
Operator !=.
bool entryManoeuvreIsComplete(MSVehicle *veh)
Configure an entry manoeuvre if nothing is configured - otherwise check if complete.
bool manoeuvreIsComplete(const ManoeuvreType checkType) const
Check if specific manoeuver is ongoing and whether the completion time is beyond currentTime.
bool configureEntryManoeuvre(MSVehicle *veh)
Setup the entry manoeuvre for this vehicle (Sets completion time and manoeuvre type)
Container that holds the vehicles driving state (position+speed).
double myPosLat
the stored lateral position
State(double pos, double speed, double posLat, double backPos, double previousSpeed)
Constructor.
double myPreviousSpeed
the speed at the begin of the previous time step
double myPos
the stored position
bool operator!=(const State &state)
Operator !=.
double mySpeed
the stored speed (should be >=0 at any time)
State & operator=(const State &state)
Assignment operator.
double pos() const
Position of this state.
double myBackPos
the stored back position
void passTime(SUMOTime dt, bool waiting)
const std::string getState() const
SUMOTime cumulatedWaitingTime(SUMOTime memory=-1) const
void setState(const std::string &state)
WaitingTimeCollector(SUMOTime memory=MSGlobals::gWaitingTimeMemory)
Constructor.
void registerEmergencyStop()
register emergency stop
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
void registerStopEnded()
register emergency stop
void registerEmergencyBraking()
register emergency stop
void removeVType(const MSVehicleType *vehType)
void registerOneWaiting()
increases the count of vehicles waiting for a transport to allow recognition of person / container re...
void unregisterOneWaiting()
decreases the count of vehicles waiting for a transport to allow recognition of person / container re...
void registerStopStarted()
register emergency stop
Abstract in-vehicle device.
Representation of a vehicle in the micro simulation.
void setManoeuvreType(const MSVehicle::ManoeuvreType mType)
accessor function to myManoeuvre equivalent
TraciLaneChangePriority
modes for prioritizing traci lane change requests
double getRightSideOnEdge(const MSLane *lane=0) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
bool wasRemoteControlled(SUMOTime lookBack=DELTA_T) const
Returns the information whether the vehicle is fully controlled via TraCI within the lookBack time.
void processLinkApproaches(double &vSafe, double &vSafeMin, double &vSafeMinDist)
This method iterates through the driveprocess items for the vehicle and adapts the given in/out param...
const MSLane * getPreviousLane(const MSLane *current, int &furtherIndex) const
void checkLinkLeader(const MSLink *link, const MSLane *lane, double seen, DriveProcessItem *const lastLink, double &v, double &vLinkPass, double &vLinkWait, bool &setRequest, bool isShadowLink=false) const
checks for link leaders on the given link
void checkRewindLinkLanes(const double lengthsInFront, DriveItemVector &lfLinks) const
runs heuristic for keeping the intersection clear in case of downstream jamming
bool willStop() const
Returns whether the vehicle will stop on the current edge.
bool hasDriverState() const
Whether this vehicle is equipped with a MSDriverState.
static int nextLinkPriority(const std::vector< MSLane * > &conts)
get a numerical value for the priority of the upcoming link
double getTimeGapOnLane() const
Returns the time gap in seconds to the leader of the vehicle on the same lane.
void updateBestLanes(bool forceRebuild=false, const MSLane *startLane=0)
computes the best lanes to use in order to continue the route
bool myAmIdling
Whether the vehicle is trying to enter the network (eg after parking so engine is running)
SUMOTime myWaitingTime
The time the vehicle waits (is not faster than 0.1m/s) in seconds.
double getStopDelay() const
Returns the public transport stop delay in seconds.
double computeAngle() const
compute the current vehicle angle
double myTimeLoss
the time loss in seconds due to driving with less than maximum speed
SUMOTime myLastActionTime
Action offset (actions are taken at time myActionOffset + N*getActionStepLength()) Initialized to 0,...
ConstMSEdgeVector::const_iterator getRerouteOrigin() const
Returns the starting point for reroutes (usually the current edge)
bool hasArrivedInternal(bool oppositeTransformed=true) const
Returns whether this vehicle has already arived (reached the arrivalPosition on its final edge) metho...
double getFriction() const
Returns the current friction on the road as perceived by the friction device.
bool ignoreFoe(const SUMOTrafficObject *foe) const
decide whether a given foe object may be ignored
void boardTransportables(MSStop &stop)
board persons and load transportables at the given stop
const std::vector< const MSLane * > getUpcomingLanesUntil(double distance) const
Returns the upcoming (best followed by default 0) sequence of lanes to continue the route starting at...
double getCurveRadius() const
Returns the vehicle's current curve radius in m.
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
void adaptLaneEntering2MoveReminder(const MSLane &enteredLane)
Adapts the vehicle's entering of a new lane.
void addTransportable(MSTransportable *transportable)
Adds a person or container to this vehicle.
SUMOTime myJunctionConflictEntryTime
double getLeftSideOnEdge(const MSLane *lane=0) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
PositionVector getBoundingPoly(double offset=0) const
get bounding polygon
void setTentativeLaneAndPosition(MSLane *lane, double pos, double posLat=0)
set tentative lane and position during insertion to ensure that all cfmodels work (some of them requi...
bool brakeForOverlap(const MSLink *link, const MSLane *lane) const
handle width transitions
void workOnMoveReminders(double oldPos, double newPos, double newSpeed)
Processes active move reminder.
bool isStoppedOnLane() const
double getDistanceToPosition(double destPos, const MSLane *destLane) const
bool brokeDown() const
Returns how long the vehicle has been stopped already due to lack of energy.
double myAcceleration
The current acceleration after dawdling in m/s.
void registerInsertionApproach(MSLink *link, double dist)
register approach on insertion
void cleanupFurtherLanes()
remove vehicle from further lanes (on leaving the network)
void adaptToLeaders(const MSLeaderInfo &ahead, double latOffset, const double seen, DriveProcessItem *const lastLink, const MSLane *const lane, double &v, double &vLinkPass) const
const MSLane * getBackLane() const
Returns the lane the where the rear of the object is currently at.
void enterLaneAtInsertion(MSLane *enteredLane, double pos, double speed, double posLat, MSMoveReminder::Notification notification)
Update when the vehicle enters a new lane in the emit step.
double getBackPositionOnLane() const
Get the vehicle's position relative to its current lane.
double myStopSpeed
the speed that is needed for a scheduled stop or waypoint
void setPreviousSpeed(double prevSpeed, double prevAcceleration)
Sets the influenced previous speed.
double myRawAngle
the angle in radians before lane changing
SUMOTime getArrivalTime(SUMOTime t, double seen, double v, double arrivalSpeed) const
double getAccumulatedWaitingSeconds() const
Returns the number of seconds waited (speed was lesser than 0.1m/s) within the last millisecs.
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
bool isFrontOnLane(const MSLane *lane) const
Returns the information whether the front of the vehicle is on the given lane.
virtual ~MSVehicle()
Destructor.
void processLaneAdvances(std::vector< MSLane * > &passedLanes, std::string &emergencyReason)
This method checks if the vehicle has advanced over one or several lanes along its route and triggers...
MSAbstractLaneChangeModel & getLaneChangeModel()
void setEmergencyBlueLight(SUMOTime currentTime)
sets the blue flashing light for emergency vehicles
bool isActionStep(SUMOTime t) const
Returns whether the next simulation step will be an action point for the vehicle.
MSAbstractLaneChangeModel * myLaneChangeModel
Position getPositionAlongBestLanes(double offset) const
Return the (x,y)-position, which the vehicle would reach if it continued along its best continuation ...
bool hasValidRouteStart(std::string &msg)
checks whether the vehicle can depart on the first edge
double getLeftSideOnLane() const
Get the lateral position of the vehicles left side on the lane:
std::vector< MSLane * > myFurtherLanes
The information into which lanes the vehicle laps into.
bool signalSet(int which) const
Returns whether the given signal is on.
MSCFModel::VehicleVariables * myCFVariables
The per vehicle variables of the car following model.
bool betterContinuation(const LaneQ *bestConnectedNext, const LaneQ &m) const
comparison between different continuations from the same lane
bool addTraciStop(SUMOVehicleParameter::Stop stop, std::string &errorMsg)
void checkLinkLeaderCurrentAndParallel(const MSLink *link, const MSLane *lane, double seen, DriveProcessItem *const lastLink, double &v, double &vLinkPass, double &vLinkWait, bool &setRequest) const
checks for link leaders of the current link as well as the parallel link (if there is one)
std::pair< double, const MSLink * > myNextTurn
the upcoming turn for the vehicle
double getDistanceToLeaveJunction() const
get the distance from the start of this lane to the start of the next normal lane (or 0 if this lane ...
int influenceChangeDecision(int state)
allow TraCI to influence a lane change decision
double getMaxSpeedOnLane() const
Returns the maximal speed for the vehicle on its current lane (including speed factor and deviation,...
bool isRemoteControlled() const
Returns the information whether the vehicle is fully controlled via TraCI.
bool myAmOnNet
Whether the vehicle is on the network (not parking, teleported, vaporized, or arrived)
void enterLaneAtMove(MSLane *enteredLane, bool onTeleporting=false)
Update when the vehicle enters a new lane in the move step.
double myLastAngle
the angle in radians from the previous simulation step (for computing curve radius)
void adaptBestLanesOccupation(int laneIndex, double density)
update occupation from MSLaneChanger
std::pair< double, double > estimateTimeToNextStop() const
return time (s) and distance to the next stop
double accelThresholdForWaiting() const
maximum acceleration to consider a vehicle as 'waiting' at low speed
void setAngle(double angle, bool straightenFurther=false)
Set a custom vehicle angle in rad, optionally updates furtherLanePosLat.
std::vector< LaneQ >::iterator myCurrentLaneInBestLanes
void setApproachingForAllLinks()
Register junction approaches for all link items in the current plan.
double getDeltaPos(const double accel) const
calculates the distance covered in the next integration step given an acceleration and assuming the c...
const MSLane * myLastBestLanesInternalLane
void updateOccupancyAndCurrentBestLane(const MSLane *startLane)
updates LaneQ::nextOccupation and myCurrentLaneInBestLanes
const std::vector< MSLane * > getUpstreamOppositeLanes() const
Returns the sequence of opposite lanes corresponding to past lanes.
WaitingTimeCollector myWaitingTimeCollector
void setRemoteState(Position xyPos)
sets position outside the road network
void fixPosition()
repair errors in vehicle position after changing between internal edges
double getAcceleration() const
Returns the vehicle's acceleration in m/s (this is computed as the last step's mean acceleration in c...
double getSpeedWithoutTraciInfluence() const
Returns the uninfluenced velocity.
PositionVector getBoundingBox(double offset=0) const
get bounding rectangle
ManoeuvreType
flag identifying which, if any, manoeuvre is in progress
@ MANOEUVRE_ENTRY
Manoeuvre into stopping place.
@ MANOEUVRE_NONE
not manouevring
@ MANOEUVRE_EXIT
Manoeuvre out of stopping place.
const MSEdge * getNextEdgePtr() const
returns the next edge (possibly an internal edge)
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
void setBrakingSignals(double vNext)
sets the braking lights on/off
const std::vector< MSLane * > & getBestLanesContinuation() const
Returns the best sequence of lanes to continue the route starting at myLane.
const MSEdge * myLastBestLanesEdge
bool ignoreCollision() const
whether this vehicle is except from collision checks
Influencer * myInfluencer
An instance of a velocity/lane influencing instance; built in "getInfluencer".
void saveState(OutputDevice &out)
Saves the states of a vehicle.
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
void planMove(const SUMOTime t, const MSLeaderInfo &ahead, const double lengthsInFront)
Compute safe velocities for the upcoming lanes based on positions and speeds from the last time step....
bool resumeFromStopping()
int getBestLaneOffset() const
void adaptToJunctionLeader(const std::pair< const MSVehicle *, double > leaderInfo, const double seen, DriveProcessItem *const lastLink, const MSLane *const lane, double &v, double &vLinkPass, double distToCrossing=-1) const
double lateralDistanceToLane(const int offset) const
Get the minimal lateral distance required to move fully onto the lane at given offset.
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
void leaveLaneBack(const MSMoveReminder::Notification reason, const MSLane *leftLane)
Update of reminders if vehicle back leaves a lane during (during forward movement.
void resetActionOffset(const SUMOTime timeUntilNextAction=0)
Resets the action offset for the vehicle.
std::vector< DriveProcessItem > DriveItemVector
Container for used Links/visited Lanes during planMove() and executeMove.
void interpolateLateralZ(Position &pos, double offset, double posLat) const
perform lateral z interpolation in elevated networks
void setBlinkerInformation()
sets the blue flashing light for emergency vehicles
const MSEdge * getCurrentEdge() const
Returns the edge the vehicle is currently at (possibly an internal edge or nullptr)
void adaptToLeaderDistance(const MSLeaderDistanceInfo &ahead, double latOffset, double seen, DriveProcessItem *const lastLink, double &v, double &vLinkPass) const
DriveItemVector::iterator myNextDriveItem
iterator pointing to the next item in myLFLinkLanes
bool unsafeLinkAhead(const MSLane *lane, double zipperDist) const
whether the vehicle may safely move to the given lane with regard to upcoming links
void leaveLane(const MSMoveReminder::Notification reason, const MSLane *approachedLane=0)
Update of members if vehicle leaves a new lane in the lane change step or at arrival.
const MSLink * myHaveStoppedFor
bool isIdling() const
Returns whether a sim vehicle is waiting to enter a lane (after parking has completed)
std::shared_ptr< MSSimpleDriverState > getDriverState() const
Returns the vehicle driver's state.
void removeApproachingInformation(const DriveItemVector &lfLinks) const
unregister approach from all upcoming links
double getAngleDiff() const
get the change in angle from the last simulation step
SUMOTime myJunctionEntryTimeNeverYield
double getLatOffset(const MSLane *lane) const
Get the offset that that must be added to interpret myState.myPosLat for the given lane.
bool rerouteParkingArea(const std::string &parkingAreaID, std::string &errorMsg)
bool hasArrived() const
Returns whether this vehicle has already arrived (reached the arrivalPosition on its final edge)
void switchOffSignal(int signal)
Switches the given signal off.
double getStopArrivalDelay() const
Returns the estimated public transport stop arrival delay in seconds.
int mySignals
State of things of the vehicle that can be on or off.
bool setExitManoeuvre()
accessor function to myManoeuvre equivalent
bool isOppositeLane(const MSLane *lane) const
whether the give lane is reverse direction of the current route or not
double myStopDist
distance to the next stop or doubleMax if there is none
Signalling
Some boolean values which describe the state of some vehicle parts.
@ VEH_SIGNAL_BLINKER_RIGHT
Right blinker lights are switched on.
@ VEH_SIGNAL_BRAKELIGHT
The brake lights are on.
@ VEH_SIGNAL_EMERGENCY_BLUE
A blue emergency light is on.
@ VEH_SIGNAL_BLINKER_LEFT
Left blinker lights are switched on.
SUMOTime getActionStepLength() const
Returns the vehicle's action step length in millisecs, i.e. the interval between two action points.
bool myHaveToWaitOnNextLink
SUMOTime collisionStopTime() const
Returns the remaining time a vehicle needs to stop due to a collision. A negative value indicates tha...
const std::vector< const MSLane * > getPastLanesUntil(double distance) const
Returns the sequence of past lanes (right-most on edge) based on the route starting at the current la...
double getBestLaneDist() const
returns the distance that can be driven without lane change
void replaceVehicleType(const MSVehicleType *type)
Replaces the current vehicle type by the one given.
void updateState(double vNext, bool parking=false)
updates the vehicles state, given a next value for its speed. This value can be negative in case of t...
double slowDownForSchedule(double vMinComfortable) const
optionally return an upper bound on speed to stay within the schedule
bool executeMove()
Executes planned vehicle movements with regards to right-of-way.
const MSLane * getLane() const
Returns the lane the vehicle is on.
std::pair< const MSVehicle *const, double > getFollower(double dist=0) const
Returns the follower of the vehicle looking for a fixed distance.
SUMOTime getWaitingTimeFor(const MSLink *link) const
getWaitingTime, but taking into account having stopped for a stop-link
ChangeRequest
Requests set via TraCI.
@ REQUEST_HOLD
vehicle want's to keep the current lane
@ REQUEST_LEFT
vehicle want's to change to left lane
@ REQUEST_NONE
vehicle doesn't want to change
@ REQUEST_RIGHT
vehicle want's to change to right lane
bool isLeader(const MSLink *link, const MSVehicle *veh, const double gap) const
whether the given vehicle must be followed at the given junction
void resetApproachOnReroute()
reset rail signal approach information
void computeFurtherLanes(MSLane *enteredLane, double pos, bool collision=false)
updates myFurtherLanes on lane insertion or after collision
MSLane * getMutableLane() const
Returns the lane the vehicle is on Non const version indicates that something volatile is going on.
std::pair< const MSLane *, double > getLanePosAfterDist(double distance) const
return lane and position along bestlanes at the given distance
SUMOTime myCollisionImmunity
amount of time for which the vehicle is immune from collisions
bool passingMinor() const
decide whether the vehicle is passing a minor link or has comitted to do so
void updateWaitingTime(double vNext)
Updates the vehicle's waiting time counters (accumulated and consecutive)
void enterLaneAtLaneChange(MSLane *enteredLane)
Update when the vehicle enters a new lane in the laneChange step.
BaseInfluencer & getBaseInfluencer()
Returns the velocity/lane influencer.
Influencer & getInfluencer()
bool isBidiOn(const MSLane *lane) const
whether this vehicle is driving against lane
double getRightSideOnLane() const
Get the lateral position of the vehicles right side on the lane:
double getCurrentApparentDecel() const
get apparent deceleration based on vType parameters and current acceleration
double updateFurtherLanes(std::vector< MSLane * > &furtherLanes, std::vector< double > &furtherLanesPosLat, const std::vector< MSLane * > &passedLanes)
update a vector of further lanes and return the new backPos
DriveItemVector myLFLinkLanesPrev
planned speeds from the previous step for un-registering from junctions after the new container is fi...
std::vector< std::vector< LaneQ > > myBestLanes
void setActionStepLength(double actionStepLength, bool resetActionOffset=true)
Sets the action steplength of the vehicle.
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
double getSlope() const
Returns the slope of the road at vehicle's position in degrees.
bool myActionStep
The flag myActionStep indicates whether the current time step is an action point for the vehicle.
const Position getBackPosition() const
void loadState(const SUMOSAXAttributes &attrs, const SUMOTime offset)
Loads the state of this vehicle from the given description.
SUMOTime myTimeSinceStartup
duration of driving (speed > SUMO_const_haltingSpeed) after the last halting episode
double getSpeed() const
Returns the vehicle's current speed.
SUMOTime remainingStopDuration() const
Returns the remaining stop duration for a stopped vehicle or 0.
bool keepStopping(bool afterProcessing=false) const
Returns whether the vehicle is stopped and must continue to do so.
void workOnIdleReminders()
cycle through vehicle devices invoking notifyIdle
static std::vector< MSLane * > myEmptyLaneVector
Position myCachedPosition
bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
MSVehicle::ManoeuvreType getManoeuvreType() const
accessor function to myManoeuvre equivalent
double checkReversal(bool &canReverse, double speedThreshold=SUMO_const_haltingSpeed, double seen=0) const
void updateLaneBruttoSum()
Update the lane brutto occupancy after a change in minGap.
void removePassedDriveItems()
Erase passed drive items from myLFLinkLanes (and unregister approaching information for corresponding...
const std::vector< MSLane * > & getFurtherLanes() const
const std::vector< LaneQ > & getBestLanes() const
Returns the description of best lanes to use in order to continue the route.
std::vector< double > myFurtherLanesPosLat
lateral positions on further lanes
bool checkActionStep(const SUMOTime t)
Returns whether the vehicle is supposed to take action in the current simulation step Updates myActio...
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
Position validatePosition(Position result, double offset=0) const
ensure that a vehicle-relative position is not invalid
void loadPreviousApproaching(MSLink *link, bool setRequest, SUMOTime arrivalTime, double arrivalSpeed, double arrivalSpeedBraking, double dist, double leaveSpeed)
bool keepClear(const MSLink *link) const
decide whether the given link must be kept clear
bool manoeuvreIsComplete() const
accessor function to myManoeuvre equivalent
double processNextStop(double currentVelocity)
Processes stops, returns the velocity needed to reach the stop.
double myAngle
the angle in radians (
bool ignoreRed(const MSLink *link, bool canBrake) const
decide whether a red (or yellow light) may be ignored
double getPositionOnLane() const
Get the vehicle's position along the lane.
void updateTimeLoss(double vNext)
Updates the vehicle's time loss.
MSDevice_DriverState * myDriverState
This vehicle's driver state.
bool joinTrainPart(MSVehicle *veh)
try joining the given vehicle to the rear of this one (to resolve joinTriggered)
MSLane * myLane
The lane the vehicle is on.
bool onFurtherEdge(const MSEdge *edge) const
whether this vehicle has its back (and no its front) on the given edge
double processTraCISpeedControl(double vSafe, double vNext)
Check for speed advices from the traci client and adjust the speed vNext in the current (euler) / aft...
double getLateralOverlap() const
return the amount by which the vehicle extends laterally outside it's primary lane
double getAngle() const
Returns the vehicle's direction in radians.
bool handleCollisionStop(MSStop &stop, const double distToStop)
bool hasInfluencer() const
whether the vehicle is individually influenced (via TraCI or special parameters)
MSDevice_Friction * myFrictionDevice
This vehicle's friction perception.
double getPreviousSpeed() const
Returns the vehicle's speed before the previous time step.
MSVehicle()
invalidated default constructor
bool joinTrainPartFront(MSVehicle *veh)
try joining the given vehicle to the front of this one (to resolve joinTriggered)
void updateActionOffset(const SUMOTime oldActionStepLength, const SUMOTime newActionStepLength)
Process an updated action step length value (only affects the vehicle's action offset,...
double getBrakeGap(bool delayed=false) const
get distance for coming to a stop (used for rerouting checks)
std::pair< const MSVehicle *const, double > getLeader(double dist=0, bool considerFoes=true) const
Returns the leader of the vehicle looking for a fixed distance.
void executeFractionalMove(double dist)
move vehicle forward by the given distance during insertion
LaneChangeMode
modes for resolving conflicts between external control (traci) and vehicle control over lane changing...
virtual void drawOutsideNetwork(bool)
register vehicle for drawing while outside the network
void adaptToOncomingLeader(const std::pair< const MSVehicle *, double > leaderInfo, DriveProcessItem *const lastLink, double &v, double &vLinkPass) const
void planMoveInternal(const SUMOTime t, MSLeaderInfo ahead, DriveItemVector &lfLinks, double &myStopDist, double &newStopSpeed, std::pair< double, const MSLink * > &myNextTurn) const
State myState
This Vehicles driving state (pos and speed)
double getCenterOnEdge(const MSLane *lane=0) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
void adaptToLeader(const std::pair< const MSVehicle *, double > leaderInfo, double seen, DriveProcessItem *const lastLink, double &v, double &vLinkPass) const
bool instantStopping() const
whether instant stopping is permitted
void switchOnSignal(int signal)
Switches the given signal on.
static bool overlap(const MSVehicle *veh1, const MSVehicle *veh2)
void updateParkingState()
update state while parking
DriveItemVector myLFLinkLanes
container for the planned speeds in the current step
void updateDriveItems()
Check whether the drive items (myLFLinkLanes) are up to date, and update them if required.
SUMOTime myJunctionEntryTime
time at which the current junction was entered
static MSVehicleTransfer * getInstance()
Returns the instance of this object.
void remove(MSVehicle *veh)
Remove a vehicle from this transfer object.
The car-following model and parameter.
double getLengthWithGap() const
Get vehicle's length including the minimum gap [m].
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
double getMaxSpeed() const
Get vehicle's (technical) maximum speed [m/s].
const std::string & getID() const
Returns the name of the vehicle type.
double getMinGap() const
Get the free space in front of vehicles of this class.
LaneChangeModel getLaneChangeModel() const
void setLength(const double &length)
Set a new value for this type's length.
SUMOTime getExitManoeuvreTime(const int angle) const
Accessor function for parameter equivalent returning exit time for a specific manoeuver angle.
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
bool isVehicleSpecific() const
Returns whether this type belongs to a single vehicle only (was modified)
void setActionStepLength(const SUMOTime actionStepLength, bool resetActionOffset)
Set a new value for this type's action step length.
double getLength() const
Get vehicle's length [m].
SUMOVehicleShape getGuiShape() const
Get this vehicle type's shape.
SUMOTime getEntryManoeuvreTime(const int angle) const
Accessor function for parameter equivalent returning entry time for a specific manoeuver angle.
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.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false, const bool escape=false)
writes a named attribute
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
bool hasParameter(const std::string &key) const
Returns whether the parameter is set.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
A point in 2D or 3D with translation and scaling methods.
double slopeTo2D(const Position &other) const
returns the slope of the vector pointing from here to the other position (in radians between -M_PI an...
static const Position INVALID
used to indicate that a position is valid
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
void setz(double z)
set position z
double z() const
Returns the z-position.
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position (in radians bet...
double length2D() const
Returns the length.
void append(const PositionVector &v, double sameThreshold=2.0)
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
double slopeDegreeAtOffset(double pos) const
Returns the slope at the given length.
void extrapolate2D(const double val, const bool onlyFirst=false)
extrapolate position vector in two dimensions (Z is ignored)
void scaleRelative(double factor)
enlarges/shrinks the polygon by a factor based at the centroid
PositionVector reverse() const
reverse position vector
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
virtual bool compute(const E *from, const E *to, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into, bool silent=false)=0
Builds the route between the given edges using the minimum effort at the given time The definition of...
virtual double recomputeCosts(const std::vector< const E * > &edges, const V *const v, SUMOTime msTime, double *lengthp=nullptr) const
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
double getFloat(int id) const
Returns the double-value of the named (by its enum-value) attribute.
Representation of a vehicle, person, or container.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual double getSpeed() const =0
Returns the object's current speed.
double locomotiveLength
the length of the locomotive
double speedFactorPremature
the possible speed reduction when a train is ahead of schedule
double getLCParam(const SumoXMLAttr attr, const double defaultValue) const
Returns the named value from the map, or the default if it is not contained there.
double getJMParam(const SumoXMLAttr attr, const double defaultValue) const
Returns the named value from the map, or the default if it is not contained there.
Representation of a vehicle.
Definition of vehicle stop (position and duration)
SUMOTime started
the time at which this stop was reached
ParkingType parking
whether the vehicle is removed from the net while stopping
SUMOTime extension
The maximum time extension for boarding / loading.
std::string split
the id of the vehicle (train portion) that splits of upon reaching this stop
double startPos
The stopping position start.
std::string line
the new line id of the trip within a cyclical public transport route
double posLat
the lateral offset when stopping
bool onDemand
whether the stop may be skipped
int parametersSet
Information for the output which parameter were set.
std::string join
the id of the vehicle (train portion) to which this vehicle shall be joined
SUMOTime until
The time at which the vehicle may continue its journey.
SUMOTime ended
the time at which this stop was ended
double endPos
The stopping position end.
SUMOTime waitUntil
The earliest pickup time for a taxi stop.
std::string tripId
id of the trip within a cyclical public transport route
bool collision
Whether this stop was triggered by a collision.
SUMOTime arrival
The (expected) time at which the vehicle reaches the stop.
SUMOTime duration
The stopping duration.
Structure representing possible vehicle parameter.
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle's end speed shall be chosen.
double departSpeed
(optional) The initial speed of the vehicle
std::vector< std::string > via
List of the via-edges the vehicle must visit.
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
long long int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
double arrivalPos
(optional) The position the vehicle shall arrive on
ArrivalPosDefinition arrivalPosProcedure
Information how the vehicle shall choose the arrival position.
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
int arrivalEdge
(optional) The final edge within the route of the vehicle
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
static SUMOTime processActionStepLength(double given)
Checks and converts given value for the action step length from seconds to miliseconds assuring it be...
std::vector< std::string > getVector()
return vector of strings
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression, cppcoreguidelines-noexcept-swap, performance-noexcept-swap) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
Drive process items represent bounds on the safe velocity corresponding to the upcoming links.
void adaptStopSpeed(const double v)
double getLeaveSpeed() const
void adaptLeaveSpeed(const double v)
static std::map< const MSVehicle *, GapControlState * > refVehMap
stores reference vehicles currently in use by a gapController
static GapControlVehStateListener * myVehStateListener
void activate(double tauOriginal, double tauTarget, double additionalGap, double duration, double changeRate, double maxDecel, const MSVehicle *refVeh)
Start gap control with given params.
static void cleanup()
Static cleanup (removes vehicle state listener)
virtual ~GapControlState()
void deactivate()
Stop gap control.
static void init()
Static initalization (adds vehicle state listener)
A structure representing the best lanes for continuing the current route starting at 'lane'.
double length
The overall length which may be driven when using this lane without a lane change.
bool allowsContinuation
Whether this lane allows to continue the drive.
double nextOccupation
As occupation, but without the first lane.
std::vector< MSLane * > bestContinuations
MSLane * lane
The described lane.
double currentLength
The length which may be driven on this lane.
int bestLaneOffset
The (signed) number of lanes to be crossed to get to the lane which allows to continue the drive.
double occupation
The overall vehicle sum on consecutive lanes which can be passed without a lane change.