108 #define DEBUG_COND (isSelected())
110 #define DEBUG_COND2(obj) (obj->isSelected())
115 #define STOPPING_PLACE_OFFSET 0.5
117 #define CRLL_LOOK_AHEAD 5
119 #define JUNCTION_BLOCKAGE_TIME 5
122 #define DIST_TO_STOPLINE_EXPECT_PRIORITY 1.0
124 #define NUMERICAL_EPS_SPEED (0.1 * NUMERICAL_EPS * TS)
162 return (myPos != state.
myPos ||
172 myPos(pos), mySpeed(speed), myPosLat(posLat), myBackPos(backPos), myPreviousSpeed(previousSpeed), myLastCoveredDist(
SPEED2DIST(speed)) {}
184 assert(memorySpan <= myMemorySize);
185 if (memorySpan == -1) {
186 memorySpan = myMemorySize;
189 for (
const auto& interval : myWaitingIntervals) {
190 if (interval.second >= memorySpan) {
191 if (interval.first >= memorySpan) {
194 totalWaitingTime += memorySpan - interval.first;
197 totalWaitingTime += interval.second - interval.first;
200 return totalWaitingTime;
206 auto i = myWaitingIntervals.begin();
207 const auto end = myWaitingIntervals.end();
208 const bool startNewInterval = i == end || (i->first != 0);
211 if (i->first >= myMemorySize) {
219 auto d = std::distance(i, end);
221 myWaitingIntervals.pop_back();
227 }
else if (!startNewInterval) {
228 myWaitingIntervals.begin()->first = 0;
230 myWaitingIntervals.push_front(std::make_pair(0, dt));
238 std::ostringstream state;
239 state << myMemorySize <<
" " << myWaitingIntervals.size();
240 for (
const auto& interval : myWaitingIntervals) {
241 state <<
" " << interval.first <<
" " << interval.second;
249 std::istringstream is(state);
252 is >> myMemorySize >> numIntervals;
253 while (numIntervals-- > 0) {
255 myWaitingIntervals.emplace_back(begin, end);
274 if (GapControlState::refVehMap.find(msVeh) != end(GapControlState::refVehMap)) {
276 GapControlState::refVehMap[msVeh]->deactivate();
286 std::map<const MSVehicle*, MSVehicle::Influencer::GapControlState*>
293 tauOriginal(-1), tauCurrent(-1), tauTarget(-1), addGapCurrent(-1), addGapTarget(-1),
294 remainingDuration(-1), changeRate(-1), maxDecel(-1), referenceVeh(nullptr), active(false), gapAttained(false), prevLeader(nullptr),
295 lastUpdate(-1), timeHeadwayIncrement(0.0), spaceHeadwayIncrement(0.0) {}
309 WRITE_ERROR(
"MSVehicle::Influencer::GapControlState::init(): No MSNet instance found!")
326 tauOriginal = tauOrig;
327 tauCurrent = tauOrig;
330 addGapTarget = additionalGap;
331 remainingDuration = dur;
334 referenceVeh = refVeh;
337 prevLeader =
nullptr;
339 timeHeadwayIncrement = changeRate *
TS * (tauTarget - tauOriginal);
340 spaceHeadwayIncrement = changeRate *
TS * addGapTarget;
342 if (referenceVeh !=
nullptr) {
352 if (referenceVeh !=
nullptr) {
355 referenceVeh =
nullptr;
389 GapControlState::init();
394 GapControlState::cleanup();
399 mySpeedAdaptationStarted =
true;
400 mySpeedTimeLine = speedTimeLine;
405 if (myGapControlState ==
nullptr) {
406 myGapControlState = std::make_shared<GapControlState>();
408 myGapControlState->activate(originalTau, newTimeHeadway, newSpaceHeadway, duration, changeRate, maxDecel, refVeh);
413 if (myGapControlState !=
nullptr && myGapControlState->active) {
414 myGapControlState->deactivate();
420 myLaneTimeLine = laneTimeLine;
426 for (
auto& item : myLaneTimeLine) {
427 item.second += indexShift;
439 return (1 * myConsiderSafeVelocity +
440 2 * myConsiderMaxAcceleration +
441 4 * myConsiderMaxDeceleration +
442 8 * myRespectJunctionPriority +
443 16 * myEmergencyBrakeRedLight +
444 32 * !myRespectJunctionLeaderPriority
451 return (1 * myStrategicLC +
452 4 * myCooperativeLC +
454 64 * myRightDriveLC +
455 256 * myTraciLaneChangePriority +
462 for (std::vector<std::pair<SUMOTime, int>>::iterator i = myLaneTimeLine.begin(); i != myLaneTimeLine.end(); ++i) {
466 duration -= i->first;
474 if (!myLaneTimeLine.empty()) {
475 return myLaneTimeLine.back().first;
485 while (mySpeedTimeLine.size() == 1 || (mySpeedTimeLine.size() > 1 && currentTime > mySpeedTimeLine[1].first)) {
486 mySpeedTimeLine.erase(mySpeedTimeLine.begin());
489 if (!(mySpeedTimeLine.size() < 2 || currentTime < mySpeedTimeLine[0].first)) {
491 if (!mySpeedAdaptationStarted) {
492 mySpeedTimeLine[0].second = speed;
493 mySpeedAdaptationStarted =
true;
496 const double td =
STEPS2TIME(currentTime - mySpeedTimeLine[0].first) /
STEPS2TIME(mySpeedTimeLine[1].first +
DELTA_T - mySpeedTimeLine[0].first);
497 speed = mySpeedTimeLine[0].second - (mySpeedTimeLine[0].second - mySpeedTimeLine[1].second) * td;
498 if (myConsiderSafeVelocity) {
499 speed =
MIN2(speed, vSafe);
501 if (myConsiderMaxAcceleration) {
502 speed =
MIN2(speed, vMax);
504 if (myConsiderMaxDeceleration) {
505 speed =
MAX2(speed, vMin);
515 std::cout << currentTime <<
" Influencer::gapControlSpeed(): speed=" << speed
516 <<
", vSafe=" << vSafe
522 double gapControlSpeed = speed;
523 if (myGapControlState !=
nullptr && myGapControlState->active) {
525 const double currentSpeed = veh->
getSpeed();
527 assert(msVeh !=
nullptr);
528 const double desiredTargetTimeSpacing = myGapControlState->tauTarget * currentSpeed;
529 std::pair<const MSVehicle*, double> leaderInfo;
530 if (myGapControlState->referenceVeh ==
nullptr) {
533 leaderInfo = msVeh->
getLeader(
MAX2(desiredTargetTimeSpacing, myGapControlState->addGapCurrent) +
MAX2(brakeGap, 20.0));
536 std::cout <<
" --- no refVeh; myGapControlState->addGapCurrent: " << myGapControlState->addGapCurrent <<
", brakeGap: " << brakeGap <<
" in simstep: " <<
SIMSTEP << std::endl;
541 const MSVehicle* leader = myGapControlState->referenceVeh;
549 if (dist < -100000) {
551 std::cout <<
" Ego and reference vehicle are not in CF relation..." << std::endl;
553 std::cout <<
" Reference vehicle is behind ego..." << std::endl;
560 const double fakeDist =
MAX2(0.0, leaderInfo.second - myGapControlState->addGapCurrent);
563 const double desiredCurrentSpacing = myGapControlState->tauCurrent * currentSpeed;
564 std::cout <<
" Gap control active:"
565 <<
" currentSpeed=" << currentSpeed
566 <<
", desiredTargetTimeSpacing=" << desiredTargetTimeSpacing
567 <<
", desiredCurrentSpacing=" << desiredCurrentSpacing
568 <<
", leader=" << (leaderInfo.first ==
nullptr ?
"NULL" : leaderInfo.first->getID())
569 <<
", dist=" << leaderInfo.second
570 <<
", fakeDist=" << fakeDist
571 <<
",\n tauOriginal=" << myGapControlState->tauOriginal
572 <<
", tauTarget=" << myGapControlState->tauTarget
573 <<
", tauCurrent=" << myGapControlState->tauCurrent
577 if (leaderInfo.first !=
nullptr) {
578 if (myGapControlState->prevLeader !=
nullptr && myGapControlState->prevLeader != leaderInfo.first) {
582 myGapControlState->prevLeader = leaderInfo.first;
588 gapControlSpeed =
MIN2(gapControlSpeed,
589 cfm->
followSpeed(msVeh, currentSpeed, fakeDist, leaderInfo.first->
getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first));
593 std::cout <<
" -> gapControlSpeed=" << gapControlSpeed;
594 if (myGapControlState->maxDecel > 0) {
595 std::cout <<
", with maxDecel bound: " <<
MAX2(gapControlSpeed, currentSpeed -
TS * myGapControlState->maxDecel);
597 std::cout << std::endl;
600 if (myGapControlState->maxDecel > 0) {
601 gapControlSpeed =
MAX2(gapControlSpeed, currentSpeed -
TS * myGapControlState->maxDecel);
608 if (myGapControlState->lastUpdate < currentTime) {
611 std::cout <<
" Updating GapControlState." << std::endl;
614 if (myGapControlState->tauCurrent == myGapControlState->tauTarget && myGapControlState->addGapCurrent == myGapControlState->addGapTarget) {
615 if (!myGapControlState->gapAttained) {
617 myGapControlState->gapAttained = leaderInfo.first ==
nullptr || leaderInfo.second >
MAX2(desiredTargetTimeSpacing, myGapControlState->addGapTarget) - POSITION_EPS;
620 if (myGapControlState->gapAttained) {
621 std::cout <<
" Target gap was established." << std::endl;
627 myGapControlState->remainingDuration -=
TS;
630 std::cout <<
" Gap control remaining duration: " << myGapControlState->remainingDuration << std::endl;
633 if (myGapControlState->remainingDuration <= 0) {
636 std::cout <<
" Gap control duration expired, deactivating control." << std::endl;
640 myGapControlState->deactivate();
645 myGapControlState->tauCurrent =
MIN2(myGapControlState->tauCurrent + myGapControlState->timeHeadwayIncrement, myGapControlState->tauTarget);
646 myGapControlState->addGapCurrent =
MIN2(myGapControlState->addGapCurrent + myGapControlState->spaceHeadwayIncrement, myGapControlState->addGapTarget);
649 if (myConsiderSafeVelocity) {
650 gapControlSpeed =
MIN2(gapControlSpeed, vSafe);
652 if (myConsiderMaxAcceleration) {
653 gapControlSpeed =
MIN2(gapControlSpeed, vMax);
655 if (myConsiderMaxDeceleration) {
656 gapControlSpeed =
MAX2(gapControlSpeed, vMin);
658 return MIN2(speed, gapControlSpeed);
666 return myOriginalSpeed;
671 myOriginalSpeed = speed;
678 while (myLaneTimeLine.size() == 1 || (myLaneTimeLine.size() > 1 && currentTime > myLaneTimeLine[1].first)) {
679 myLaneTimeLine.erase(myLaneTimeLine.begin());
683 if (myLaneTimeLine.size() >= 2 && currentTime >= myLaneTimeLine[0].first) {
684 const int destinationLaneIndex = myLaneTimeLine[1].second;
685 if (destinationLaneIndex < (
int)currentEdge.
getLanes().size()) {
686 if (currentLaneIndex > destinationLaneIndex) {
688 }
else if (currentLaneIndex < destinationLaneIndex) {
693 }
else if (currentEdge.
getLanes().back()->getOpposite() !=
nullptr) {
702 if ((state &
LCA_TRACI) != 0 && myLatDist != 0) {
711 mode = myStrategicLC;
713 mode = myCooperativeLC;
715 mode = mySpeedGainLC;
717 mode = myRightDriveLC;
756 switch (changeRequest) {
772 assert(myLaneTimeLine.size() >= 2);
773 assert(currentTime >= myLaneTimeLine[0].first);
774 return STEPS2TIME(myLaneTimeLine[1].first - currentTime);
780 myConsiderSafeVelocity = ((speedMode & 1) != 0);
781 myConsiderMaxAcceleration = ((speedMode & 2) != 0);
782 myConsiderMaxDeceleration = ((speedMode & 4) != 0);
783 myRespectJunctionPriority = ((speedMode & 8) != 0);
784 myEmergencyBrakeRedLight = ((speedMode & 16) != 0);
785 myRespectJunctionLeaderPriority = ((speedMode & 32) == 0);
802 myRemoteXYPos = xyPos;
805 myRemotePosLat = posLat;
806 myRemoteAngle = angle;
807 myRemoteEdgeOffset = edgeOffset;
808 myRemoteRoute = route;
809 myLastRemoteAccess = t;
821 return myLastRemoteAccess >= t -
TIME2STEPS(10);
827 if (myRemoteRoute.size() != 0 && myRemoteRoute != v->
getRoute().
getEdges()) {
830 #ifdef DEBUG_REMOTECONTROL
843 const bool wasOnRoad = v->
isOnRoad();
844 const bool withinLane = myRemoteLane !=
nullptr && fabs(myRemotePosLat) < 0.5 * (myRemoteLane->getWidth() + v->
getVehicleType().
getWidth());
845 const bool keepLane = wasOnRoad && v->
getLane() == myRemoteLane;
846 if (v->
isOnRoad() && !(keepLane && withinLane)) {
847 if (myRemoteLane !=
nullptr && &v->
getLane()->
getEdge() == &myRemoteLane->getEdge()) {
854 if (myRemoteRoute.size() != 0 && myRemoteRoute != v->
getRoute().
getEdges()) {
856 #ifdef DEBUG_REMOTECONTROL
857 std::cout <<
SIMSTEP <<
" postProcessRemoteControl veh=" << v->
getID()
861 <<
" newRoute=" <<
toString(myRemoteRoute)
862 <<
" newRouteEdge=" << myRemoteRoute[myRemoteEdgeOffset]->getID()
870 if (myRemoteLane !=
nullptr && myRemotePos > myRemoteLane->getLength()) {
871 myRemotePos = myRemoteLane->getLength();
873 if (myRemoteLane !=
nullptr && withinLane) {
879 if (needFurtherUpdate) {
889 myRemoteLane->forceVehicleInsertion(v, myRemotePos, notify, myRemotePosLat);
896 myRemoteLane->requireCollisionCheck();
924 if (myRemoteLane !=
nullptr) {
930 if (distAlongRoute != std::numeric_limits<double>::max()) {
931 dist = distAlongRoute;
935 const double minSpeed = myConsiderMaxDeceleration ?
937 const double maxSpeed = (myRemoteLane !=
nullptr
938 ? myRemoteLane->getVehicleMaxSpeed(veh)
949 if (myRemoteLane ==
nullptr) {
959 if (dist == std::numeric_limits<double>::max()) {
963 WRITE_WARNINGF(
TL(
"Vehicle '%' moved by TraCI from % to % (dist %) with implied speed of % (exceeding maximum speed %). time=%."),
1024 further->resetPartialOccupation(
this);
1025 if (further->getBidiLane() !=
nullptr
1027 further->getBidiLane()->resetPartialOccupation(
this);
1044 #ifdef DEBUG_ACTIONSTEPS
1046 std::cout <<
SIMTIME <<
" Removing vehicle '" <<
getID() <<
"' (reason: " <<
toString(reason) <<
")" << std::endl;
1071 if (!(*myCurrEdge)->isTazConnector()) {
1073 if ((*myCurrEdge)->getDepartLane(*
this) ==
nullptr) {
1074 msg =
"Invalid departlane definition for vehicle '" +
getID() +
"'.";
1083 if ((*myCurrEdge)->allowedLanes(
getVClass()) ==
nullptr) {
1084 msg =
"Vehicle '" +
getID() +
"' is not allowed to depart on any lane of edge '" + (*myCurrEdge)->getID() +
"'.";
1090 msg =
"Departure speed for vehicle '" +
getID() +
"' is too high for the vehicle type '" +
myType->
getID() +
"'.";
1121 updateBestLanes(
true, onInit ? (*myCurrEdge)->getLanes().front() : 0);
1124 myStopDist = std::numeric_limits<double>::max();
1142 if (!rem->first->notifyMove(*
this, oldPos + rem->second, newPos + rem->second,
MAX2(0., newSpeed))) {
1144 if (myTraceMoveReminders) {
1145 traceMoveReminder(
"notifyMove", rem->first, rem->second,
false);
1151 if (myTraceMoveReminders) {
1152 traceMoveReminder(
"notifyMove", rem->first, rem->second,
true);
1167 if (duration >= 0) {
1182 rem.first->notifyIdle(*
this);
1187 rem->notifyIdle(*
this);
1198 rem.second += oldLaneLength;
1202 if (myTraceMoveReminders) {
1203 traceMoveReminder(
"adaptedPos", rem.first, rem.second,
true);
1217 return getStops().begin()->parkingarea->getVehicleSlope(*
this);
1252 if (
myStops.begin()->parkingarea !=
nullptr) {
1253 return myStops.begin()->parkingarea->getVehiclePosition(*
this);
1263 if (offset == 0. && !changingLanes) {
1286 double relOffset = fabs(posLat) / centerDist;
1287 double newZ = (1 - relOffset) * pos.
z() + relOffset * shadowPos.
z();
1298 return MAX2(0.0, result);
1316 auto nextBestLane = bestLanes.begin();
1321 bool success =
true;
1323 while (offset > 0) {
1328 lane = lane->
getLinkCont()[0]->getViaLaneOrLane();
1330 if (lane ==
nullptr) {
1340 while (nextBestLane != bestLanes.end() && *nextBestLane ==
nullptr) {
1345 assert(lane == *nextBestLane);
1349 assert(nextBestLane == bestLanes.end() || *nextBestLane != 0);
1350 if (nextBestLane == bestLanes.end()) {
1355 assert(link !=
nullptr);
1386 int furtherIndex = 0;
1395 offset += lastLength;
1405 ConstMSEdgeVector::const_iterator
1420 #ifdef DEBUG_FURTHER
1422 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
" setAngle(" << angle <<
") straightenFurther=" << straightenFurther << std::endl;
1431 if (link !=
nullptr) {
1446 const bool newActionStepLength = actionStepLengthMillisecs != previousActionStepLength;
1447 if (newActionStepLength) {
1477 if (
myStops.begin()->parkingarea !=
nullptr) {
1478 return myStops.begin()->parkingarea->getVehicleAngle(*
this);
1515 double result = (p1 != p2 ? p2.
angleTo2D(p1) :
1520 #ifdef DEBUG_FURTHER
1539 #ifdef DEBUG_FURTHER
1546 #ifdef DEBUG_FURTHER
1582 || (
myStops.front().getSpeed() > 0
1594 return myStops.front().duration;
1616 return currentVelocity;
1621 std::cout <<
"\nPROCESS_NEXT_STOP\n" <<
SIMTIME <<
" vehicle '" <<
getID() <<
"'" << std::endl;
1632 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' reached stop.\n"
1666 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' resumes from stopping." << std::endl;
1691 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' registers as waiting for person." << std::endl;
1706 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' registers as waiting for container." << std::endl;
1729 return currentVelocity;
1745 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' hasn't reached next stop." << std::endl;
1755 if (noExits && noEntries) {
1765 bool fitsOnStoppingPlace =
true;
1766 if (stop.
busstop !=
nullptr) {
1776 fitsOnStoppingPlace =
false;
1780 if (rem->isParkingRerouter()) {
1784 if (
myStops.empty() ||
myStops.front().parkingarea != oldParkingArea) {
1786 return currentVelocity;
1789 fitsOnStoppingPlace =
false;
1791 fitsOnStoppingPlace =
false;
1798 std::cout <<
" pos=" <<
myState.
pos() <<
" speed=" << currentVelocity <<
" targetPos=" << targetPos <<
" fits=" << fitsOnStoppingPlace
1799 <<
" reachedThresh=" << reachedThreshold
1814 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' reached next stop." << std::endl;
1839 if (stop.
busstop !=
nullptr) {
1865 if (splitVeh ==
nullptr) {
1896 return currentVelocity;
1919 bool unregister =
false;
1923 if (taxiDevice !=
nullptr) {
1955 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' unregisters as waiting for transportable." << std::endl;
1970 myStops.begin()->joinTriggered =
false;
1989 double skippedLaneLengths = 0;
2004 std::string warn =
TL(
"Cannot join vehicle '%' to vehicle '%' due to incompatible routes. time=%.");
2011 std::string warn =
TL(
"Cannot join vehicle '%' to vehicle '%' due to incompatible routes. time=%.");
2024 myStops.begin()->joinTriggered =
false;
2061 if (timeSinceLastAction == 0) {
2063 timeSinceLastAction = oldActionStepLength;
2065 if (timeSinceLastAction >= newActionStepLength) {
2069 SUMOTime timeUntilNextAction = newActionStepLength - timeSinceLastAction;
2078 #ifdef DEBUG_PLAN_MOVE
2084 <<
" veh=" <<
getID()
2099 #ifdef DEBUG_ACTIONSTEPS
2101 std::cout <<
STEPS2TIME(t) <<
" vehicle '" <<
getID() <<
"' skips action." << std::endl;
2109 #ifdef DEBUG_ACTIONSTEPS
2111 std::cout <<
STEPS2TIME(t) <<
" vehicle = '" <<
getID() <<
"' takes action." << std::endl;
2119 #ifdef DEBUG_PLAN_MOVE
2121 DriveItemVector::iterator i;
2124 <<
" vPass=" << (*i).myVLinkPass
2125 <<
" vWait=" << (*i).myVLinkWait
2126 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
2127 <<
" request=" << (*i).mySetRequest
2156 const bool result = (
overlap > POSITION_EPS
2169 #ifdef DEBUG_PLAN_MOVE
2184 newStopDist = std::numeric_limits<double>::max();
2192 double lateralShift = 0;
2196 laneMaxV =
MIN2(laneMaxV, l->getVehicleMaxSpeed(
this));
2197 #ifdef DEBUG_PLAN_MOVE
2199 std::cout <<
" laneMaxV=" << laneMaxV <<
" lane=" << l->getID() <<
"\n";
2205 laneMaxV =
MAX2(laneMaxV, vMinComfortable);
2207 laneMaxV = std::numeric_limits<double>::max();
2221 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" speedBeforeTraci=" << v;
2227 std::cout <<
" influencedSpeed=" << v;
2233 std::cout <<
" gapControlSpeed=" << v <<
"\n";
2241 #ifdef DEBUG_PLAN_MOVE
2243 std::cout <<
" dist=" << dist <<
" bestLaneConts=" <<
toString(bestLaneConts)
2244 <<
"\n maxV=" << maxV <<
" laneMaxV=" << laneMaxV <<
" v=" << v <<
"\n";
2247 assert(bestLaneConts.size() > 0);
2248 bool hadNonInternal =
false;
2251 nextTurn.first = seen;
2252 nextTurn.second =
nullptr;
2254 double seenNonInternal = 0;
2259 bool slowedDownForMinor =
false;
2260 double mustSeeBeforeReversal = 0;
2266 #ifdef PARALLEL_STOPWATCH
2272 if (v > vMinComfortable &&
hasStops() &&
myStops.front().pars.arrival >= 0 && sfp > 0
2274 && !
myStops.front().reached) {
2276 v =
MIN2(v, vSlowDown);
2288 const double gapOffset = leaderLane ==
myLane ? 0 : seen - leaderLane->
getLength();
2294 if (cand.first != 0) {
2295 if ((cand.first->myLaneChangeModel->isOpposite() && cand.first->getLaneChangeModel().getShadowLane() != leaderLane)
2296 || (!cand.first->myLaneChangeModel->isOpposite() && cand.first->getLaneChangeModel().getShadowLane() == leaderLane)) {
2298 oppositeLeaders.
addLeader(cand.first, cand.second + gapOffset -
getVehicleType().getMinGap() + cand.first->getVehicleType().
getMinGap() - cand.first->getVehicleType().getLength());
2301 const bool assumeStopped = cand.first->isStopped() || cand.first->getWaitingSeconds() > 1;
2302 const double predMaxDist = cand.first->getSpeed() + (assumeStopped ? 0 : cand.first->getCarFollowModel().getMaxAccel()) * minTimeToLeaveLane;
2303 if (cand.second >= 0 && (cand.second - v * minTimeToLeaveLane - predMaxDist < 0 || assumeStopped)) {
2309 #ifdef DEBUG_PLAN_MOVE
2311 std::cout <<
" leaderLane=" << leaderLane->
getID() <<
" gapOffset=" << gapOffset <<
" minTimeToLeaveLane=" << minTimeToLeaveLane
2312 <<
" cands=" << cands.
toString() <<
" oppositeLeaders=" << oppositeLeaders.
toString() <<
"\n";
2320 const bool outsideLeft = leftOL > lane->
getWidth();
2321 #ifdef DEBUG_PLAN_MOVE
2323 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" lane=" << lane->
getID() <<
" rightOL=" << rightOL <<
" leftOL=" << leftOL <<
"\n";
2326 if (rightOL < 0 || outsideLeft) {
2330 int sublaneOffset = 0;
2337 #ifdef DEBUG_PLAN_MOVE
2339 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" lane=" << lane->
getID() <<
" sublaneOffset=" << sublaneOffset <<
" outsideLeft=" << outsideLeft <<
"\n";
2344 && ((!outsideLeft && cand->getLeftSideOnEdge() < 0)
2345 || (outsideLeft && cand->getLeftSideOnEdge() > lane->
getEdge().
getWidth()))) {
2347 #ifdef DEBUG_PLAN_MOVE
2349 std::cout <<
" outsideLeader=" << cand->getID() <<
" ahead=" << outsideLeaders.
toString() <<
"\n";
2356 adaptToLeaders(outsideLeaders, lateralShift, seen, lastLink, leaderLane, v, vLinkPass);
2360 adaptToLeaders(ahead, lateralShift, seen, lastLink, leaderLane, v, vLinkPass);
2362 if (lastLink !=
nullptr) {
2365 #ifdef DEBUG_PLAN_MOVE
2367 std::cout <<
"\nv = " << v <<
"\n";
2375 if (shadowLane !=
nullptr
2389 #ifdef DEBUG_PLAN_MOVE
2391 std::cout <<
SIMTIME <<
" opposite veh=" <<
getID() <<
" shadowLane=" << shadowLane->
getID() <<
" latOffset=" << latOffset <<
" shadowLeaders=" << shadowLeaders.
toString() <<
"\n";
2399 adaptToLeaders(shadowLeaders, latOffset, seen - turningDifference, lastLink, shadowLane, v, vLinkPass);
2404 const double latOffset = 0;
2405 #ifdef DEBUG_PLAN_MOVE
2407 std::cout <<
SIMTIME <<
" opposite shadows veh=" <<
getID() <<
" shadowLane=" << shadowLane->
getID()
2408 <<
" latOffset=" << latOffset <<
" shadowLeaders=" << shadowLeaders.
toString() <<
"\n";
2412 #ifdef DEBUG_PLAN_MOVE
2414 std::cout <<
" shadowLeadersFixed=" << shadowLeaders.
toString() <<
"\n";
2423 const double relativePos = lane->
getLength() - seen;
2424 #ifdef DEBUG_PLAN_MOVE
2426 std::cout <<
SIMTIME <<
" adapt to pedestrians on lane=" << lane->
getID() <<
" relPos=" << relativePos <<
"\n";
2432 if (leader.first != 0) {
2434 v =
MIN2(v, stopSpeed);
2435 #ifdef DEBUG_PLAN_MOVE
2437 std::cout <<
SIMTIME <<
" pedLeader=" << leader.first->getID() <<
" dist=" << leader.second <<
" v=" << v <<
"\n";
2446 const double relativePos = seen;
2447 #ifdef DEBUG_PLAN_MOVE
2449 std::cout <<
SIMTIME <<
" adapt to pedestrians on lane=" << lane->
getID() <<
" relPos=" << relativePos <<
"\n";
2456 if (leader.first != 0) {
2458 v =
MIN2(v, stopSpeed);
2459 #ifdef DEBUG_PLAN_MOVE
2461 std::cout <<
SIMTIME <<
" pedLeader=" << leader.first->getID() <<
" dist=" << leader.second <<
" v=" << v <<
"\n";
2471 || (
myStops.begin()->isOpposite &&
myStops.begin()->lane->getEdge().getOppositeEdge() == &lane->
getEdge()))
2477 bool isWaypoint = stop.
getSpeed() > 0;
2478 double endPos = stop.
getEndPos(*
this) + NUMERICAL_EPS;
2483 }
else if (isWaypoint && !stop.
reached) {
2486 newStopDist = seen + endPos - lane->
getLength();
2489 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" newStopDist=" << newStopDist <<
" stopLane=" << stop.
lane->
getID() <<
" stopEndPos=" << endPos <<
"\n";
2493 double stopSpeed = laneMaxV;
2495 bool waypointWithStop =
false;
2508 if (stop.
getUntil() > t + time2end) {
2510 double distToEnd = newStopDist;
2515 waypointWithStop =
true;
2521 newStopDist = std::numeric_limits<double>::max();
2528 if (lastLink !=
nullptr) {
2534 if (lastLink !=
nullptr) {
2538 v =
MIN2(v, stopSpeed);
2540 std::vector<MSLink*>::const_iterator exitLink =
MSLane::succLinkSec(*
this, view + 1, *lane, bestLaneConts);
2542 bool dummySetRequest;
2543 double dummyVLinkWait;
2547 #ifdef DEBUG_PLAN_MOVE
2549 std::cout <<
"\n" <<
SIMTIME <<
" next stop: distance = " << newStopDist <<
" requires stopSpeed = " << stopSpeed <<
"\n";
2556 lfLinks.emplace_back(v, newStopDist);
2563 std::vector<MSLink*>::const_iterator link =
MSLane::succLinkSec(*
this, view + 1, *lane, bestLaneConts);
2566 if (!encounteredTurn) {
2574 nextTurn.first = seen;
2575 nextTurn.second = *link;
2576 encounteredTurn =
true;
2577 #ifdef DEBUG_NEXT_TURN
2580 <<
" at " << nextTurn.first <<
"m." << std::endl;
2595 const double va =
MAX2(NUMERICAL_EPS, cfModel.
freeSpeed(
this,
getSpeed(), distToArrival, arrivalSpeed));
2597 if (lastLink !=
nullptr) {
2606 || (opposite && (*link)->getViaLaneOrLane()->getParallelOpposite() ==
nullptr
2609 if (lastLink !=
nullptr) {
2617 #ifdef DEBUG_PLAN_MOVE
2619 std::cout <<
" braking for link end lane=" << lane->
getID() <<
" seen=" << seen
2625 lfLinks.emplace_back(v, seen);
2629 lateralShift += (*link)->getLateralShift();
2630 const bool yellowOrRed = (*link)->haveRed() || (*link)->haveYellow();
2641 double laneStopOffset;
2647 const bool canBrakeBeforeLaneEnd = seen >= brakeDist;
2651 laneStopOffset = majorStopOffset;
2652 }
else if ((*link)->havePriority()) {
2654 laneStopOffset =
MIN2((*link)->getFoeVisibilityDistance() - POSITION_EPS, majorStopOffset);
2657 laneStopOffset =
MIN2((*link)->getFoeVisibilityDistance() - POSITION_EPS, minorStopOffset);
2659 if (canBrakeBeforeLaneEnd) {
2661 laneStopOffset =
MIN2(laneStopOffset, seen - brakeDist);
2663 laneStopOffset =
MAX2(POSITION_EPS, laneStopOffset);
2664 double stopDist =
MAX2(0., seen - laneStopOffset);
2665 if (newStopDist != std::numeric_limits<double>::max()) {
2666 stopDist =
MAX2(stopDist, newStopDist);
2668 #ifdef DEBUG_PLAN_MOVE
2670 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" effective stopOffset on lane '" << lane->
getID()
2671 <<
"' is " << laneStopOffset <<
" (-> stopDist=" << stopDist <<
")" << std::endl;
2681 mustSeeBeforeReversal = 2 * seen +
getLength();
2683 v =
MIN2(v, vMustReverse);
2686 foundRailSignal |= ((*link)->getTLLogic() !=
nullptr
2691 bool canReverseEventually =
false;
2692 const double vReverse =
checkReversal(canReverseEventually, laneMaxV, seen);
2693 v =
MIN2(v, vReverse);
2694 #ifdef DEBUG_PLAN_MOVE
2696 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" canReverseEventually=" << canReverseEventually <<
" v=" << v <<
"\n";
2709 assert(timeRemaining != 0);
2712 (seen - POSITION_EPS) / timeRemaining);
2713 #ifdef DEBUG_PLAN_MOVE
2715 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" slowing down to finish continuous change before"
2716 <<
" link=" << (*link)->getViaLaneOrLane()->getID()
2717 <<
" timeRemaining=" << timeRemaining
2730 const bool abortRequestAfterMinor = slowedDownForMinor && (*link)->getInternalLaneBefore() ==
nullptr;
2732 bool setRequest = (v >
NUMERICAL_EPS_SPEED && !abortRequestAfterMinor) || (leavingCurrentIntersection);
2734 double stopSpeed = cfModel.
stopSpeed(
this,
getSpeed(), stopDist, stopDecel, MSCFModel::CalcReason::CURRENT_WAIT);
2735 double vLinkWait =
MIN2(v, stopSpeed);
2736 #ifdef DEBUG_PLAN_MOVE
2739 <<
" stopDist=" << stopDist
2740 <<
" stopDecel=" << stopDecel
2741 <<
" vLinkWait=" << vLinkWait
2742 <<
" brakeDist=" << brakeDist
2744 <<
" leaveIntersection=" << leavingCurrentIntersection
2745 <<
" setRequest=" << setRequest
2754 if (yellowOrRed && canBrakeBeforeStopLine && !
ignoreRed(*link, canBrakeBeforeStopLine) && seen >= mustSeeBeforeReversal) {
2761 lfLinks.push_back(
DriveProcessItem(*link, v, vLinkWait,
false, arrivalTime, vLinkWait, 0, seen, -1));
2772 #ifdef DEBUG_PLAN_MOVE
2774 <<
" ignoreRed spent=" <<
STEPS2TIME(t - (*link)->getLastStateChange())
2775 <<
" redSpeed=" << redSpeed
2784 if (lastLink !=
nullptr) {
2787 double arrivalSpeed = vLinkPass;
2793 const double visibilityDistance = (*link)->getFoeVisibilityDistance();
2794 const double determinedFoePresence = seen <= visibilityDistance;
2799 #ifdef DEBUG_PLAN_MOVE
2801 std::cout <<
" approaching link=" << (*link)->getViaLaneOrLane()->getID() <<
" prio=" << (*link)->havePriority() <<
" seen=" << seen <<
" visibilityDistance=" << visibilityDistance <<
" brakeDist=" << brakeDist <<
"\n";
2805 const bool couldBrakeForMinor = !(*link)->havePriority() && brakeDist < seen && !(*link)->lastWasContMajor();
2806 if (couldBrakeForMinor && !determinedFoePresence) {
2811 arrivalSpeed =
MIN2(vLinkPass, maxArrivalSpeed);
2812 slowedDownForMinor =
true;
2813 #ifdef DEBUG_PLAN_MOVE
2815 std::cout <<
" slowedDownForMinor maxSpeedAtVisDist=" << maxSpeedAtVisibilityDist <<
" maxArrivalSpeed=" << maxArrivalSpeed <<
" arrivalSpeed=" << arrivalSpeed <<
"\n";
2821 std::pair<const SUMOVehicle*, const MSLink*> blocker = (*link)->getFirstApproachingFoe(*link);
2824 while (blocker.second !=
nullptr && blocker.second != *link && n > 0) {
2825 blocker = blocker.second->getFirstApproachingFoe(*link);
2833 if (blocker.second == *link) {
2843 if (couldBrakeForMinor && determinedFoePresence && (*link)->getLane()->getEdge().isRoundabout()) {
2844 const bool wasOpened = (*link)->opened(arrivalTime, arrivalSpeed, arrivalSpeed,
2848 nullptr,
false,
this);
2850 slowedDownForMinor =
true;
2852 #ifdef DEBUG_PLAN_MOVE
2854 std::cout <<
" slowedDownForMinor at roundabout=" << (!wasOpened) <<
"\n";
2861 double arrivalSpeedBraking = 0;
2862 const double bGap = cfModel.
brakeGap(v);
2868 arrivalSpeedBraking =
MIN2(arrivalSpeedBraking, arrivalSpeed);
2877 const double estimatedLeaveSpeed =
MIN2((*link)->getViaLaneOrLane()->getVehicleMaxSpeed(
this),
2880 arrivalTime, arrivalSpeed,
2881 arrivalSpeedBraking,
2882 seen, estimatedLeaveSpeed));
2883 if ((*link)->getViaLane() ==
nullptr) {
2884 hadNonInternal =
true;
2887 #ifdef DEBUG_PLAN_MOVE
2889 std::cout <<
" checkAbort setRequest=" << setRequest <<
" v=" << v <<
" seen=" << seen <<
" dist=" << dist
2890 <<
" seenNonInternal=" << seenNonInternal
2891 <<
" seenInternal=" << seenInternal <<
" length=" << vehicleLength <<
"\n";
2895 if ((!setRequest || v <= 0 || seen > dist) && hadNonInternal && seenNonInternal >
MAX2(vehicleLength *
CRLL_LOOK_AHEAD, vehicleLength + seenInternal) && foundRailSignal) {
2899 lane = (*link)->getViaLaneOrLane();
2902 laneMaxV = std::numeric_limits<double>::max();
2910 #ifdef DEBUG_PLAN_MOVE
2912 std::cout <<
" laneMaxV=" << laneMaxV <<
" freeSpeed=" << va <<
" v=" << v <<
"\n";
2922 if (leaderLane ==
nullptr) {
2929 lastLink = &lfLinks.back();
2938 #ifdef PARALLEL_STOPWATCH
2962 const double s = timeDist.second;
2969 const double radicand = 4 * t * t * b * b - 8 * s * b;
2970 const double x = radicand >= 0 ? t * b - sqrt(radicand) * 0.5 : vSlowDownMin;
2971 double vSlowDown = x < vSlowDownMin ? vSlowDownMin : x;
2972 #ifdef DEBUG_PLAN_MOVE
2974 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" ad=" << arrivalDelay <<
" t=" << t <<
" vsm=" << vSlowDownMin
2975 <<
" r=" << radicand <<
" vs=" << vSlowDown <<
"\n";
3009 const MSLane*
const lane,
double& v,
double& vLinkPass)
const {
3012 ahead.
getSubLanes(
this, latOffset, rightmost, leftmost);
3013 #ifdef DEBUG_PLAN_MOVE
3015 <<
"\nADAPT_TO_LEADERS\nveh=" <<
getID()
3016 <<
" lane=" << lane->
getID()
3017 <<
" latOffset=" << latOffset
3018 <<
" rm=" << rightmost
3019 <<
" lm=" << leftmost
3034 for (
int sublane = rightmost; sublane <= leftmost; ++sublane) {
3036 if (pred !=
nullptr && pred !=
this) {
3039 double gap = (lastLink ==
nullptr
3042 bool oncoming =
false;
3046 gap = (lastLink ==
nullptr
3051 gap = (lastLink ==
nullptr
3060 #ifdef DEBUG_PLAN_MOVE
3062 std::cout <<
" fixedGap=" << gap <<
" predMaxDist=" << predMaxDist <<
"\n";
3072 #ifdef DEBUG_PLAN_MOVE
3074 std::cout <<
" pred=" << pred->
getID() <<
" predLane=" << pred->
getLane()->
getID() <<
" predPos=" << pred->
getPositionOnLane() <<
" gap=" << gap <<
" predBack=" << predBack <<
" seen=" << seen <<
" lane=" << lane->
getID() <<
" myLane=" <<
myLane->
getID() <<
" lastLink=" << (lastLink ==
nullptr ?
"NULL" : lastLink->
myLink->
getDescription()) <<
" oncoming=" << oncoming <<
"\n";
3077 if (oncoming && gap >= 0) {
3080 adaptToLeader(std::make_pair(pred, gap), seen, lastLink, v, vLinkPass);
3090 double& v,
double& vLinkPass)
const {
3093 ahead.
getSubLanes(
this, latOffset, rightmost, leftmost);
3094 #ifdef DEBUG_PLAN_MOVE
3096 <<
"\nADAPT_TO_LEADERS_DISTANCE\nveh=" <<
getID()
3097 <<
" latOffset=" << latOffset
3098 <<
" rm=" << rightmost
3099 <<
" lm=" << leftmost
3103 for (
int sublane = rightmost; sublane <= leftmost; ++sublane) {
3106 if (pred !=
nullptr && pred !=
this) {
3107 #ifdef DEBUG_PLAN_MOVE
3109 std::cout <<
" pred=" << pred->
getID() <<
" predLane=" << pred->
getLane()->
getID() <<
" predPos=" << pred->
getPositionOnLane() <<
" gap=" << predDist.second <<
"\n";
3122 double& v,
double& vLinkPass)
const {
3123 if (leaderInfo.first != 0) {
3125 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3127 std::cout <<
" foe ignored\n";
3133 double vsafeLeader = 0;
3135 vsafeLeader = -std::numeric_limits<double>::max();
3137 bool backOnRoute =
true;
3138 if (leaderInfo.second < 0 && lastLink !=
nullptr && lastLink->
myLink !=
nullptr) {
3139 backOnRoute =
false;
3144 if (leaderInfo.first->getBackLane() == current) {
3148 if (lane == current) {
3151 if (leaderInfo.first->getBackLane() == lane) {
3156 #ifdef DEBUG_PLAN_MOVE
3158 std::cout <<
SIMTIME <<
" current=" << current->
getID() <<
" leaderBackLane=" << leaderInfo.first->getBackLane()->getID() <<
" backOnRoute=" << backOnRoute <<
"\n";
3162 double stopDist = seen - current->
getLength() - POSITION_EPS;
3171 vsafeLeader = cfModel.
followSpeed(
this,
getSpeed(), leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first);
3173 if (lastLink !=
nullptr) {
3174 const double futureVSafe = cfModel.
followSpeed(
this, lastLink->
accelV, leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first, MSCFModel::CalcReason::FUTURE);
3176 #ifdef DEBUG_PLAN_MOVE
3178 std::cout <<
" vlinkpass=" << lastLink->
myVLinkPass <<
" futureVSafe=" << futureVSafe <<
"\n";
3182 v =
MIN2(v, vsafeLeader);
3183 vLinkPass =
MIN2(vLinkPass, vsafeLeader);
3184 #ifdef DEBUG_PLAN_MOVE
3188 <<
" veh=" <<
getID()
3189 <<
" lead=" << leaderInfo.first->getID()
3190 <<
" leadSpeed=" << leaderInfo.first->getSpeed()
3191 <<
" gap=" << leaderInfo.second
3192 <<
" leadLane=" << leaderInfo.first->getLane()->getID()
3193 <<
" predPos=" << leaderInfo.first->getPositionOnLane()
3196 <<
" vSafeLeader=" << vsafeLeader
3197 <<
" vLinkPass=" << vLinkPass
3207 const MSLane*
const lane,
double& v,
double& vLinkPass,
3208 double distToCrossing)
const {
3209 if (leaderInfo.first != 0) {
3211 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3213 std::cout <<
" junction foe ignored\n";
3219 double vsafeLeader = 0;
3221 vsafeLeader = -std::numeric_limits<double>::max();
3223 if (leaderInfo.second >= 0) {
3224 vsafeLeader = cfModel.
followSpeed(
this,
getSpeed(), leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCurrentApparentDecel(), leaderInfo.first);
3225 }
else if (leaderInfo.first !=
this) {
3229 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3231 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" stopping before junction: lane=" << lane->
getID() <<
" seen=" << seen
3233 <<
" stopDist=" << seen - lane->
getLength() - POSITION_EPS
3234 <<
" vsafeLeader=" << vsafeLeader
3235 <<
" distToCrossing=" << distToCrossing
3240 if (distToCrossing >= 0) {
3243 if (leaderInfo.first ==
this) {
3245 const double vStopCrossing = cfModel.
stopSpeed(
this,
getSpeed(), distToCrossing);
3246 vsafeLeader = vStopCrossing;
3247 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3249 std::cout <<
" breaking for pedestrian distToCrossing=" << distToCrossing <<
" vStop=" << vStop <<
"\n";
3252 }
else if (leaderInfo.second == -std::numeric_limits<double>::max()) {
3254 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3256 std::cout <<
" stop at crossing point for critical leader\n";
3259 vsafeLeader =
MAX2(vsafeLeader, vStop);
3261 const double leaderDistToCrossing = distToCrossing - leaderInfo.second;
3269 vsafeLeader =
MAX2(vsafeLeader,
MIN2(v2, vStop));
3270 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3272 std::cout <<
" driving up to the crossing point (distToCrossing=" << distToCrossing <<
")"
3273 <<
" leaderPastCPTime=" << leaderPastCPTime
3274 <<
" vFinal=" << vFinal
3276 <<
" vStop=" << vStop
3277 <<
" vsafeLeader=" << vsafeLeader <<
"\n";
3282 if (lastLink !=
nullptr) {
3285 v =
MIN2(v, vsafeLeader);
3286 vLinkPass =
MIN2(vLinkPass, vsafeLeader);
3287 #ifdef DEBUG_PLAN_MOVE
3291 <<
" veh=" <<
getID()
3292 <<
" lead=" << leaderInfo.first->getID()
3293 <<
" leadSpeed=" << leaderInfo.first->getSpeed()
3294 <<
" gap=" << leaderInfo.second
3295 <<
" leadLane=" << leaderInfo.first->getLane()->getID()
3296 <<
" predPos=" << leaderInfo.first->getPositionOnLane()
3298 <<
" lane=" << lane->
getID()
3300 <<
" dTC=" << distToCrossing
3302 <<
" vSafeLeader=" << vsafeLeader
3303 <<
" vLinkPass=" << vLinkPass
3313 double& v,
double& vLinkPass)
const {
3314 if (leaderInfo.first != 0) {
3316 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3318 std::cout <<
" oncoming foe ignored\n";
3324 const MSVehicle* lead = leaderInfo.first;
3329 const double gapSum = leaderBrakeGap + egoBrakeGap;
3333 double gap = leaderInfo.second;
3334 if (egoExit + leaderExit < gap) {
3335 gap -= egoExit + leaderExit;
3340 const double freeGap =
MAX2(0.0, gap - gapSum);
3341 const double splitGap =
MIN2(gap, gapSum);
3343 const double gapRatio = gapSum > 0 ? egoBrakeGap / gapSum : 0.5;
3344 const double vsafeLeader = cfModel.
stopSpeed(
this,
getSpeed(), splitGap * gapRatio + egoExit + 0.5 * freeGap);
3345 if (lastLink !=
nullptr) {
3346 const double futureVSafe = cfModel.
stopSpeed(
this, lastLink->
accelV, leaderInfo.second, MSCFModel::CalcReason::FUTURE);
3348 #ifdef DEBUG_PLAN_MOVE
3350 std::cout <<
" vlinkpass=" << lastLink->
myVLinkPass <<
" futureVSafe=" << futureVSafe <<
"\n";
3354 v =
MIN2(v, vsafeLeader);
3355 vLinkPass =
MIN2(vLinkPass, vsafeLeader);
3356 #ifdef DEBUG_PLAN_MOVE
3360 <<
" veh=" <<
getID()
3361 <<
" oncomingLead=" << lead->
getID()
3362 <<
" leadSpeed=" << lead->
getSpeed()
3363 <<
" gap=" << leaderInfo.second
3365 <<
" gapRatio=" << gapRatio
3370 <<
" vSafeLeader=" << vsafeLeader
3371 <<
" vLinkPass=" << vLinkPass
3380 DriveProcessItem*
const lastLink,
double& v,
double& vLinkPass,
double& vLinkWait,
bool& setRequest)
const {
3383 checkLinkLeader(link, lane, seen, lastLink, v, vLinkPass, vLinkWait, setRequest);
3386 if (parallelLink !=
nullptr) {
3387 checkLinkLeader(parallelLink, lane, seen, lastLink, v, vLinkPass, vLinkWait, setRequest,
true);
3396 DriveProcessItem*
const lastLink,
double& v,
double& vLinkPass,
double& vLinkWait,
bool& setRequest,
3397 bool isShadowLink)
const {
3398 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3404 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3409 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
3411 const MSVehicle* leader = (*it).vehAndGap.first;
3412 if (leader ==
nullptr) {
3414 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3416 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" is blocked on link to " << link->
getViaLaneOrLane()->
getID() <<
" by pedestrian. dist=" << it->distToCrossing <<
"\n";
3421 #ifdef DEBUG_PLAN_MOVE
3423 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" is ignoring pedestrian (jmIgnoreJunctionFoeProb)\n";
3428 adaptToJunctionLeader(std::make_pair(
this, -1), seen, lastLink, lane, v, vLinkPass, it->distToCrossing);
3429 }
else if (
isLeader(link, leader, (*it).vehAndGap.second) || (*it).inTheWay()) {
3432 #ifdef DEBUG_PLAN_MOVE
3434 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" is ignoring linkLeader=" << leader->
getID() <<
" (jmIgnoreJunctionFoeProb)\n";
3445 linkLeadersAhead.
addLeader(leader,
false, 0);
3449 #ifdef DEBUG_PLAN_MOVE
3453 <<
" isShadowLink=" << isShadowLink
3454 <<
" lane=" << lane->
getID()
3455 <<
" foe=" << leader->
getID()
3457 <<
" latOffset=" << latOffset
3459 <<
" linkLeadersAhead=" << linkLeadersAhead.
toString()
3464 #ifdef DEBUG_PLAN_MOVE
3466 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" linkLeader=" << leader->
getID() <<
" gap=" << it->vehAndGap.second
3475 if (lastLink !=
nullptr) {
3489 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3491 std::cout <<
" aborting request\n";
3498 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3500 std::cout <<
" aborting previous request\n";
3506 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
3509 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" ignoring leader " << leader->
getID() <<
" gap=" << (*it).vehAndGap.second <<
" dtC=" << (*it).distToCrossing
3519 vLinkWait =
MIN2(vLinkWait, v);
3549 double vSafeZipper = std::numeric_limits<double>::max();
3552 bool canBrakeVSafeMin =
false;
3557 MSLink*
const link = dpi.myLink;
3559 #ifdef DEBUG_EXEC_MOVE
3563 <<
" veh=" <<
getID()
3565 <<
" req=" << dpi.mySetRequest
3566 <<
" vP=" << dpi.myVLinkPass
3567 <<
" vW=" << dpi.myVLinkWait
3568 <<
" d=" << dpi.myDistance
3575 if (link !=
nullptr && dpi.mySetRequest) {
3584 const bool ignoreRedLink =
ignoreRed(link, canBrake) || beyondStopLine;
3585 if (yellow && canBrake && !ignoreRedLink) {
3586 vSafe = dpi.myVLinkWait;
3588 #ifdef DEBUG_CHECKREWINDLINKLANES
3590 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (yellow)\n";
3597 bool opened = (yellow || influencerPrio
3598 || link->
opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
3604 ignoreRedLink,
this));
3607 if (parallelLink !=
nullptr) {
3610 opened = yellow || influencerPrio || (opened && parallelLink->
opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
3614 ignoreRedLink,
this));
3615 #ifdef DEBUG_EXEC_MOVE
3618 <<
" veh=" <<
getID()
3622 <<
" opened=" << opened
3629 #ifdef DEBUG_EXEC_MOVE
3632 <<
" opened=" << opened
3633 <<
" influencerPrio=" << influencerPrio
3636 <<
" isCont=" << link->
isCont()
3637 <<
" ignoreRed=" << ignoreRedLink
3643 double determinedFoePresence = dpi.myDistance <= visibilityDistance;
3644 if (!determinedFoePresence && (canBrake || !yellow)) {
3645 vSafe = dpi.myVLinkWait;
3647 #ifdef DEBUG_CHECKREWINDLINKLANES
3649 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (minor)\n";
3665 vSafeMinDist = dpi.myDistance;
3671 canBrakeVSafeMin = canBrake;
3672 #ifdef DEBUG_EXEC_MOVE
3674 std::cout <<
" vSafeMin=" << vSafeMin <<
" vSafeMinDist=" << vSafeMinDist <<
" canBrake=" << canBrake <<
"\n";
3681 vSafe = dpi.myVLinkPass;
3685 #ifdef DEBUG_CHECKREWINDLINKLANES
3687 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (very slow)\n";
3692 vSafeZipper =
MIN2(vSafeZipper,
3693 link->
getZipperSpeed(
this, dpi.myDistance, dpi.myVLinkPass, dpi.myArrivalTime, &collectFoes));
3694 }
else if (!canBrake
3699 #ifdef DEBUG_EXEC_MOVE
3701 std::cout <<
SIMTIME <<
" too fast to brake for closed link\n";
3704 vSafe = dpi.myVLinkPass;
3706 vSafe = dpi.myVLinkWait;
3708 #ifdef DEBUG_CHECKREWINDLINKLANES
3710 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (closed)\n";
3713 #ifdef DEBUG_EXEC_MOVE
3724 #ifdef DEBUG_EXEC_MOVE
3726 std::cout <<
SIMTIME <<
" resetting junctionEntryTime at junction '" << link->
getJunction()->
getID() <<
"' beause of non-request exitLink\n";
3733 vSafe = dpi.myVLinkWait;
3736 #ifdef DEBUG_CHECKREWINDLINKLANES
3738 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (no request, braking) vSafe=" << vSafe <<
"\n";
3743 #ifdef DEBUG_CHECKREWINDLINKLANES
3745 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (no request, stopping)\n";
3780 #ifdef DEBUG_EXEC_MOVE
3782 std::cout <<
"vSafeMin Problem? vSafe=" << vSafe <<
" vSafeMin=" << vSafeMin <<
" vSafeMinDist=" << vSafeMinDist << std::endl;
3785 if (canBrakeVSafeMin && vSafe <
getSpeed()) {
3791 #ifdef DEBUG_CHECKREWINDLINKLANES
3793 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" haveToWait (vSafe=" << vSafe <<
" < vSafeMin=" << vSafeMin <<
")\n";
3811 vSafe =
MIN2(vSafe, vSafeZipper);
3821 std::cout <<
SIMTIME <<
" MSVehicle::processTraCISpeedControl() for vehicle '" <<
getID() <<
"'"
3822 <<
" vSafe=" << vSafe <<
" (init)vNext=" << vNext <<
" keepStopping=" <<
keepStopping();
3831 vMin =
MAX2(0., vMin);
3840 std::cout <<
" (processed)vNext=" << vNext << std::endl;
3850 #ifdef DEBUG_ACTIONSTEPS
3852 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" removePassedDriveItems()\n"
3853 <<
" Current items: ";
3855 if (j.myLink == 0) {
3856 std::cout <<
"\n Stop at distance " << j.myDistance;
3858 const MSLane* to = j.myLink->getViaLaneOrLane();
3859 const MSLane* from = j.myLink->getLaneBefore();
3860 std::cout <<
"\n Link at distance " << j.myDistance <<
": '"
3861 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
3864 std::cout <<
"\n myNextDriveItem: ";
3871 std::cout <<
"\n Link at distance " <<
myNextDriveItem->myDistance <<
": '"
3872 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
3875 std::cout << std::endl;
3879 #ifdef DEBUG_ACTIONSTEPS
3881 std::cout <<
" Removing item: ";
3882 if (j->myLink == 0) {
3883 std::cout <<
"Stop at distance " << j->myDistance;
3885 const MSLane* to = j->myLink->getViaLaneOrLane();
3886 const MSLane* from = j->myLink->getLaneBefore();
3887 std::cout <<
"Link at distance " << j->myDistance <<
": '"
3888 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
3890 std::cout << std::endl;
3893 if (j->myLink !=
nullptr) {
3894 j->myLink->removeApproaching(
this);
3904 #ifdef DEBUG_ACTIONSTEPS
3906 std::cout <<
SIMTIME <<
" updateDriveItems(), veh='" <<
getID() <<
"' (lane: '" <<
getLane()->
getID() <<
"')\nCurrent drive items:" << std::endl;
3909 <<
" vPass=" << dpi.myVLinkPass
3910 <<
" vWait=" << dpi.myVLinkWait
3911 <<
" linkLane=" << (dpi.myLink == 0 ?
"NULL" : dpi.myLink->getViaLaneOrLane()->getID())
3912 <<
" request=" << dpi.mySetRequest
3915 std::cout <<
" myNextDriveItem's linked lane: " << (
myNextDriveItem->myLink == 0 ?
"NULL" :
myNextDriveItem->myLink->getViaLaneOrLane()->getID()) << std::endl;
3922 const MSLink* nextPlannedLink =
nullptr;
3925 while (i !=
myLFLinkLanes.end() && nextPlannedLink ==
nullptr) {
3926 nextPlannedLink = i->myLink;
3930 if (nextPlannedLink ==
nullptr) {
3932 #ifdef DEBUG_ACTIONSTEPS
3934 std::cout <<
"Found no link-related drive item." << std::endl;
3942 #ifdef DEBUG_ACTIONSTEPS
3944 std::cout <<
"Continuing on planned lane sequence, no update required." << std::endl;
3966 #ifdef DEBUG_ACTIONSTEPS
3968 std::cout <<
"Changed lane. Drive items will be updated along the current lane continuation." << std::endl;
3980 MSLink* newLink =
nullptr;
3982 if (driveItemIt->myLink ==
nullptr) {
3992 #ifdef DEBUG_ACTIONSTEPS
3994 std::cout <<
"Reached end of the new continuation sequence. Erasing leftover link-items." << std::endl;
3998 if (driveItemIt->myLink ==
nullptr) {
4009 const MSLane*
const target = *bestLaneIt;
4013 if (link->getLane() == target) {
4019 if (newLink == driveItemIt->myLink) {
4021 #ifdef DEBUG_ACTIONSTEPS
4023 std::cout <<
"Old and new continuation sequences merge at link\n"
4025 <<
"\nNo update beyond merge required." << std::endl;
4031 #ifdef DEBUG_ACTIONSTEPS
4033 std::cout <<
"lane=" << lane->
getID() <<
"\nUpdating link\n '" << driveItemIt->myLink->getLaneBefore()->getID() <<
"'->'" << driveItemIt->myLink->getViaLaneOrLane()->getID() <<
"'"
4037 newLink->
setApproaching(
this, driveItemIt->myLink->getApproaching(
this));
4038 driveItemIt->myLink->removeApproaching(
this);
4039 driveItemIt->myLink = newLink;
4046 #ifdef DEBUG_ACTIONSTEPS
4048 std::cout <<
"Updated drive items:" << std::endl;
4051 <<
" vPass=" << dpi.myVLinkPass
4052 <<
" vWait=" << dpi.myVLinkWait
4053 <<
" linkLane=" << (dpi.myLink == 0 ?
"NULL" : dpi.myLink->getViaLaneOrLane()->getID())
4054 <<
" request=" << dpi.mySetRequest
4071 brakelightsOn =
true;
4112 #ifdef DEBUG_REVERSE_BIDI
4116 <<
" speedThreshold=" << speedThreshold
4124 <<
" stopOk=" << stopOk
4143 if (remainingRoute < neededFutureRoute) {
4144 #ifdef DEBUG_REVERSE_BIDI
4156 #ifdef DEBUG_REVERSE_BIDI
4167 const double stopPos =
myStops.front().getEndPos(*
this);
4170 if (newPos > stopPos) {
4171 #ifdef DEBUG_REVERSE_BIDI
4176 if (seen >
MAX2(brakeDist, 1.0)) {
4179 #ifdef DEBUG_REVERSE_BIDI
4181 std::cout <<
" train is too long, skipping stop at " << stopPos <<
" cannot be avoided\n";
4195 if (!further->getEdge().isInternal()) {
4196 if (further->getEdge().getBidiEdge() != *(
myCurrEdge + view)) {
4197 #ifdef DEBUG_REVERSE_BIDI
4199 std::cout <<
" noBidi view=" << view <<
" further=" << further->
getID() <<
" furtherBidi=" <<
Named::getIDSecure(further->getEdge().getBidiEdge()) <<
" future=" << (*(
myCurrEdge + view))->getID() <<
"\n";
4206 if (toNext ==
nullptr) {
4211 #ifdef DEBUG_REVERSE_BIDI
4213 std::cout <<
" do not reverse on a red signal\n";
4221 const double stopPos =
myStops.front().getEndPos(*
this);
4223 if (newPos > stopPos) {
4224 #ifdef DEBUG_REVERSE_BIDI
4226 std::cout <<
" reversal would go past stop on further-opposite lane " << further->getBidiLane()->getID() <<
"\n";
4229 if (seen >
MAX2(brakeDist, 1.0)) {
4233 #ifdef DEBUG_REVERSE_BIDI
4235 std::cout <<
" train is too long, skipping stop at " << stopPos <<
" cannot be avoided\n";
4246 #ifdef DEBUG_REVERSE_BIDI
4248 std::cout <<
SIMTIME <<
" seen=" << seen <<
" vReverseOK=" << vMinComfortable <<
"\n";
4252 return vMinComfortable;
4261 passedLanes.push_back(*i);
4263 if (passedLanes.size() == 0 || passedLanes.back() !=
myLane) {
4264 passedLanes.push_back(
myLane);
4267 bool reverseTrain =
false;
4275 #ifdef DEBUG_REVERSE_BIDI
4300 if (link !=
nullptr) {
4306 emergencyReason =
" because it must reverse direction";
4307 approachedLane =
nullptr;
4323 if (link->
haveRed() && !
ignoreRed(link,
false) && !beyondStopLine && !reverseTrain) {
4324 emergencyReason =
" because of a red traffic light";
4328 if (reverseTrain && approachedLane->
isInternal()) {
4336 }
else if (reverseTrain) {
4337 approachedLane = (*(
myCurrEdge + 1))->getLanes()[0];
4345 emergencyReason =
" because there is no connection to the next edge";
4346 approachedLane =
nullptr;
4349 if (approachedLane !=
myLane && approachedLane !=
nullptr) {
4369 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
4385 WRITE_WARNING(
"Vehicle '" +
getID() +
"' could not finish continuous lane change (turn lane) time=" +
4394 passedLanes.push_back(approachedLane);
4399 #ifdef DEBUG_ACTIONSTEPS
4401 std::cout <<
"Updated drive items:" << std::endl;
4404 <<
" vPass=" << (*i).myVLinkPass
4405 <<
" vWait=" << (*i).myVLinkWait
4406 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
4407 <<
" request=" << (*i).mySetRequest
4424 #ifdef DEBUG_EXEC_MOVE
4426 std::cout <<
"\nEXECUTE_MOVE\n"
4428 <<
" veh=" <<
getID()
4436 double vSafe = std::numeric_limits<double>::max();
4438 double vSafeMin = -std::numeric_limits<double>::max();
4441 double vSafeMinDist = 0;
4446 #ifdef DEBUG_ACTIONSTEPS
4448 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"'\n"
4449 " vsafe from processLinkApproaches(): vsafe " << vSafe << std::endl;
4455 #ifdef DEBUG_ACTIONSTEPS
4457 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' skips processLinkApproaches()\n"
4459 <<
"speed: " <<
getSpeed() <<
" -> " << vSafe << std::endl;
4473 double vNext = vSafe;
4492 vNext =
MAX2(vNext, vSafeMin);
4501 #ifdef DEBUG_EXEC_MOVE
4503 std::cout <<
SIMTIME <<
" finalizeSpeed vSafe=" << vSafe <<
" vSafeMin=" << (vSafeMin == -std::numeric_limits<double>::max() ?
"-Inf" :
toString(vSafeMin))
4504 <<
" vNext=" << vNext <<
" (i.e. accel=" <<
SPEED2ACCEL(vNext -
getSpeed()) <<
")" << std::endl;
4521 vNext =
MAX2(vNext, 0.);
4531 if (elecHybridOfVehicle !=
nullptr) {
4533 elecHybridOfVehicle->
setConsum(elecHybridOfVehicle->
consumption(*
this, (vNext - this->getSpeed()) /
TS, vNext));
4537 if (elecHybridOfVehicle->
getConsum() /
TS > maxPower) {
4542 vNext =
MAX2(vNext, 0.);
4544 elecHybridOfVehicle->
setConsum(elecHybridOfVehicle->
consumption(*
this, (vNext - this->getSpeed()) /
TS, vNext));
4562 std::vector<MSLane*> passedLanes;
4566 std::string emergencyReason;
4574 if (emergencyReason ==
"") {
4575 emergencyReason =
TL(
" for unknown reasons");
4577 WRITE_WARNINGF(
TL(
"Vehicle '%' performs emergency stop at the end of lane '%'% (decel=%, offset=%), time=%."),
4588 passedLanes.clear();
4590 #ifdef DEBUG_ACTIONSTEPS
4592 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
"' updates further lanes." << std::endl;
4621 #ifdef DEBUG_ACTIONSTEPS
4623 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
"' skips LCM->prepareStep()." << std::endl;
4631 #ifdef DEBUG_EXEC_MOVE
4639 MSLane* newOpposite =
nullptr;
4641 if (newOppositeEdge !=
nullptr) {
4643 #ifdef DEBUG_EXEC_MOVE
4645 std::cout <<
SIMTIME <<
" newOppositeEdge=" << newOppositeEdge->
getID() <<
" oldLaneOffset=" << oldLaneOffset <<
" leftMost=" << newOppositeEdge->
getNumLanes() - 1 <<
" newOpposite=" <<
Named::getIDSecure(newOpposite) <<
"\n";
4649 if (newOpposite ==
nullptr) {
4652 WRITE_WARNINGF(
TL(
"Unexpected end of opposite lane for vehicle '%' at lane '%', time=%."),
4659 if (oldOpposite !=
nullptr) {
4672 oldLane = oldLaneMaybeOpposite;
4680 return myLane != oldLane;
4691 for (
int i = 0; i < (int)lanes.size(); i++) {
4693 if (i + 1 < (
int)lanes.size()) {
4694 const MSLane*
const to = lanes[i + 1];
4696 for (
MSLink*
const l : lanes[i]->getLinkCont()) {
4697 if ((
internal && l->getViaLane() == to) || (!
internal && l->getLane() == to)) {
4706 std::vector<MSLane*> passedLanes;
4708 if (lanes.size() > 1) {
4711 std::string emergencyReason;
4713 #ifdef DEBUG_EXTRAPOLATE_DEPARTPOS
4715 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" executeFractionalMove dist=" << dist
4716 <<
" passedLanes=" <<
toString(passedLanes) <<
" lanes=" <<
toString(lanes)
4724 if (lanes.size() > 1) {
4726 #ifdef DEBUG_FURTHER
4728 std::cout <<
SIMTIME <<
" leaveLane \n";
4731 (*i)->resetPartialOccupation(
this);
4756 #ifdef DEBUG_EXEC_MOVE
4758 std::cout <<
SIMTIME <<
" updateState() for veh '" <<
getID() <<
"': deltaPos=" << deltaPos
4763 if (decelPlus > 0) {
4767 decelPlus += 2 * NUMERICAL_EPS;
4770 WRITE_WARNINGF(
TL(
"Vehicle '%' performs emergency braking on lane '%' with decel=%, wished=%, severity=%, time=%."),
4805 dev->notifyParking();
4830 const std::vector<MSLane*>& passedLanes) {
4831 #ifdef DEBUG_SETFURTHER
4833 <<
" updateFurtherLanes oldFurther=" <<
toString(furtherLanes)
4834 <<
" oldFurtherPosLat=" <<
toString(furtherLanesPosLat)
4835 <<
" passed=" <<
toString(passedLanes)
4838 for (
MSLane* further : furtherLanes) {
4839 further->resetPartialOccupation(
this);
4840 if (further->getBidiLane() !=
nullptr
4842 further->getBidiLane()->resetPartialOccupation(
this);
4846 std::vector<MSLane*> newFurther;
4847 std::vector<double> newFurtherPosLat;
4850 if (passedLanes.size() > 1) {
4852 std::vector<MSLane*>::const_iterator fi = furtherLanes.begin();
4853 std::vector<double>::const_iterator fpi = furtherLanesPosLat.begin();
4854 for (
auto pi = passedLanes.rbegin() + 1; pi != passedLanes.rend() && backPosOnPreviousLane < 0; ++pi) {
4857 newFurther.push_back(further);
4863 if (fi != furtherLanes.end() && further == *fi) {
4865 newFurtherPosLat.push_back(*fpi);
4873 if (newFurtherPosLat.size() == 0) {
4880 newFurtherPosLat.push_back(newFurtherPosLat.back());
4883 #ifdef DEBUG_SETFURTHER
4885 std::cout <<
SIMTIME <<
" updateFurtherLanes \n"
4886 <<
" further lane '" << further->
getID() <<
"' backPosOnPreviousLane=" << backPosOnPreviousLane
4891 furtherLanes = newFurther;
4892 furtherLanesPosLat = newFurtherPosLat;
4894 furtherLanes.clear();
4895 furtherLanesPosLat.clear();
4897 #ifdef DEBUG_SETFURTHER
4899 <<
" newFurther=" <<
toString(furtherLanes)
4900 <<
" newFurtherPosLat=" <<
toString(furtherLanesPosLat)
4901 <<
" newBackPos=" << backPosOnPreviousLane
4904 return backPosOnPreviousLane;
4910 #ifdef DEBUG_FURTHER
4913 <<
" getBackPositionOnLane veh=" <<
getID()
4915 <<
" cbgP=" << calledByGetPosition
4970 leftLength -= (*i)->getLength();
4983 leftLength -= (*i)->getLength();
4994 auto j = furtherTargetLanes.begin();
4995 while (leftLength > 0 && j != furtherTargetLanes.end()) {
4996 leftLength -= (*i)->getLength();
5027 double seenSpace = -lengthsInFront;
5028 #ifdef DEBUG_CHECKREWINDLINKLANES
5030 std::cout <<
"\nCHECK_REWIND_LINKLANES\n" <<
" veh=" <<
getID() <<
" lengthsInFront=" << lengthsInFront <<
"\n";
5033 bool foundStopped =
false;
5036 for (
int i = 0; i < (int)lfLinks.size(); ++i) {
5039 #ifdef DEBUG_CHECKREWINDLINKLANES
5042 <<
" foundStopped=" << foundStopped;
5044 if (item.
myLink ==
nullptr || foundStopped) {
5045 if (!foundStopped) {
5050 #ifdef DEBUG_CHECKREWINDLINKLANES
5059 if (approachedLane !=
nullptr) {
5062 if (approachedLane ==
myLane) {
5069 #ifdef DEBUG_CHECKREWINDLINKLANES
5071 <<
" approached=" << approachedLane->
getID()
5074 <<
" seenSpace=" << seenSpace
5076 <<
" lengthsInFront=" << lengthsInFront
5083 if (last ==
nullptr || last ==
this) {
5086 seenSpace += approachedLane->
getLength();
5089 #ifdef DEBUG_CHECKREWINDLINKLANES
5095 bool foundStopped2 =
false;
5101 const double oncomingBGap = oncomingVeh->
getBrakeGap(
true);
5104 const double spaceTillOncoming = oncomingGap - oncomingBGap - oncomingMove;
5105 spaceTillLastStanding =
MIN2(spaceTillLastStanding, spaceTillOncoming);
5107 foundStopped =
true;
5109 #ifdef DEBUG_CHECKREWINDLINKLANES
5111 std::cout <<
" oVeh=" << oncomingVeh->
getID()
5112 <<
" oGap=" << oncomingGap
5113 <<
" bGap=" << oncomingBGap
5114 <<
" mGap=" << oncomingMove
5115 <<
" sto=" << spaceTillOncoming;
5120 seenSpace += spaceTillLastStanding;
5121 if (foundStopped2) {
5122 foundStopped =
true;
5127 foundStopped =
true;
5130 #ifdef DEBUG_CHECKREWINDLINKLANES
5132 <<
" approached=" << approachedLane->
getID()
5133 <<
" last=" << last->
getID()
5140 <<
" stls=" << spaceTillLastStanding
5142 <<
" seenSpace=" << seenSpace
5143 <<
" foundStopped=" << foundStopped
5144 <<
" foundStopped2=" << foundStopped2
5151 for (
int i = ((
int)lfLinks.size() - 1); i > 0; --i) {
5155 const bool opened = (item.
myLink !=
nullptr
5156 && (canLeaveJunction || (
5167 #ifdef DEBUG_CHECKREWINDLINKLANES
5170 <<
" canLeave=" << canLeaveJunction
5171 <<
" opened=" << opened
5172 <<
" allowsContinuation=" << allowsContinuation
5173 <<
" foundStopped=" << foundStopped
5176 if (!opened && item.
myLink !=
nullptr) {
5177 foundStopped =
true;
5181 allowsContinuation =
true;
5185 if (allowsContinuation) {
5187 #ifdef DEBUG_CHECKREWINDLINKLANES
5197 int removalBegin = -1;
5198 for (
int i = 0; foundStopped && i < (int)lfLinks.size() && removalBegin < 0; ++i) {
5201 if (item.
myLink ==
nullptr) {
5212 #ifdef DEBUG_CHECKREWINDLINKLANES
5215 <<
" veh=" <<
getID()
5218 <<
" leftSpace=" << leftSpace
5221 if (leftSpace < 0/* && item.myLink->willHaveBlockedFoe()*/) {
5222 double impatienceCorrection = 0;
5229 if (leftSpace < -impatienceCorrection / 10. &&
keepClear(item.
myLink)) {
5238 while (removalBegin < (
int)(lfLinks.size())) {
5240 if (dpi.
myLink ==
nullptr) {
5244 #ifdef DEBUG_CHECKREWINDLINKLANES
5249 if (dpi.
myDistance >= brakeGap + POSITION_EPS) {
5251 if (!dpi.
myLink->
isExitLink() || !lfLinks[removalBegin - 1].mySetRequest) {
5269 if (dpi.myLink !=
nullptr) {
5273 dpi.myLink->setApproaching(
this, dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
5280 if (dpi.myLink !=
nullptr) {
5286 if (parallelLink !=
nullptr) {
5288 parallelLink->
setApproaching(
this, dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
5289 dpi.mySetRequest, dpi.myArrivalSpeedBraking,
getWaitingTime(), dpi.myDistance,
5296 #ifdef DEBUG_PLAN_MOVE
5299 <<
" veh=" <<
getID()
5300 <<
" after checkRewindLinkLanes\n";
5303 <<
" vPass=" << dpi.myVLinkPass
5304 <<
" vWait=" << dpi.myVLinkWait
5305 <<
" linkLane=" << (dpi.myLink == 0 ?
"NULL" : dpi.myLink->getViaLaneOrLane()->getID())
5306 <<
" request=" << dpi.mySetRequest
5307 <<
" atime=" << dpi.myArrivalTime
5330 if (rem->first->getLane() !=
nullptr && rem->second > 0.) {
5332 if (myTraceMoveReminders) {
5333 traceMoveReminder(
"notifyEnter_skipped", rem->first, rem->second,
true);
5338 if (rem->first->notifyEnter(*
this, reason, enteredLane)) {
5340 if (myTraceMoveReminders) {
5341 traceMoveReminder(
"notifyEnter", rem->first, rem->second,
true);
5347 if (myTraceMoveReminders) {
5348 traceMoveReminder(
"notifyEnter", rem->first, rem->second,
false);
5385 if (!onTeleporting) {
5389 assert(oldLane !=
nullptr);
5391 if (link !=
nullptr) {
5435 int deleteFurther = 0;
5436 #ifdef DEBUG_SETFURTHER
5447 if (lane !=
nullptr) {
5450 #ifdef DEBUG_SETFURTHER
5452 std::cout <<
" enterLaneAtLaneChange i=" << i <<
" lane=" <<
Named::getIDSecure(lane) <<
" leftLength=" << leftLength <<
"\n";
5455 if (leftLength > 0) {
5456 if (lane !=
nullptr) {
5472 #ifdef DEBUG_SETFURTHER
5485 #ifdef DEBUG_SETFURTHER
5500 if (deleteFurther > 0) {
5501 #ifdef DEBUG_SETFURTHER
5503 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" shortening myFurtherLanes by " << deleteFurther <<
"\n";
5509 #ifdef DEBUG_SETFURTHER
5524 MSLane* clane = enteredLane;
5526 while (leftLength > 0) {
5530 const MSEdge* fromRouteEdge =
myRoute->getEdges()[routeIndex];
5534 if (ili.lane->getEdge().getNormalBefore() == fromRouteEdge) {
5560 #ifdef DEBUG_SETFURTHER
5568 #ifdef DEBUG_SETFURTHER
5570 std::cout <<
SIMTIME <<
" opposite: resetPartialOccupation " << further->getID() <<
" \n";
5573 further->resetPartialOccupation(
this);
5574 if (further->getBidiLane() !=
nullptr
5576 further->getBidiLane()->resetPartialOccupation(
this);
5628 if (rem->first->notifyLeave(*
this,
myState.
myPos + rem->second, reason, approachedLane)) {
5630 if (myTraceMoveReminders) {
5631 traceMoveReminder(
"notifyLeave", rem->first, rem->second,
true);
5637 if (myTraceMoveReminders) {
5638 traceMoveReminder(
"notifyLeave", rem->first, rem->second,
false);
5658 #ifdef DEBUG_FURTHER
5660 std::cout <<
SIMTIME <<
" leaveLane \n";
5663 further->resetPartialOccupation(
this);
5664 if (further->getBidiLane() !=
nullptr
5666 further->getBidiLane()->resetPartialOccupation(
this);
5677 myStopDist = std::numeric_limits<double>::max();
5684 if (
myStops.front().getSpeed() <= 0) {
5697 if (stop.
busstop !=
nullptr) {
5713 myStopDist = std::numeric_limits<double>::max();
5737 const std::vector<MSVehicle::LaneQ>&
5745 #ifdef DEBUG_BESTLANES
5750 if (startLane ==
nullptr) {
5753 assert(startLane != 0);
5761 assert(startLane != 0);
5762 #ifdef DEBUG_BESTLANES
5764 std::cout <<
" startLaneIsOpposite newStartLane=" << startLane->
getID() <<
"\n";
5775 #ifdef DEBUG_BESTLANES
5777 std::cout <<
" only updateOccupancyAndCurrentBestLane\n";
5788 #ifdef DEBUG_BESTLANES
5790 std::cout <<
" nothing to do on internal\n";
5800 std::vector<LaneQ>& lanes = *it;
5801 assert(lanes.size() > 0);
5802 if (&(lanes[0].lane->getEdge()) == nextEdge) {
5804 std::vector<LaneQ> oldLanes = lanes;
5806 const std::vector<MSLane*>& sourceLanes = startLane->
getEdge().
getLanes();
5807 for (std::vector<MSLane*>::const_iterator it_source = sourceLanes.begin(); it_source != sourceLanes.end(); ++it_source) {
5808 for (std::vector<LaneQ>::iterator it_lane = oldLanes.begin(); it_lane != oldLanes.end(); ++it_lane) {
5809 if ((*it_source)->getLinkCont()[0]->getLane() == (*it_lane).lane) {
5810 lanes.push_back(*it_lane);
5817 for (
int i = 0; i < (int)lanes.size(); ++i) {
5818 if (i + lanes[i].bestLaneOffset < 0) {
5819 lanes[i].bestLaneOffset = -i;
5821 if (i + lanes[i].bestLaneOffset >= (
int)lanes.size()) {
5822 lanes[i].bestLaneOffset = (int)lanes.size() - i - 1;
5824 assert(i + lanes[i].bestLaneOffset >= 0);
5825 assert(i + lanes[i].bestLaneOffset < (
int)lanes.size());
5826 if (lanes[i].bestContinuations[0] != 0) {
5828 lanes[i].bestContinuations.insert(lanes[i].bestContinuations.begin(), (
MSLane*)
nullptr);
5830 if (startLane->
getLinkCont()[0]->getLane() == lanes[i].lane) {
5833 assert(&(lanes[i].lane->getEdge()) == nextEdge);
5837 #ifdef DEBUG_BESTLANES
5839 std::cout <<
" updated for internal\n";
5857 const MSLane* nextStopLane =
nullptr;
5858 double nextStopPos = 0;
5859 bool nextStopIsWaypoint =
false;
5862 nextStopLane = nextStop.
lane;
5867 nextStopEdge = nextStop.
edge;
5869 nextStopIsWaypoint = nextStop.
getSpeed() > 0;
5873 nextStopEdge = (
myRoute->end() - 1);
5877 if (nextStopEdge !=
myRoute->end()) {
5880 nextStopPos =
MAX2(POSITION_EPS,
MIN2((
double)nextStopPos, (
double)(nextStopLane->
getLength() - 2 * POSITION_EPS)));
5883 nextStopPos = (*nextStopEdge)->getLength();
5892 double seenLength = 0;
5893 bool progress =
true;
5897 std::vector<LaneQ> currentLanes;
5898 const std::vector<MSLane*>* allowed =
nullptr;
5899 const MSEdge* nextEdge =
nullptr;
5901 nextEdge = *(ce + 1);
5904 const std::vector<MSLane*>& lanes = (*ce)->getLanes();
5905 for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
5914 q.
allowsContinuation = allowed ==
nullptr || std::find(allowed->begin(), allowed->end(), cl) != allowed->end();
5917 currentLanes.push_back(q);
5920 if (nextStopEdge == ce
5923 if (!nextStopLane->
isInternal() && !continueAfterStop) {
5927 for (std::vector<LaneQ>::iterator q = currentLanes.begin(); q != currentLanes.end(); ++q) {
5928 if (nextStopLane !=
nullptr && normalStopLane != (*q).lane) {
5929 (*q).allowsContinuation =
false;
5930 (*q).length = nextStopPos;
5931 (*q).currentLength = (*q).length;
5938 seenLength += currentLanes[0].lane->getLength();
5940 progress &= (seen <= 4 || seenLength <
MAX2(maxBrakeDist, 3000.0));
5942 progress &= ce !=
myRoute->end();
5952 double bestLength = -1;
5954 int bestThisIndex = 0;
5955 int bestThisMaxIndex = 0;
5958 for (std::vector<LaneQ>::iterator j = last.begin(); j != last.end(); ++j, ++index) {
5959 if ((*j).length > bestLength) {
5960 bestLength = (*j).length;
5961 bestThisIndex = index;
5962 bestThisMaxIndex = index;
5963 }
else if ((*j).length == bestLength) {
5964 bestThisMaxIndex = index;
5968 bool requiredChangeRightForbidden =
false;
5969 int requireChangeToLeftForbidden = -1;
5970 for (std::vector<LaneQ>::iterator j = last.begin(); j != last.end(); ++j, ++index) {
5971 if ((*j).length < bestLength) {
5972 if (abs(bestThisIndex - index) < abs(bestThisMaxIndex - index)) {
5973 (*j).bestLaneOffset = bestThisIndex - index;
5975 (*j).bestLaneOffset = bestThisMaxIndex - index;
5977 if ((*j).bestLaneOffset < 0 && (!(*j).lane->allowsChangingRight(
getVClass())
5978 || !(*j).lane->getParallelLane(-1,
false)->allowsVehicleClass(
getVClass())
5979 || requiredChangeRightForbidden)) {
5981 requiredChangeRightForbidden =
true;
5983 }
else if ((*j).bestLaneOffset > 0 && (!(*j).lane->allowsChangingLeft(
getVClass())
5984 || !(*j).lane->getParallelLane(1,
false)->allowsVehicleClass(
getVClass()))) {
5986 requireChangeToLeftForbidden = (*j).lane->getIndex();
5990 for (
int i = requireChangeToLeftForbidden; i >= 0; i--) {
5993 #ifdef DEBUG_BESTLANES
5995 std::cout <<
" last edge=" << last.front().lane->getEdge().getID() <<
" (bestIndex=" << bestThisIndex <<
" bestMaxIndex=" << bestThisMaxIndex <<
"):\n";
5997 for (std::vector<LaneQ>::iterator j = laneQs.begin(); j != laneQs.end(); ++j) {
5998 std::cout <<
" lane=" << (*j).lane->getID() <<
" length=" << (*j).length <<
" bestOffset=" << (*j).bestLaneOffset <<
"\n";
6005 for (std::vector<std::vector<LaneQ> >::reverse_iterator i =
myBestLanes.rbegin() + 1; i !=
myBestLanes.rend(); ++i) {
6006 std::vector<LaneQ>& nextLanes = (*(i - 1));
6007 std::vector<LaneQ>& clanes = (*i);
6008 MSEdge*
const cE = &clanes[0].lane->getEdge();
6010 double bestConnectedLength = -1;
6011 double bestLength = -1;
6012 for (
const LaneQ& j : nextLanes) {
6013 if (j.lane->isApproachedFrom(cE) && bestConnectedLength < j.length) {
6014 bestConnectedLength = j.length;
6016 if (bestLength < j.length) {
6017 bestLength = j.length;
6021 int bestThisIndex = 0;
6022 int bestThisMaxIndex = 0;
6023 if (bestConnectedLength > 0) {
6025 for (
LaneQ& j : clanes) {
6026 const LaneQ* bestConnectedNext =
nullptr;
6027 if (j.allowsContinuation) {
6028 for (
const LaneQ& m : nextLanes) {
6029 if ((m.lane->allowsVehicleClass(
getVClass()) || m.lane->hadPermissionChanges())
6030 && m.lane->isApproachedFrom(cE, j.lane)) {
6032 bestConnectedNext = &m;
6036 if (bestConnectedNext !=
nullptr) {
6037 if (bestConnectedNext->
length == bestConnectedLength && abs(bestConnectedNext->
bestLaneOffset) < 2) {
6040 j.length += bestConnectedNext->
length;
6048 j.allowsContinuation =
false;
6050 if (clanes[bestThisIndex].length < j.length
6051 || (clanes[bestThisIndex].length == j.length && abs(clanes[bestThisIndex].bestLaneOffset) > abs(j.bestLaneOffset))
6052 || (clanes[bestThisIndex].length == j.length && abs(clanes[bestThisIndex].bestLaneOffset) == abs(j.bestLaneOffset) &&
6055 bestThisIndex = index;
6056 bestThisMaxIndex = index;
6057 }
else if (clanes[bestThisIndex].length == j.length
6058 && abs(clanes[bestThisIndex].bestLaneOffset) == abs(j.bestLaneOffset)
6060 bestThisMaxIndex = index;
6068 for (
const LaneQ& j : clanes) {
6070 if (overheadWireSegmentID !=
"") {
6071 bestThisIndex = index;
6072 bestThisMaxIndex = index;
6080 int bestNextIndex = 0;
6081 int bestDistToNeeded = (int) clanes.size();
6083 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
6084 if ((*j).allowsContinuation) {
6086 for (std::vector<LaneQ>::const_iterator m = nextLanes.begin(); m != nextLanes.end(); ++m, ++nextIndex) {
6087 if ((*m).lane->isApproachedFrom(cE, (*j).lane)) {
6088 if (bestDistToNeeded > abs((*m).bestLaneOffset)) {
6089 bestDistToNeeded = abs((*m).bestLaneOffset);
6090 bestThisIndex = index;
6091 bestThisMaxIndex = index;
6092 bestNextIndex = nextIndex;
6098 clanes[bestThisIndex].length += nextLanes[bestNextIndex].length;
6099 copy(nextLanes[bestNextIndex].bestContinuations.begin(), nextLanes[bestNextIndex].bestContinuations.end(), back_inserter(clanes[bestThisIndex].bestContinuations));
6104 bool requiredChangeRightForbidden =
false;
6105 int requireChangeToLeftForbidden = -1;
6106 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
6107 if ((*j).length < clanes[bestThisIndex].length
6108 || ((*j).length == clanes[bestThisIndex].length && abs((*j).bestLaneOffset) > abs(clanes[bestThisIndex].bestLaneOffset))
6111 if (abs(bestThisIndex - index) < abs(bestThisMaxIndex - index)) {
6112 (*j).bestLaneOffset = bestThisIndex - index;
6114 (*j).bestLaneOffset = bestThisMaxIndex - index;
6118 (*j).length = (*j).currentLength;
6120 if ((*j).bestLaneOffset < 0 && (!(*j).lane->allowsChangingRight(
getVClass())
6121 || !(*j).lane->getParallelLane(-1,
false)->allowsVehicleClass(
getVClass())
6122 || requiredChangeRightForbidden)) {
6124 requiredChangeRightForbidden =
true;
6125 if ((*j).length == (*j).currentLength) {
6128 }
else if ((*j).bestLaneOffset > 0 && (!(*j).lane->allowsChangingLeft(
getVClass())
6129 || !(*j).lane->getParallelLane(1,
false)->allowsVehicleClass(
getVClass()))) {
6131 requireChangeToLeftForbidden = (*j).lane->getIndex();
6134 (*j).bestLaneOffset = 0;
6137 for (
int idx = requireChangeToLeftForbidden; idx >= 0; idx--) {
6138 if (clanes[idx].length == clanes[idx].currentLength) {
6139 clanes[idx].length = 0;
6147 if (overheadWireID !=
"") {
6148 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
6149 (*j).bestLaneOffset = bestThisIndex - index;
6154 #ifdef DEBUG_BESTLANES
6156 std::cout <<
" edge=" << cE->
getID() <<
" (bestIndex=" << bestThisIndex <<
" bestMaxIndex=" << bestThisMaxIndex <<
"):\n";
6157 std::vector<LaneQ>& laneQs = clanes;
6158 for (std::vector<LaneQ>::iterator j = laneQs.begin(); j != laneQs.end(); ++j) {
6159 std::cout <<
" lane=" << (*j).lane->getID() <<
" length=" << (*j).length <<
" bestOffset=" << (*j).bestLaneOffset <<
" allowCont=" << (*j).allowsContinuation <<
"\n";
6166 #ifdef DEBUG_BESTLANES
6177 if (bestConnectedNext ==
nullptr) {
6194 if (conts.size() < 2) {
6197 const MSLink*
const link = conts[0]->getLinkTo(conts[1]);
6198 if (link !=
nullptr) {
6210 std::vector<LaneQ>& currLanes = *
myBestLanes.begin();
6211 std::vector<LaneQ>::iterator i;
6212 for (i = currLanes.begin(); i != currLanes.end(); ++i) {
6213 double nextOccupation = 0;
6214 for (std::vector<MSLane*>::const_iterator j = (*i).bestContinuations.begin() + 1; j != (*i).bestContinuations.end(); ++j) {
6215 nextOccupation += (*j)->getBruttoVehLenSum();
6217 (*i).nextOccupation = nextOccupation;
6218 #ifdef DEBUG_BESTLANES
6220 std::cout <<
" lane=" << (*i).lane->getID() <<
" nextOccupation=" << nextOccupation <<
"\n";
6223 if ((*i).lane == startLane) {
6230 const std::vector<MSLane*>&
6235 return (*myCurrentLaneInBestLanes).bestContinuations;
6239 const std::vector<MSLane*>&
6251 if ((*i).lane == lane) {
6252 return (*i).bestContinuations;
6258 const std::vector<const MSLane*>
6260 std::vector<const MSLane*> lanes;
6273 while (lane->
isInternal() && (distance > 0.)) {
6274 lanes.insert(lanes.end(), lane);
6276 lane = lane->
getLinkCont().front()->getViaLaneOrLane();
6280 if (contLanes.empty()) {
6283 auto contLanesIt = contLanes.begin();
6285 while (distance > 0.) {
6287 if (contLanesIt != contLanes.end()) {
6290 assert(l->
getEdge().
getID() == (*routeIt)->getLanes().front()->getEdge().getID());
6299 }
else if (routeIt !=
myRoute->end()) {
6301 l = (*routeIt)->getLanes().back();
6307 assert(l !=
nullptr);
6311 while ((internalLane !=
nullptr) && internalLane->
isInternal() && (distance > 0.)) {
6312 lanes.insert(lanes.end(), internalLane);
6314 internalLane = internalLane->
getLinkCont().front()->getViaLaneOrLane();
6316 if (distance <= 0.) {
6320 lanes.insert(lanes.end(), l);
6327 const std::vector<const MSLane*>
6329 std::vector<const MSLane*> lanes;
6331 if (distance <= 0.) {
6343 while (lane->
isInternal() && (distance > 0.)) {
6344 lanes.insert(lanes.end(), lane);
6349 while (distance > 0.) {
6351 MSLane* l = (*routeIt)->getLanes().back();
6355 const MSLane* internalLane = internalEdge !=
nullptr ? internalEdge->
getLanes().front() :
nullptr;
6356 std::vector<const MSLane*> internalLanes;
6357 while ((internalLane !=
nullptr) && internalLane->
isInternal()) {
6358 internalLanes.insert(internalLanes.begin(), internalLane);
6359 internalLane = internalLane->
getLinkCont().front()->getViaLaneOrLane();
6361 for (
auto it = internalLanes.begin(); (it != internalLanes.end()) && (distance > 0.); ++it) {
6362 lanes.insert(lanes.end(), *it);
6363 distance -= (*it)->getLength();
6365 if (distance <= 0.) {
6369 lanes.insert(lanes.end(), l);
6374 if (routeIt !=
myRoute->begin()) {
6385 const std::vector<MSLane*>
6388 std::vector<MSLane*> result;
6389 for (
const MSLane* lane : routeLanes) {
6391 if (opposite !=
nullptr) {
6392 result.push_back(opposite);
6406 return (*myCurrentLaneInBestLanes).bestLaneOffset;
6415 return (*myCurrentLaneInBestLanes).length;
6423 std::vector<MSVehicle::LaneQ>& preb =
myBestLanes.front();
6424 assert(laneIndex < (
int)preb.size());
6425 preb[laneIndex].occupation = density + preb[laneIndex].nextOccupation;
6436 std::pair<const MSLane*, double>
6438 if (distance == 0) {
6443 for (
const MSLane* lane : lanes) {
6444 if (lane->getLength() > distance) {
6445 return std::make_pair(lane, distance);
6447 distance -= lane->getLength();
6449 return std::make_pair(
nullptr, -1);
6455 if (
isOnRoad() && destEdge !=
nullptr) {
6458 return std::numeric_limits<double>::max();
6462 std::pair<const MSVehicle* const, double>
6465 return std::make_pair(
static_cast<const MSVehicle*
>(
nullptr), -1);
6474 MSLane::VehCont::const_iterator it = std::find(vehs.begin(), vehs.end(),
this);
6475 if (it != vehs.end() && it + 1 != vehs.end()) {
6478 if (lead !=
nullptr) {
6479 std::pair<const MSVehicle* const, double> result(
6492 std::pair<const MSVehicle* const, double>
6495 return std::make_pair(
static_cast<const MSVehicle*
>(
nullptr), -1);
6507 std::pair<const MSVehicle* const, double> leaderInfo =
getLeader(-1);
6508 if (leaderInfo.first ==
nullptr ||
getSpeed() == 0) {
6520 if (
myStops.front().triggered &&
myStops.front().numExpectedPerson > 0) {
6521 myStops.front().numExpectedPerson -= (int)
myStops.front().pars.awaitedPersons.count(transportable->
getID());
6524 if (
myStops.front().pars.containerTriggered &&
myStops.front().numExpectedContainer > 0) {
6525 myStops.front().numExpectedContainer -= (int)
myStops.front().pars.awaitedContainers.count(transportable->
getID());
6537 const bool blinkerManoeuvre = (((state &
LCA_SUBLANE) == 0) && (
6545 if ((state &
LCA_LEFT) != 0 && blinkerManoeuvre) {
6547 }
else if ((state &
LCA_RIGHT) != 0 && blinkerManoeuvre) {
6559 switch ((*link)->getDirection()) {
6576 && (
myStops.begin()->reached ||
6579 if (
myStops.begin()->lane->getIndex() > 0 &&
myStops.begin()->lane->getParallelLane(-1)->allowsVehicleClass(
getVClass())) {
6597 if (currentTime % 1000 == 0) {
6677 #ifdef DEBUG_FURTHER
6684 #ifdef DEBUG_FURTHER
6694 for (
int i = 0; i < (int)shadowFurther.size(); ++i) {
6696 if (shadowFurther[i] == lane) {
6721 #ifdef DEBUG_FURTHER
6728 #ifdef DEBUG_FURTHER
6736 #ifdef DEBUG_FURTHER
6743 for (
int i = 0; i < (int)shadowFurther.size(); ++i) {
6744 if (shadowFurther[i] == lane) {
6745 #ifdef DEBUG_FURTHER
6748 <<
" lane=" << lane->
getID()
6762 MSLane* targetLane = furtherTargets[i];
6763 if (targetLane == lane) {
6766 #ifdef DEBUG_TARGET_LANE
6768 std::cout <<
" getLatOffset veh=" <<
getID()
6774 <<
" targetDir=" << targetDir
6775 <<
" latOffset=" << latOffset
6792 assert(offset == 0 || offset == 1 || offset == -1);
6793 assert(
myLane !=
nullptr);
6796 const double halfVehWidth = 0.5 * (
getWidth() + NUMERICAL_EPS);
6799 double leftLimit = halfCurrentLaneWidth - halfVehWidth - oppositeSign * latPos;
6800 double rightLimit = -halfCurrentLaneWidth + halfVehWidth - oppositeSign * latPos;
6801 double latLaneDist = 0;
6803 if (latPos + halfVehWidth > halfCurrentLaneWidth) {
6805 latLaneDist = halfCurrentLaneWidth - latPos - halfVehWidth;
6806 }
else if (latPos - halfVehWidth < -halfCurrentLaneWidth) {
6808 latLaneDist = -halfCurrentLaneWidth - latPos + halfVehWidth;
6810 latLaneDist *= oppositeSign;
6811 }
else if (offset == -1) {
6812 latLaneDist = rightLimit - (
getWidth() + NUMERICAL_EPS);
6813 }
else if (offset == 1) {
6814 latLaneDist = leftLimit + (
getWidth() + NUMERICAL_EPS);
6816 #ifdef DEBUG_ACTIONSTEPS
6819 <<
" veh=" <<
getID()
6820 <<
" halfCurrentLaneWidth=" << halfCurrentLaneWidth
6821 <<
" halfVehWidth=" << halfVehWidth
6822 <<
" latPos=" << latPos
6823 <<
" latLaneDist=" << latLaneDist
6824 <<
" leftLimit=" << leftLimit
6825 <<
" rightLimit=" << rightLimit
6853 if (dpi.myLink !=
nullptr) {
6854 dpi.myLink->removeApproaching(
this);
6872 std::vector<MSLink*>::const_iterator link =
MSLane::succLinkSec(*
this, view, *lane, bestLaneConts);
6874 while (!lane->
isLinkEnd(link) && seen <= dist) {
6876 && (((*link)->getState() ==
LINKSTATE_ZIPPER && seen < (*link)->getFoeVisibilityDistance())
6877 || !(*link)->havePriority())) {
6881 if ((*di).myLink !=
nullptr) {
6882 const MSLane* diPredLane = (*di).myLink->getLaneBefore();
6883 if (diPredLane !=
nullptr) {
6894 const SUMOTime leaveTime = (*link)->getLeaveTime((*di).myArrivalTime, (*di).myArrivalSpeed,
6896 if ((*link)->hasApproachingFoe((*di).myArrivalTime, leaveTime, (*di).myArrivalSpeed,
getCarFollowModel().getMaxDecel())) {
6903 lane = (*link)->getViaLaneOrLane();
6927 centerLine.push_back(lane->getShape().back());
6967 result.push_back(line1[0]);
6968 result.push_back(line2[0]);
6969 result.push_back(line2[1]);
6970 result.push_back(line1[1]);
6973 result.push_back(line1[1]);
6974 result.push_back(line2[1]);
6975 result.push_back(line2[0]);
6976 result.push_back(line1[0]);
6988 if (&(*i)->getEdge() == edge) {
7014 if (destParkArea ==
nullptr) {
7016 errorMsg =
"Vehicle " +
getID() +
" is not driving to a parking area so it cannot be rerouted.";
7029 if (newParkingArea ==
nullptr) {
7030 errorMsg =
"Parking area ID " +
toString(parkingAreaID) +
" not found in the network.";
7043 if (!newDestination) {
7054 if (edgesFromPark.size() > 0) {
7055 edges.insert(edges.end(), edgesFromPark.begin() + 1, edgesFromPark.end());
7058 if (newDestination) {
7069 const bool onInit =
myLane ==
nullptr;
7082 const int numStops = (int)
myStops.size();
7127 if (stop.
busstop !=
nullptr) {
7156 rem.first->notifyStopEnded();
7167 myStopDist = std::numeric_limits<double>::max();
7266 #ifdef DEBUG_IGNORE_RED
7271 if (ignoreRedTime < 0) {
7273 if (ignoreYellowTime > 0 && link->
haveYellow()) {
7277 return !canBrake || ignoreYellowTime > yellowDuration;
7287 #ifdef DEBUG_IGNORE_RED
7291 <<
" ignoreRedTime=" << ignoreRedTime
7292 <<
" spentRed=" << redDuration
7293 <<
" canBrake=" << canBrake <<
"\n";
7297 return !canBrake || ignoreRedTime > redDuration;
7314 if (
id == foe->
getID()) {
7340 if (veh ==
nullptr) {
7367 assert(logic !=
nullptr);
7384 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
7386 std::cout <<
" foeGap=" << foeGap <<
" foeBGap=" << foeBrakeGap <<
"\n";
7390 if (foeGap < foeBrakeGap) {
7399 response = foeEntry->
haveRed();
7414 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
7417 <<
" foeLane=" << foeLane->
getID()
7419 <<
" linkIndex=" << link->
getIndex()
7420 <<
" foeLinkIndex=" << foeLink->
getIndex()
7423 <<
" response=" << response
7424 <<
" response2=" << response2
7432 }
else if (response && response2) {
7438 if (egoET == foeET) {
7442 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
7444 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" equal ET " << egoET <<
" with foe " << veh->
getID()
7445 <<
" foeIsLeaderByID=" << (
getID() < veh->
getID()) <<
"\n";
7450 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
7452 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" equal ET " << egoET <<
" with foe " << veh->
getID()
7462 #ifdef DEBUG_PLAN_MOVE_LEADERINFO
7464 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" egoET " << egoET <<
" with foe " << veh->
getID()
7465 <<
" foeET=" << foeET <<
" isLeader=" << (egoET > foeET) <<
"\n";
7468 return egoET > foeET;
7484 std::vector<std::string> internals;
7503 stop.write(out,
false);
7511 stop.writeParams(out);
7521 dev->saveState(out);
7529 throw ProcessError(
TL(
"Error: Invalid vehicles in state (may be a meso state)!"));
7548 while (pastStops > 0) {
7573 myStops.front().startedFromState =
true;
7582 SUMOTime arrivalTime,
double arrivalSpeed,
7583 double arrivalSpeedBraking,
7584 double dist,
double leaveSpeed) {
7587 arrivalTime, arrivalSpeed, arrivalSpeedBraking, dist, leaveSpeed));
7592 std::shared_ptr<MSSimpleDriverState>
7608 if (prevAcceleration != std::numeric_limits<double>::min()) {
7668 return (myGUIIncrement);
7674 return (myManoeuvreType);
7692 myManoeuvreType = mType;
7707 if (abs(GUIAngle) < 0.1) {
7710 myManoeuvreVehicleID = veh->
getID();
7713 myManoeuvreStartTime = currentTime;
7715 myGUIIncrement = GUIAngle / (
STEPS2TIME(myManoeuvreCompleteTime - myManoeuvreStartTime) /
TS);
7719 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 <<
7720 " endTime=" << myManoeuvreCompleteTime <<
" manoeuvre time=" << myManoeuvreCompleteTime - currentTime <<
" parkArea=" << myManoeuvreStop << std::endl;
7746 if (abs(GUIAngle) < 0.1) {
7750 myManoeuvreVehicleID = veh->
getID();
7753 myManoeuvreStartTime = currentTime;
7755 myGUIIncrement = -GUIAngle / (
STEPS2TIME(myManoeuvreCompleteTime - myManoeuvreStartTime) /
TS);
7762 std::cout <<
"EXIT manoeuvre start: vehicle=" << veh->
getID() <<
" Manoeuvre Angle=" << manoeuverAngle <<
" increment=" <<
RAD2DEG(myGUIIncrement) <<
" currentTime=" << currentTime
7763 <<
" endTime=" << myManoeuvreCompleteTime <<
" manoeuvre time=" << myManoeuvreCompleteTime - currentTime <<
" parkArea=" << myManoeuvreStop << std::endl;
7781 if (configureEntryManoeuvre(veh)) {
7798 if (checkType != myManoeuvreType) {
7822 std::pair<double, double>
7826 if (lane ==
nullptr) {
7837 travelTime += (*it)->getMinimumTravelTime(
this);
7838 dist += (*it)->getLength();
7843 dist += stopEdgeDist;
7850 const double d = dist;
7856 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))))
7857 + pow((a * vs), 2))))) * 0.5) + (c * b)) / (b + a));
7861 double timeLossAccel = 0;
7862 double timeLossDecel = 0;
7863 double timeLossLength = 0;
7865 double v =
MIN2(maxVD, (*it)->getVehicleMaxSpeed(
this));
7867 if (edgeLength <= len && v0Stable && v0 < v) {
7868 const double lengthDist =
MIN2(len, edgeLength);
7869 const double dTL = lengthDist / v0 - lengthDist / v;
7871 timeLossLength += dTL;
7873 if (edgeLength > len) {
7874 const double dv = v - v0;
7877 const double dTA = dv / a - dv * (v + v0) / (2 * a * v);
7879 timeLossAccel += dTA;
7881 }
else if (dv < 0) {
7883 const double dTD = -dv / b + dv * (v + v0) / (2 * b * v0);
7885 timeLossDecel += dTD;
7894 const double dv = v - v0;
7897 const double dTA = dv / a - dv * (v + v0) / (2 * a * v);
7899 timeLossAccel += dTA;
7901 }
else if (dv < 0) {
7903 const double dTD = -dv / b + dv * (v + v0) / (2 * b * v0);
7905 timeLossDecel += dTD;
7907 const double result = travelTime + timeLossAccel + timeLossDecel + timeLossLength;
7910 return {
MAX2(0.0, result), dist};
7971 return nextInternal ? nextInternal : nextNormal;
7983 bool resultInternal;
7986 if (furtherIndex % 2 == 0) {
7987 routeIndex -= (furtherIndex + 0) / 2;
7988 resultInternal =
false;
7990 routeIndex -= (furtherIndex + 1) / 2;
7991 resultInternal =
false;
7994 if (furtherIndex % 2 != 0) {
7995 routeIndex -= (furtherIndex + 1) / 2;
7996 resultInternal =
false;
7998 routeIndex -= (furtherIndex + 2) / 2;
7999 resultInternal =
true;
8003 routeIndex -= furtherIndex;
8004 resultInternal =
false;
8007 if (routeIndex >= 0) {
8008 if (resultInternal) {
8011 for (
MSLink* link : cand->getLinkCont()) {
8012 if (link->getLane() == current) {
8013 if (link->getViaLane() !=
nullptr) {
8014 return link->getViaLane();
8016 return const_cast<MSLane*
>(link->getLaneBefore());
8022 return myRoute->getEdges()[routeIndex]->getLanes()[0];
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::shared_ptr< const MSRoute > ConstMSRoutePtr
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
@ RAIL_CARGO
render as a cargo train
@ PASSENGER_VAN
render as a van
@ PASSENGER
render as a passenger vehicle
@ RAIL_CAR
render as a (city) rail without locomotive
@ PASSENGER_HATCHBACK
render as a hatchback passenger vehicle ("Fliessheck")
@ BUS_FLEXIBLE
render as a flexible city bus
@ TRUCK_1TRAILER
render as a transport vehicle with one trailer
@ PASSENGER_SEDAN
render as a sedan passenger vehicle ("Stufenheck")
@ PASSENGER_WAGON
render as a wagon passenger vehicle ("Combi")
@ TRUCK_SEMITRAILER
render as a semi-trailer transport vehicle ("Sattelschlepper")
@ SVC_RAIL_CLASSES
classes which drive on tracks
@ SVC_EMERGENCY
public emergency vehicles
const int VEHPARS_CFMODEL_PARAMS_SET
@ GIVEN
The lane is given.
@ GIVEN
The speed is given.
@ SPLIT_FRONT
depart position for a split vehicle is in front of the continuing vehicle
@ 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_CF_IGNORE_IDS
@ SUMO_ATTR_JM_STOPLINE_GAP
@ SUMO_ATTR_JM_DRIVE_AFTER_RED_TIME
@ SUMO_ATTR_JM_DRIVE_AFTER_YELLOW_TIME
@ SUMO_ATTR_CF_IGNORE_TYPES
@ SUMO_ATTR_JM_IGNORE_JUNCTION_FOE_PROB
@ SUMO_ATTR_STATE
The state of a link.
@ SUMO_ATTR_JM_DRIVE_RED_SPEED
int gPrecision
the precision for floating point outputs
bool gDebugFlag1
global utility flags for debugging
const double INVALID_DOUBLE
invalid double
const double SUMO_const_laneWidth
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
#define SOFT_ASSERT(expr)
define SOFT_ASSERT raise an assertion in debug mode everywhere except on the windows test server
double 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
virtual void resetSpeedLat()
double getManeuverDist() const
Returns the remaining unblocked distance for the current maneuver. (only used by sublane model)
int getLaneChangeDirection() const
return the direction of the current lane change maneuver
virtual void prepareStep()
void resetChanged()
reset the flag whether a vehicle already moved to false
MSLane * getShadowLane() const
Returns the lane the vehicle's shadow is on during continuous/sublane lane change.
virtual void saveState(OutputDevice &out) const
Save the state of the laneChangeModel.
void endLaneChangeManeuver(const MSMoveReminder::Notification reason=MSMoveReminder::NOTIFICATION_LANE_CHANGE)
const std::vector< MSLane * > & getShadowFurtherLanes() const
void setNoShadowPartialOccupator(MSLane *lane)
SUMOTime remainingTime() const
Compute the remaining time until LC completion.
void setShadowApproachingInformation(MSLink *link) const
set approach information for the shadow vehicle
const std::vector< MSLane * > & getFurtherTargetLanes() const
static MSAbstractLaneChangeModel * build(LaneChangeModel lcm, MSVehicle &vehicle)
Factory method for instantiating new lane changing models.
void changedToOpposite()
called when a vehicle changes between lanes in opposite directions
int getShadowDirection() const
return the direction in which the current shadow lane lies
virtual void loadState(const SUMOSAXAttributes &attrs)
Loads the state of the laneChangeModel from the given attributes.
double calcAngleOffset()
return the angle offset during a continuous change maneuver
void setPreviousAngleOffset(const double angleOffset)
set the angle offset of the previous time step
MSLane * getTargetLane() const
Returns the lane the vehicle has committed to enter during a sublane lane change.
virtual void resetState()
double getAngleOffset() const
return the angle offset resulting from lane change and sigma
bool isChangingLanes() const
return true if the vehicle currently performs a lane change maneuver
void removeShadowApproachingInformation() const
void setExtraImpatience(double value)
Sets routing behavior.
The base class for microscopic and mesoscopic vehicles.
double getMaxSpeed() const
Returns the maximum speed (the minimum of desired and technical maximum speed)
bool haveValidStopEdges(bool silent=false) const
check whether all stop.edge MSRouteIterators are valid and in order
virtual bool isSelected() const
whether this vehicle is selected in the GUI
std::list< MSStop > myStops
The vehicle's list of stops.
double getImpatience() const
Returns this vehicles impatience.
const std::vector< MSTransportable * > & getPersons() const
retrieve riding persons
virtual void initDevices()
const MSEdge * succEdge(int nSuccs) const
Returns the nSuccs'th successor of edge the vehicle is currently at.
void calculateArrivalParams(bool onInit)
(Re-)Calculates the arrival position and lane from the vehicle parameters
virtual double getArrivalPos() const
Returns this vehicle's desired arrivalPos for its current route (may change on reroute)
MSVehicleType * myType
This vehicle's type.
MoveReminderCont myMoveReminders
Currently relevant move reminders.
double myDepartPos
The real depart position.
const std::list< MSStop > & getStops() const
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)
double getChosenSpeedFactor() const
Returns the precomputed factor by which the driver wants to be faster than the speed limit.
std::vector< MSVehicleDevice * > myDevices
The devices this vehicle has.
virtual void addTransportable(MSTransportable *transportable)
Adds a person or container to this vehicle.
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.
MSParkingArea * getCurrentParkingArea()
get the current parking area stop or nullptr
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
int getPersonNumber() const
Returns the number of persons.
MSRouteIterator myCurrEdge
Iterator to current route-edge.
bool hasDeparted() const
Returns whether this vehicle has already departed.
ConstMSRoutePtr myRoute
This vehicle's route.
double getWidth() const
Returns the vehicle's width.
MSDevice_Transportable * myContainerDevice
The containers this vehicle may have.
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 MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
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.
MSParkingArea * getNextParkingArea()
get the upcoming parking area stop or nullptr
int myArrivalLane
The destination lane where the vehicle stops.
SUMOTime myDeparture
The real departure time.
bool isStoppedTriggered() const
Returns whether the vehicle is on a triggered stop.
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.
virtual bool addTraciStop(SUMOVehicleParameter::Stop stop, std::string &errorMsg)
int getRoutePosition() const
return index of edge within route
bool replaceParkingArea(MSParkingArea *parkingArea, std::string &errorMsg)
replace the current parking area stop with a new stop with merge duration
static const SUMOTime NOT_YET_DEPARTED
bool myAmRegisteredAsWaiting
Whether this vehicle is registered as waiting for a person or container (for deadlock-recognition)
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT() const
EnergyParams * myEnergyParams
The emission parameters this vehicle may have.
const SUMOVehicleParameter * myParameter
This vehicle's parameter.
int myRouteValidity
status of the current vehicle route
virtual bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
const MSRoute & getRoute() const
Returns the current route.
bool isStopped() const
Returns whether the vehicle is at a stop.
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists, nullptr otherwise.
int myNumberReroutes
The number of reroutings.
double myArrivalPos
The position on the destination lane where the vehicle stops.
virtual void saveState(OutputDevice &out)
Saves the (common) state of a vehicle.
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 ...
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 VehicleVariables * createVehicleVariables() const
Returns model specific values which are stored inside a vehicle and must be used with casting.
double getApparentDecel() const
Get the vehicle type's apparent deceleration [m/s^2] (the one regarded by its followers.
double getMaxAccel() const
Get the vehicle type's maximum acceleration [m/s^2].
double brakeGap(const double speed) const
Returns the distance the vehicle needs to halt including driver's reaction time tau (i....
virtual double maximumLaneSpeedCF(const MSVehicle *const veh, double maxSpeed, double maxSpeedLane) const
Returns the maximum velocity the CF-model wants to achieve in the next step.
double maximumSafeStopSpeed(double gap, double decel, double currentSpeed, bool onInsertion=false, double headway=-1, bool relaxEmergency=true) const
Returns the maximum next velocity for stopping within gap.
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
double getMinimalArrivalSpeedEuler(double dist, double currentSpeed) const
Computes the minimal possible arrival speed after covering a given distance for Euler update.
virtual double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0, const CalcReason usage=CalcReason::CURRENT) const =0
Computes the vehicle's follow speed (no dawdling)
double stopSpeed(const MSVehicle *const veh, const double speed, double gap, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
virtual double getHeadwayTime() const
Get the driver's desired headway [s].
The ToC Device controls transition of control between automated and manual driving.
std::shared_ptr< MSSimpleDriverState > getDriverState() const
return internal state
void update()
update internal state
A device which collects info on the vehicle trip (mainly on departure and arrival)
double consumption(SUMOVehicle &veh, double a, double newSpeed)
return energy consumption in Wh (power multiplied by TS)
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()
A device which collects info on the vehicle trip (mainly on departure and arrival)
void cancelCurrentCustomers()
remove the persons the taxi is currently waiting for from reservations
bool notifyMove(SUMOTrafficObject &veh, double oldPos, double newPos, double newSpeed)
Checks whether the vehicle is at a stop and transportable action is needed.
bool anyLeavingAtStop(const MSStop &stop) const
void transferAtSplitOrJoin(MSBaseVehicle *otherVeh)
transfers transportables that want to continue in the other train part (without boarding/loading dela...
void checkCollisionForInactive(MSLane *l)
trigger collision checking for inactive lane
A road/street connecting two junctions.
const MSEdge * getOppositeEdge() const
Returns the opposite direction edge if on exists else a nullptr.
bool isFringe() const
return whether this edge is at the fringe of the network
const MSEdge * getNormalSuccessor() const
if this edge is an internal edge, return its first normal successor, otherwise the edge itself
const std::vector< MSLane * > * allowedLanes(const MSEdge &destination, SUMOVehicleClass vclass=SVC_IGNORING, bool ignoreTransientPermissions=false) const
Get the allowed lanes to reach the destination-edge.
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersons() const
Returns this edge's persons set.
bool isNormal() const
return whether this edge is an internal edge
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
double getSpeedLimit() const
Returns the speed limit of the edge @caution The speed limit of the first lane is retured; should pro...
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 MSJunction * getToJunction() const
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 MSEdge * getBidiEdge() const
return opposite superposable/congruent edge, if it exist and 0 else
const MSEdgeVector & getSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Returns the following edges, restricted by vClass.
static bool gModelParkingManoeuver
whether parking simulation includes manoeuver time and any associated lane blocking
static bool gUseStopStarted
static SUMOTime gStartupWaitThreshold
The minimum waiting time before applying startupDelay.
static double gTLSYellowMinDecel
The minimum deceleration at a yellow traffic light (only overruled by emergencyDecel)
static double gLateralResolution
static bool gSemiImplicitEulerUpdate
static bool 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
threshold for warning about strong deceleration
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
void add(SUMOVehicle *veh)
Adds a single vehicle for departure.
virtual const MSJunctionLogic * getLogic() const
virtual const MSLogicJunction::LinkBits & getResponseFor(int linkIndex) const
Returns the response for the given link.
Representation of a lane in the micro simulation.
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
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)
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
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.
std::vector< StopWatch< std::chrono::nanoseconds > > & getStopWatch()
const MSEdge * getNextNormal() const
Returns the lane's follower if it is an internal lane, the edge of the lane otherwise.
SVCPermissions getPermissions() const
Returns the vehicle class permissions for this lane.
MSLane * getCanonicalPredecessorLane() const
double getLength() const
Returns the lane's length.
double getMaximumBrakeDist() const
compute maximum braking distance on this lane
const MSLane * getInternalFollowingLane(const MSLane *const) const
returns the internal lane leading to the given lane or nullptr, if there is none
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
const std::vector< IncomingLaneInfo > & getIncomingLanes() 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
MSEdge & getEdge() const
Returns the lane's edge.
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 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
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
const std::vector< MSMoveReminder * > & getMoveReminders() const
Return the list of this lane's move reminders.
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.
MSVehicle * getFirstFullVehicle() const
returns the first vehicle for which this lane is responsible or 0
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
virtual const PositionVector & getShape(bool) 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
LinkState getState() const
Returns the current state of the link.
MSLane * getViaLane() const
Returns the following inner lane.
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.
MSLane * getViaLaneOrLane() const
return the via lane if it exists and the lane otherwise
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.
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
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
double getLateralShift() const
return lateral shift that must be applied when passing this link
const MSTrafficLightLogic * getTLLogic() const
Returns the TLS index.
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
MSJunction * getJunction() const
double getZipperSpeed(const MSVehicle *ego, const double dist, double vSafe, SUMOTime arrivalTime, const BlockingFoes *foes) const
return the speed at which ego vehicle must approach the zipper link
MSLink * getOppositeDirectionLink() const
return the link that is the opposite entry link to this one
LinkDirection getDirection() const
Returns the direction the vehicle passing this link take.
bool keepClear() const
whether the junction after this link must be kept clear
const MSLane * getInternalLaneBefore() const
return myInternalLaneBefore (always 0 when compiled without internal lanes)
bool haveRed() const
Returns whether this link is blocked by a red (or redyellow) traffic light.
Something on a lane to be noticed about vehicle movement.
Notification
Definition of a vehicle state.
@ NOTIFICATION_TELEPORT_ARRIVED
The vehicle was teleported out of the net.
@ NOTIFICATION_PARKING_REROUTE
The vehicle needs another parking area.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NOTIFICATION_LANE_CHANGE
The vehicle changes lanes (micro only)
@ NOTIFICATION_VAPORIZED_VAPORIZER
The vehicle got vaporized with a vaporizer.
@ NOTIFICATION_JUNCTION
The vehicle arrived at a junction.
@ NOTIFICATION_PARKING
The vehicle starts or ends parking.
@ NOTIFICATION_VAPORIZED_COLLISION
The vehicle got removed by a collision.
@ NOTIFICATION_LOAD_STATE
The vehicle has been loaded from a state file.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
@ NOTIFICATION_TELEPORT_CONTINUATION
The vehicle continues being teleported past an edge.
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.
MSVehicleControl & getVehicleControl()
Returns the vehicle 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.
MSEdgeControl & getEdgeControl()
Returns the edge control.
bool hasContainers() const
Returns whether containers are simulated.
MSInsertionControl & getInsertionControl()
Returns the insertion control.
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.
virtual MSTransportableControl & getPersonControl()
Returns the person 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 MSEdge * getLastEdge() const
returns the destination edge
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
const ConstMSEdgeVector & getEdges() const
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
bool startedFromState
whether the 'started' value was loaded from simulaton state
MSStoppingPlace * chargingStation
(Optional) charging station if one is assigned to the stop
SUMOTime duration
The stopping duration.
SUMOTime getUntil() const
return until / ended time
const SUMOVehicleParameter::Stop pars
The stop parameter.
MSStoppingPlace * busstop
(Optional) bus stop if one is assigned to the stop
static MSStopOut * getInstance()
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)
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 registerEmergencyBraking()
register emergency stop
void removeVType(const MSVehicleType *vehType)
void registerOneWaiting()
increases the count of vehicles waiting for a transport to allow recognition of person / container re...
void unregisterOneWaiting()
decreases the count of vehicles waiting for a transport to allow recognition of person / container re...
void registerStopStarted()
register emergency stop
Abstract in-vehicle device.
Representation of a vehicle in the micro simulation.
void setManoeuvreType(const MSVehicle::ManoeuvreType mType)
accessor function to myManoeuvre equivalent
TraciLaneChangePriority
modes for prioritizing traci lane change requests
double getRightSideOnEdge(const MSLane *lane=0) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
bool wasRemoteControlled(SUMOTime lookBack=DELTA_T) const
Returns the information whether the vehicle is fully controlled via TraCI within the lookBack time.
void processLinkApproaches(double &vSafe, double &vSafeMin, double &vSafeMinDist)
This method iterates through the driveprocess items for the vehicle and adapts the given in/out param...
const MSLane * getPreviousLane(const MSLane *current, int &furtherIndex) const
void checkLinkLeader(const MSLink *link, const MSLane *lane, double seen, DriveProcessItem *const lastLink, double &v, double &vLinkPass, double &vLinkWait, bool &setRequest, bool isShadowLink=false) const
checks for link leaders on the given link
void checkRewindLinkLanes(const double lengthsInFront, DriveItemVector &lfLinks) const
runs heuristic for keeping the intersection clear in case of downstream jamming
bool willStop() const
Returns whether the vehicle will stop on the current edge.
bool hasDriverState() const
Whether this vehicle is equipped with a MSDriverState.
static int nextLinkPriority(const std::vector< MSLane * > &conts)
get a numerical value for the priority of the upcoming link
double getTimeGapOnLane() const
Returns the time gap in seconds to the leader of the vehicle on the same lane.
void updateBestLanes(bool forceRebuild=false, const MSLane *startLane=0)
computes the best lanes to use in order to continue the route
bool myAmIdling
Whether the vehicle is trying to enter the network (eg after parking so engine is running)
SUMOTime myWaitingTime
The time the vehicle waits (is not faster than 0.1m/s) in seconds.
double getStopDelay() const
Returns the public transport stop delay in seconds.
double computeAngle() const
compute the current vehicle angle
double myTimeLoss
the time loss in seconds due to driving with less than maximum speed
SUMOTime myLastActionTime
Action offset (actions are taken at time myActionOffset + N*getActionStepLength()) Initialized to 0,...
ConstMSEdgeVector::const_iterator getRerouteOrigin() const
Returns the starting point for reroutes (usually the current edge)
bool hasArrivedInternal(bool oppositeTransformed=true) const
Returns whether this vehicle has already arived (reached the arrivalPosition on its final edge) metho...
double getFriction() const
Returns the current friction on the road as perceived by the friction device.
bool ignoreFoe(const SUMOTrafficObject *foe) const
decide whether a given foe object may be ignored
void boardTransportables(MSStop &stop)
board persons and load transportables at the given stop
const std::vector< const MSLane * > getUpcomingLanesUntil(double distance) const
Returns the upcoming (best followed by default 0) sequence of lanes to continue the route starting at...
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
void adaptLaneEntering2MoveReminder(const MSLane &enteredLane)
Adapts the vehicle's entering of a new lane.
void addTransportable(MSTransportable *transportable)
Adds a person or container to this vehicle.
SUMOTime myJunctionConflictEntryTime
double getLeftSideOnEdge(const MSLane *lane=0) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
PositionVector getBoundingPoly(double offset=0) const
get bounding polygon
void setTentativeLaneAndPosition(MSLane *lane, double pos, double posLat=0)
set tentative lane and position during insertion to ensure that all cfmodels work (some of them requi...
bool brakeForOverlap(const MSLink *link, const MSLane *lane) const
handle with transitions
const std::vector< MSLane * > & getFurtherLanes() const
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 cleanupFurtherLanes()
remove vehicle from further lanes (on leaving the network)
void adaptToLeaders(const MSLeaderInfo &ahead, double latOffset, const double seen, DriveProcessItem *const lastLink, const MSLane *const lane, double &v, double &vLinkPass) const
static bool betterContinuation(const LaneQ *bestConnectedNext, const LaneQ &m)
comparison between different continuations from the same lane
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.
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.
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
bool isFrontOnLane(const MSLane *lane) const
Returns the information whether the front of the vehicle is on the given lane.
virtual ~MSVehicle()
Destructor.
void processLaneAdvances(std::vector< MSLane * > &passedLanes, std::string &emergencyReason)
This method checks if the vehicle has advanced over one or several lanes along its route and triggers...
MSAbstractLaneChangeModel & getLaneChangeModel()
void setEmergencyBlueLight(SUMOTime currentTime)
sets the blue flashing light for emergency vehicles
bool isActionStep(SUMOTime t) const
Returns whether the next simulation step will be an action point for the vehicle.
MSAbstractLaneChangeModel * myLaneChangeModel
Position getPositionAlongBestLanes(double offset) const
Return the (x,y)-position, which the vehicle would reach if it continued along its best continuation ...
bool hasValidRouteStart(std::string &msg)
checks 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.
MSLane * getMutableLane() const
Returns the lane the vehicle is on Non const version indicates that something volatile is going 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)
void planMoveInternal(const SUMOTime t, MSLeaderInfo ahead, DriveItemVector &lfLinks, double &myStopDist, std::pair< double, const MSLink * > &myNextTurn) const
std::pair< double, const MSLink * > myNextTurn
the upcoming turn for the vehicle
double getDistanceToLeaveJunction() const
get the distance from the start of this lane to the start of the next normal lane (or 0 if this lane ...
int influenceChangeDecision(int state)
allow TraCI to influence a lane change decision
double getMaxSpeedOnLane() const
Returns the maximal speed for the vehicle on its current lane (including speed factor and deviation,...
bool isRemoteControlled() const
Returns the information whether the vehicle is fully controlled via TraCI.
bool myAmOnNet
Whether the vehicle is on the network (not parking, teleported, vaporized, or arrived)
void enterLaneAtMove(MSLane *enteredLane, bool onTeleporting=false)
Update when the vehicle enters a new lane in the move step.
void adaptBestLanesOccupation(int laneIndex, double density)
update occupation from MSLaneChanger
std::pair< double, double > estimateTimeToNextStop() const
return time (s) and distance to the next stop
double accelThresholdForWaiting() const
maximum acceleration to consider a vehicle as 'waiting' at low speed
void setAngle(double angle, bool straightenFurther=false)
Set a custom vehicle angle in rad, optionally updates furtherLanePosLat.
std::vector< LaneQ >::iterator myCurrentLaneInBestLanes
double getDeltaPos(const double accel) const
calculates the distance covered in the next integration step given an acceleration and assuming the c...
const MSLane * myLastBestLanesInternalLane
void updateOccupancyAndCurrentBestLane(const MSLane *startLane)
updates LaneQ::nextOccupation and myCurrentLaneInBestLanes
const std::vector< MSLane * > getUpstreamOppositeLanes() const
Returns the sequence of opposite lanes corresponding to past lanes.
WaitingTimeCollector myWaitingTimeCollector
void setRemoteState(Position xyPos)
sets position outside the road network
void fixPosition()
repair errors in vehicle position after changing between internal edges
double getAcceleration() const
Returns the vehicle's acceleration in m/s (this is computed as the last step's mean acceleration in c...
double getSpeedWithoutTraciInfluence() const
Returns the uninfluenced velocity.
PositionVector getBoundingBox(double offset=0) const
get bounding rectangle
ManoeuvreType
flag identifying which, if any, manoeuvre is in progress
@ MANOEUVRE_ENTRY
Manoeuvre into stopping place.
@ MANOEUVRE_NONE
not manouevring
@ MANOEUVRE_EXIT
Manoeuvre out of stopping place.
const MSEdge * getNextEdgePtr() const
returns the next edge (possibly an internal edge)
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
void setBrakingSignals(double vNext)
sets the braking lights on/off
const std::vector< MSLane * > & getBestLanesContinuation() const
Returns the best sequence of lanes to continue the route starting at myLane.
const MSEdge * myLastBestLanesEdge
bool ignoreCollision() const
whether this vehicle is except from collision checks
Influencer * myInfluencer
An instance of a velocity/lane influencing instance; built in "getInfluencer".
void saveState(OutputDevice &out)
Saves the states of a vehicle.
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
void planMove(const SUMOTime t, const MSLeaderInfo &ahead, const double lengthsInFront)
Compute safe velocities for the upcoming lanes based on positions and speeds from the last time step....
bool resumeFromStopping()
int getBestLaneOffset() const
void adaptToJunctionLeader(const std::pair< const MSVehicle *, double > leaderInfo, const double seen, DriveProcessItem *const lastLink, const MSLane *const lane, double &v, double &vLinkPass, double distToCrossing=-1) const
double lateralDistanceToLane(const int offset) const
Get the minimal lateral distance required to move fully onto the lane at given offset.
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
void resetActionOffset(const SUMOTime timeUntilNextAction=0)
Resets the action offset for the vehicle.
std::vector< DriveProcessItem > DriveItemVector
Container for used Links/visited Lanes during planMove() and executeMove.
void interpolateLateralZ(Position &pos, double offset, double posLat) const
perform lateral z interpolation in elevated networks
void setBlinkerInformation()
sets the blue flashing light for emergency vehicles
const MSEdge * getCurrentEdge() const
Returns the edge the vehicle is currently at (possibly an internal edge or nullptr)
void adaptToLeaderDistance(const MSLeaderDistanceInfo &ahead, double latOffset, double seen, DriveProcessItem *const lastLink, double &v, double &vLinkPass) const
DriveItemVector::iterator myNextDriveItem
iterator pointing to the next item in myLFLinkLanes
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)
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.
double slowDownForSchedule(double vMinComfortable) const
optionally return an upper bound on speed to stay within the schedule
bool executeMove()
Executes planned vehicle movements with regards to right-of-way.
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
std::pair< const MSLane *, double > getLanePosAfterDist(double distance) const
return lane and position along bestlanes at the given distance
SUMOTime myCollisionImmunity
amount of time for which the vehicle is immune from collisions
bool passingMinor() const
decide whether the vehicle is passing a minor link or has comitted to do so
void updateWaitingTime(double vNext)
Updates the vehicle's waiting time counters (accumulated and consecutive)
void enterLaneAtLaneChange(MSLane *enteredLane)
Update when the vehicle enters a new lane in the laneChange step.
BaseInfluencer & getBaseInfluencer()
Returns the velocity/lane influencer.
Influencer & getInfluencer()
bool isBidiOn(const MSLane *lane) const
whether this vehicle is driving against lane
double getRightSideOnLane() const
Get the lateral position of the vehicles right side on the lane:
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 episode
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
bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
MSVehicle::ManoeuvreType getManoeuvreType() const
accessor function to myManoeuvre equivalent
double checkReversal(bool &canReverse, double speedThreshold=SUMO_const_haltingSpeed, double seen=0) const
void removePassedDriveItems()
Erase passed drive items from myLFLinkLanes (and unregister approaching information for corresponding...
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...
Position validatePosition(Position result, double offset=0) const
ensure that a vehicle-relative position is not invalid
void loadPreviousApproaching(MSLink *link, bool setRequest, SUMOTime arrivalTime, double arrivalSpeed, double arrivalSpeedBraking, double dist, double leaveSpeed)
bool keepClear(const MSLink *link) const
decide whether the given link must be kept clear
bool manoeuvreIsComplete() const
accessor function to myManoeuvre equivalent
double processNextStop(double currentVelocity)
Processes stops, returns the velocity needed to reach the stop.
double myAngle
the angle in radians (
bool ignoreRed(const MSLink *link, bool canBrake) const
decide whether a red (or yellow light) may be ignored
double getPositionOnLane() const
Get the vehicle's position along the lane.
const MSLane * getLane() const
Returns the lane the vehicle is on.
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)
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
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
void adaptToOncomingLeader(const std::pair< const MSVehicle *, double > leaderInfo, DriveProcessItem *const lastLink, double &v, double &vLinkPass) const
State myState
This Vehicles driving state (pos and speed)
double getCenterOnEdge(const MSLane *lane=0) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
void adaptToLeader(const std::pair< const MSVehicle *, double > leaderInfo, double seen, DriveProcessItem *const lastLink, double &v, double &vLinkPass) const
void activateReminders(const MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
"Activates" all current move reminder
double getDistanceToPosition(double destPos, const MSEdge *destEdge) 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].
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.
bool isVehicleSpecific() const
Returns whether this type belongs to a single vehicle only (was modified)
const std::string & getID() const
Returns the name of the vehicle type.
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.
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
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.
bool hasParameter(const std::string &key) const
Returns whether the parameter is set.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
A point in 2D or 3D with translation and scaling methods.
double slopeTo2D(const Position &other) const
returns the slope of the vector pointing from here to the other position (in radians between -M_PI an...
static const Position INVALID
used to indicate that a position is valid
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
void setz(double z)
set position z
double z() const
Returns the z-position.
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position (in radians bet...
double length2D() const
Returns the length.
void append(const PositionVector &v, double sameThreshold=2.0)
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
double slopeDegreeAtOffset(double pos) const
Returns the slope at the given length.
void extrapolate2D(const double val, const bool onlyFirst=false)
extrapolate position vector in two dimensions (Z is ignored)
void scaleRelative(double factor)
enlarges/shrinks the polygon by a factor based at the centroid
PositionVector reverse() const
reverse position vector
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
virtual bool compute(const E *from, const E *to, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into, bool silent=false)=0
Builds the route between the given edges using the minimum effort at the given time The definition of...
virtual double recomputeCosts(const std::vector< const E * > &edges, const V *const v, SUMOTime msTime, double *lengthp=nullptr) const
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
double getFloat(int id) const
Returns the double-value of the named (by its enum-value) attribute.
Representation of a vehicle, person, or container.
virtual double getSpeed() const =0
Returns the object's current speed.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
double speedFactorPremature
the possible speed reduction when a train is ahead of schedule
double getJMParam(const SumoXMLAttr attr, const double defaultValue) const
Returns the named value from the map, or the default if it is not contained there.
Representation of a vehicle.
Definition of vehicle stop (position and duration)
SUMOTime started
the time at which this stop was reached
ParkingType parking
whether the vehicle is removed from the net while stopping
SUMOTime extension
The maximum time extension for boarding / loading.
std::string split
the id of the vehicle (train portion) that splits of upon reaching this stop
double startPos
The stopping position start.
std::string line
the new line id of the trip within a cyclical public transport route
double posLat
the lateral offset when stopping
bool onDemand
whether the stop may be skipped
std::string join
the id of the vehicle (train portion) to which this vehicle shall be joined
SUMOTime until
The time at which the vehicle may continue its journey.
SUMOTime ended
the time at which this stop was ended
double endPos
The stopping position end.
SUMOTime waitUntil
The earliest pickup time for a taxi stop.
std::string tripId
id of the trip within a cyclical public transport route
bool collision
Whether this stop was triggered by a collision.
SUMOTime arrival
The (expected) time at which the vehicle reaches the stop.
SUMOTime duration
The stopping duration.
Structure representing possible vehicle parameter.
int 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
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
static SUMOTime processActionStepLength(double given)
Checks and converts given value for the action step length from seconds to miliseconds assuring it be...
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.