105#define DEBUG_COND (isSelected())
107#define DEBUG_COND2(obj) (obj->isSelected())
112#define STOPPING_PLACE_OFFSET 0.5
114#define CRLL_LOOK_AHEAD 5
116#define JUNCTION_BLOCKAGE_TIME 5
119#define DIST_TO_STOPLINE_EXPECT_PRIORITY 1.0
121#define NUMERICAL_EPS_SPEED (0.1 * NUMERICAL_EPS * TS)
159 return (myPos != state.
myPos ||
169 myPos(pos), mySpeed(speed), myPosLat(posLat), myBackPos(backPos), myPreviousSpeed(previousSpeed), myLastCoveredDist(
SPEED2DIST(speed)) {}
181 assert(memorySpan <= myMemorySize);
182 if (memorySpan == -1) {
183 memorySpan = myMemorySize;
186 for (
const auto& interval : myWaitingIntervals) {
187 if (interval.second >= memorySpan) {
188 if (interval.first >= memorySpan) {
191 totalWaitingTime += memorySpan - interval.first;
194 totalWaitingTime += interval.second - interval.first;
197 return totalWaitingTime;
203 auto i = myWaitingIntervals.begin();
204 const auto end = myWaitingIntervals.end();
205 const bool startNewInterval = i == end || (i->first != 0);
208 if (i->first >= myMemorySize) {
216 auto d = std::distance(i, end);
218 myWaitingIntervals.pop_back();
224 }
else if (!startNewInterval) {
225 myWaitingIntervals.begin()->first = 0;
227 myWaitingIntervals.push_front(std::make_pair(0, dt));
235 std::ostringstream state;
236 state << myMemorySize <<
" " << myWaitingIntervals.size();
237 for (
const auto& interval : myWaitingIntervals) {
238 state <<
" " << interval.first <<
" " << interval.second;
246 std::istringstream is(state);
249 is >> myMemorySize >> numIntervals;
250 while (numIntervals-- > 0) {
252 myWaitingIntervals.emplace_back(begin, end);
271 if (GapControlState::refVehMap.find(msVeh) != end(GapControlState::refVehMap)) {
273 GapControlState::refVehMap[msVeh]->deactivate();
283std::map<const MSVehicle*, MSVehicle::Influencer::GapControlState*>
290 tauOriginal(-1), tauCurrent(-1), tauTarget(-1), addGapCurrent(-1), addGapTarget(-1),
291 remainingDuration(-1), changeRate(-1), maxDecel(-1), referenceVeh(nullptr), active(false), gapAttained(false), prevLeader(nullptr),
292 lastUpdate(-1), timeHeadwayIncrement(0.0), spaceHeadwayIncrement(0.0) {}
306 WRITE_ERROR(
TL(
"MSVehicle::Influencer::GapControlState::init(): No MSNet instance found!"))
323 tauOriginal = tauOrig;
324 tauCurrent = tauOrig;
327 addGapTarget = additionalGap;
328 remainingDuration = dur;
331 referenceVeh = refVeh;
334 prevLeader =
nullptr;
336 timeHeadwayIncrement = changeRate *
TS * (tauTarget - tauOriginal);
337 spaceHeadwayIncrement = changeRate *
TS * addGapTarget;
339 if (referenceVeh !=
nullptr) {
349 if (referenceVeh !=
nullptr) {
352 referenceVeh =
nullptr;
386 GapControlState::init();
391 GapControlState::cleanup();
396 mySpeedAdaptationStarted =
true;
397 mySpeedTimeLine = speedTimeLine;
402 if (myGapControlState ==
nullptr) {
403 myGapControlState = std::make_shared<GapControlState>();
405 myGapControlState->activate(originalTau, newTimeHeadway, newSpaceHeadway, duration, changeRate, maxDecel, refVeh);
410 if (myGapControlState !=
nullptr && myGapControlState->active) {
411 myGapControlState->deactivate();
417 myLaneTimeLine = laneTimeLine;
423 for (
auto& item : myLaneTimeLine) {
424 item.second += indexShift;
436 return (1 * myConsiderSafeVelocity +
437 2 * myConsiderMaxAcceleration +
438 4 * myConsiderMaxDeceleration +
439 8 * myRespectJunctionPriority +
440 16 * myEmergencyBrakeRedLight +
441 32 * !myRespectJunctionLeaderPriority
448 return (1 * myStrategicLC +
449 4 * myCooperativeLC +
451 64 * myRightDriveLC +
452 256 * myTraciLaneChangePriority +
459 for (std::vector<std::pair<SUMOTime, int>>::iterator i = myLaneTimeLine.begin(); i != myLaneTimeLine.end(); ++i) {
463 duration -= i->first;
471 if (!myLaneTimeLine.empty()) {
472 return myLaneTimeLine.back().first;
482 while (mySpeedTimeLine.size() == 1 || (mySpeedTimeLine.size() > 1 && currentTime > mySpeedTimeLine[1].first)) {
483 mySpeedTimeLine.erase(mySpeedTimeLine.begin());
486 if (!(mySpeedTimeLine.size() < 2 || currentTime < mySpeedTimeLine[0].first)) {
488 if (!mySpeedAdaptationStarted) {
489 mySpeedTimeLine[0].second = speed;
490 mySpeedAdaptationStarted =
true;
493 const double td =
STEPS2TIME(currentTime - mySpeedTimeLine[0].first) /
STEPS2TIME(mySpeedTimeLine[1].first +
DELTA_T - mySpeedTimeLine[0].first);
494 speed = mySpeedTimeLine[0].second - (mySpeedTimeLine[0].second - mySpeedTimeLine[1].second) * td;
495 if (myConsiderSafeVelocity) {
496 speed =
MIN2(speed, vSafe);
498 if (myConsiderMaxAcceleration) {
499 speed =
MIN2(speed, vMax);
501 if (myConsiderMaxDeceleration) {
502 speed =
MAX2(speed, vMin);
512 std::cout << currentTime <<
" Influencer::gapControlSpeed(): speed=" << speed
513 <<
", vSafe=" << vSafe
519 double gapControlSpeed = speed;
520 if (myGapControlState !=
nullptr && myGapControlState->active) {
522 const double currentSpeed = veh->
getSpeed();
524 assert(msVeh !=
nullptr);
525 const double desiredTargetTimeSpacing = myGapControlState->tauTarget * currentSpeed;
526 std::pair<const MSVehicle*, double> leaderInfo;
527 if (myGapControlState->referenceVeh ==
nullptr) {
529 leaderInfo = msVeh->
getLeader(
MAX2(desiredTargetTimeSpacing, myGapControlState->addGapCurrent) + 20.);
532 const MSVehicle* leader = myGapControlState->referenceVeh;
540 if (dist < -100000) {
542 std::cout <<
" Ego and reference vehicle are not in CF relation..." << std::endl;
544 std::cout <<
" Reference vehicle is behind ego..." << std::endl;
551 const double fakeDist =
MAX2(0.0, leaderInfo.second - myGapControlState->addGapCurrent);
554 const double desiredCurrentSpacing = myGapControlState->tauCurrent * currentSpeed;
555 std::cout <<
" Gap control active:"
556 <<
" currentSpeed=" << currentSpeed
557 <<
", desiredTargetTimeSpacing=" << desiredTargetTimeSpacing
558 <<
", desiredCurrentSpacing=" << desiredCurrentSpacing
559 <<
", leader=" << (leaderInfo.first ==
nullptr ?
"NULL" : leaderInfo.first->getID())
560 <<
", dist=" << leaderInfo.second
561 <<
", fakeDist=" << fakeDist
562 <<
",\n tauOriginal=" << myGapControlState->tauOriginal
563 <<
", tauTarget=" << myGapControlState->tauTarget
564 <<
", tauCurrent=" << myGapControlState->tauCurrent
568 if (leaderInfo.first !=
nullptr) {
569 if (myGapControlState->prevLeader !=
nullptr && myGapControlState->prevLeader != leaderInfo.first) {
573 myGapControlState->prevLeader = leaderInfo.first;
579 gapControlSpeed =
MIN2(gapControlSpeed,
580 cfm->
followSpeed(msVeh, currentSpeed, fakeDist, leaderInfo.first->
getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first));
584 std::cout <<
" -> gapControlSpeed=" << gapControlSpeed;
585 if (myGapControlState->maxDecel > 0) {
586 std::cout <<
", with maxDecel bound: " <<
MAX2(gapControlSpeed, currentSpeed -
TS * myGapControlState->maxDecel);
588 std::cout << std::endl;
591 if (myGapControlState->maxDecel > 0) {
592 gapControlSpeed =
MAX2(gapControlSpeed, currentSpeed -
TS * myGapControlState->maxDecel);
599 if (myGapControlState->lastUpdate < currentTime) {
602 std::cout <<
" Updating GapControlState." << std::endl;
605 if (myGapControlState->tauCurrent == myGapControlState->tauTarget && myGapControlState->addGapCurrent == myGapControlState->addGapTarget) {
606 if (!myGapControlState->gapAttained) {
608 myGapControlState->gapAttained = leaderInfo.first ==
nullptr || leaderInfo.second >
MAX2(desiredTargetTimeSpacing, myGapControlState->addGapTarget) - POSITION_EPS;
611 if (myGapControlState->gapAttained) {
612 std::cout <<
" Target gap was established." << std::endl;
618 myGapControlState->remainingDuration -=
TS;
621 std::cout <<
" Gap control remaining duration: " << myGapControlState->remainingDuration << std::endl;
624 if (myGapControlState->remainingDuration <= 0) {
627 std::cout <<
" Gap control duration expired, deactivating control." << std::endl;
631 myGapControlState->deactivate();
636 myGapControlState->tauCurrent =
MIN2(myGapControlState->tauCurrent + myGapControlState->timeHeadwayIncrement, myGapControlState->tauTarget);
637 myGapControlState->addGapCurrent =
MIN2(myGapControlState->addGapCurrent + myGapControlState->spaceHeadwayIncrement, myGapControlState->addGapTarget);
640 if (myConsiderSafeVelocity) {
641 gapControlSpeed =
MIN2(gapControlSpeed, vSafe);
643 if (myConsiderMaxAcceleration) {
644 gapControlSpeed =
MIN2(gapControlSpeed, vMax);
646 if (myConsiderMaxDeceleration) {
647 gapControlSpeed =
MAX2(gapControlSpeed, vMin);
649 return MIN2(speed, gapControlSpeed);
657 return myOriginalSpeed;
662 myOriginalSpeed = speed;
669 while (myLaneTimeLine.size() == 1 || (myLaneTimeLine.size() > 1 && currentTime > myLaneTimeLine[1].first)) {
670 myLaneTimeLine.erase(myLaneTimeLine.begin());
674 if (myLaneTimeLine.size() >= 2 && currentTime >= myLaneTimeLine[0].first) {
675 const int destinationLaneIndex = myLaneTimeLine[1].second;
676 if (destinationLaneIndex < (
int)currentEdge.
getLanes().size()) {
677 if (currentLaneIndex > destinationLaneIndex) {
679 }
else if (currentLaneIndex < destinationLaneIndex) {
684 }
else if (currentEdge.
getLanes().back()->getOpposite() !=
nullptr) {
693 if ((state &
LCA_TRACI) != 0 && myLatDist != 0) {
702 mode = myStrategicLC;
704 mode = myCooperativeLC;
706 mode = mySpeedGainLC;
708 mode = myRightDriveLC;
718 state &= ~LCA_WANTS_LANECHANGE_OR_STAY;
719 state &= ~LCA_URGENT;
726 state &= ~LCA_WANTS_LANECHANGE_OR_STAY;
727 state &= ~LCA_URGENT;
747 switch (changeRequest) {
763 assert(myLaneTimeLine.size() >= 2);
764 assert(currentTime >= myLaneTimeLine[0].first);
765 return STEPS2TIME(myLaneTimeLine[1].first - currentTime);
771 myConsiderSafeVelocity = ((speedMode & 1) != 0);
772 myConsiderMaxAcceleration = ((speedMode & 2) != 0);
773 myConsiderMaxDeceleration = ((speedMode & 4) != 0);
774 myRespectJunctionPriority = ((speedMode & 8) != 0);
775 myEmergencyBrakeRedLight = ((speedMode & 16) != 0);
776 myRespectJunctionLeaderPriority = ((speedMode & 32) == 0);
793 myRemoteXYPos = xyPos;
796 myRemotePosLat = posLat;
797 myRemoteAngle = angle;
798 myRemoteEdgeOffset = edgeOffset;
799 myRemoteRoute = route;
800 myLastRemoteAccess = t;
812 return myLastRemoteAccess >= t -
TIME2STEPS(10);
818 if (myRemoteRoute.size() != 0 && myRemoteRoute != v->
getRoute().
getEdges()) {
821#ifdef DEBUG_REMOTECONTROL
833 const bool wasOnRoad = v->
isOnRoad();
834 const bool withinLane = myRemoteLane !=
nullptr && fabs(myRemotePosLat) < 0.5 * (myRemoteLane->getWidth() + v->
getVehicleType().
getWidth());
835 const bool keepLane = wasOnRoad && v->
getLane() == myRemoteLane;
836 if (v->
isOnRoad() && !(keepLane && withinLane)) {
837 if (myRemoteLane !=
nullptr && &v->
getLane()->
getEdge() == &myRemoteLane->getEdge()) {
844 if (myRemoteRoute.size() != 0 && myRemoteRoute != v->
getRoute().
getEdges()) {
846#ifdef DEBUG_REMOTECONTROL
847 std::cout <<
SIMSTEP <<
" postProcessRemoteControl veh=" << v->
getID()
851 <<
" newRoute=" <<
toString(myRemoteRoute)
852 <<
" newRouteEdge=" << myRemoteRoute[myRemoteEdgeOffset]->getID()
860 if (myRemoteLane !=
nullptr && myRemotePos > myRemoteLane->getLength()) {
861 myRemotePos = myRemoteLane->getLength();
863 if (myRemoteLane !=
nullptr && withinLane) {
871 myRemoteLane->forceVehicleInsertion(v, myRemotePos, notify, myRemotePosLat);
878 myRemoteLane->requireCollisionCheck();
906 if (myRemoteLane !=
nullptr) {
912 if (distAlongRoute != std::numeric_limits<double>::max()) {
913 dist = distAlongRoute;
917 const double minSpeed = myConsiderMaxDeceleration ?
919 const double maxSpeed = (myRemoteLane !=
nullptr
920 ? myRemoteLane->getVehicleMaxSpeed(veh)
930 if (myRemoteLane ==
nullptr) {
940 if (dist == std::numeric_limits<double>::max()) {
944 WRITE_WARNINGF(
TL(
"Vehicle '%' moved by TraCI from % to % (dist %) with implied speed of % (exceeding maximum speed %). time=%."),
993 (*i)->resetPartialOccupation(
this);
1016#ifdef DEBUG_ACTIONSTEPS
1018 std::cout <<
SIMTIME <<
" Removing vehicle '" <<
getID() <<
"' (reason: " <<
toString(reason) <<
")" << std::endl;
1040 if (!(*myCurrEdge)->isTazConnector()) {
1042 if ((*myCurrEdge)->getDepartLane(*
this) ==
nullptr) {
1043 msg =
"Invalid departlane definition for vehicle '" +
getID() +
"'.";
1052 if ((*myCurrEdge)->allowedLanes(
getVClass()) ==
nullptr) {
1053 msg =
"Vehicle '" +
getID() +
"' is not allowed to depart on any lane of edge '" + (*myCurrEdge)->getID() +
"'.";
1059 msg =
"Departure speed for vehicle '" +
getID() +
"' is too high for the vehicle type '" +
myType->
getID() +
"'.";
1090 updateBestLanes(
true, onInit ? (*myCurrEdge)->getLanes().front() : 0);
1108 if (!rem->first->notifyMove(*
this, oldPos + rem->second, newPos + rem->second,
MAX2(0., newSpeed))) {
1110 if (myTraceMoveReminders) {
1111 traceMoveReminder(
"notifyMove", rem->first, rem->second,
false);
1117 if (myTraceMoveReminders) {
1118 traceMoveReminder(
"notifyMove", rem->first, rem->second,
true);
1133 if (duration >= 0) {
1148 rem.first->notifyIdle(*
this);
1153 rem->notifyIdle(*
this);
1164 rem.second += oldLaneLength;
1168 if (myTraceMoveReminders) {
1169 traceMoveReminder(
"adaptedPos", rem.first, rem.second,
true);
1183 return getStops().begin()->parkingarea->getVehicleSlope(*
this);
1218 if (
myStops.begin()->parkingarea !=
nullptr) {
1219 return myStops.begin()->parkingarea->getVehiclePosition(*
this);
1229 if (offset == 0. && !changingLanes) {
1247 auto nextBestLane = bestLanes.begin();
1252 bool success =
true;
1254 while (offset > 0) {
1259 lane = lane->
getLinkCont()[0]->getViaLaneOrLane();
1261 if (lane ==
nullptr) {
1271 while (nextBestLane != bestLanes.end() && *nextBestLane ==
nullptr) {
1276 assert(lane == *nextBestLane);
1280 assert(nextBestLane == bestLanes.end() || *nextBestLane != 0);
1281 if (nextBestLane == bestLanes.end()) {
1286 assert(link !=
nullptr);
1317 int furtherIndex = 0;
1326 offset += lastLength;
1356 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
" setAngle(" << angle <<
") straightenFurther=" << straightenFurther << std::endl;
1364 if (further->
getLinkTo(next) !=
nullptr) {
1379 const bool newActionStepLength = actionStepLengthMillisecs != previousActionStepLength;
1380 if (newActionStepLength) {
1410 if (
myStops.begin()->parkingarea !=
nullptr) {
1411 return myStops.begin()->parkingarea->getVehicleAngle(*
this);
1441 double result = (p1 != p2 ? p2.
angleTo2D(p1) :
1491 if (parkingArea == 0) {
1492 errorMsg =
"new parkingArea is NULL";
1496 errorMsg =
"vehicle has no stops";
1499 if (
myStops.front().parkingarea == 0) {
1500 errorMsg =
"first stop is not at parkingArea";
1506 for (std::list<MSStop>::iterator iter = ++
myStops.begin(); iter !=
myStops.end();) {
1507 if (iter->parkingarea == parkingArea) {
1508 stopPar.
duration += iter->duration;
1535 return nextParkingArea;
1543 currentParkingArea =
myStops.begin()->parkingarea;
1545 return currentParkingArea;
1574 return myStops.front().duration;
1596 return currentVelocity;
1601 std::cout <<
"\nPROCESS_NEXT_STOP\n" <<
SIMTIME <<
" vehicle '" <<
getID() <<
"'" << std::endl;
1612 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' reached stop.\n"
1633 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' resumes from stopping." << std::endl;
1652 WRITE_WARNING(
"Vehicle '" +
getID() +
"' ignores triggered stop on lane '" + stop.
lane->
getID() +
"' due to capacity constraints.");
1660 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' registers as waiting for person." << std::endl;
1666 WRITE_WARNING(
"Vehicle '" +
getID() +
"' ignores container triggered stop on lane '" + stop.
lane->
getID() +
"' due to capacity constraints.");
1674 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' registers as waiting for container." << std::endl;
1684 return currentVelocity;
1700 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' hasn't reached next stop." << std::endl;
1710 if (noExits && noEntries) {
1720 bool fitsOnStoppingPlace =
true;
1721 if (stop.
busstop !=
nullptr) {
1731 fitsOnStoppingPlace =
false;
1738 if (
myStops.empty() ||
myStops.front().parkingarea != oldParkingArea) {
1740 return currentVelocity;
1743 fitsOnStoppingPlace =
false;
1745 fitsOnStoppingPlace =
false;
1752 std::cout <<
" pos=" <<
myState.
pos() <<
" speed=" << currentVelocity <<
" targetPos=" << targetPos <<
" fits=" << fitsOnStoppingPlace
1753 <<
" reachedThresh=" << reachedThreshold
1768 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' reached next stop." << std::endl;
1788 if (stop.
busstop !=
nullptr) {
1814 if (splitVeh ==
nullptr) {
1833 return currentVelocity;
1856 bool unregister =
false;
1886 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' unregisters as waiting for transportable." << std::endl;
1901 myStops.begin()->joinTriggered =
false;
1939 myStops.begin()->joinTriggered =
false;
1948 if (stop ==
nullptr) {
1952 if (s.busstop == stop
1953 || s.containerstop == stop
1954 || s.parkingarea == stop
1955 || s.chargingStation == stop) {
1965 if (&s.lane->getEdge() == edge) {
1998 if (timeSinceLastAction == 0) {
2000 timeSinceLastAction = oldActionStepLength;
2002 if (timeSinceLastAction >= newActionStepLength) {
2006 SUMOTime timeUntilNextAction = newActionStepLength - timeSinceLastAction;
2015#ifdef DEBUG_PLAN_MOVE
2021 <<
" veh=" <<
getID()
2036#ifdef DEBUG_ACTIONSTEPS
2038 std::cout <<
STEPS2TIME(t) <<
" vehicle '" <<
getID() <<
"' skips action." << std::endl;
2046#ifdef DEBUG_ACTIONSTEPS
2048 std::cout <<
STEPS2TIME(t) <<
" vehicle = '" <<
getID() <<
"' takes action." << std::endl;
2056#ifdef DEBUG_PLAN_MOVE
2058 DriveItemVector::iterator i;
2061 <<
" vPass=" << (*i).myVLinkPass
2062 <<
" vWait=" << (*i).myVLinkWait
2063 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
2064 <<
" request=" << (*i).mySetRequest
2085 newStopDist = std::numeric_limits<double>::max();
2093 double lateralShift = 0;
2097 laneMaxV =
MIN2(laneMaxV, l->getVehicleMaxSpeed(
this));
2098#ifdef DEBUG_PLAN_MOVE
2100 std::cout <<
" laneMaxV=" << laneMaxV <<
" lane=" << l->getID() <<
"\n";
2106 laneMaxV =
MAX2(laneMaxV, vMinComfortable);
2108 laneMaxV = std::numeric_limits<double>::max();
2122 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" speedBeforeTraci=" << v;
2128 std::cout <<
" influencedSpeed=" << v;
2134 std::cout <<
" gapControlSpeed=" << v <<
"\n";
2142#ifdef DEBUG_PLAN_MOVE
2144 std::cout <<
" dist=" << dist <<
" bestLaneConts=" <<
toString(bestLaneConts)
2145 <<
"\n maxV=" << maxV <<
" laneMaxV=" << laneMaxV <<
" v=" << v <<
"\n";
2148 assert(bestLaneConts.size() > 0);
2149 bool hadNonInternal =
false;
2152 nextTurn.first = seen;
2155 double seenNonInternal = 0;
2160 bool slowedDownForMinor =
false;
2161 double mustSeeBeforeReversal = 0;
2167#ifdef PARALLEL_STOPWATCH
2171#pragma warning(push)
2172#pragma warning(disable: 4127)
2187 const double gapOffset = leaderLane ==
myLane ? 0 : seen - leaderLane->
getLength();
2193 if (cand.first != 0) {
2194 if ((cand.first->myLaneChangeModel->isOpposite() && cand.first->getLaneChangeModel().getShadowLane() != leaderLane)
2195 || (!cand.first->myLaneChangeModel->isOpposite() && cand.first->getLaneChangeModel().getShadowLane() == leaderLane)) {
2197 oppositeLeaders.
addLeader(cand.first, cand.second + gapOffset -
getVehicleType().getMinGap() + cand.first->getVehicleType().
getMinGap() - cand.first->getVehicleType().getLength());
2200 const bool assumeStopped = cand.first->isStopped() || cand.first->getWaitingSeconds() > 1;
2201 const double predMaxDist = cand.first->getSpeed() + (assumeStopped ? 0 : cand.first->getCarFollowModel().getMaxAccel()) * minTimeToLeaveLane;
2202 if (cand.second >= 0 && (cand.second - v * minTimeToLeaveLane - predMaxDist < 0 || assumeStopped)) {
2208#ifdef DEBUG_PLAN_MOVE
2210 std::cout <<
" leaderLane=" << leaderLane->
getID() <<
" gapOffset=" << gapOffset <<
" minTimeToLeaveLane=" << minTimeToLeaveLane
2211 <<
" cands=" << cands.
toString() <<
" oppositeLeaders=" << oppositeLeaders.
toString() <<
"\n";
2228 && ((outsideLeft && cand->getLeftSideOnLane() < 0)
2229 || (!outsideLeft && cand->getRightSideOnEdge() > lane->
getWidth()))) {
2231#ifdef DEBUG_PLAN_MOVE
2233 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" offset=" << ahead.
getSublaneOffset() <<
" outsideLeft=" << outsideLeft <<
" outsideLeader=" << cand->getID() <<
"\n";
2240 adaptToLeaders(ahead, lateralShift, seen, lastLink, leaderLane, v, vLinkPass);
2242 if (lastLink !=
nullptr) {
2245#ifdef DEBUG_PLAN_MOVE
2247 std::cout <<
"\nv = " << v <<
"\n";
2255 if (shadowLane !=
nullptr
2269#ifdef DEBUG_PLAN_MOVE
2271 std::cout <<
SIMTIME <<
" opposite veh=" <<
getID() <<
" shadowLane=" << shadowLane->
getID() <<
" latOffset=" << latOffset <<
" shadowLeaders=" << shadowLeaders.
toString() <<
"\n";
2278 adaptToLeaders(shadowLeaders, latOffset, seen, lastLink, shadowLane, v, vLinkPass);
2283 const double latOffset = 0;
2284#ifdef DEBUG_PLAN_MOVE
2286 std::cout <<
SIMTIME <<
" opposite shadows veh=" <<
getID() <<
" shadowLane=" << shadowLane->
getID()
2287 <<
" latOffset=" << latOffset <<
" shadowLeaders=" << shadowLeaders.
toString() <<
"\n";
2291#ifdef DEBUG_PLAN_MOVE
2293 std::cout <<
" shadowLeadersFixed=" << shadowLeaders.
toString() <<
"\n";
2302 const double relativePos = lane->
getLength() - seen;
2303#ifdef DEBUG_PLAN_MOVE
2305 std::cout <<
SIMTIME <<
" adapt to pedestrians on lane=" << lane->
getID() <<
" relPos=" << relativePos <<
"\n";
2311 if (leader.first != 0) {
2313 v =
MIN2(v, stopSpeed);
2314#ifdef DEBUG_PLAN_MOVE
2316 std::cout <<
SIMTIME <<
" pedLeader=" << leader.first->getID() <<
" dist=" << leader.second <<
" v=" << v <<
"\n";
2325 const double relativePos = seen;
2326#ifdef DEBUG_PLAN_MOVE
2328 std::cout <<
SIMTIME <<
" adapt to pedestrians on lane=" << lane->
getID() <<
" relPos=" << relativePos <<
"\n";
2335 if (leader.first != 0) {
2337 v =
MIN2(v, stopSpeed);
2338#ifdef DEBUG_PLAN_MOVE
2340 std::cout <<
SIMTIME <<
" pedLeader=" << leader.first->getID() <<
" dist=" << leader.second <<
" v=" << v <<
"\n";
2350 || (
myStops.begin()->isOpposite &&
myStops.begin()->lane->getEdge().getOppositeEdge() == &lane->
getEdge()))
2356 bool isWaypoint = stop.
getSpeed() > 0;
2357 double endPos = stop.
getEndPos(*
this) + NUMERICAL_EPS;
2362 }
else if (isWaypoint && !stop.
reached) {
2365 newStopDist = seen + endPos - lane->
getLength();
2368 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" newStopDist=" << newStopDist <<
" stopLane=" << stop.
lane->
getID() <<
" stopEndPos=" << endPos <<
"\n";
2372 double stopSpeed = laneMaxV;
2374 bool waypointWithStop =
false;
2387 if (stop.
getUntil() > t + time2end) {
2389 double distToEnd = newStopDist;
2394 waypointWithStop =
true;
2400 newStopDist = std::numeric_limits<double>::max();
2407 if (lastLink !=
nullptr) {
2413 if (lastLink !=
nullptr) {
2417 v =
MIN2(v, stopSpeed);
2419 std::vector<MSLink*>::const_iterator exitLink =
MSLane::succLinkSec(*
this, view + 1, *lane, bestLaneConts);
2421 bool dummySetRequest;
2422 double dummyVLinkWait;
2426#ifdef DEBUG_PLAN_MOVE
2428 std::cout <<
"\n" <<
SIMTIME <<
" next stop: distance = " << newStopDist <<
" requires stopSpeed = " << stopSpeed <<
"\n";
2433 lfLinks.emplace_back(v, newStopDist);
2440 std::vector<MSLink*>::const_iterator link =
MSLane::succLinkSec(*
this, view + 1, *lane, bestLaneConts);
2443 if (!encounteredTurn) {
2451 nextTurn.first = seen;
2452 nextTurn.second = linkDir;
2453 encounteredTurn =
true;
2454#ifdef DEBUG_NEXT_TURN
2457 <<
" at " << nextTurn.first <<
"m." << std::endl;
2472 const double va =
MAX2(NUMERICAL_EPS, cfModel.
freeSpeed(
this,
getSpeed(), distToArrival, arrivalSpeed));
2474 if (lastLink !=
nullptr) {
2482 || ((*link)->getViaLane() ==
nullptr
2487 lane) > POSITION_EPS
2498 || (opposite && (*link)->getViaLaneOrLane()->getParallelOpposite() ==
nullptr
2501 if (lastLink !=
nullptr) {
2509#ifdef DEBUG_PLAN_MOVE
2511 std::cout <<
" braking for link end lane=" << lane->
getID() <<
" seen=" << seen
2517 lfLinks.emplace_back(v, seen);
2521 lateralShift += (*link)->getLateralShift();
2522 const bool yellowOrRed = (*link)->haveRed() || (*link)->haveYellow();
2533 double laneStopOffset;
2539 const bool canBrakeBeforeLaneEnd = seen >= brakeDist;
2543 laneStopOffset = majorStopOffset;
2544 }
else if ((*link)->havePriority()) {
2546 laneStopOffset =
MIN2((*link)->getFoeVisibilityDistance() - POSITION_EPS, majorStopOffset);
2549 laneStopOffset =
MIN2((*link)->getFoeVisibilityDistance() - POSITION_EPS, minorStopOffset);
2551 if (canBrakeBeforeLaneEnd) {
2553 laneStopOffset =
MIN2(laneStopOffset, seen - brakeDist);
2555 laneStopOffset =
MAX2(POSITION_EPS, laneStopOffset);
2556 double stopDist =
MAX2(0., seen - laneStopOffset);
2557 if (newStopDist != std::numeric_limits<double>::max()) {
2558 stopDist =
MAX2(stopDist, newStopDist);
2560#ifdef DEBUG_PLAN_MOVE
2562 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" effective stopOffset on lane '" << lane->
getID()
2563 <<
"' is " << laneStopOffset <<
" (-> stopDist=" << stopDist <<
")" << std::endl;
2573 mustSeeBeforeReversal = 2 * seen +
getLength();
2575 v =
MIN2(v, vMustReverse);
2578 foundRailSignal |= ((*link)->getTLLogic() !=
nullptr
2583 bool canReverseEventually =
false;
2584 const double vReverse =
checkReversal(canReverseEventually, laneMaxV, seen);
2585 v =
MIN2(v, vReverse);
2586#ifdef DEBUG_PLAN_MOVE
2588 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" canReverseEventually=" << canReverseEventually <<
" v=" << v <<
"\n";
2601 assert(timeRemaining != 0);
2604 (seen - POSITION_EPS) / timeRemaining);
2605#ifdef DEBUG_PLAN_MOVE
2607 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" slowing down to finish continuous change before"
2608 <<
" link=" << (*link)->getViaLaneOrLane()->getID()
2609 <<
" timeRemaining=" << timeRemaining
2622 const bool abortRequestAfterMinor = slowedDownForMinor && (*link)->getInternalLaneBefore() ==
nullptr;
2624 bool setRequest = (v >
NUMERICAL_EPS_SPEED && !abortRequestAfterMinor) || (leavingCurrentIntersection);
2626 double stopSpeed = cfModel.
stopSpeed(
this,
getSpeed(), stopDist, stopDecel, MSCFModel::CalcReason::CURRENT_WAIT);
2627 double vLinkWait =
MIN2(v, stopSpeed);
2628#ifdef DEBUG_PLAN_MOVE
2631 <<
" stopDist=" << stopDist
2632 <<
" stopDecel=" << stopDecel
2633 <<
" vLinkWait=" << vLinkWait
2634 <<
" brakeDist=" << brakeDist
2636 <<
" leaveIntersection=" << leavingCurrentIntersection
2637 <<
" setRequest=" << setRequest
2646 if (yellowOrRed && canBrakeBeforeStopLine && !
ignoreRed(*link, canBrakeBeforeStopLine) && seen >= mustSeeBeforeReversal) {
2653 lfLinks.push_back(
DriveProcessItem(*link, v, vLinkWait,
false, arrivalTime, vLinkWait, 0, seen, -1));
2664#ifdef DEBUG_PLAN_MOVE
2666 <<
" ignoreRed spent=" <<
STEPS2TIME(t - (*link)->getLastStateChange())
2667 <<
" redSpeed=" << redSpeed
2676 if (lastLink !=
nullptr) {
2679 double arrivalSpeed = vLinkPass;
2685 const double visibilityDistance = (*link)->getFoeVisibilityDistance();
2686 const double determinedFoePresence = seen <= visibilityDistance;
2691#ifdef DEBUG_PLAN_MOVE
2693 std::cout <<
" approaching link=" << (*link)->getViaLaneOrLane()->getID() <<
" prio=" << (*link)->havePriority() <<
" seen=" << seen <<
" visibilityDistance=" << visibilityDistance <<
" brakeDist=" << brakeDist <<
"\n";
2697 const bool couldBrakeForMinor = !(*link)->havePriority() && brakeDist < seen && !(*link)->lastWasContMajor();
2698 if (couldBrakeForMinor && !determinedFoePresence) {
2703 arrivalSpeed =
MIN2(vLinkPass, maxArrivalSpeed);
2704 slowedDownForMinor =
true;
2705#ifdef DEBUG_PLAN_MOVE
2707 std::cout <<
" slowedDownForMinor maxSpeedAtVisDist=" << maxSpeedAtVisibilityDist <<
" maxArrivalSpeed=" << maxArrivalSpeed <<
" arrivalSpeed=" << arrivalSpeed <<
"\n";
2713 std::pair<const SUMOVehicle*, const MSLink*> blocker = (*link)->getFirstApproachingFoe(*link);
2716 while (blocker.second !=
nullptr && blocker.second != *link && n > 0) {
2717 blocker = blocker.second->getFirstApproachingFoe(*link);
2725 if (blocker.second == *link) {
2733 if (couldBrakeForMinor && (*link)->getLane()->getEdge().isRoundabout()) {
2734 slowedDownForMinor =
true;
2735#ifdef DEBUG_PLAN_MOVE
2737 std::cout <<
" slowedDownForMinor at roundabout\n";
2746 double arrivalSpeedBraking = 0;
2747 const double bGap = cfModel.
brakeGap(v);
2753 arrivalSpeedBraking =
MIN2(arrivalSpeedBraking, arrivalSpeed);
2762 const double estimatedLeaveSpeed =
MIN2((*link)->getViaLaneOrLane()->getVehicleMaxSpeed(
this),
2765 arrivalTime, arrivalSpeed,
2766 arrivalSpeedBraking,
2767 seen, estimatedLeaveSpeed));
2768 if ((*link)->getViaLane() ==
nullptr) {
2769 hadNonInternal =
true;
2772#ifdef DEBUG_PLAN_MOVE
2774 std::cout <<
" checkAbort setRequest=" << setRequest <<
" v=" << v <<
" seen=" << seen <<
" dist=" << dist
2775 <<
" seenNonInternal=" << seenNonInternal
2776 <<
" seenInternal=" << seenInternal <<
" length=" << vehicleLength <<
"\n";
2780 if ((!setRequest || v <= 0 || seen > dist) && hadNonInternal && seenNonInternal >
MAX2(vehicleLength *
CRLL_LOOK_AHEAD, vehicleLength + seenInternal) && foundRailSignal) {
2784 lane = (*link)->getViaLaneOrLane();
2787 laneMaxV = std::numeric_limits<double>::max();
2802 if (leaderLane ==
nullptr) {
2809 lastLink = &lfLinks.back();
2818#ifdef PARALLEL_STOPWATCH
2846 const MSLane*
const lane,
double& v,
double& vLinkPass)
const {
2849 ahead.
getSubLanes(
this, latOffset, rightmost, leftmost);
2850#ifdef DEBUG_PLAN_MOVE
2852 <<
"\nADAPT_TO_LEADERS\nveh=" <<
getID()
2853 <<
" lane=" << lane->
getID()
2854 <<
" latOffset=" << latOffset
2855 <<
" rm=" << rightmost
2856 <<
" lm=" << leftmost
2871 for (
int sublane = rightmost; sublane <= leftmost; ++sublane) {
2873 if (pred !=
nullptr && pred !=
this) {
2876 double gap = (lastLink ==
nullptr
2882 gap = (lastLink ==
nullptr
2887 gap = (lastLink ==
nullptr
2896#ifdef DEBUG_PLAN_MOVE
2898 std::cout <<
" fixedGap=" << gap <<
" predMaxDist=" << predMaxDist <<
"\n";
2910 gap =
MAX2(0.0, gap);
2912#ifdef DEBUG_PLAN_MOVE
2914 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()) <<
"\n";
2917 adaptToLeader(std::make_pair(pred, gap), seen, lastLink, v, vLinkPass);
2926 double& v,
double& vLinkPass)
const {
2929 ahead.
getSubLanes(
this, latOffset, rightmost, leftmost);
2930#ifdef DEBUG_PLAN_MOVE
2932 <<
"\nADAPT_TO_LEADERS_DISTANCE\nveh=" <<
getID()
2933 <<
" latOffset=" << latOffset
2934 <<
" rm=" << rightmost
2935 <<
" lm=" << leftmost
2939 for (
int sublane = rightmost; sublane <= leftmost; ++sublane) {
2942 if (pred !=
nullptr && pred !=
this) {
2943#ifdef DEBUG_PLAN_MOVE
2945 std::cout <<
" pred=" << pred->
getID() <<
" predLane=" << pred->
getLane()->
getID() <<
" predPos=" << pred->
getPositionOnLane() <<
" gap=" << predDist.second <<
"\n";
2958 double& v,
double& vLinkPass)
const {
2959 if (leaderInfo.first != 0) {
2960 assert(leaderInfo.first != 0);
2962 double vsafeLeader = 0;
2964 vsafeLeader = -std::numeric_limits<double>::max();
2966 bool backOnRoute =
true;
2967 if (leaderInfo.second < 0 && lastLink !=
nullptr && lastLink->
myLink !=
nullptr) {
2968 backOnRoute =
false;
2973 if (leaderInfo.first->getBackLane() == current) {
2977 if (lane == current) {
2980 if (leaderInfo.first->getBackLane() == lane) {
2985#ifdef DEBUG_PLAN_MOVE
2987 std::cout <<
SIMTIME <<
" current=" << current->
getID() <<
" leaderBackLane=" << leaderInfo.first->getBackLane()->getID() <<
" backOnRoute=" << backOnRoute <<
"\n";
2991 double stopDist = seen - current->
getLength() - POSITION_EPS;
3000 vsafeLeader = cfModel.
followSpeed(
this,
getSpeed(), leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first);
3002 if (lastLink !=
nullptr) {
3003 const double futureVSafe = cfModel.
followSpeed(
this, lastLink->
accelV, leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first, MSCFModel::CalcReason::FUTURE);
3005#ifdef DEBUG_PLAN_MOVE
3007 std::cout <<
" vlinkpass=" << lastLink->
myVLinkPass <<
" futureVSafe=" << futureVSafe <<
"\n";
3011 v =
MIN2(v, vsafeLeader);
3012 vLinkPass =
MIN2(vLinkPass, vsafeLeader);
3013#ifdef DEBUG_PLAN_MOVE
3017 <<
" veh=" <<
getID()
3018 <<
" lead=" << leaderInfo.first->getID()
3019 <<
" leadSpeed=" << leaderInfo.first->getSpeed()
3020 <<
" gap=" << leaderInfo.second
3021 <<
" leadLane=" << leaderInfo.first->getLane()->getID()
3022 <<
" predPos=" << leaderInfo.first->getPositionOnLane()
3025 <<
" vSafeLeader=" << vsafeLeader
3026 <<
" vLinkPass=" << vLinkPass
3036 const MSLane*
const lane,
double& v,
double& vLinkPass,
3037 double distToCrossing)
const {
3038 if (leaderInfo.first != 0) {
3040 double vsafeLeader = 0;
3042 vsafeLeader = -std::numeric_limits<double>::max();
3044 if (leaderInfo.second >= 0) {
3045 vsafeLeader = cfModel.
followSpeed(
this,
getSpeed(), leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first);
3046 }
else if (leaderInfo.first !=
this) {
3050#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3052 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" stopping before junction: lane=" << lane->
getID() <<
" seen=" << seen
3054 <<
" stopDist=" << seen - lane->
getLength() - POSITION_EPS
3055 <<
" vsafeLeader=" << vsafeLeader
3056 <<
" distToCrossing=" << distToCrossing
3061 if (distToCrossing >= 0) {
3064 if (leaderInfo.first ==
this) {
3066 vsafeLeader = vStop;
3067#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3069 std::cout <<
" breaking for pedestrian distToCrossing=" << distToCrossing <<
" vStop=" << vStop <<
"\n";
3072 }
else if (leaderInfo.second == -std::numeric_limits<double>::max()) {
3074#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3076 std::cout <<
" stop at crossing point for critical leader\n";
3079 vsafeLeader =
MAX2(vsafeLeader, vStop);
3081 const double leaderDistToCrossing = distToCrossing - leaderInfo.second;
3089 vsafeLeader =
MAX2(vsafeLeader,
MIN2(v2, vStop));
3090#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3092 std::cout <<
" driving up to the crossing point (distToCrossing=" << distToCrossing <<
")"
3093 <<
" leaderPastCPTime=" << leaderPastCPTime
3094 <<
" vFinal=" << vFinal
3096 <<
" vStop=" << vStop
3097 <<
" vsafeLeader=" << vsafeLeader <<
"\n";
3102 if (lastLink !=
nullptr) {
3105 v =
MIN2(v, vsafeLeader);
3106 vLinkPass =
MIN2(vLinkPass, vsafeLeader);
3107#ifdef DEBUG_PLAN_MOVE
3111 <<
" veh=" <<
getID()
3112 <<
" lead=" << leaderInfo.first->getID()
3113 <<
" leadSpeed=" << leaderInfo.first->getSpeed()
3114 <<
" gap=" << leaderInfo.second
3115 <<
" leadLane=" << leaderInfo.first->getLane()->getID()
3116 <<
" predPos=" << leaderInfo.first->getPositionOnLane()
3118 <<
" lane=" << lane->
getID()
3120 <<
" dTC=" << distToCrossing
3122 <<
" vSafeLeader=" << vsafeLeader
3123 <<
" vLinkPass=" << vLinkPass
3132 DriveProcessItem*
const lastLink,
double& v,
double& vLinkPass,
double& vLinkWait,
bool& setRequest)
const {
3135 checkLinkLeader(link, lane, seen, lastLink, v, vLinkPass, vLinkWait, setRequest);
3138 if (parallelLink !=
nullptr) {
3139 checkLinkLeader(parallelLink, lane, seen, lastLink, v, vLinkPass, vLinkWait, setRequest,
true);
3148 DriveProcessItem*
const lastLink,
double& v,
double& vLinkPass,
double& vLinkWait,
bool& setRequest,
3149 bool isShadowLink)
const {
3150#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3156#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3161 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
3163 const MSVehicle* leader = (*it).vehAndGap.first;
3164 if (leader ==
nullptr) {
3166#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3168 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" is blocked on link to " << link->
getViaLaneOrLane()->
getID() <<
" by pedestrian. dist=" << it->distToCrossing <<
"\n";
3173#ifdef DEBUG_PLAN_MOVE
3175 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" is ignoring pedestrian (jmIgnoreJunctionFoeProb)\n";
3180 adaptToJunctionLeader(std::make_pair(
this, -1), seen, lastLink, lane, v, vLinkPass, it->distToCrossing);
3181 }
else if (
isLeader(link, leader, (*it).vehAndGap.second) || (*it).inTheWay) {
3184#ifdef DEBUG_PLAN_MOVE
3186 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" is ignoring linkLeader=" << leader->
getID() <<
" (jmIgnoreJunctionFoeProb)\n";
3197 linkLeadersAhead.
addLeader(leader,
false, 0);
3201#ifdef DEBUG_PLAN_MOVE
3205 <<
" isShadowLink=" << isShadowLink
3206 <<
" lane=" << lane->
getID()
3207 <<
" foe=" << leader->
getID()
3209 <<
" latOffset=" << latOffset
3211 <<
" linkLeadersAhead=" << linkLeadersAhead.
toString()
3216#ifdef DEBUG_PLAN_MOVE
3218 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" linkLeader=" << leader->
getID() <<
" gap=" << it->vehAndGap.second
3227 if (lastLink !=
nullptr) {
3241#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3243 std::cout <<
" aborting request\n";
3250#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3252 std::cout <<
" aborting previous request\n";
3258#ifdef DEBUG_PLAN_MOVE_LEADERINFO
3261 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" ignoring leader " << leader->
getID() <<
" gap=" << (*it).vehAndGap.second <<
" dtC=" << (*it).distToCrossing
3271 vLinkWait =
MIN2(vLinkWait, v);
3301 double vSafeZipper = std::numeric_limits<double>::max();
3304 bool canBrakeVSafeMin =
false;
3309 MSLink*
const link = dpi.myLink;
3311#ifdef DEBUG_EXEC_MOVE
3315 <<
" veh=" <<
getID()
3317 <<
" req=" << dpi.mySetRequest
3318 <<
" vP=" << dpi.myVLinkPass
3319 <<
" vW=" << dpi.myVLinkWait
3320 <<
" d=" << dpi.myDistance
3327 if (link !=
nullptr && dpi.mySetRequest) {
3336 const bool ignoreRedLink =
ignoreRed(link, canBrake) || beyondStopLine;
3337 if (yellow && canBrake && !ignoreRedLink) {
3338 vSafe = dpi.myVLinkWait;
3340#ifdef DEBUG_CHECKREWINDLINKLANES
3342 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (yellow)\n";
3349 bool opened = (yellow || influencerPrio
3350 || link->
opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
3356 ignoreRedLink,
this));
3359 if (parallelLink !=
nullptr) {
3362 opened = yellow || influencerPrio || (opened && parallelLink->
opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
3366 ignoreRedLink,
this));
3367#ifdef DEBUG_EXEC_MOVE
3370 <<
" veh=" <<
getID()
3374 <<
" opened=" << opened
3381#ifdef DEBUG_EXEC_MOVE
3384 <<
" opened=" << opened
3385 <<
" influencerPrio=" << influencerPrio
3388 <<
" isCont=" << link->
isCont()
3389 <<
" ignoreRed=" << ignoreRedLink
3395 double determinedFoePresence = dpi.myDistance <= visibilityDistance;
3396 if (!determinedFoePresence && (canBrake || !yellow)) {
3397 vSafe = dpi.myVLinkWait;
3399#ifdef DEBUG_CHECKREWINDLINKLANES
3401 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (minor)\n";
3417 vSafeMinDist = dpi.myDistance;
3423 canBrakeVSafeMin = canBrake;
3424#ifdef DEBUG_EXEC_MOVE
3426 std::cout <<
" vSafeMin=" << vSafeMin <<
" vSafeMinDist=" << vSafeMinDist <<
" canBrake=" << canBrake <<
"\n";
3433 vSafe = dpi.myVLinkPass;
3437#ifdef DEBUG_CHECKREWINDLINKLANES
3439 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (very slow)\n";
3444 vSafeZipper =
MIN2(vSafeZipper,
3445 link->
getZipperSpeed(
this, dpi.myDistance, dpi.myVLinkPass, dpi.myArrivalTime, &collectFoes));
3447 vSafe = dpi.myVLinkWait;
3449#ifdef DEBUG_CHECKREWINDLINKLANES
3451 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (closed)\n";
3454#ifdef DEBUG_EXEC_MOVE
3465#ifdef DEBUG_EXEC_MOVE
3467 std::cout <<
SIMTIME <<
" reseting junctionEntryTime at junction '" << link->
getJunction()->
getID() <<
"' beause of non-request exitLink\n";
3474 vSafe = dpi.myVLinkWait;
3477#ifdef DEBUG_CHECKREWINDLINKLANES
3479 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (no request, braking) vSafe=" << vSafe <<
"\n";
3484#ifdef DEBUG_CHECKREWINDLINKLANES
3486 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (no request, stopping)\n";
3521#ifdef DEBUG_EXEC_MOVE
3523 std::cout <<
"vSafeMin Problem? vSafe=" << vSafe <<
" vSafeMin=" << vSafeMin <<
" vSafeMinDist=" << vSafeMinDist << std::endl;
3526 if (canBrakeVSafeMin && vSafe <
getSpeed()) {
3532#ifdef DEBUG_CHECKREWINDLINKLANES
3534 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (vSafe=" << vSafe <<
" < vSafeMin=" << vSafeMin <<
")\n";
3552 vSafe =
MIN2(vSafe, vSafeZipper);
3562 std::cout <<
SIMTIME <<
" MSVehicle::processTraCISpeedControl() for vehicle '" <<
getID() <<
"'"
3563 <<
" vSafe=" << vSafe <<
" (init)vNext=" << vNext;
3572 vMin =
MAX2(0., vMin);
3577 std::cout <<
" (processed)vNext=" << vNext << std::endl;
3587#ifdef DEBUG_ACTIONSTEPS
3589 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" removePassedDriveItems()\n"
3590 <<
" Current items: ";
3592 if (j.myLink == 0) {
3593 std::cout <<
"\n Stop at distance " << j.myDistance;
3595 const MSLane* to = j.myLink->getViaLaneOrLane();
3596 const MSLane* from = j.myLink->getLaneBefore();
3597 std::cout <<
"\n Link at distance " << j.myDistance <<
": '"
3598 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
3601 std::cout <<
"\n myNextDriveItem: ";
3608 std::cout <<
"\n Link at distance " <<
myNextDriveItem->myDistance <<
": '"
3609 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
3612 std::cout << std::endl;
3616#ifdef DEBUG_ACTIONSTEPS
3618 std::cout <<
" Removing item: ";
3619 if (j->myLink == 0) {
3620 std::cout <<
"Stop at distance " << j->myDistance;
3622 const MSLane* to = j->myLink->getViaLaneOrLane();
3623 const MSLane* from = j->myLink->getLaneBefore();
3624 std::cout <<
"Link at distance " << j->myDistance <<
": '"
3625 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
3627 std::cout << std::endl;
3630 if (j->myLink !=
nullptr) {
3631 j->myLink->removeApproaching(
this);
3641#ifdef DEBUG_ACTIONSTEPS
3643 std::cout <<
SIMTIME <<
" updateDriveItems(), veh='" <<
getID() <<
"' (lane: '" <<
getLane()->
getID() <<
"')\nCurrent drive items:" << std::endl;
3646 <<
" vPass=" << dpi.myVLinkPass
3647 <<
" vWait=" << dpi.myVLinkWait
3648 <<
" linkLane=" << (dpi.myLink == 0 ?
"NULL" : dpi.myLink->getViaLaneOrLane()->getID())
3649 <<
" request=" << dpi.mySetRequest
3652 std::cout <<
" myNextDriveItem's linked lane: " << (
myNextDriveItem->myLink == 0 ?
"NULL" :
myNextDriveItem->myLink->getViaLaneOrLane()->getID()) << std::endl;
3659 const MSLink* nextPlannedLink =
nullptr;
3662 while (i !=
myLFLinkLanes.end() && nextPlannedLink ==
nullptr) {
3663 nextPlannedLink = i->myLink;
3667 if (nextPlannedLink ==
nullptr) {
3669#ifdef DEBUG_ACTIONSTEPS
3671 std::cout <<
"Found no link-related drive item." << std::endl;
3679#ifdef DEBUG_ACTIONSTEPS
3681 std::cout <<
"Continuing on planned lane sequence, no update required." << std::endl;
3703#ifdef DEBUG_ACTIONSTEPS
3705 std::cout <<
"Changed lane. Drive items will be updated along the current lane continuation." << std::endl;
3717 MSLink* newLink =
nullptr;
3719 if (driveItemIt->myLink ==
nullptr) {
3729#ifdef DEBUG_ACTIONSTEPS
3731 std::cout <<
"Reached end of the new continuation sequence. Erasing leftover link-items." << std::endl;
3735 if (driveItemIt->myLink ==
nullptr) {
3746 const MSLane*
const target = *bestLaneIt;
3750 if (link->getLane() == target) {
3756 if (newLink == driveItemIt->myLink) {
3758#ifdef DEBUG_ACTIONSTEPS
3760 std::cout <<
"Old and new continuation sequences merge at link\n"
3762 <<
"\nNo update beyond merge required." << std::endl;
3768#ifdef DEBUG_ACTIONSTEPS
3770 std::cout <<
"lane=" << lane->
getID() <<
"\nUpdating link\n '" << driveItemIt->myLink->getLaneBefore()->getID() <<
"'->'" << driveItemIt->myLink->getViaLaneOrLane()->getID() <<
"'"
3774 newLink->
setApproaching(
this, driveItemIt->myLink->getApproaching(
this));
3775 driveItemIt->myLink->removeApproaching(
this);
3776 driveItemIt->myLink = newLink;
3783#ifdef DEBUG_ACTIONSTEPS
3785 std::cout <<
"Updated drive items:" << std::endl;
3788 <<
" vPass=" << dpi.myVLinkPass
3789 <<
" vWait=" << dpi.myVLinkWait
3790 <<
" linkLane=" << (dpi.myLink == 0 ?
"NULL" : dpi.myLink->getViaLaneOrLane()->getID())
3791 <<
" request=" << dpi.mySetRequest
3808 brakelightsOn =
true;
3846#ifdef DEBUG_REVERSE_BIDI
3850 <<
" speedThreshold=" << speedThreshold
3858 <<
" stopOk=" << stopOk
3877 if (remainingRoute < neededFutureRoute) {
3878#ifdef DEBUG_REVERSE_BIDI
3890#ifdef DEBUG_REVERSE_BIDI
3901 const double stopPos =
myStops.front().getEndPos(*
this);
3904 if (newPos > stopPos) {
3905#ifdef DEBUG_REVERSE_BIDI
3910 if (seen >
MAX2(brakeDist, 1.0)) {
3913#ifdef DEBUG_REVERSE_BIDI
3915 std::cout <<
" train is too long, skipping stop at " << stopPos <<
" cannot be avoided\n";
3926 if (!further->getEdge().isInternal()) {
3927 if (further->getEdge().getBidiEdge() != *(
myCurrEdge + view)) {
3928#ifdef DEBUG_REVERSE_BIDI
3930 std::cout <<
" noBidi view=" << view <<
" further=" << further->getID() <<
" furtherBidi=" <<
Named::getIDSecure(further->getEdge().getBidiEdge()) <<
" future=" << (*(
myCurrEdge + view))->getID() <<
"\n";
3937 const double stopPos =
myStops.front().getEndPos(*
this);
3939 if (newPos > stopPos) {
3940#ifdef DEBUG_REVERSE_BIDI
3942 std::cout <<
" reversal would go past stop on further-opposite lane " << further->getBidiLane()->getID() <<
"\n";
3945 if (seen >
MAX2(brakeDist, 1.0)) {
3949#ifdef DEBUG_REVERSE_BIDI
3951 std::cout <<
" train is too long, skipping stop at " << stopPos <<
" cannot be avoided\n";
3962#ifdef DEBUG_REVERSE_BIDI
3964 std::cout <<
SIMTIME <<
" seen=" << seen <<
" vReverseOK=" << vMinComfortable <<
"\n";
3968 return vMinComfortable;
3977 passedLanes.push_back(*i);
3979 if (passedLanes.size() == 0 || passedLanes.back() !=
myLane) {
3980 passedLanes.push_back(
myLane);
3983 bool reverseTrain =
false;
3989#ifdef DEBUG_REVERSE_BIDI
4014 if (link !=
nullptr) {
4020 emergencyReason =
" because it must reverse direction";
4021 approachedLane =
nullptr;
4037 if (link->
haveRed() && !
ignoreRed(link,
false) && !beyondStopLine && !reverseTrain) {
4038 emergencyReason =
" because of a red traffic light";
4042 if (reverseTrain && approachedLane->
isInternal()) {
4050 }
else if (reverseTrain) {
4051 approachedLane = (*(
myCurrEdge + 1))->getLanes()[0];
4059 emergencyReason =
" because there is no connection to the next edge";
4060 approachedLane =
nullptr;
4063 if (approachedLane !=
myLane && approachedLane !=
nullptr) {
4081#ifdef DEBUG_PLAN_MOVE_LEADERINFO
4097 WRITE_WARNING(
"Vehicle '" +
getID() +
"' could not finish continuous lane change (turn lane) time=" +
4106 passedLanes.push_back(approachedLane);
4111#ifdef DEBUG_ACTIONSTEPS
4113 std::cout <<
"Updated drive items:" << std::endl;
4116 <<
" vPass=" << (*i).myVLinkPass
4117 <<
" vWait=" << (*i).myVLinkWait
4118 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
4119 <<
" request=" << (*i).mySetRequest
4136#ifdef DEBUG_EXEC_MOVE
4138 std::cout <<
"\nEXECUTE_MOVE\n"
4140 <<
" veh=" <<
getID()
4148 double vSafe = std::numeric_limits<double>::max();
4150 double vSafeMin = -std::numeric_limits<double>::max();
4153 double vSafeMinDist = 0;
4158#ifdef DEBUG_ACTIONSTEPS
4160 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"'\n"
4161 " vsafe from processLinkApproaches(): vsafe " << vSafe << std::endl;
4167#ifdef DEBUG_ACTIONSTEPS
4169 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' skips processLinkApproaches()\n"
4171 <<
"speed: " <<
getSpeed() <<
" -> " << vSafe << std::endl;
4185 double vNext = vSafe;
4199 vNext =
MAX2(vNext, vSafeMin);
4208#ifdef DEBUG_EXEC_MOVE
4210 std::cout <<
SIMTIME <<
" finalizeSpeed vSafe=" << vSafe <<
" vSafeMin=" << (vSafeMin == -std::numeric_limits<double>::max() ?
"-Inf" :
toString(vSafeMin))
4211 <<
" vNext=" << vNext <<
" (i.e. accel=" <<
SPEED2ACCEL(vNext -
getSpeed()) <<
")" << std::endl;
4228 vNext =
MAX2(vNext, 0.);
4238 if (elecHybridOfVehicle !=
nullptr) {
4240 elecHybridOfVehicle->
setConsum(elecHybridOfVehicle->
consumption(*
this, (vNext - this->getSpeed()) /
TS, vNext));
4244 if (elecHybridOfVehicle->
getConsum() /
TS > maxPower) {
4249 vNext =
MAX2(vNext, 0.);
4251 elecHybridOfVehicle->
setConsum(elecHybridOfVehicle->
consumption(*
this, (vNext - this->getSpeed()) /
TS, vNext));
4269 std::vector<MSLane*> passedLanes;
4273 std::string emergencyReason =
TL(
" for unknown reasons");
4281 WRITE_WARNINGF(
TL(
"Vehicle '%' performs emergency stop at the end of lane '%'% (decel=%, offset=%), time=%."),
4292 passedLanes.clear();
4294#ifdef DEBUG_ACTIONSTEPS
4296 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
"' updates further lanes." << std::endl;
4323#ifdef DEBUG_ACTIONSTEPS
4325 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
"' skips LCM->prepareStep()." << std::endl;
4332#ifdef DEBUG_EXEC_MOVE
4340 MSLane* newOpposite =
nullptr;
4342 if (newOppositeEdge !=
nullptr) {
4344#ifdef DEBUG_EXEC_MOVE
4346 std::cout <<
SIMTIME <<
" newOppositeEdge=" << newOppositeEdge->
getID() <<
" oldLaneOffset=" << oldLaneOffset <<
" leftMost=" << newOppositeEdge->
getNumLanes() - 1 <<
" newOpposite=" <<
Named::getIDSecure(newOpposite) <<
"\n";
4350 if (newOpposite ==
nullptr) {
4353 WRITE_WARNINGF(
TL(
"Unexpected end of opposite lane for vehicle '%' at lane '%', time=%."),
4360 if (oldOpposite !=
nullptr) {
4368#pragma warning(push)
4369#pragma warning(disable: 4127)
4380 oldLane = oldLaneMaybeOpposite;
4388 return myLane != oldLane;
4399 for (
int i = 0; i < (int)lanes.size(); i++) {
4401 if (i + 1 < (
int)lanes.size()) {
4402 const MSLane*
const to = lanes[i + 1];
4404 for (
MSLink*
const l : lanes[i]->getLinkCont()) {
4405 if ((internal && l->getViaLane() == to) || (!internal && l->getLane() == to)) {
4414 std::vector<MSLane*> passedLanes;
4416 std::string emergencyReason =
" for unknown reasons";
4417 if (lanes.size() > 1) {
4421#ifdef DEBUG_EXTRAPOLATE_DEPARTPOS
4423 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" executeFractionalMove dist=" << dist
4424 <<
" passedLanes=" <<
toString(passedLanes) <<
" lanes=" <<
toString(lanes)
4432 if (lanes.size() > 1) {
4436 std::cout <<
SIMTIME <<
" leaveLane \n";
4439 (*i)->resetPartialOccupation(
this);
4464#ifdef DEBUG_EXEC_MOVE
4466 std::cout <<
SIMTIME <<
" updateState() for veh '" <<
getID() <<
"': deltaPos=" << deltaPos
4471 if (decelPlus > 0) {
4475 decelPlus += 2 * NUMERICAL_EPS;
4478 WRITE_WARNINGF(
TL(
"Vehicle '%' performs emergency braking on lane '%' with decel=%, wished=%, severity=%, time=%."),
4512 dev->notifyParking();
4537 const std::vector<MSLane*>& passedLanes) {
4538#ifdef DEBUG_SETFURTHER
4540 <<
" updateFurtherLanes oldFurther=" <<
toString(furtherLanes)
4541 <<
" oldFurtherPosLat=" <<
toString(furtherLanesPosLat)
4542 <<
" passed=" <<
toString(passedLanes)
4545 for (std::vector<MSLane*>::iterator i = furtherLanes.begin(); i != furtherLanes.end(); ++i) {
4546 (*i)->resetPartialOccupation(
this);
4549 std::vector<MSLane*> newFurther;
4550 std::vector<double> newFurtherPosLat;
4553 if (passedLanes.size() > 1) {
4555 std::vector<MSLane*>::const_iterator fi = furtherLanes.begin();
4556 std::vector<double>::const_iterator fpi = furtherLanesPosLat.begin();
4557 for (
auto pi = passedLanes.rbegin() + 1; pi != passedLanes.rend() && backPosOnPreviousLane < 0; ++pi) {
4559 newFurther.push_back(*pi);
4560 backPosOnPreviousLane += (*pi)->setPartialOccupation(
this);
4561 if (fi != furtherLanes.end() && *pi == *fi) {
4563 newFurtherPosLat.push_back(*fpi);
4571 if (newFurtherPosLat.size() == 0) {
4578 newFurtherPosLat.push_back(newFurtherPosLat.back());
4581#ifdef DEBUG_SETFURTHER
4583 std::cout <<
SIMTIME <<
" updateFurtherLanes \n"
4584 <<
" further lane '" << (*pi)->getID() <<
"' backPosOnPreviousLane=" << backPosOnPreviousLane
4589 furtherLanes = newFurther;
4590 furtherLanesPosLat = newFurtherPosLat;
4592 furtherLanes.clear();
4593 furtherLanesPosLat.clear();
4595#ifdef DEBUG_SETFURTHER
4597 <<
" newFurther=" <<
toString(furtherLanes)
4598 <<
" newFurtherPosLat=" <<
toString(furtherLanesPosLat)
4599 <<
" newBackPos=" << backPosOnPreviousLane
4602 return backPosOnPreviousLane;
4611 <<
" getBackPositionOnLane veh=" <<
getID()
4613 <<
" cbgP=" << calledByGetPosition
4675 leftLength -= (*i)->getLength();
4686 leftLength -= (*i)->getLength();
4697 auto j = furtherTargetLanes.begin();
4698 while (leftLength > 0 && j != furtherTargetLanes.end()) {
4699 leftLength -= (*i)->getLength();
4710#pragma warning(push)
4711#pragma warning(disable: 4127)
4737 double seenSpace = -lengthsInFront;
4738#ifdef DEBUG_CHECKREWINDLINKLANES
4740 std::cout <<
"\nCHECK_REWIND_LINKLANES\n" <<
" veh=" <<
getID() <<
" lengthsInFront=" << lengthsInFront <<
"\n";
4743 bool foundStopped =
false;
4746 for (
int i = 0; i < (int)lfLinks.size(); ++i) {
4749#ifdef DEBUG_CHECKREWINDLINKLANES
4752 <<
" foundStopped=" << foundStopped;
4754 if (item.
myLink ==
nullptr || foundStopped) {
4755 if (!foundStopped) {
4760#ifdef DEBUG_CHECKREWINDLINKLANES
4769 if (approachedLane !=
nullptr) {
4772 if (approachedLane ==
myLane) {
4779#ifdef DEBUG_CHECKREWINDLINKLANES
4781 <<
" approached=" << approachedLane->
getID()
4784 <<
" seenSpace=" << seenSpace
4786 <<
" lengthsInFront=" << lengthsInFront
4793 if (last ==
nullptr || last ==
this) {
4796 seenSpace += approachedLane->
getLength();
4799#ifdef DEBUG_CHECKREWINDLINKLANES
4805 bool foundStopped2 =
false;
4807 seenSpace += spaceTillLastStanding;
4808 if (foundStopped2) {
4809 foundStopped =
true;
4814 foundStopped =
true;
4817#ifdef DEBUG_CHECKREWINDLINKLANES
4819 <<
" approached=" << approachedLane->
getID()
4820 <<
" last=" << last->
getID()
4827 <<
" stls=" << spaceTillLastStanding
4829 <<
" seenSpace=" << seenSpace
4830 <<
" foundStopped=" << foundStopped
4831 <<
" foundStopped2=" << foundStopped2
4838 for (
int i = ((
int)lfLinks.size() - 1); i > 0; --i) {
4842 const bool opened = (item.
myLink !=
nullptr
4843 && (canLeaveJunction || (
4854#ifdef DEBUG_CHECKREWINDLINKLANES
4857 <<
" canLeave=" << canLeaveJunction
4858 <<
" opened=" << opened
4859 <<
" allowsContinuation=" << allowsContinuation
4860 <<
" foundStopped=" << foundStopped
4863 if (!opened && item.
myLink !=
nullptr) {
4864 foundStopped =
true;
4868 allowsContinuation =
true;
4872 if (allowsContinuation) {
4874#ifdef DEBUG_CHECKREWINDLINKLANES
4884 int removalBegin = -1;
4885 for (
int i = 0; foundStopped && i < (int)lfLinks.size() && removalBegin < 0; ++i) {
4888 if (item.
myLink ==
nullptr) {
4899#ifdef DEBUG_CHECKREWINDLINKLANES
4902 <<
" veh=" <<
getID()
4905 <<
" leftSpace=" << leftSpace
4908 if (leftSpace < 0/* && item.myLink->willHaveBlockedFoe()*/) {
4909 double impatienceCorrection = 0;
4916 if (leftSpace < -impatienceCorrection / 10. &&
keepClear(item.
myLink)) {
4925 while (removalBegin < (
int)(lfLinks.size())) {
4927 if (dpi.
myLink ==
nullptr) {
4931#ifdef DEBUG_CHECKREWINDLINKLANES
4936 if (dpi.
myDistance >= brakeGap + POSITION_EPS) {
4938 if (!dpi.
myLink->
isExitLink() || !lfLinks[removalBegin - 1].mySetRequest) {
4956 if (dpi.myLink !=
nullptr) {
4960 dpi.myLink->setApproaching(
this, dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
4967 if (dpi.myLink !=
nullptr) {
4973 if (parallelLink !=
nullptr) {
4975 parallelLink->
setApproaching(
this, dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
4976 dpi.mySetRequest, dpi.myArrivalSpeedBraking,
getWaitingTime(), dpi.myDistance,
4983#ifdef DEBUG_PLAN_MOVE
4986 <<
" veh=" <<
getID()
4987 <<
" after checkRewindLinkLanes\n";
4990 <<
" vPass=" << dpi.myVLinkPass
4991 <<
" vWait=" << dpi.myVLinkWait
4992 <<
" linkLane=" << (dpi.myLink == 0 ?
"NULL" : dpi.myLink->getViaLaneOrLane()->getID())
4993 <<
" request=" << dpi.mySetRequest
4994 <<
" atime=" << dpi.myArrivalTime
5017 if (rem->first->getLane() !=
nullptr && rem->second > 0.) {
5019 if (myTraceMoveReminders) {
5020 traceMoveReminder(
"notifyEnter_skipped", rem->first, rem->second,
true);
5025 if (rem->first->notifyEnter(*
this, reason, enteredLane)) {
5027 if (myTraceMoveReminders) {
5028 traceMoveReminder(
"notifyEnter", rem->first, rem->second,
true);
5034 if (myTraceMoveReminders) {
5035 traceMoveReminder(
"notifyEnter", rem->first, rem->second,
false);
5072 if (!onTeleporting) {
5076 assert(oldLane !=
nullptr);
5078 if (link !=
nullptr) {
5121 int deleteFurther = 0;
5123 if (lane !=
nullptr) {
5126 if (lane !=
nullptr) {
5127#ifdef DEBUG_SETFURTHER
5129 std::cout <<
SIMTIME <<
" enterLaneAtLaneChange \n";
5135 if (leftLength > 0) {
5138 leftLength -= (lane)->setPartialOccupation(
this);
5140#ifdef DEBUG_SETFURTHER
5156#ifdef DEBUG_SETFURTHER
5163 if (deleteFurther > 0) {
5164#ifdef DEBUG_SETFURTHER
5166 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" shortening myFurtherLanes by " << deleteFurther <<
"\n";
5172#ifdef DEBUG_SETFURTHER
5187 MSLane* clane = enteredLane;
5189 while (leftLength > 0) {
5197 if (ili.lane->getEdge().getNormalBefore() == fromRouteEdge) {
5219#ifdef DEBUG_SETFURTHER
5227#ifdef DEBUG_SETFURTHER
5229 std::cout <<
SIMTIME <<
" opposite: resetPartialOccupation " << (*i)->getID() <<
" \n";
5232 (*i)->resetPartialOccupation(
this);
5283 if (rem->first->notifyLeave(*
this,
myState.
myPos + rem->second, reason, approachedLane)) {
5285 if (myTraceMoveReminders) {
5286 traceMoveReminder(
"notifyLeave", rem->first, rem->second,
true);
5292 if (myTraceMoveReminders) {
5293 traceMoveReminder(
"notifyLeave", rem->first, rem->second,
false);
5311 std::cout <<
SIMTIME <<
" leaveLane \n";
5314 (*i)->resetPartialOccupation(
this);
5324 myStopDist = std::numeric_limits<double>::max();
5331 if (
myStops.front().getSpeed() <= 0) {
5344 if (stop.
busstop !=
nullptr) {
5360 myStopDist = std::numeric_limits<double>::max();
5384const std::vector<MSVehicle::LaneQ>&
5392#ifdef DEBUG_BESTLANES
5397 if (startLane ==
nullptr) {
5400 assert(startLane != 0);
5408 assert(startLane != 0);
5409#ifdef DEBUG_BESTLANES
5411 std::cout <<
" startLaneIsOpposite newStartLane=" << startLane->
getID() <<
"\n";
5422#ifdef DEBUG_BESTLANES
5424 std::cout <<
" only updateOccupancyAndCurrentBestLane\n";
5435#ifdef DEBUG_BESTLANES
5437 std::cout <<
" nothing to do on internal\n";
5447 std::vector<LaneQ>& lanes = *it;
5448 assert(lanes.size() > 0);
5449 if (&(lanes[0].lane->getEdge()) == nextEdge) {
5451 std::vector<LaneQ> oldLanes = lanes;
5453 const std::vector<MSLane*>& sourceLanes = startLane->
getEdge().
getLanes();
5454 for (std::vector<MSLane*>::const_iterator it_source = sourceLanes.begin(); it_source != sourceLanes.end(); ++it_source) {
5455 for (std::vector<LaneQ>::iterator it_lane = oldLanes.begin(); it_lane != oldLanes.end(); ++it_lane) {
5456 if ((*it_source)->getLinkCont()[0]->getLane() == (*it_lane).lane) {
5457 lanes.push_back(*it_lane);
5464 for (
int i = 0; i < (int)lanes.size(); ++i) {
5465 if (i + lanes[i].bestLaneOffset < 0) {
5466 lanes[i].bestLaneOffset = -i;
5468 if (i + lanes[i].bestLaneOffset >= (
int)lanes.size()) {
5469 lanes[i].bestLaneOffset = (int)lanes.size() - i - 1;
5471 assert(i + lanes[i].bestLaneOffset >= 0);
5472 assert(i + lanes[i].bestLaneOffset < (
int)lanes.size());
5473 if (lanes[i].bestContinuations[0] != 0) {
5475 lanes[i].bestContinuations.insert(lanes[i].bestContinuations.begin(), (
MSLane*)
nullptr);
5477 if (startLane->
getLinkCont()[0]->getLane() == lanes[i].lane) {
5480 assert(&(lanes[i].lane->getEdge()) == nextEdge);
5484#ifdef DEBUG_BESTLANES
5486 std::cout <<
" updated for internal\n";
5503 const MSLane* nextStopLane =
nullptr;
5504 double nextStopPos = 0;
5505 bool nextStopIsWaypoint =
false;
5508 nextStopLane = nextStop.
lane;
5513 nextStopEdge = nextStop.
edge;
5515 nextStopIsWaypoint = nextStop.
getSpeed() > 0;
5526 nextStopPos =
MAX2(POSITION_EPS,
MIN2((
double)nextStopPos, (
double)(nextStopLane->
getLength() - 2 * POSITION_EPS)));
5529 nextStopPos = (*nextStopEdge)->getLength();
5538 double seenLength = 0;
5539 bool progress =
true;
5543 std::vector<LaneQ> currentLanes;
5544 const std::vector<MSLane*>* allowed =
nullptr;
5545 const MSEdge* nextEdge =
nullptr;
5547 nextEdge = *(ce + 1);
5550 const std::vector<MSLane*>& lanes = (*ce)->getLanes();
5551 for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
5559 q.
allowsContinuation = allowed ==
nullptr || std::find(allowed->begin(), allowed->end(), cl) != allowed->end();
5562 currentLanes.push_back(q);
5565 if (nextStopEdge == ce
5568 if (!nextStopLane->
isInternal() && !continueAfterStop) {
5572 for (std::vector<LaneQ>::iterator q = currentLanes.begin(); q != currentLanes.end(); ++q) {
5573 if (nextStopLane !=
nullptr && normalStopLane != (*q).lane) {
5574 (*q).allowsContinuation =
false;
5575 (*q).length = nextStopPos;
5576 (*q).currentLength = (*q).length;
5583 seenLength += currentLanes[0].lane->getLength();
5585 progress &= (seen <= 4 || seenLength <
MAX2(maxBrakeDist, 3000.0));
5597 double bestLength = -1;
5599 int bestThisIndex = 0;
5600 int bestThisMaxIndex = 0;
5603 for (std::vector<LaneQ>::iterator j = last.begin(); j != last.end(); ++j, ++index) {
5604 if ((*j).length > bestLength) {
5605 bestLength = (*j).length;
5606 bestThisIndex = index;
5607 bestThisMaxIndex = index;
5608 }
else if ((*j).length == bestLength) {
5609 bestThisMaxIndex = index;
5613 bool requiredChangeRightForbidden =
false;
5614 int requireChangeToLeftForbidden = -1;
5615 for (std::vector<LaneQ>::iterator j = last.begin(); j != last.end(); ++j, ++index) {
5616 if ((*j).length < bestLength) {
5617 if (abs(bestThisIndex - index) < abs(bestThisMaxIndex - index)) {
5618 (*j).bestLaneOffset = bestThisIndex - index;
5620 (*j).bestLaneOffset = bestThisMaxIndex - index;
5622 if ((*j).bestLaneOffset < 0 && (!(*j).lane->allowsChangingRight(
getVClass())
5623 || !(*j).lane->getParallelLane(-1,
false)->allowsVehicleClass(
getVClass())
5624 || requiredChangeRightForbidden)) {
5626 requiredChangeRightForbidden =
true;
5627 (*j).length -= (*j).currentLength;
5628 }
else if ((*j).bestLaneOffset > 0 && (!(*j).lane->allowsChangingLeft(
getVClass())
5629 || !(*j).lane->getParallelLane(1,
false)->allowsVehicleClass(
getVClass()))) {
5631 requireChangeToLeftForbidden = (*j).lane->getIndex();
5635 for (
int i = requireChangeToLeftForbidden; i >= 0; i--) {
5636 last[i].length -= last[i].currentLength;
5638#ifdef DEBUG_BESTLANES
5640 std::cout <<
" last edge=" << last.front().lane->getEdge().getID() <<
" (bestIndex=" << bestThisIndex <<
" bestMaxIndex=" << bestThisMaxIndex <<
"):\n";
5642 for (std::vector<LaneQ>::iterator j = laneQs.begin(); j != laneQs.end(); ++j) {
5643 std::cout <<
" lane=" << (*j).lane->getID() <<
" length=" << (*j).length <<
" bestOffset=" << (*j).bestLaneOffset <<
"\n";
5650 for (std::vector<std::vector<LaneQ> >::reverse_iterator i =
myBestLanes.rbegin() + 1; i !=
myBestLanes.rend(); ++i) {
5651 std::vector<LaneQ>& nextLanes = (*(i - 1));
5652 std::vector<LaneQ>& clanes = (*i);
5653 MSEdge& cE = clanes[0].lane->getEdge();
5655 double bestConnectedLength = -1;
5656 double bestLength = -1;
5657 for (std::vector<LaneQ>::iterator j = nextLanes.begin(); j != nextLanes.end(); ++j, ++index) {
5658 if ((*j).lane->isApproachedFrom(&cE) && bestConnectedLength < (*j).length) {
5659 bestConnectedLength = (*j).length;
5661 if (bestLength < (*j).length) {
5662 bestLength = (*j).length;
5666 int bestThisIndex = 0;
5667 int bestThisMaxIndex = 0;
5668 if (bestConnectedLength > 0) {
5670 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
5671 LaneQ bestConnectedNext;
5672 bestConnectedNext.
length = -1;
5673 if ((*j).allowsContinuation) {
5674 for (std::vector<LaneQ>::const_iterator m = nextLanes.begin(); m != nextLanes.end(); ++m) {
5675 if (((*m).lane->allowsVehicleClass(
getVClass()) || (*m).lane->hadPermissionChanges())
5676 && (*m).lane->isApproachedFrom(&cE, (*j).lane)) {
5677 if (bestConnectedNext.
length < (*m).length || (bestConnectedNext.
length == (*m).length && abs(bestConnectedNext.
bestLaneOffset) > abs((*m).bestLaneOffset))) {
5678 bestConnectedNext = *m;
5682 if (bestConnectedNext.
length == bestConnectedLength && abs(bestConnectedNext.
bestLaneOffset) < 2) {
5683 (*j).
length += bestLength;
5685 (*j).length += bestConnectedNext.
length;
5690 if (clanes[bestThisIndex].length < (*j).length
5691 || (clanes[bestThisIndex].length == (*j).length && abs(clanes[bestThisIndex].bestLaneOffset) > abs((*j).bestLaneOffset))
5692 || (clanes[bestThisIndex].length == (*j).length && abs(clanes[bestThisIndex].bestLaneOffset) == abs((*j).bestLaneOffset) &&
5695 bestThisIndex = index;
5696 bestThisMaxIndex = index;
5697 }
else if (clanes[bestThisIndex].length == (*j).length
5698 && abs(clanes[bestThisIndex].bestLaneOffset) == abs((*j).bestLaneOffset)
5700 bestThisMaxIndex = index;
5707 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
5709 if (overheadWireSegmentID !=
"") {
5710 bestThisIndex = index;
5711 bestThisMaxIndex = index;
5718 int bestNextIndex = 0;
5719 int bestDistToNeeded = (int) clanes.size();
5721 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
5722 if ((*j).allowsContinuation) {
5724 for (std::vector<LaneQ>::const_iterator m = nextLanes.begin(); m != nextLanes.end(); ++m, ++nextIndex) {
5725 if ((*m).lane->isApproachedFrom(&cE, (*j).lane)) {
5726 if (bestDistToNeeded > abs((*m).bestLaneOffset)) {
5727 bestDistToNeeded = abs((*m).bestLaneOffset);
5728 bestThisIndex = index;
5729 bestThisMaxIndex = index;
5730 bestNextIndex = nextIndex;
5736 clanes[bestThisIndex].length += nextLanes[bestNextIndex].length;
5737 copy(nextLanes[bestNextIndex].bestContinuations.begin(), nextLanes[bestNextIndex].bestContinuations.end(), back_inserter(clanes[bestThisIndex].bestContinuations));
5742 bool requiredChangeRightForbidden =
false;
5743 int requireChangeToLeftForbidden = -1;
5744 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
5745 if ((*j).length < clanes[bestThisIndex].length
5746 || ((*j).length == clanes[bestThisIndex].length && abs((*j).bestLaneOffset) > abs(clanes[bestThisIndex].bestLaneOffset))
5749 if (abs(bestThisIndex - index) < abs(bestThisMaxIndex - index)) {
5750 (*j).bestLaneOffset = bestThisIndex - index;
5752 (*j).bestLaneOffset = bestThisMaxIndex - index;
5756 (*j).length = (*j).currentLength;
5758 if ((*j).bestLaneOffset < 0 && (!(*j).lane->allowsChangingRight(
getVClass())
5759 || !(*j).lane->getParallelLane(-1,
false)->allowsVehicleClass(
getVClass())
5760 || requiredChangeRightForbidden)) {
5762 requiredChangeRightForbidden =
true;
5763 (*j).length -= (*j).currentLength;
5764 }
else if ((*j).bestLaneOffset > 0 && (!(*j).lane->allowsChangingLeft(
getVClass())
5765 || !(*j).lane->getParallelLane(1,
false)->allowsVehicleClass(
getVClass()))) {
5767 requireChangeToLeftForbidden = (*j).lane->getIndex();
5770 (*j).bestLaneOffset = 0;
5773 for (
int idx = requireChangeToLeftForbidden; idx >= 0; idx--) {
5774 clanes[idx].length -= clanes[idx].currentLength;
5781 if (overheadWireID !=
"") {
5782 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
5783 (*j).bestLaneOffset = bestThisIndex - index;
5788#ifdef DEBUG_BESTLANES
5790 std::cout <<
" edge=" << cE.
getID() <<
" (bestIndex=" << bestThisIndex <<
" bestMaxIndex=" << bestThisMaxIndex <<
"):\n";
5791 std::vector<LaneQ>& laneQs = clanes;
5792 for (std::vector<LaneQ>::iterator j = laneQs.begin(); j != laneQs.end(); ++j) {
5793 std::cout <<
" lane=" << (*j).lane->getID() <<
" length=" << (*j).length <<
" bestOffset=" << (*j).bestLaneOffset <<
"\n";
5800#ifdef DEBUG_BESTLANES
5811 if (conts.size() < 2) {
5814 const MSLink*
const link = conts[0]->getLinkTo(conts[1]);
5815 if (link !=
nullptr) {
5827 std::vector<LaneQ>& currLanes = *
myBestLanes.begin();
5828 std::vector<LaneQ>::iterator i;
5829 for (i = currLanes.begin(); i != currLanes.end(); ++i) {
5830 double nextOccupation = 0;
5831 for (std::vector<MSLane*>::const_iterator j = (*i).bestContinuations.begin() + 1; j != (*i).bestContinuations.end(); ++j) {
5832 nextOccupation += (*j)->getBruttoVehLenSum();
5834 (*i).nextOccupation = nextOccupation;
5835#ifdef DEBUG_BESTLANES
5837 std::cout <<
" lane=" << (*i).lane->getID() <<
" nextOccupation=" << nextOccupation <<
"\n";
5840 if ((*i).lane == startLane) {
5847const std::vector<MSLane*>&
5852 return (*myCurrentLaneInBestLanes).bestContinuations;
5856const std::vector<MSLane*>&
5868 if ((*i).lane == lane) {
5869 return (*i).bestContinuations;
5875const std::vector<const MSLane*>
5877 std::vector<const MSLane*> lanes;
5879 if (distance <= 0.) {
5890 while (lane->
isInternal() && (distance > 0.)) {
5891 lanes.insert(lanes.end(), lane);
5893 lane = lane->
getLinkCont().front()->getViaLaneOrLane();
5897 if (contLanes.empty()) {
5900 auto contLanesIt = contLanes.begin();
5902 while (distance > 0.) {
5904 if (contLanesIt != contLanes.end()) {
5907 assert(l->
getEdge().
getID() == (*routeIt)->getLanes().front()->getEdge().getID());
5918 l = (*routeIt)->getLanes().back();
5924 assert(l !=
nullptr);
5928 while ((internalLane !=
nullptr) && internalLane->
isInternal() && (distance > 0.)) {
5929 lanes.insert(lanes.end(), internalLane);
5931 internalLane = internalLane->
getLinkCont().front()->getViaLaneOrLane();
5933 if (distance <= 0.) {
5937 lanes.insert(lanes.end(), l);
5944const std::vector<const MSLane*>
5946 std::vector<const MSLane*> lanes;
5948 if (distance <= 0.) {
5960 while (lane->
isInternal() && (distance > 0.)) {
5961 lanes.insert(lanes.end(), lane);
5966 while (distance > 0.) {
5968 MSLane* l = (*routeIt)->getLanes().back();
5972 const MSLane* internalLane = internalEdge !=
nullptr ? internalEdge->
getLanes().front() :
nullptr;
5973 std::vector<const MSLane*> internalLanes;
5974 while ((internalLane !=
nullptr) && internalLane->
isInternal()) {
5975 internalLanes.insert(internalLanes.begin(), internalLane);
5976 internalLane = internalLane->
getLinkCont().front()->getViaLaneOrLane();
5978 for (
auto it = internalLanes.begin(); (it != internalLanes.end()) && (distance > 0.); ++it) {
5979 lanes.insert(lanes.end(), *it);
5980 distance -= (*it)->getLength();
5982 if (distance <= 0.) {
5986 lanes.insert(lanes.end(), l);
6002const std::vector<MSLane*>
6005 std::vector<MSLane*> result;
6006 for (
const MSLane* lane : routeLanes) {
6008 if (opposite !=
nullptr) {
6009 result.push_back(opposite);
6023 return (*myCurrentLaneInBestLanes).bestLaneOffset;
6032 return (*myCurrentLaneInBestLanes).length;
6040 std::vector<MSVehicle::LaneQ>& preb =
myBestLanes.front();
6041 assert(laneIndex < (
int)preb.size());
6042 preb[laneIndex].occupation = density + preb[laneIndex].nextOccupation;
6053std::pair<const MSLane*, double>
6055 if (distance == 0) {
6060 for (
const MSLane* lane : lanes) {
6061 if (lane->getLength() > distance) {
6062 return std::make_pair(lane, distance);
6064 distance -= lane->getLength();
6066 return std::make_pair(
nullptr, -1);
6072 double distance = std::numeric_limits<double>::max();
6073 if (
isOnRoad() && destEdge !=
nullptr) {
6087std::pair<const MSVehicle* const, double>
6090 return std::make_pair(
static_cast<const MSVehicle*
>(
nullptr), -1);
6099 MSLane::VehCont::const_iterator it = std::find(vehs.begin(), vehs.end(),
this);
6100 if (it != vehs.end() && it + 1 != vehs.end()) {
6103 if (lead !=
nullptr) {
6104 std::pair<const MSVehicle* const, double> result(
6117std::pair<const MSVehicle* const, double>
6120 return std::make_pair(
static_cast<const MSVehicle*
>(
nullptr), -1);
6132 std::pair<const MSVehicle* const, double> leaderInfo =
getLeader(-1);
6133 if (leaderInfo.first ==
nullptr ||
getSpeed() == 0) {
6145 if (
myStops.front().triggered &&
myStops.front().numExpectedPerson > 0) {
6146 myStops.front().numExpectedPerson -= (int)
myStops.front().pars.awaitedPersons.count(transportable->
getID());
6149 if (
myStops.front().pars.containerTriggered &&
myStops.front().numExpectedContainer > 0) {
6150 myStops.front().numExpectedContainer -= (int)
myStops.front().pars.awaitedContainers.count(transportable->
getID());
6162 const bool blinkerManoeuvre = (((state &
LCA_SUBLANE) == 0) && (
6170 if ((state &
LCA_LEFT) != 0 && blinkerManoeuvre) {
6172 }
else if ((state &
LCA_RIGHT) != 0 && blinkerManoeuvre) {
6184 switch ((*link)->getDirection()) {
6201 && (
myStops.begin()->reached ||
6204 if (
myStops.begin()->lane->getIndex() > 0 &&
myStops.begin()->lane->getParallelLane(-1)->allowsVehicleClass(
getVClass())) {
6222 if (currentTime % 1000 == 0) {
6306 for (
int i = 0; i < (int)shadowFurther.size(); ++i) {
6308 if (shadowFurther[i] == lane) {
6348 for (
int i = 0; i < (int)shadowFurther.size(); ++i) {
6349 if (shadowFurther[i] == lane) {
6353 <<
" lane=" << lane->
getID()
6367 MSLane* targetLane = furtherTargets[i];
6368 if (targetLane == lane) {
6371#ifdef DEBUG_TARGET_LANE
6373 std::cout <<
" getLatOffset veh=" <<
getID()
6379 <<
" targetDir=" << targetDir
6380 <<
" latOffset=" << latOffset
6397 assert(offset == 0 || offset == 1 || offset == -1);
6398 assert(
myLane !=
nullptr);
6401 const double halfVehWidth = 0.5 * (
getWidth() + NUMERICAL_EPS);
6404 double leftLimit = halfCurrentLaneWidth - halfVehWidth - oppositeSign * latPos;
6405 double rightLimit = -halfCurrentLaneWidth + halfVehWidth - oppositeSign * latPos;
6406 double latLaneDist = 0;
6408 if (latPos + halfVehWidth > halfCurrentLaneWidth) {
6410 latLaneDist = halfCurrentLaneWidth - latPos - halfVehWidth;
6411 }
else if (latPos - halfVehWidth < -halfCurrentLaneWidth) {
6413 latLaneDist = -halfCurrentLaneWidth - latPos + halfVehWidth;
6415 latLaneDist *= oppositeSign;
6416 }
else if (offset == -1) {
6417 latLaneDist = rightLimit - (
getWidth() + NUMERICAL_EPS);
6418 }
else if (offset == 1) {
6419 latLaneDist = leftLimit + (
getWidth() + NUMERICAL_EPS);
6421#ifdef DEBUG_ACTIONSTEPS
6424 <<
" veh=" <<
getID()
6425 <<
" halfCurrentLaneWidth=" << halfCurrentLaneWidth
6426 <<
" halfVehWidth=" << halfVehWidth
6427 <<
" latPos=" << latPos
6428 <<
" latLaneDist=" << latLaneDist
6429 <<
" leftLimit=" << leftLimit
6430 <<
" rightLimit=" << rightLimit
6458 if (dpi.myLink !=
nullptr) {
6459 dpi.myLink->removeApproaching(
this);
6477 std::vector<MSLink*>::const_iterator link =
MSLane::succLinkSec(*
this, view, *lane, bestLaneConts);
6479 while (!lane->
isLinkEnd(link) && seen <= dist) {
6481 && (((*link)->getState() ==
LINKSTATE_ZIPPER && seen < (*link)->getFoeVisibilityDistance())
6482 || !(*link)->havePriority())) {
6486 if ((*di).myLink !=
nullptr) {
6487 const MSLane* diPredLane = (*di).myLink->getLaneBefore();
6488 if (diPredLane !=
nullptr) {
6499 const SUMOTime leaveTime = (*link)->getLeaveTime((*di).myArrivalTime, (*di).myArrivalSpeed,
6501 if ((*link)->hasApproachingFoe((*di).myArrivalTime, leaveTime, (*di).myArrivalSpeed,
getCarFollowModel().getMaxDecel())) {
6508 lane = (*link)->getViaLaneOrLane();
6532 centerLine.push_back(lane->getShape().back());
6572 result.push_back(line1[0]);
6573 result.push_back(line2[0]);
6574 result.push_back(line2[1]);
6575 result.push_back(line1[1]);
6578 result.push_back(line1[1]);
6579 result.push_back(line2[1]);
6580 result.push_back(line2[0]);
6581 result.push_back(line1[0]);
6593 if (&(*i)->getEdge() == edge) {
6610 if (destParkArea ==
nullptr) {
6612 errorMsg =
"Vehicle " +
getID() +
" is not driving to a parking area so it cannot be rerouted.";
6625 if (newParkingArea ==
nullptr) {
6626 errorMsg =
"Parking area ID " +
toString(parkingAreaID) +
" not found in the network.";
6639 if (!newDestination) {
6650 if (edgesFromPark.size() > 0) {
6651 edges.insert(edges.end(), edgesFromPark.begin() + 1, edgesFromPark.end());
6654 if (newDestination) {
6665 const bool onInit =
myLane ==
nullptr;
6678 const int numStops = (int)
myStops.size();
6723 if (stop.
busstop !=
nullptr) {
6744 rem.first->notifyStopEnded();
6856#ifdef DEBUG_IGNORE_RED
6861 if (ignoreRedTime < 0) {
6863 if (ignoreYellowTime > 0 && link->
haveYellow()) {
6867 return !canBrake || ignoreYellowTime > yellowDuration;
6877#ifdef DEBUG_IGNORE_RED
6881 <<
" ignoreRedTime=" << ignoreRedTime
6882 <<
" spentRed=" << redDuration
6883 <<
" canBrake=" << canBrake <<
"\n";
6887 return !canBrake || ignoreRedTime > redDuration;
6913 if (veh ==
nullptr) {
6940 assert(logic !=
nullptr);
6951 const double foeGap = -gap - veh->
getLength();
6952#ifdef DEBUG_PLAN_MOVE_LEADERINFO
6954 std::cout <<
" foeGap=" << foeGap <<
" foeBGap=" << veh->
getBrakeGap(
true) <<
"\n";
6967 response = foeEntry->
haveRed();
6982#ifdef DEBUG_PLAN_MOVE_LEADERINFO
6985 <<
" foeLane=" << foeLane->
getID()
6987 <<
" linkIndex=" << link->
getIndex()
6988 <<
" foeLinkIndex=" << foeLink->
getIndex()
6991 <<
" response=" << response
6992 <<
" response2=" << response2
7000 }
else if (response && response2) {
7006 if (egoET == foeET) {
7010#ifdef DEBUG_PLAN_MOVE_LEADERINFO
7012 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" equal ET " << egoET <<
" with foe " << veh->
getID()
7013 <<
" foeIsLeaderByID=" << (
getID() < veh->
getID()) <<
"\n";
7018#ifdef DEBUG_PLAN_MOVE_LEADERINFO
7020 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" equal ET " << egoET <<
" with foe " << veh->
getID()
7030#ifdef DEBUG_PLAN_MOVE_LEADERINFO
7032 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" egoET " << egoET <<
" with foe " << veh->
getID()
7033 <<
" foeET=" << foeET <<
" isLeader=" << (egoET > foeET) <<
"\n";
7036 return egoET > foeET;
7052 std::vector<std::string> internals;
7071 stop.write(out,
false);
7088 dev->saveState(out);
7096 throw ProcessError(
"Error: Invalid vehicles in state (may be a meso state)!");
7115 while (pastStops > 0) {
7144 SUMOTime arrivalTime,
double arrivalSpeed,
7145 double arrivalSpeedBraking,
7146 double dist,
double leaveSpeed) {
7149 arrivalTime, arrivalSpeed, arrivalSpeedBraking, dist, leaveSpeed));
7154std::shared_ptr<MSSimpleDriverState>
7170 if (prevAcceleration != std::numeric_limits<double>::min()) {
7226 return (myGUIIncrement);
7231 return (myManoeuvreType);
7247 myManoeuvreType = mType;
7262 if (abs(GUIAngle) < 0.1) {
7265 myManoeuvreVehicleID = veh->
getID();
7268 myManoeuvreStartTime = currentTime;
7270 myGUIIncrement = GUIAngle / (
STEPS2TIME(myManoeuvreCompleteTime - myManoeuvreStartTime) /
TS);
7274 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 <<
7275 " endTime=" << myManoeuvreCompleteTime <<
" manoeuvre time=" << myManoeuvreCompleteTime - currentTime <<
" parkArea=" << myManoeuvreStop << std::endl;
7300 if (abs(GUIAngle) < 0.1) {
7304 myManoeuvreVehicleID = veh->
getID();
7307 myManoeuvreStartTime = currentTime;
7309 myGUIIncrement = -GUIAngle / (
STEPS2TIME(myManoeuvreCompleteTime - myManoeuvreStartTime) /
TS);
7316 std::cout <<
"EXIT manoeuvre start: vehicle=" << veh->
getID() <<
" Manoeuvre Angle=" << manoeuverAngle <<
" increment=" <<
RAD2DEG(myGUIIncrement) <<
" currentTime=" << currentTime
7317 <<
" endTime=" << myManoeuvreCompleteTime <<
" manoeuvre time=" << myManoeuvreCompleteTime - currentTime <<
" parkArea=" << myManoeuvreStop << std::endl;
7334 if (configureEntryManoeuvre(veh)) {
7351 if (checkType != myManoeuvreType) {
7376 if (lane ==
nullptr) {
7387 travelTime += (*it)->getMinimumTravelTime(
this);
7388 dist += (*it)->getLength();
7393 dist += stopEdgeDist;
7400 const double d = dist;
7406 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))))
7407 + pow((a * vs), 2))))) * 0.5) + (c * b)) / (b + a));
7411 double timeLossAccel = 0;
7412 double timeLossDecel = 0;
7413 double timeLossLength = 0;
7415 double v =
MIN2(maxVD, (*it)->getVehicleMaxSpeed(
this));
7417 if (edgeLength <= len && v0Stable && v0 < v) {
7418 const double lengthDist =
MIN2(len, edgeLength);
7419 const double dTL = lengthDist / v0 - lengthDist / v;
7421 timeLossLength += dTL;
7423 if (edgeLength > len) {
7424 const double dv = v - v0;
7427 const double dTA = dv / a - dv * (v + v0) / (2 * a * v);
7429 timeLossAccel += dTA;
7431 }
else if (dv < 0) {
7433 const double dTD = -dv / b + dv * (v + v0) / (2 * b * v0);
7435 timeLossDecel += dTD;
7444 const double dv = v - v0;
7447 const double dTA = dv / a - dv * (v + v0) / (2 * a * v);
7449 timeLossAccel += dTA;
7451 }
else if (dv < 0) {
7453 const double dTD = -dv / b + dv * (v + v0) / (2 * b * v0);
7455 timeLossDecel += dTD;
7457 const double result = travelTime + timeLossAccel + timeLossDecel + timeLossLength;
7460 return MAX2(0.0, result);
7518 return nextInternal ? nextInternal : nextNormal;
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(...)
#define WRITE_WARNING(msg)
std::string time2string(SUMOTime t)
convert SUMOTime to string
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
@ SVC_RAIL_CLASSES
classes which drive on tracks
@ SVC_EMERGENCY
public emergency vehicles
@ 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")
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
@ GIVEN
The lane is given.
@ GIVEN
The speed is given.
@ GIVEN
The arrival lane is given.
@ GIVEN
The speed is given.
const int VEHPARS_FORCE_REROUTE
@ GIVEN
The arrival position is given.
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_IGNORE_KEEPCLEAR_TIME
@ SUMO_ATTR_MAXIMUMPOWER
Maximum Power.
@ SUMO_ATTR_JM_STOPLINE_GAP
@ SUMO_ATTR_JM_DRIVE_AFTER_RED_TIME
@ SUMO_ATTR_JM_DRIVE_AFTER_YELLOW_TIME
@ 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
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 getDouble(SumoXMLAttr attr) const
void setDouble(SumoXMLAttr attr, double value)
Sets a parameter.
static double naviDegree(const double angle)
static double fromNaviDegree(const double angle)
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
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.
SUMOTime remainingTime() const
Compute the remaining time until LC completion.
void setShadowApproachingInformation(MSLink *link) const
set approach information for the shadow vehicle
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.
const std::vector< MSLane * > & getFurtherTargetLanes() const
virtual void resetState()
double getAngleOffset() const
return the angle offset during a continuous change maneuver
const std::vector< MSLane * > & getShadowFurtherLanes() const
bool isChangingLanes() const
return true if the vehicle currently performs a lane change maneuver
void removeShadowApproachingInformation() const
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const int rngIndex, SUMOVehicleClass svc) const
The base class for microscopic and mesoscopic vehicles.
double getMaxSpeed() const
Returns the maximum speed (the minimum of desired and technical maximum speed)
MSVehicleDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists or 0.
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)
MSVehicleType * myType
This vehicle's type.
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 addReminder(MSMoveReminder *rem)
Adds a MoveReminder dynamically.
void replaceParameter(const SUMOVehicleParameter *newParameter)
replace the vehicle parameter (deleting the old one)
std::vector< MSVehicleDevice * > myDevices
The devices this vehicle has.
virtual void addTransportable(MSTransportable *transportable)
Adds a person or container to this vehicle.
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
virtual void replaceVehicleType(MSVehicleType *type)
Replaces the current vehicle type by the one given.
double getLength() const
Returns the vehicle's length.
bool isParking() const
Returns whether the vehicle is parking.
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.
bool hasDeparted() const
Returns whether this vehicle has already departed.
double getWidth() const
Returns the vehicle's width.
MSDevice_Transportable * myContainerDevice
The containers this vehicle may have.
const std::list< MSStop > & getStops() const
SUMOTime getDeparture() const
Returns this vehicle's real departure time.
double getWaitingSeconds() const
Returns the number of seconds waited (speed was lesser than 0.1m/s)
MSDevice_Transportable * myPersonDevice
The passengers this vehicle may have.
const MSRoute * myRoute
This vehicle's route.
bool hasStops() const
Returns whether the vehicle has to stop somewhere.
@ ROUTE_START_INVALID_LANE
@ ROUTE_START_INVALID_PERMISSIONS
SUMOVehicleClass getVClass() const
Returns the vehicle's access class.
virtual bool replaceRoute(const MSRoute *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.
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.
std::vector< SUMOVehicleParameter::Stop > myPastStops
The list of stops that the vehicle has already reached.
void onDepart()
Called when the vehicle is inserted into the network.
bool haveValidStopEdges() const
check whether all stop.edge MSRouteIterators are valid and in order
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
static const SUMOTime NOT_YET_DEPARTED
bool myAmRegisteredAsWaiting
Whether this vehicle is registered as waiting for a person or container (for deadlock-recognition)
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.
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.
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.
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 maximumSafeStopSpeed(double gap, double decel, double currentSpeed, bool onInsertion=false, double headway=-1) const
Returns the maximum next velocity for stopping within gap.
double getEmergencyDecel() const
Get the vehicle type's maximal phisically 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...
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 double maximumLaneSpeedCF(double maxSpeed, double maxSpeedLane) const
Returns the maximum velocity the CF-model wants to achieve in the next step.
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....
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)
double getParameterDouble(const std::string &key) const
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()
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 checkCollisionForInactive(MSLane *l)
trigger collision checking for inactive lane
A road/street connecting two junctions.
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 * getBidiEdge() const
return opposite superposable/congruent edge, if it exist and 0 else
bool isNormal() const
return whether this edge is an internal edge
const std::vector< MSLane * > * allowedLanes(const MSEdge &destination, SUMOVehicleClass vclass=SVC_IGNORING) const
Get the allowed lanes to reach the destination-edge.
double getSpeedLimit() const
Returns the speed limit of the edge @caution The speed limit of the first lane is retured; should pro...
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 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 gLefthand
Whether lefthand-drive is being simulated.
static bool gSublane
whether sublane simulation is enabled (sublane model or continuous lanechanging)
static SUMOTime gLaneChangeDuration
static double gEmergencyDecelWarningThreshold
treshold 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< MSVehicle *const, double > getFollower(const MSVehicle *ego, double egoPos, double dist, MinorLinkMode mLinkMode) const
Find follower vehicle for the given ego vehicle (which may be on the opposite direction lane)
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...
static std::vector< MSLink * >::const_iterator succLinkSec(const SUMOVehicle &veh, int nRouteSuccs, const MSLane &succLinkSource, const std::vector< MSLane * > &conts)
const MSLink * getLinkTo(const MSLane *const) const
returns the link to the given lane or nullptr, if it is not connected
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.
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
MSLane * getCanonicalPredecessorLane() const
double getLength() const
Returns the lane's length.
const PositionVector & getShape() const
Returns this lane's shape.
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
const MSLeaderInfo getLastVehicleInformation(const MSVehicle *ego, double latOffset, double minPos=0, bool allowCached=true) const
Returns the last vehicles on the lane.
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 precedecessor lane (sorted using by_connections_to_sorter). The result is cached ...
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
std::pair< MSVehicle *const, double > getLeaderOnConsecutive(double dist, double seen, double speed, const MSVehicle &veh, const std::vector< MSLane * > &bestLaneConts) const
Returns the immediate leader and the distance to him.
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
MSLeaderDistanceInfo getFollowersOnConsecutive(const MSVehicle *ego, double backOffset, bool allSublanes, double searchDist=-1, MinorLinkMode mLinkMode=FOLLOW_ALWAYS) const
return the sublane followers with the largest missing rear gap among all predecessor lanes (within di...
double getWidth() const
Returns the lane's width.
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
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.
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 isConflictEntryLink() const
return whether this link enters the conflict area (not a continuation link)
int getIndex() const
Returns the respond index (for visualization)
std::vector< const SUMOVehicle * > BlockingFoes
bool havePriority() const
Returns whether this link is a major link.
double getZipperSpeed(const MSVehicle *ego, const double dist, double vSafe, SUMOTime arrivalTime, BlockingFoes *collectFoes) const
return the speed at which ego vehicle must approach the zipper 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 lane or 0
MSLane * getViaLaneOrLane() const
return the via lane if it exists and the lane otherwise
double getLateralShift() const
return lateral shift that must be applied when passing this link
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) const
Returns the information whether the link may be passed.
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.
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_LOAD_STATE
The vehicle has been loaded from a state file.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
Interface for objects listening to vehicle state changes.
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.
A lane area vehicles can halt at.
void leaveFrom(SUMOVehicle *what)
Called if a vehicle leaves this stop.
int getCapacity() const
Returns the area capacity.
void enter(SUMOVehicle *veh)
Called if a vehicle enters this stop.
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
int getOccupancyIncludingBlocked() const
Returns the area occupancy.
double getLastFreePosWithReservation(SUMOTime t, const SUMOVehicle &forVehicle, double brakePos)
Returns the last free position on this stop including reservatiosn 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.
const ConstMSEdgeVector & getEdges() const
MSRouteIterator end() const
Returns the end of the list of edges to pass.
const MSEdge * getLastEdge() const
returns the destination edge
double getDistanceBetween(double fromPos, double toPos, const MSEdge *fromEdge, const MSEdge *toEdge, bool includeInternal=true, int routePosition=0) const
Compute the distance between 2 given edges on this route, including the length of internal lanes....
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 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
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 stopStarted(const SUMOVehicle *veh, int numPersons, int numContainers, SUMOTime time)
void stopEnded(const SUMOVehicle *veh, const SUMOVehicleParameter::Stop &stop, const std::string &laneOrEdgeID, bool simEnd=false)
static MSStopOut * getInstance()
A lane area vehicles can halt at.
double getBeginLanePosition() const
Returns the begin position of 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.
void enter(SUMOVehicle *veh, bool parking)
Called if a vehicle enters this stop.
const MSLane & getLane() const
Returns the lane this stop is located at.
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)
load any applicable transportables Loads any person / container that is waiting on that edge for the ...
bool isPerson() const
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 considerSafeVelocity() const
Returns whether safe velocities shall be considered.
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 myRespectJunctionLeaderPriority
Whether the junction priority rules are respected (within)
void setOriginalSpeed(double speed)
Stores the originally longitudinal speed.
double myOriginalSpeed
The velocity before influence.
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
static 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 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
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 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...
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,...
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 replaceParkingArea(MSParkingArea *parkingArea, std::string &errorMsg)
replace the current parking area stop with a new stop with merge duration
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...
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.
MSParkingArea * getNextParkingArea()
get the upcoming parking area stop or nullptr
SUMOTime myJunctionConflictEntryTime
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...
SUMOTime getWaitingTime() const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
void workOnMoveReminders(double oldPos, double newPos, double newSpeed)
Processes active move reminder.
bool isStoppedOnLane() const
double myAcceleration
The current acceleration after dawdling in m/s.
void registerInsertionApproach(MSLink *link, double dist)
register approach on insertion
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
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.
std::pair< double, LinkDirection > myNextTurn
the upcoming turn for the vehicle
double getBackPositionOnLane() const
Get the vehicle's position relative to its current lane.
void setPreviousSpeed(double prevSpeed, double prevAcceleration)
Sets the influenced previous speed.
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.
bool isFrontOnLane(const MSLane *lane) const
Returns the information whether the front of the vehicle is on the given lane.
virtual ~MSVehicle()
Destructor.
bool stopsAt(MSStoppingPlace *stop) const
Returns whether the vehicle stops at the given stopping place.
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 wether 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 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)
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.
void adaptBestLanesOccupation(int laneIndex, double density)
update occupation from MSLaneChanger
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
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.
double estimateTimeToNextStop() const
MSParkingArea * getCurrentParkingArea()
get the current parking area stop or nullptr
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.
bool replaceRoute(const MSRoute *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.
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.
bool stopsAtEdge(const MSEdge *edge) const
Returns whether the vehicle stops at the given edge.
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
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 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
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.
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
void replaceVehicleType(MSVehicleType *type)
Replaces the current vehicle type by the one given.
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 arived (reached the arrivalPosition on its final edge)
const MSEdge * getRerouteOrigin() const
Returns the starting point for reroutes (usually the current edge)
void switchOffSignal(int signal)
Switches the given signal off.
void updateState(double vNext)
updates the vehicles state, given a next value for its speed. This value can be negative in case of t...
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
std::pair< const MSVehicle *const, double > getLeader(double dist=0) const
Returns the leader of the vehicle looking for a fixed distance.
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.
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 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()
double getRightSideOnLane() const
Get the lateral position of the vehicles right side on the lane:
bool unsafeLinkAhead(const MSLane *lane) const
whether the vehicle may safely move to the given lane with regard to upcoming links
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 eposide
double getSpeed() const
Returns the vehicle's current speed.
void setApproachingForAllLinks(const SUMOTime t)
Register junction approaches for all link items in the current plan.
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
MSVehicle::ManoeuvreType getManoeuvreType() const
accessor function to myManoeuvre equivalent
double checkReversal(bool &canReverse, double speedThreshold=SUMO_const_haltingSpeed, double seen=0) const
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 ignore
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)
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
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
void activateReminders(const MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
"Activates" all current move reminder
double getDistanceToPosition(double destPos, const MSEdge *destEdge) const
void planMoveInternal(const SUMOTime t, MSLeaderInfo ahead, DriveItemVector &lfLinks, double &myStopDist, std::pair< double, LinkDirection > &myNextTurn) const
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 SumoXMLAttr attr, const T &val)
writes a named attribute
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
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
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
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position
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 ammount
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)
double recomputeCosts(const std::vector< const E * > &edges, const V *const v, SUMOTime msTime, double *lengthp=nullptr) const
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...
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.
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.
virtual double getSpeed() const =0
Returns the object's current speed.
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
std::string lane
The lane to stop at.
SUMOTime extension
The maximum time extension for boarding / loading.
std::string parkingarea
(Optional) parking area if one is assigned to the stop
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
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.
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 parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
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.
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
double arrivalPos
(optional) The position the vehicle shall arrive on
bool wasSet(int what) const
Returns whether the given parameter was set.
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
static SUMOTime processActionStepLength(double given)
Checks and converts given value for the action step length from seconds to miliseconds assuring it be...
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) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) 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.
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 vehStateListener
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.