99 #define DEBUG_COND (isSelected()) 102 #define STOPPING_PLACE_OFFSET 0.5 104 #define CRLL_LOOK_AHEAD 5 107 #define DIST_TO_STOPLINE_EXPECT_PRIORITY 1.0 185 if (memorySpan == -1) {
190 if (i->second >= memorySpan) {
191 if (i->first >= memorySpan) {
194 totalWaitingTime += memorySpan - i->first;
197 totalWaitingTime += i->second - i->first;
200 return totalWaitingTime;
207 bool startNewInterval = i == end || (i->first != 0);
218 waitingIntervalList::iterator::difference_type d = std::distance(i, end);
226 }
else if (!startNewInterval) {
244 mySpeedAdaptationStarted(true),
245 myConsiderSafeVelocity(true),
246 myConsiderMaxAcceleration(true),
247 myConsiderMaxDeceleration(true),
248 myRespectJunctionPriority(true),
249 myEmergencyBrakeRedLight(true),
324 speed =
MIN2(speed, vSafe);
327 speed =
MIN2(speed, vMax);
330 speed =
MAX2(speed, vMin);
352 if (destinationLaneIndex < (
int)currentEdge.
getLanes().size()) {
353 if (currentLaneIndex > destinationLaneIndex) {
355 }
else if (currentLaneIndex < destinationLaneIndex) {
379 }
else if ((state & LCA_TRACI) != 0) {
386 state &= ~LCA_WANTS_LANECHANGE_OR_STAY;
394 state &= ~LCA_WANTS_LANECHANGE_OR_STAY;
415 switch (changeRequest) {
484 const bool wasOnRoad = v->
isOnRoad();
564 return busstop->getLastFreePos(veh);
565 }
else if (containerstop != 0) {
566 return containerstop->getLastFreePos(veh);
567 }
else if (parkingarea != 0) {
568 return parkingarea->getLastFreePos(veh);
569 }
else if (chargingStation != 0) {
570 return chargingStation->getLastFreePos(veh);
578 if (parkingarea != 0) {
579 return "parkingArea:" + parkingarea->getID();
580 }
else if (containerstop != 0) {
581 return "containerStop:" + containerstop->getID();
582 }
else if (busstop != 0) {
583 return "busStop:" + busstop->getID();
584 }
else if (chargingStation != 0) {
585 return "chargingStation:" + chargingStation->getID();
587 return "lane:" + lane->getID() +
" pos:" +
toString(pars.endPos);
599 if (containerstop != 0) {
602 if (busstop == 0 && containerstop == 0) {
610 if (pars.until >= 0) {
613 if (pars.triggered) {
616 if (pars.containerTriggered) {
622 if (pars.awaitedPersons.size() > 0) {
625 if (pars.awaitedContainers.size() > 0) {
656 myStopDist(std::numeric_limits<double>::max()),
664 if (!(*myCurrEdge)->isTazConnector()) {
666 if ((*myCurrEdge)->getDepartLane(*
this) == 0) {
667 throw ProcessError(
"Invalid departlane definition for vehicle '" + pars->
id +
"'.");
671 throw ProcessError(
"Vehicle '" + pars->
id +
"' is not allowed to depart on any lane of its first edge.");
676 "' is too high for the vehicle type '" + type->
getID() +
"'.");
688 (*i)->resetPartialOccupation(
this);
710 #ifdef DEBUG_ACTIONSTEPS 712 std::cout <<
SIMTIME <<
" Removing vehicle '" <<
getID() <<
"' (reason: " <<
toString(reason) <<
")" << std::endl;
745 (newCurrEdge + 1) == edges.end() || (*(newCurrEdge + 1)) != &(
myLane->
getOutgoingLanes()[0]->getEdge()))) {
762 if (stopsFromScratch) {
767 for (std::list<Stop>::iterator iter =
myStops.begin(); iter !=
myStops.end();) {
768 if (removeStops && find(
myCurrEdge, edges.end(), &iter->lane->getEdge()) == edges.end()) {
772 iter->edge = find(
myCurrEdge, edges.end(), &iter->lane->getEdge());
778 for (std::vector<SUMOVehicleParameter::Stop>::const_iterator i = newRoute->
getStops().begin(); i != newRoute->
getStops().end(); ++i) {
847 if (!rem->first->notifyMove(*
this, oldPos + rem->second, newPos + rem->second,
MAX2(0., newSpeed))) {
849 if (myTraceMoveReminders) {
850 traceMoveReminder(
"notifyMove", rem->first, rem->second,
false);
856 if (myTraceMoveReminders) {
857 traceMoveReminder(
"notifyMove", rem->first, rem->second,
true);
873 rem->second += oldLaneLength;
877 if (myTraceMoveReminders) {
878 traceMoveReminder(
"adaptedPos", rem->first, rem->second,
true);
911 if (
myStops.begin()->parkingarea != 0) {
912 return myStops.begin()->parkingarea->getVehiclePosition(*
this);
921 if (offset == 0. && !changingLanes) {
936 auto nextBestLane = bestLanes.begin();
959 while (nextBestLane != bestLanes.end() && *nextBestLane == 0) {
964 assert(lane == *nextBestLane);
968 assert(nextBestLane == bestLanes.end() || *nextBestLane != 0);
969 if (nextBestLane == bestLanes.end()) {
996 int furtherIndex = 0;
1025 #ifdef DEBUG_FURTHER 1027 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
" setAngle(" << angle <<
") straightenFurther=" << straightenFurther << std::endl;
1042 if (
myStops.begin()->parkingarea != 0) {
1043 return myStops.begin()->parkingarea->getVehicleAngle(*
this);
1064 double result = (p1 != p2 ? p2.
angleTo2D(p1) :
1069 #ifdef DEBUG_FURTHER 1089 #ifdef DEBUG_FURTHER 1108 errorMsg =
"Vehicle '" +
myParameter->
id +
"' is not allowed to stop on lane '" + stopPar.
lane +
"'.";
1120 if (stopPar.
until != -1) {
1128 std::string stopType =
"stop";
1129 std::string stopID =
"";
1131 stopType =
"busStop";
1134 stopType =
"containerStop";
1137 stopType =
"chargingStation";
1140 stopType =
"parkingArea";
1143 const std::string errorMsgStart = stopID ==
"" ? stopType : stopType +
" '" + stopID +
"'";
1146 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' on lane '" + stopPar.
lane +
"' has an invalid position.";
1150 errorMsg = errorMsgStart +
" on lane '" + stopPar.
lane +
"' is too short for vehicle '" +
myParameter->
id +
"'.";
1154 if (searchStart == 0) {
1161 std::list<Stop>::iterator iter =
myStops.begin();
1164 prevStopEdge =
myStops.back().edge;
1165 prevStopPos =
myStops.back().pars.endPos;
1168 if (prevStopEdge == stop.
edge && prevStopPos > stop.
pars.
endPos) {
1174 while (iter !=
myStops.end() && (iter->edge < stop.
edge ||
1175 (iter->pars.endPos < stop.
pars.
endPos && iter->edge == stop.
edge))) {
1176 prevStopEdge = iter->edge;
1177 prevStopPos = iter->pars.endPos;
1181 int index = stopPar.
index;
1183 prevStopEdge = iter->edge;
1184 prevStopPos = iter->pars.endPos;
1192 (prevStopEdge == stop.
edge && prevStopPos > stop.
pars.
endPos && !collision)
1197 return addStop(stopPar, errorMsg, untilOffset, collision, &next);
1199 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' on lane '" + stopPar.
lane +
"' is not downstream the current route.";
1210 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' on lane '" + stopPar.
lane +
"' is too close to break.";
1218 pos += (*myCurrEdge)->getLength();
1228 return addStop(stopPar, errorMsg, untilOffset, collision, &next);
1230 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' on lane '" + stopPar.
lane +
"' is before departPos.";
1234 if (iter !=
myStops.begin()) {
1235 std::list<Stop>::iterator iter2 = iter;
1238 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' on lane '" + stopPar.
lane +
"' ends earlier than previous stop.";
1249 assert(parkingArea != 0);
1251 errorMsg =
"Vehicle '" +
myParameter->
id +
"' has no stops.";
1257 errorMsg =
"current stop already reached";
1261 errorMsg =
"current stop is not a parkingArea";
1265 errorMsg =
"current stop is the same as the new parking area";
1271 int removeStops = 0;
1274 for (std::list<Stop>::const_iterator iter =
myStops.begin(); iter !=
myStops.end(); ++iter) {
1275 if (duration == 0) {
1276 duration = iter->duration;
1279 if (iter->parkingarea != 0 && iter->parkingarea == parkingArea) {
1280 duration += iter->duration;
1305 while (removeStops > 0) {
1309 const bool result =
addStop(stopPar, errorMsg);
1327 return nextParkingArea;
1379 return currentVelocity;
1384 std::cout <<
"\nPROCESS_NEXT_STOP\n" <<
SIMTIME <<
" vehicle '" <<
getID() <<
"'" << std::endl;
1393 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' reached stop.\n" 1406 for (std::vector<MSTransportable*>::const_iterator i = persons.begin(); i != persons.end(); ++i) {
1417 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' unregisters as waiting for person." << std::endl;
1425 for (std::vector<MSTransportable*>::const_iterator i = containers.begin(); i != containers.end(); ++i) {
1436 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' unregisters as waiting for container." << std::endl;
1444 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' resumes from stopping." << std::endl;
1451 WRITE_WARNING(
"Vehicle '" +
getID() +
"' ignores triggered stop on lane '" + stop.
lane->
getID() +
"' due to capacity constraints.");
1459 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' registers as waiting for person." << std::endl;
1465 WRITE_WARNING(
"Vehicle '" +
getID() +
"' ignores container triggered stop on lane '" + stop.
lane->
getID() +
"' due to capacity constraints.");
1473 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' registers as waiting for container." << std::endl;
1492 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' hasn't reached next stop." << std::endl;
1500 bool useStoppingPlace =
false;
1501 bool fitsOnStoppingPlace =
true;
1503 useStoppingPlace =
true;
1508 fitsOnStoppingPlace =
false;
1513 useStoppingPlace =
true;
1517 fitsOnStoppingPlace =
false;
1524 fitsOnStoppingPlace =
false;
1533 if (
myStops.empty() ||
myStops.front().parkingarea != oldParkingArea) {
1535 return currentVelocity;
1550 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' reached next stop." << std::endl;
1589 return currentVelocity;
1596 for (std::list<Stop>::const_iterator iter =
myStops.begin(); iter !=
myStops.end(); ++iter) {
1597 result.push_back(*iter->edge);
1621 if (timeSinceLastAction == 0) {
1623 timeSinceLastAction = oldActionStepLength;
1625 if (timeSinceLastAction >= newActionStepLength) {
1627 myLastActionTime = now;
1629 SUMOTime timeUntilNextAction = newActionStepLength - timeSinceLastAction;
1638 #ifdef DEBUG_PLAN_MOVE 1643 <<
" veh=" <<
getID()
1652 #ifdef DEBUG_ACTIONSTEPS 1654 std::cout <<
STEPS2TIME(t) <<
" vehicle '" <<
getID() <<
"' skips action." << std::endl;
1661 #ifdef DEBUG_ACTIONSTEPS 1663 std::cout <<
STEPS2TIME(t) <<
" vehicle = '" <<
getID() <<
"' takes action." << std::endl;
1669 #ifdef DEBUG_PLAN_MOVE 1671 DriveItemVector::iterator i;
1674 <<
" vPass=" << (*i).myVLinkPass
1675 <<
" vWait=" << (*i).myVLinkWait
1676 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
1677 <<
" request=" << (*i).mySetRequest
1684 #ifdef DEBUG_PLAN_MOVE 1686 std::cout <<
" after checkRewindLinkLanes\n";
1687 DriveItemVector::iterator i;
1690 <<
" vPass=" << (*i).myVLinkPass
1691 <<
" vWait=" << (*i).myVLinkWait
1692 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
1693 <<
" request=" << (*i).mySetRequest
1694 <<
" atime=" << (*i).myArrivalTime
1695 <<
" atimeB=" << (*i).myArrivalTimeBraking
1710 myStopDist = std::numeric_limits<double>::max();
1718 double v =
MIN2(maxV, laneMaxV);
1731 #ifdef DEBUG_PLAN_MOVE 1733 std::cout <<
" bestLaneConts=" <<
toString(bestLaneConts) <<
"\n";
1736 assert(bestLaneConts.size() > 0);
1737 bool hadNonInternal =
false;
1739 double seenNonInternal = 0;
1743 bool slowedDownForMinor =
false;
1749 #pragma warning(push) 1750 #pragma warning(disable: 4127) // do not warn about constant conditional expression 1754 #pragma warning(pop) 1765 if (leader.first != 0 && leader.first->getLane() == leaderLane && leader.first->getLaneChangeModel().isOpposite()) {
1769 adaptToLeaders(ahead, 0, seen, lastLink, leaderLane, v, vLinkPass);
1770 #ifdef DEBUG_PLAN_MOVE 1772 std::cout <<
"\nv = " << v <<
"\n";
1780 if (shadowLane != 0) {
1784 seen, lastLink, shadowLane, v, vLinkPass);
1789 const double relativePos = lane->
getLength() - seen;
1790 #ifdef DEBUG_PLAN_MOVE 1792 std::cout <<
SIMTIME <<
" adapt to pedestrians on lane=" << lane->
getID() <<
" relPos=" << relativePos <<
"\n";
1797 if (leader.first != 0) {
1799 v =
MIN2(v, stopSpeed);
1800 #ifdef DEBUG_PLAN_MOVE 1802 std::cout <<
SIMTIME <<
" pedLeader=" << leader.first->getID() <<
" dist=" << leader.second <<
" v=" << v <<
"\n";
1815 myStopDist = seen + endPos - lane->
getLength();
1817 if (lastLink != 0) {
1820 v =
MIN2(v, stopSpeed);
1823 #ifdef DEBUG_PLAN_MOVE 1825 std::cout <<
"\n" <<
SIMTIME <<
" next stop: distance = " << myStopDist <<
" requires stopSpeed = " << stopSpeed <<
"\n";
1835 MSLinkCont::const_iterator link =
MSLane::succLinkSec(*
this, view + 1, *lane, bestLaneConts);
1845 if (lastLink != 0) {
1853 ((*link)->getViaLane() == 0
1867 if (lastLink != 0) {
1875 #ifdef DEBUG_PLAN_MOVE 1886 const bool yellowOrRed = (*link)->haveRed() || (*link)->haveYellow();
1898 const double stopDist =
MAX2(0., seen - laneStopOffset);
1908 assert(timeRemaining != 0);
1911 #ifdef DEBUG_PLAN_MOVE 1912 if (
DEBUG_COND) std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" slowing down to finish continuous change before" 1913 <<
" link=" << (*link)->getViaLaneOrLane()->getID()
1914 <<
" timeRemaining=" << timeRemaining
1926 const bool abortRequestAfterMinor = slowedDownForMinor && (*link)->getInternalLaneBefore() == 0;
1928 bool setRequest = (v > 0 && !abortRequestAfterMinor) || (leavingCurrentIntersection);
1932 const bool canBrake = seen >= brakeDist;
1933 #ifdef DEBUG_PLAN_MOVE 1936 <<
" stopDist=" << stopDist
1937 <<
" vLinkWait=" << vLinkWait
1938 <<
" brakeDist=" << brakeDist
1942 if (yellowOrRed && canBrake && !
ignoreRed(*link, canBrake)) {
1954 #ifdef DEBUG_EXEC_MOVE 1956 <<
" ignoreRed spent=" <<
STEPS2TIME(t - (*link)->getLastStateChange())
1957 <<
" redSpeed=" << redSpeed
1966 checkLinkLeader(*link, lane, seen, lastLink, v, vLinkPass, vLinkWait, setRequest);
1969 if (parallelLink != 0) {
1970 checkLinkLeader(parallelLink, lane, seen, lastLink, v, vLinkPass, vLinkWait, setRequest,
true);
1975 if (lastLink != 0) {
1978 double arrivalSpeed = vLinkPass;
1984 double visibilityDistance = (*link)->getFoeVisibilityDistance();
1985 double determinedFoePresence = seen < visibilityDistance;
1990 #ifdef DEBUG_PLAN_MOVE 1992 std::cout <<
" approaching link=" << (*link)->getViaLaneOrLane()->getID() <<
" prio=" << (*link)->havePriority() <<
" seen=" << seen <<
" visibilityDistance=" << visibilityDistance <<
" brakeDist=" << brakeDist <<
"\n";
1996 if (!(*link)->havePriority() && !determinedFoePresence && brakeDist < seen && !(*link)->lastWasContMajor()) {
2001 arrivalSpeed =
MIN2(vLinkPass, maxArrivalSpeed);
2002 slowedDownForMinor =
true;
2003 #ifdef DEBUG_PLAN_MOVE 2005 std::cout <<
" slowedDownForMinor maxArrivalSpeed=" << maxArrivalSpeed <<
" arrivalSpeed=" << arrivalSpeed <<
"\n";
2022 double arrivalSpeedBraking = 0;
2029 arrivalSpeedBraking =
MIN2(arrivalSpeedBraking, arrivalSpeed);
2033 arrivalTimeBraking =
MAX2(arrivalTime, t +
TIME2STEPS(seen / ((v + arrivalSpeedBraking) * 0.5)));
2036 arrivalTime, arrivalSpeed,
2037 arrivalTimeBraking, arrivalSpeedBraking,
2040 if ((*link)->getViaLane() == 0) {
2041 hadNonInternal =
true;
2045 if ((!setRequest || v <= 0 || seen > dist) && hadNonInternal && seenNonInternal > vehicleLength *
CRLL_LOOK_AHEAD) {
2049 lane = (*link)->getViaLaneOrLane();
2058 leaderLane = opposite ? lane->
getOpposite() : lane;
2059 if (leaderLane == 0) {
2065 lastLink = &lfLinks.back();
2080 const MSLane*
const lane,
double& v,
double& vLinkPass)
const {
2083 ahead.
getSubLanes(
this, latOffset, rightmost, leftmost);
2084 #ifdef DEBUG_PLAN_MOVE 2086 <<
"\nADAPT_TO_LEADERS\nveh=" <<
getID()
2087 <<
" lane=" << lane->
getID()
2088 <<
" rm=" << rightmost
2089 <<
" lm=" << leftmost
2103 for (
int sublane = rightmost; sublane <= leftmost; ++sublane) {
2108 const double gap = (lastLink == 0
2111 #ifdef DEBUG_PLAN_MOVE 2113 std::cout <<
" pred=" << pred->
getID() <<
" predLane=" << pred->
getLane()->
getID() <<
" predPos=" << pred->
getPositionOnLane() <<
" gap=" << gap <<
" predBack=" << predBack <<
" seen=" << seen <<
" lane=" << lane->
getID() <<
" myLane=" <<
myLane->
getID() <<
"\n";
2116 adaptToLeader(std::make_pair(pred, gap), seen, lastLink, lane, v, vLinkPass);
2125 const MSLane*
const lane,
double& v,
double& vLinkPass,
2126 double distToCrossing)
const {
2127 if (leaderInfo.first != 0) {
2128 const double vsafeLeader =
getSafeFollowSpeed(leaderInfo, seen, lane, distToCrossing);
2129 if (lastLink != 0) {
2132 v =
MIN2(v, vsafeLeader);
2133 vLinkPass =
MIN2(vLinkPass, vsafeLeader);
2135 #ifdef DEBUG_PLAN_MOVE 2139 <<
" veh=" <<
getID()
2140 <<
" lead=" << leaderInfo.first->getID()
2141 <<
" leadSpeed=" << leaderInfo.first->getSpeed()
2142 <<
" gap=" << leaderInfo.second
2143 <<
" leadLane=" << leaderInfo.first->getLane()->getID()
2144 <<
" predPos=" << leaderInfo.first->getPositionOnLane()
2146 <<
" lane=" << lane->
getID()
2148 <<
" dTC=" << distToCrossing
2150 <<
" vSafeLeader=" << vsafeLeader
2151 <<
" vLinkPass=" << vLinkPass
2160 DriveProcessItem*
const lastLink,
double& v,
double& vLinkPass,
double& vLinkWait,
bool& setRequest,
2161 bool isShadowLink)
const {
2163 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
2165 const MSVehicle* leader = (*it).vehAndGap.first;
2169 adaptToLeader(std::make_pair(
this, -1), seen, lastLink, lane, v, vLinkPass, it->distToCrossing);
2170 }
else if (link->
isLeader(
this, leader)) {
2177 linkLeadersAhead.
addLeader(leader,
false, 0);
2181 #ifdef DEBUG_PLAN_MOVE 2185 <<
" isShadowLink=" << isShadowLink
2186 <<
" lane=" << lane->
getID()
2187 <<
" foe=" << leader->
getID()
2189 <<
" latOffset=" << latOffset
2191 <<
" linkLeadersAhead=" << linkLeadersAhead.
toString()
2196 adaptToLeader(it->vehAndGap, seen, lastLink, lane, v, vLinkPass, it->distToCrossing);
2198 if (lastLink != 0) {
2220 vLinkWait =
MIN2(vLinkWait, v);
2226 const double seen,
const MSLane*
const lane,
double distToCrossing)
const {
2227 assert(leaderInfo.first != 0);
2229 double vsafeLeader = 0;
2231 vsafeLeader = -std::numeric_limits<double>::max();
2233 if (leaderInfo.second >= 0) {
2234 vsafeLeader = cfModel.
followSpeed(
this,
getSpeed(), leaderInfo.second, leaderInfo.first->getSpeed(), leaderInfo.first->getCarFollowModel().getApparentDecel());
2240 if (distToCrossing >= 0) {
2273 double vSafeZipper = std::numeric_limits<double>::max();
2280 MSLink* link = (*i).myLink;
2282 #ifdef DEBUG_EXEC_MOVE 2286 <<
" veh=" <<
getID()
2288 <<
" req=" << (*i).mySetRequest
2289 <<
" vP=" << (*i).myVLinkPass
2290 <<
" vW=" << (*i).myVLinkWait
2291 <<
" d=" << (*i).myDistance
2298 if (link != 0 && (*i).mySetRequest) {
2305 const bool ignoreRedLink =
ignoreRed(link, canBrake);
2306 if (yellow && canBrake && !ignoreRedLink) {
2307 vSafe = (*i).myVLinkWait;
2314 const bool influencerPrio =
false;
2318 std::vector<const SUMOVehicle*> collectFoes;
2319 bool opened = (yellow || influencerPrio
2320 || link->
opened((*i).myArrivalTime, (*i).myArrivalSpeed, (*i).getLeaveSpeed(),
2325 ignoreRedLink,
this));
2328 if (parallelLink != 0) {
2331 opened = yellow || influencerPrio || (opened & parallelLink->
opened((*i).myArrivalTime, (*i).myArrivalSpeed, (*i).getLeaveSpeed(),
2335 ignoreRedLink,
this));
2336 #ifdef DEBUG_EXEC_MOVE 2339 <<
" veh=" <<
getID()
2343 <<
" opened=" << opened
2352 double determinedFoePresence = i->myDistance <= visibilityDistance;
2353 if (!determinedFoePresence) {
2354 vSafe = (*i).myVLinkWait;
2377 vSafe = (*i).myVLinkPass;
2383 vSafeZipper =
MIN2(vSafeZipper,
2384 link->
getZipperSpeed(
this, (*i).myDistance, (*i).myVLinkPass, (*i).myArrivalTime, &collectFoes));
2386 vSafe = (*i).myVLinkWait;
2391 #ifdef DEBUG_EXEC_MOVE 2400 vSafe = (*i).myVLinkWait;
2431 #ifdef DEBUG_EXEC_MOVE 2433 std::cout <<
"vSafeMin Problem?" << std::endl;
2444 vSafe =
MIN2(vSafe, vSafeZipper);
2463 #ifdef DEBUG_ACTIONSTEPS 2465 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" removePassedDriveItems()\n" 2466 <<
" Current items: ";
2468 if (j.myLink == 0) {
2469 std::cout <<
"\n Stop at distance " << j.myDistance;
2471 const MSLane* to = j.myLink->getViaLaneOrLane();
2472 const MSLane* from = j.myLink->getLaneBefore();
2473 std::cout <<
"\n Link at distance " << j.myDistance <<
": '" 2474 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
2477 std::cout <<
"\n myNextDriveItem: ";
2478 if (myLFLinkLanes.size() != 0) {
2484 std::cout <<
"\n Link at distance " <<
myNextDriveItem->myDistance <<
": '" 2485 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
2488 std::cout << std::endl;
2492 #ifdef DEBUG_ACTIONSTEPS 2494 std::cout <<
" Removing item: ";
2495 if (j->myLink == 0) {
2496 std::cout <<
"Stop at distance " << j->myDistance;
2498 const MSLane* to = j->myLink->getViaLaneOrLane();
2499 const MSLane* from = j->myLink->getLaneBefore();
2500 std::cout <<
"Link at distance " << j->myDistance <<
": '" 2501 << (from == 0 ?
"NONE" : from->
getID()) <<
"' -> '" << (to == 0 ?
"NONE" : to->
getID()) <<
"'";
2503 std::cout << std::endl;
2506 if (j->myLink != 0) {
2507 j->myLink->removeApproaching(
this);
2517 #ifdef DEBUG_ACTIONSTEPS 2519 std::cout <<
SIMTIME <<
" updateDriveItems(), veh='" <<
getID() <<
"' (lane: '" <<
getLane()->
getID() <<
"')\nCurrent drive items:" << std::endl;
2520 DriveItemVector::iterator i;
2523 <<
" vPass=" << (*i).myVLinkPass
2524 <<
" vWait=" << (*i).myVLinkWait
2525 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
2526 <<
" request=" << (*i).mySetRequest
2529 std::cout <<
" myNextDriveItem's linkLane: " << (
myNextDriveItem->myLink == 0 ?
"NULL" :
myNextDriveItem->myLink->getViaLaneOrLane()->getID()) << std::endl;
2536 const MSLink* nextPlannedLink = 0;
2540 nextPlannedLink = i->myLink;
2544 if (nextPlannedLink == 0) {
2546 #ifdef DEBUG_ACTIONSTEPS 2548 std::cout <<
"Found no link-related drive item." << std::endl;
2556 #ifdef DEBUG_ACTIONSTEPS 2558 std::cout <<
"Continuing on planned lane sequence, no update required." << std::endl;
2580 #ifdef DEBUG_ACTIONSTEPS 2582 std::cout <<
"Changed lane. Drive items will be updated along the current lane continuation." << std::endl;
2597 if (driveItemIt->myLink == 0) {
2611 #ifdef DEBUG_ACTIONSTEPS 2613 std::cout <<
"Reached end of the new continuation sequence. Erasing leftover link-items." << std::endl;
2617 if (driveItemIt->myLink == 0) {
2630 if (newLink == driveItemIt->myLink) {
2632 #ifdef DEBUG_ACTIONSTEPS 2634 std::cout <<
"Old and new continuation sequences merge at link\n" 2635 <<
"'" << newLink->
getLaneBefore()->
getID() <<
"'->'" << newLink->getViaLaneOrLane()->getID() <<
"'" 2636 <<
"\nNo update beyond merge required." << std::endl;
2642 #ifdef DEBUG_ACTIONSTEPS 2644 std::cout <<
"Updating link\n'" << driveItemIt->myLink->getLaneBefore()->getID() <<
"'->'" << driveItemIt->myLink->getViaLaneOrLane()->getID() <<
"'" 2646 std::cout <<
"\n'" << newLink->getLaneBefore()->getID() <<
"'->'" << newLink->getViaLaneOrLane()->getID() <<
"'" << std::endl;
2649 newLink->setApproaching(
this, driveItemIt->myLink->getApproaching(
this));
2650 driveItemIt->myLink->removeApproaching(
this);
2651 driveItemIt->myLink = newLink;
2652 lane = newLink->getViaLaneOrLane();
2658 #ifdef DEBUG_ACTIONSTEPS 2660 std::cout <<
"Updated drive items:" << std::endl;
2661 DriveItemVector::iterator i;
2664 <<
" vPass=" << (*i).myVLinkPass
2665 <<
" vWait=" << (*i).myVLinkWait
2666 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
2667 <<
" request=" << (*i).mySetRequest
2684 brakelightsOn =
true;
2686 if (brakelightsOn) {
2721 passedLanes.push_back(*i);
2723 if (passedLanes.size() == 0 || passedLanes.back() !=
myLane) {
2724 passedLanes.push_back(
myLane);
2744 emergencyReason =
" because of a red traffic light";
2756 emergencyReason =
" because there is no connection to the next edge";
2761 if (approachedLane !=
myLane && approachedLane != 0) {
2779 WRITE_WARNING(
"Vehicle '" +
getID() +
"' could not finish continuous lane change (turn lane) time=" +
2790 passedLanes.push_back(approachedLane);
2795 #ifdef DEBUG_ACTIONSTEPS 2797 std::cout <<
"Updated drive items:" << std::endl;
2800 <<
" vPass=" << (*i).myVLinkPass
2801 <<
" vWait=" << (*i).myVLinkWait
2802 <<
" linkLane=" << ((*i).myLink == 0 ?
"NULL" : (*i).myLink->getViaLaneOrLane()->getID())
2803 <<
" request=" << (*i).mySetRequest
2820 #ifdef DEBUG_EXEC_MOVE 2821 if (
DEBUG_COND) std::cout <<
"\nEXECUTE_MOVE\n" 2823 <<
" veh=" <<
getID()
2830 double vSafe = std::numeric_limits<double>::max();
2832 double vSafeMin = -std::numeric_limits<double>::max();
2835 double vSafeMinDist = 0;
2840 #ifdef DEBUG_ACTIONSTEPS 2842 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"'\n" 2843 " vsafe from processLinkApproaches(): vsafe " << vSafe << std::endl;
2849 #ifdef DEBUG_ACTIONSTEPS 2851 std::cout <<
SIMTIME <<
" vehicle '" <<
getID() <<
"' skips processLinkApproaches()\n" 2853 <<
"speed: " <<
getSpeed() <<
" -> " << vSafe << std::endl;
2873 #ifdef DEBUG_EXEC_MOVE 2875 std::cout <<
SIMTIME <<
" moveHelper vSafe=" << vSafe <<
" vSafeMin=" << (vSafeMin == -std::numeric_limits<double>::max() ?
"-Inf" :
toString(vSafeMin))
2893 vNext =
MAX2(vNext, 0.);
2910 std::vector<MSLane*> passedLanes;
2914 std::string emergencyReason =
" for unknown reasons";
2923 +
"'" + emergencyReason
2938 passedLanes.clear();
2940 #ifdef DEBUG_ACTIONSTEPS 2942 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
"' updates further lanes." << std::endl;
2967 #ifdef DEBUG_ACTIONSTEPS 2969 std::cout <<
SIMTIME <<
" veh '" <<
getID() <<
"' skips LCM->prepareStep()." << std::endl;
2976 #ifdef DEBUG_EXEC_MOVE 3015 #ifdef DEBUG_EXEC_MOVE 3017 std::cout <<
SIMTIME <<
" updateState() for veh '" <<
getID() <<
"': deltaPos=" << deltaPos
3055 const std::vector<MSLane*>& passedLanes) {
3056 #ifdef DEBUG_FURTHER 3058 <<
" updateFurtherLanes oldFurther=" <<
toString(furtherLanes)
3059 <<
" oldFurtherPosLat=" <<
toString(furtherLanesPosLat)
3060 <<
" passed=" <<
toString(passedLanes)
3063 for (std::vector<MSLane*>::iterator i = furtherLanes.begin(); i != furtherLanes.end(); ++i) {
3064 (*i)->resetPartialOccupation(
this);
3067 std::vector<MSLane*> newFurther;
3068 std::vector<double> newFurtherPosLat;
3070 if (passedLanes.size() > 1) {
3072 std::vector<MSLane*>::const_iterator fi = furtherLanes.begin();
3073 std::vector<double>::const_iterator fpi = furtherLanesPosLat.begin();
3074 for (
auto pi = passedLanes.rbegin() + 1; pi != passedLanes.rend() && backPosOnPreviousLane < 0; ++pi) {
3076 newFurther.push_back(*pi);
3077 backPosOnPreviousLane += (*pi)->setPartialOccupation(
this);
3078 if (fi != furtherLanes.end() && *pi == *fi) {
3080 newFurtherPosLat.push_back(*fpi);
3088 if (newFurtherPosLat.size() == 0) {
3091 newFurtherPosLat.push_back(newFurtherPosLat.back());
3094 #ifdef DEBUG_FURTHER 3096 std::cout <<
SIMTIME <<
" updateFurtherLanes \n" 3097 <<
" further lane '" << (*pi)->getID() <<
"' backPosOnPreviousLane=" << backPosOnPreviousLane
3102 furtherLanes = newFurther;
3103 furtherLanesPosLat = newFurtherPosLat;
3105 furtherLanes.clear();
3106 furtherLanesPosLat.clear();
3108 #ifdef DEBUG_FURTHER 3110 <<
" newFurther=" <<
toString(furtherLanes)
3111 <<
" newFurtherPosLat=" <<
toString(furtherLanesPosLat)
3112 <<
" newBackPos=" << backPosOnPreviousLane
3115 return backPosOnPreviousLane;
3121 #ifdef DEBUG_FURTHER 3124 <<
" getBackPositionOnLane veh=" <<
getID()
3155 leftLength -= (*i)->getLength();
3166 leftLength -= (*i)->getLength();
3177 auto j = furtherTargetLanes.begin();
3178 while (leftLength > 0 && j != furtherTargetLanes.end()) {
3179 leftLength -= (*i)->getLength();
3211 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
3215 && (*i)->isFrontOnLane(l)) {
3216 foundStopped =
true;
3217 const double ret = (*i)->getPositionOnLane() - (*i)->getVehicleType().getLengthWithGap() - lengths;
3221 lengths += (*i)->getVehicleType().getLengthWithGap();
3231 bool hadVehicle =
false;
3232 double seenSpace = -lengthsInFront;
3234 bool foundStopped =
false;
3237 for (
int i = 0; i < (int)lfLinks.size(); ++i) {
3240 if (item.
myLink == 0 || foundStopped) {
3241 if (!foundStopped) {
3251 if (approachedLane != 0) {
3255 if (approachedLane ==
myLane) {
3264 #ifdef DEBUG_CHECKREWINDLINKLANES 3267 <<
" veh=" <<
getID()
3268 <<
" approached=" << approachedLane->
getID()
3271 <<
" seenSpace=" << seenSpace
3273 <<
" lengthsInFront=" << lengthsInFront
3280 if (last == 0 || last ==
this) {
3281 seenSpace += approachedLane->
getLength();
3292 foundStopped =
true;
3294 #ifdef DEBUG_CHECKREWINDLINKLANES 3297 <<
" veh=" <<
getID()
3298 <<
" approached=" << approachedLane->
getID()
3299 <<
" lastPoc=" << last->
getID()
3301 <<
" seenSpace=" << seenSpace
3302 <<
" foundStopped=" << foundStopped
3319 foundStopped =
true;
3322 #ifdef DEBUG_CHECKREWINDLINKLANES 3325 <<
" veh=" <<
getID()
3326 <<
" approached=" << approachedLane->
getID()
3327 <<
" last=" << last->
getID()
3335 <<
" seenSpace=" << seenSpace
3336 <<
" foundStopped=" << foundStopped
3344 for (
int i = ((
int)lfLinks.size() - 1); i > 0; --i) {
3346 const bool canLeaveJunction = item.
myLink->
getViaLane() == 0 || lfLinks[i].mySetRequest;
3354 bool allowsContinuation = item.
myLink == 0 || item.
myLink->
isCont() || !lfLinks[i].hadVehicle || opened;
3355 if (!opened && item.
myLink != 0) {
3359 allowsContinuation =
true;
3363 if (allowsContinuation) {
3369 int removalBegin = -1;
3370 for (
int i = 0; hadVehicle && i < (int)lfLinks.size() && removalBegin < 0; ++i) {
3384 #ifdef DEBUG_CHECKREWINDLINKLANES 3387 <<
" veh=" <<
getID()
3390 <<
" leftSpace=" << leftSpace
3393 if (leftSpace < 0/* && item.myLink->willHaveBlockedFoe()*/) {
3394 double impatienceCorrection = 0;
3401 if (leftSpace < -impatienceCorrection / 10. &&
keepClear(item.
myLink)) {
3409 while (removalBegin < (
int)(lfLinks.size())) {
3411 lfLinks[removalBegin].myVLinkPass = lfLinks[removalBegin].myVLinkWait;
3413 lfLinks[removalBegin].mySetRequest =
false;
3419 for (DriveItemVector::iterator i = lfLinks.begin(); i != lfLinks.end(); ++i) {
3420 if ((*i).myLink != 0) {
3424 (*i).myLink->setApproaching(
this, (*i).myArrivalTime, (*i).myArrivalSpeed, (*i).getLeaveSpeed(),
3425 (*i).mySetRequest, (*i).myArrivalTimeBraking, (*i).myArrivalSpeedBraking,
getWaitingTime(), (*i).myDistance);
3430 for (DriveItemVector::iterator i = lfLinks.begin(); i != lfLinks.end(); ++i) {
3431 if ((*i).myLink != 0) {
3433 if (parallelLink != 0) {
3434 parallelLink->
setApproaching(
this, (*i).myArrivalTime, (*i).myArrivalSpeed, (*i).getLeaveSpeed(),
3435 (*i).mySetRequest, (*i).myArrivalTimeBraking, (*i).myArrivalSpeedBraking,
getWaitingTime(), (*i).myDistance);
3448 if (rem->first->getLane() != 0 && rem->second > 0.) {
3450 if (myTraceMoveReminders) {
3451 traceMoveReminder(
"notifyEnter_skipped", rem->first, rem->second,
true);
3456 if (rem->first->notifyEnter(*
this, reason, enteredLane)) {
3458 if (myTraceMoveReminders) {
3459 traceMoveReminder(
"notifyEnter", rem->first, rem->second,
true);
3465 if (myTraceMoveReminders) {
3466 traceMoveReminder(
"notifyEnter", rem->first, rem->second,
false);
3498 if (!onTeleporting) {
3535 #ifdef DEBUG_FURTHER 3537 std::cout <<
SIMTIME <<
" enterLaneAtLaneChange \n";
3543 #ifdef DEBUG_FURTHER 3545 std::cout <<
SIMTIME <<
" enterLaneAtLaneChange \n";
3548 leftLength -= (lane)->setPartialOccupation(
this);
3556 #ifdef DEBUG_FURTHER 3588 MSLane* clane = enteredLane;
3589 while (leftLength > 0) {
3591 if (clane == 0 || clane ==
myLane) {
3596 leftLength -= (clane)->setPartialOccupation(
this);
3602 #ifdef DEBUG_FURTHER 3604 std::cout <<
SIMTIME <<
" enterLaneAtInsertion \n";
3607 (*i)->resetPartialOccupation(
this);
3626 if (rem->first->notifyLeave(*
this,
myState.
myPos + rem->second, reason, approachedLane)) {
3628 if (myTraceMoveReminders) {
3629 traceMoveReminder(
"notifyLeave", rem->first, rem->second,
true);
3635 if (myTraceMoveReminders) {
3636 traceMoveReminder(
"notifyLeave", rem->first, rem->second,
false);
3646 #ifdef DEBUG_FURTHER 3648 std::cout <<
SIMTIME <<
" leaveLane \n";
3651 (*i)->resetPartialOccupation(
this);
3685 const std::vector<MSVehicle::LaneQ>&
3693 #ifdef DEBUG_BESTLANES 3698 if (startLane == 0) {
3701 assert(startLane != 0);
3706 bool startLaneIsOpposite = (startLane->
isInternal()
3709 if (startLaneIsOpposite) {
3711 assert(startLane != 0);
3731 std::vector<LaneQ>& lanes = *it;
3732 assert(lanes.size() > 0);
3733 if (&(lanes[0].lane->getEdge()) == nextEdge) {
3735 std::vector<LaneQ> oldLanes = lanes;
3737 const std::vector<MSLane*>& sourceLanes = startLane->
getEdge().
getLanes();
3738 for (std::vector<MSLane*>::const_iterator it_source = sourceLanes.begin(); it_source != sourceLanes.end(); ++it_source) {
3739 for (std::vector<LaneQ>::iterator it_lane = oldLanes.begin(); it_lane != oldLanes.end(); ++it_lane) {
3740 if ((*it_source)->getLinkCont()[0]->getLane() == (*it_lane).lane) {
3741 lanes.push_back(*it_lane);
3748 for (
int i = 0; i < (int)lanes.size(); ++i) {
3749 if (i + lanes[i].bestLaneOffset < 0) {
3750 lanes[i].bestLaneOffset = -i;
3752 if (i + lanes[i].bestLaneOffset >= (
int)lanes.size()) {
3753 lanes[i].bestLaneOffset = (int)lanes.size() - i - 1;
3755 assert(i + lanes[i].bestLaneOffset >= 0);
3756 assert(i + lanes[i].bestLaneOffset < (
int)lanes.size());
3757 if (lanes[i].bestContinuations[0] != 0) {
3759 lanes[i].bestContinuations.insert(lanes[i].bestContinuations.begin(), (
MSLane*)0);
3761 if (startLane->
getLinkCont()[0]->getLane() == lanes[i].lane) {
3764 assert(&(lanes[i].lane->getEdge()) == nextEdge);
3777 myLastBestLanesEdge = &startLane->
getEdge();
3782 const MSLane* nextStopLane = 0;
3783 double nextStopPos = 0;
3786 nextStopLane = nextStop.
lane;
3787 nextStopEdge = nextStop.
edge;
3800 nextStopPos += (*nextStopEdge)->getLength();
3806 double seenLength = 0;
3807 bool progress =
true;
3809 std::vector<LaneQ> currentLanes;
3810 const std::vector<MSLane*>* allowed = 0;
3811 const MSEdge* nextEdge = 0;
3813 nextEdge = *(ce + 1);
3816 const std::vector<MSLane*>& lanes = (*ce)->getLanes();
3817 for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
3825 q.
allowsContinuation = allowed == 0 || find(allowed->begin(), allowed->end(), cl) != allowed->end();
3828 currentLanes.push_back(q);
3831 if (nextStopEdge == ce && !nextStopLane->
isInternal()) {
3833 for (std::vector<LaneQ>::iterator q = currentLanes.begin(); q != currentLanes.end(); ++q) {
3834 if (nextStopLane != 0 && nextStopLane != (*q).lane) {
3835 (*q).allowsContinuation =
false;
3836 (*q).length = nextStopPos;
3837 (*q).currentLength = (*q).length;
3844 seenLength += currentLanes[0].lane->getLength();
3846 progress &= (seen <= 4 || seenLength < 3000);
3847 progress &= seen <= 8;
3858 double bestLength = -1;
3859 int bestThisIndex = 0;
3862 for (std::vector<LaneQ>::iterator j = last.begin(); j != last.end(); ++j, ++index) {
3863 if ((*j).length > bestLength) {
3864 bestLength = (*j).length;
3865 bestThisIndex = index;
3869 for (std::vector<LaneQ>::iterator j = last.begin(); j != last.end(); ++j, ++index) {
3870 if ((*j).length < bestLength) {
3871 (*j).bestLaneOffset = bestThisIndex - index;
3875 #ifdef DEBUG_BESTLANES 3877 std::cout <<
" last edge:\n";
3879 for (std::vector<LaneQ>::iterator j = laneQs.begin(); j != laneQs.end(); ++j) {
3880 std::cout <<
" lane=" << (*j).lane->getID() <<
" length=" << (*j).length <<
" bestOffset=" << (*j).bestLaneOffset <<
"\n";
3886 for (std::vector<std::vector<LaneQ> >::reverse_iterator i =
myBestLanes.rbegin() + 1; i !=
myBestLanes.rend(); ++i) {
3887 std::vector<LaneQ>& nextLanes = (*(i - 1));
3888 std::vector<LaneQ>& clanes = (*i);
3889 MSEdge& cE = clanes[0].lane->getEdge();
3891 double bestConnectedLength = -1;
3892 double bestLength = -1;
3893 for (std::vector<LaneQ>::iterator j = nextLanes.begin(); j != nextLanes.end(); ++j, ++index) {
3894 if ((*j).lane->isApproachedFrom(&cE) && bestConnectedLength < (*j).length) {
3895 bestConnectedLength = (*j).length;
3897 if (bestLength < (*j).length) {
3898 bestLength = (*j).length;
3902 int bestThisIndex = 0;
3903 if (bestConnectedLength > 0) {
3905 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
3906 LaneQ bestConnectedNext;
3907 bestConnectedNext.
length = -1;
3908 if ((*j).allowsContinuation) {
3909 for (std::vector<LaneQ>::const_iterator m = nextLanes.begin(); m != nextLanes.end(); ++m) {
3910 if ((*m).lane->isApproachedFrom(&cE, (*j).lane)) {
3911 if (bestConnectedNext.
length < (*m).length || (bestConnectedNext.
length == (*m).length && abs(bestConnectedNext.
bestLaneOffset) > abs((*m).bestLaneOffset))) {
3912 bestConnectedNext = *m;
3916 if (bestConnectedNext.
length == bestConnectedLength && abs(bestConnectedNext.
bestLaneOffset) < 2) {
3917 (*j).
length += bestLength;
3919 (*j).length += bestConnectedNext.
length;
3924 if (clanes[bestThisIndex].length < (*j).length
3925 || (clanes[bestThisIndex].length == (*j).length && abs(clanes[bestThisIndex].bestLaneOffset) > abs((*j).bestLaneOffset))
3926 || (clanes[bestThisIndex].length == (*j).length && abs(clanes[bestThisIndex].bestLaneOffset) == abs((*j).bestLaneOffset) &&
3929 bestThisIndex = index;
3932 #ifdef DEBUG_BESTLANES 3934 std::cout <<
" edge=" << cE.
getID() <<
"\n";
3935 std::vector<LaneQ>& laneQs = clanes;
3936 for (std::vector<LaneQ>::iterator j = laneQs.begin(); j != laneQs.end(); ++j) {
3937 std::cout <<
" lane=" << (*j).lane->getID() <<
" length=" << (*j).length <<
" bestOffset=" << (*j).bestLaneOffset <<
"\n";
3944 int bestNextIndex = 0;
3945 int bestDistToNeeded = (int) clanes.size();
3947 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
3948 if ((*j).allowsContinuation) {
3950 for (std::vector<LaneQ>::const_iterator m = nextLanes.begin(); m != nextLanes.end(); ++m, ++nextIndex) {
3951 if ((*m).lane->isApproachedFrom(&cE, (*j).lane)) {
3952 if (bestDistToNeeded > abs((*m).bestLaneOffset)) {
3953 bestDistToNeeded = abs((*m).bestLaneOffset);
3954 bestThisIndex = index;
3955 bestNextIndex = nextIndex;
3961 clanes[bestThisIndex].length += nextLanes[bestNextIndex].length;
3962 copy(nextLanes[bestNextIndex].bestContinuations.begin(), nextLanes[bestNextIndex].bestContinuations.end(), back_inserter(clanes[bestThisIndex].bestContinuations));
3967 for (std::vector<LaneQ>::iterator j = clanes.begin(); j != clanes.end(); ++j, ++index) {
3968 if ((*j).length < clanes[bestThisIndex].length
3969 || ((*j).length == clanes[bestThisIndex].length && abs((*j).bestLaneOffset) > abs(clanes[bestThisIndex].bestLaneOffset))
3972 (*j).bestLaneOffset = bestThisIndex - index;
3975 (*j).length = (*j).currentLength;
3978 (*j).bestLaneOffset = 0;
3983 #ifdef DEBUG_BESTLANES 3994 if (conts.size() < 2) {
4010 std::vector<LaneQ>& currLanes = *
myBestLanes.begin();
4011 std::vector<LaneQ>::iterator i;
4012 for (i = currLanes.begin(); i != currLanes.end(); ++i) {
4013 double nextOccupation = 0;
4014 for (std::vector<MSLane*>::const_iterator j = (*i).bestContinuations.begin() + 1; j != (*i).bestContinuations.end(); ++j) {
4015 nextOccupation += (*j)->getBruttoVehLenSum();
4017 (*i).nextOccupation = nextOccupation;
4018 if ((*i).lane == startLane) {
4025 const std::vector<MSLane*>&
4030 return (*myCurrentLaneInBestLanes).bestContinuations;
4034 const std::vector<MSLane*>&
4046 if ((*i).lane == lane) {
4047 return (*i).bestContinuations;
4059 return (*myCurrentLaneInBestLanes).bestLaneOffset;
4066 std::vector<MSVehicle::LaneQ>& preb =
myBestLanes.front();
4067 assert(laneIndex < (
int)preb.size());
4068 preb[laneIndex].occupation = density + preb[laneIndex].nextOccupation;
4082 double distance = std::numeric_limits<double>::max();
4083 if (
isOnRoad() && destEdge != NULL) {
4097 std::pair<const MSVehicle* const, double>
4100 return std::make_pair(static_cast<const MSVehicle*>(0), -1);
4108 MSLane::VehCont::const_iterator it = std::find(vehs.begin(), vehs.end(),
this);
4109 if (it != vehs.end() && it + 1 != vehs.end()) {
4113 std::pair<const MSVehicle* const, double> result(
4129 std::pair<const MSVehicle* const, double> leaderInfo =
getLeader(-1);
4130 if (leaderInfo.first == 0 ||
getSpeed() == 0) {
4193 myStops.front().numExpectedPerson -= (int)
myStops.front().pars.awaitedPersons.count(person->
getID());
4194 if (
myStops.front().numExpectedPerson == 0) {
4207 if (
myStops.size() > 0 &&
myStops.front().reached &&
myStops.front().pars.containerTriggered &&
myStops.front().numExpectedContainer > 0) {
4208 myStops.front().numExpectedContainer -= (int)
myStops.front().pars.awaitedContainers.count(container->
getID());
4209 if (
myStops.front().numExpectedContainer == 0) {
4218 const bool isPerson =
dynamic_cast<MSPerson*
>(t) != 0;
4226 const std::vector<MSTransportable*>&
4236 const std::vector<MSTransportable*>&
4264 const bool blinkerManoeuvre = (((state &
LCA_SUBLANE) == 0) && (
4266 if ((state &
LCA_LEFT) != 0 && blinkerManoeuvre) {
4268 }
else if ((state &
LCA_RIGHT) != 0 && blinkerManoeuvre) {
4280 switch ((*link)->getDirection()) {
4303 if (currentTime % 1000 == 0) {
4350 #ifdef DEBUG_FURTHER 4360 for (
int i = 0; i < (int)shadowFurther.size(); ++i) {
4362 if (shadowFurther[i] == lane) {
4383 #ifdef DEBUG_FURTHER 4391 #ifdef DEBUG_FURTHER 4398 for (
int i = 0; i < (int)shadowFurther.size(); ++i) {
4399 if (shadowFurther[i] == lane) {
4400 #ifdef DEBUG_FURTHER 4403 <<
" lane=" << lane->
getID()
4418 MSLane* targetLane = furtherTargets[i];
4419 if (targetLane == lane) {
4422 #ifdef DEBUG_TARGET_LANE 4424 std::cout <<
" getLatOffset veh=" <<
getID()
4430 <<
" targetDir=" << targetDir
4431 <<
" latOffset=" << latOffset
4448 assert(offset == 0 || offset == 1 || offset == -1);
4449 assert(
myLane !=
nullptr);
4454 double leftLimit = halfCurrentLaneWidth - halfVehWidth - latPos;
4455 double rightLimit = -halfCurrentLaneWidth + halfVehWidth - latPos;
4456 double latLaneDist = 0;
4458 if (latPos + halfVehWidth > halfCurrentLaneWidth) {
4460 latLaneDist = halfCurrentLaneWidth - latPos - halfVehWidth;
4461 }
else if (latPos - halfVehWidth < - halfCurrentLaneWidth) {
4463 latLaneDist = halfCurrentLaneWidth - latPos + halfVehWidth;
4465 }
else if (offset == -1) {
4467 }
else if (offset == 1) {
4470 #ifdef DEBUG_ACTIONSTEPS 4473 <<
" veh=" <<
getID()
4474 <<
" halfCurrentLaneWidth=" << halfCurrentLaneWidth
4475 <<
" halfVehWidth=" << halfVehWidth
4476 <<
" latPos=" << latPos
4477 <<
" latLaneDist=" << latLaneDist
4478 <<
" leftLimit=" << leftLimit
4479 <<
" rightLimit=" << rightLimit
4501 for (DriveItemVector::iterator i = lfLinks.begin(); i != lfLinks.end(); ++i) {
4502 if ((*i).myLink != 0) {
4503 (*i).myLink->removeApproaching(
this);
4523 while (!lane->
isLinkEnd(link) && seen <= dist) {
4526 || !(*link)->havePriority())) {
4530 if ((*di).myLink != 0) {
4531 const MSLane* diPredLane = (*di).myLink->getLaneBefore();
4532 if (diPredLane != 0) {
4543 const SUMOTime leaveTime = (*link)->getLeaveTime((*di).myArrivalTime, (*di).myArrivalSpeed,
4545 if ((*link)->hasApproachingFoe((*di).myArrivalTime, leaveTime, (*di).myArrivalSpeed,
getCarFollowModel().getMaxDecel())) {
4552 lane = (*link)->getViaLaneOrLane();
4595 result.push_back(line1[0]);
4596 result.push_back(line2[0]);
4597 result.push_back(line2[1]);
4598 result.push_back(line1[1]);
4601 result.push_back(line1[1]);
4602 result.push_back(line2[1]);
4603 result.push_back(line2[0]);
4604 result.push_back(line1[0]);
4616 if (&(*i)->getEdge() == edge) {
4627 const bool parking,
const bool triggered,
const bool containerTriggered, std::string& errorMsg) {
4629 for (std::list<Stop>::iterator iter =
myStops.begin(); iter !=
myStops.end(); iter++) {
4630 if (iter->lane == lane && fabs(iter->pars.endPos - endPos) <
POSITION_EPS) {
4631 if (duration == 0 && !iter->reached) {
4636 iter->duration = duration;
4647 newStop.
until = until;
4656 if (containerTriggered) {
4662 const bool result =
addStop(newStop, errorMsg);
4676 const bool triggered,
const bool containerTriggered,
const SumoXMLTag stoppingPlaceType, std::string& errorMsg) {
4678 for (std::list<Stop>::iterator iter =
myStops.begin(); iter !=
myStops.end(); iter++) {
4680 switch (stoppingPlaceType) {
4682 stop = iter->busstop;
4685 stop = iter->containerstop;
4688 stop = iter->chargingStation;
4691 stop = iter->parkingarea;
4696 if (stop != 0 && stop->
getID() == stopId) {
4697 if (duration == 0 && !iter->reached) {
4700 iter->duration = duration;
4707 switch (stoppingPlaceType) {
4725 errorMsg =
"The " +
toString(stoppingPlaceType) +
" '" + stopId +
"' is not known for vehicle '" +
getID() +
"'";
4729 newStop.
until = until;
4740 if (containerTriggered) {
4746 const bool result =
addStop(newStop, errorMsg);
4766 if (
myStops.front().busstop != 0) {
4768 myStops.front().busstop->leaveFrom(
this);
4771 if (
myStops.front().containerstop != 0) {
4773 myStops.front().containerstop->leaveFrom(
this);
4775 if (
myStops.front().parkingarea != 0) {
4777 myStops.front().parkingarea->leaveFrom(
this);
4782 if (vehroutes != 0) {
4885 #ifdef DEBUG_IGNORE_RED 4890 if (ignoreRedTime < 0) {
4898 #ifdef DEBUG_IGNORE_RED 4902 <<
" ignoreRedTime=" << ignoreRedTime
4903 <<
" spentRed=" << redDuration
4904 <<
" canBrake=" << canBrake <<
"\n";
4908 return !canBrake || ignoreRedTime > redDuration;
4936 std::vector<std::string> internals;
4947 for (std::list<Stop>::const_iterator it =
myStops.begin(); it !=
myStops.end(); ++it) {
4951 for (std::vector<MSDevice*>::const_iterator dev =
myDevices.begin(); dev !=
myDevices.end(); ++dev) {
4952 (*dev)->saveState(out);
4960 throw ProcessError(
"Error: Invalid vehicles in state (may be a meso state)!");
4971 myDeparture -= offset;
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
double myPos
the stored position
int getRoutePosition() const
bool gDebugFlag1
global utility flags for debugging
bool getRespectJunctionPriority() const
Returns whether junction priority rules shall be respected.
void adaptToLeader(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 myLatDist
The requested lateral change.
A lane area vehicles can halt at.
void adaptToLeaders(const MSLeaderInfo &ahead, double latOffset, const double seen, DriveProcessItem *const lastLink, const MSLane *const lane, double &v, double &vLinkPass) const
const int STOP_CONTAINER_TRIGGER_SET
const std::vector< MSTransportable * > & getTransportables() const
Returns the list of transportables using this vehicle.
const MSLane * myLastBestLanesInternalLane
The link is a partial left direction.
bool isChangingLanes() const
return true if the vehicle currently performs a lane change maneuver
Drive process items represent bounds on the safe velocity corresponding to the upcoming links...
double getLengthWithGap() const
Get vehicle's length including the minimum gap [m].
double computeAngle() const
compute the current vehicle angle
static double gLateralResolution
double getFuelConsumption() const
Returns fuel consumption of the current state.
const std::vector< double > & getShadowFurtherLanesPosLat() const
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
MSLane * getLogicalPredecessorLane() const
get the most likely precedecessor lane (sorted using by_connections_to_sorter). The result is cached ...
double getAccumulatedWaitingSeconds() const
Returns the number of seconds waited (speed was lesser than 0.1m/s) within the last millisecs...
double getVehicleMaxSpeed(const SUMOVehicle *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
SumoXMLTag
Numbers representing SUMO-XML - element names.
SUMOVehicleShape getGuiShape() const
Get this vehicle type's shape.
double brakeGap(const double speed) const
Returns the distance the vehicle needs to halt including driver's reaction time tau (i...
void addWaiting(const MSEdge *const edge, SUMOVehicle *vehicle)
Adds a vehicle to the list of waiting vehiclse to a given edge.
double getNOxEmissions() const
Returns NOx emission of the current state.
bool enterLaneAtMove(MSLane *enteredLane, bool onTeleporting=false)
Update when the vehicle enters a new lane in the move step.
bool ignoreRed(const MSLink *link, bool canBrake) const
decide whether a red (or yellow light) may be ignore
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT() const
virtual double freeSpeed(const MSVehicle *const veh, double speed, double seen, double maxSpeed, const bool onInsertion=false) const
Computes the vehicle's safe speed without a leader.
double getLength() const
Returns the vehicle's length.
MSEdge & getEdge() const
Returns the lane's edge.
double myAngle
the angle in radians (
Representation of a vehicle in the micro simulation.
SUMOTime getDeparture() const
Returns this vehicle's real departure time.
int size() const
Return the number of passengers / containers.
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.
double getBeginLanePosition() const
Returns the begin position of this stop.
bool isRemoteControlled() const
Returns the information whether the vehicle is fully controlled via TraCI.
bool hasPersons() const
Returns whether persons are simulated.
double getElectricityConsumption() const
Returns electricity consumption of the current state.
virtual int addLeader(const MSVehicle *veh, bool beyond, double latOffset=0)
double backPos() const
back Position of this state
bool keepClear() const
whether the junction after this link must be kept clear
void remove(MSVehicle *veh)
Remove a vehicle from this transfer object.
MSEdgeWeightsStorage * myEdgeWeights
MoveReminderCont myMoveReminders
Currently relevant move reminders.
The action is due to the default of keeping right "Rechtsfahrgebot".
PositionVector getBoundingPoly() const
get bounding polygon
const ConstMSEdgeVector & getEdges() const
The action is done to help someone else.
static int nextLinkPriority(const std::vector< MSLane *> &conts)
get a numerical value for the priority of the upcoming link
SUMOTime getWaitingTime() const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
const MSEdge * getNextNormal() const
Returns the lane's follower if it is an internal lane, the edge of the lane otherwise.
const MSEdge * myLastBestLanesEdge
std::string containerstop
(Optional) container stop if one is assigned to the stop
LaneChangeMode
modes for resolving conflicts between external control (traci) and vehicle control over lane changing...
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.
MSAbstractLaneChangeModel * myLaneChangeModel
void append(const PositionVector &v, double sameThreshold=2.0)
bool myAmOnNet
Whether the vehicle is on the network (not parking, teleported, vaporized, or arrived) ...
LaneChangeMode myRightDriveLC
changing to the rightmost lane
LinkDirection getDirection() const
Returns the direction the vehicle passing this link take.
virtual bool hasPedestrians(const MSLane *lane)
whether the given lane has pedestrians on it
std::pair< MSVehicle *const, double > getOppositeLeader(const MSVehicle *ego, double dist, bool oppositeDir) const
std::vector< std::vector< LaneQ > > myBestLanes
bool parking
whether the vehicle is removed from the net while stopping
MSLane * getLane() const
Returns the connected lane.
std::vector< MSLane * > myFurtherLanes
The information into which lanes the vehicle laps into.
State myState
This Vehicles driving state (pos and speed)
bool hasDeparted() const
Returns whether this vehicle has already departed.
double myOriginalSpeed
The velocity before influence.
void release() const
deletes the route if there are no further references to it
MSStoppingPlace * getStoppingPlace(const std::string &id, const SumoXMLTag category) const
Returns the named stopping place of the given category.
A lane area vehicles can halt at.
bool replaceParkingArea(MSParkingArea *parkingArea, std::string &errorMsg)
replace the current parking area stop with a new stop with merge duration
void enter(SUMOVehicle *what, double beg, double end)
Called if a vehicle enters this stop.
DriveItemVector myLFLinkLanes
bool resumeFromStopping()
bool myAmRegisteredAsWaitingForPerson
Whether this vehicle is registered as waiting for a person (for deadlock-recognition) ...
MSLane * getLane() const
Returns the lane the vehicle is on.
SUMOTime duration
The stopping duration.
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
int bestLaneOffset
The (signed) number of lanes to be crossed to get to the lane which allows to continue the drive...
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...
double myTimeLoss
the time loss in seconds due to driving with less than maximum speed
void setBlinkerInformation()
sets the blue flashing light for emergency vehicles
SUMOTime myLastActionTime
Action offset (actions are taken at time myActionOffset + N*getActionStepLength()) Initialized to 0...
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
void addContainer(MSTransportable *container)
Adds a container.
SUMOTime getMemorySize() const
The vehicle arrived at a junction.
virtual double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel) const =0
Computes the vehicle's follow speed (no dawdling)
int getShadowDirection() const
return the direction in which the current shadow lane lies
int getPersonNumber() const
Returns the number of persons.
double getManeuverDist() const
Returns the remaining unblocked distance for the current maneuver. (only used by sublane model) ...
std::pair< const MSVehicle *const, double > getLeader(double dist=0) const
Returns the leader of the vehicle looking for a fixed distance.
const SUMOVehicleParameter::Stop pars
The stop parameter.
int myRoutingMode
routing mode (see TraCIConstants.h)
SUMOTime duration
The stopping duration.
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
void updateTimeLoss(double vNext)
Updates the vehicle's time loss.
SUMOTime getLastStateChange() const
std::string getDescription() const
get a short description for showing in the gui
bool onFurtherEdge(const MSEdge *edge) const
whether this vehicle has its back (and no its front) on the given edge
void enter(SUMOVehicle *what, double beg, double end)
Called if a vehicle enters this stop.
const double SUMO_const_laneWidth
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...
const MSLane * getLaneBefore() const
return the internalLaneBefore if it exists and the laneBefore otherwise
The car-following model abstraction.
MSParkingArea * parkingarea
(Optional) parkingArea if one is assigned to the stop
MSStoppingPlace * busstop
(Optional) bus stop if one is assigned to the stop
double getPositionOnLane() const
Get the vehicle's position along the lane.
bool triggered
whether an arriving person lets the vehicle continue
bool myConsiderMaxAcceleration
Whether the maximum acceleration shall be regarded.
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
double myPosLat
the stored lateral position
int getBestLaneOffset() const
double myArrivalPos
The position on the destination lane where the vehicle stops.
The link is a 180 degree turn.
virtual void clear()
discard all information
bool reached
Information whether the stop has been reached.
Notification
Definition of a vehicle state.
double getLastFreePos(const SUMOVehicle &forVehicle) const
Returns the last free position on this stop.
double getDistanceBetween(double fromPos, double toPos, const MSEdge *fromEdge, const MSEdge *toEdge, bool includeInternal=true) const
Compute the distance between 2 given edges on this route, including the length of internal lanes...
std::string time2string(SUMOTime t)
std::vector< const MSLane * > getOutgoingLanes() const
get the list of outgoing lanes
virtual MSVehicle * removeVehicle(MSVehicle *remVehicle, MSMoveReminder::Notification notification, bool notify=true)
MSDevice_Transportable * myPersonDevice
The passengers this vehicle may have.
#define STOPPING_PLACE_OFFSET
Changes the wished vehicle speed / lanes.
static MSDevice_Transportable * buildVehicleDevices(SUMOVehicle &v, std::vector< MSDevice *> &into, const bool isContainer)
Build devices for the given vehicle, if needed.
double lateralDistanceToLane(const int offset) const
Get the minimal lateral distance required to move fully onto the lane at given offset.
const std::vector< MSLane * > * allowedLanes(const MSEdge &destination, SUMOVehicleClass vclass=SVC_IGNORING) const
Get the allowed lanes to reach the destination-edge.
bool addTraciStopAtStoppingPlace(const std::string &stopId, const SUMOTime duration, const SUMOTime until, const bool parking, const bool triggered, const bool containerTriggered, const SumoXMLTag stoppingPlaceType, std::string &errorMsg)
bool myRespectJunctionPriority
Whether the junction priority rules are respected.
double getZipperSpeed(const MSVehicle *ego, const double dist, double vSafe, SUMOTime arrivalTime, std::vector< const SUMOVehicle *> *collectFoes) const
return the speed at which ego vehicle must approach the zipper link
double getLeaveSpeed() const
virtual VehicleVariables * createVehicleVariables() const
Returns model specific values which are stored inside a vehicle and must be used with casting...
void registerEmergencyStop()
register emergency stop
static const double ZIPPER_ADAPT_DIST
virtual double maxNextSpeed(double speed, const MSVehicle *const veh) const
Returns the maximum speed given the current speed.
bool isRoundabout() const
State & operator=(const State &state)
Assignment operator.
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position ...
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
vehicle doesn't want to change
TraciLaneChangePriority
modes for prioritizing traci lane change requests
double getLength() const
Returns the lane's length.
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
const PositionVector & getShape() const
Returns this lane's shape.
const MSRoute * myRoute
This vehicle's route.
static std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
PositionVector getBoundingBox() const
get bounding rectangle
bool isLinkEnd(MSLinkCont::const_iterator &i) const
const MSRoute & getRoute() const
Returns the current route.
bool isStoppedOnLane() const
MSLink * getLinkTo(const MSLane *) const
returns the link to the given lane or 0, if it is not connected
The vehicle got vaporized.
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
PositionVector reverse() const
reverse position vector
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
SUMOTime until
The time at which the vehicle may continue its journey.
bool addStop(const SUMOVehicleParameter::Stop &stopPar, std::string &errorMsg, SUMOTime untilOffset=0, bool collision=false, MSRouteIterator *searchStart=0)
Adds a stop.
bool checkActionStep(const SUMOTime t)
Returns whether the vehicle is supposed to take action in the current simulation step Updates myActio...
double getRightSideOnLane() const
Get the vehicle's lateral position on the lane:
void adaptBestLanesOccupation(int laneIndex, double density)
update occupation from MSLaneChanger
WaitingTimeCollector myWaitingTimeCollector
This is an uncontrolled, right-before-left link.
bool hasFoes() const
Returns whether this link belongs to a junction where more than one edge is incoming.
render as a sedan passenger vehicle ("Stufenheck")
void removeWaiting(const MSEdge *const edge, SUMOVehicle *vehicle)
Removes a vehicle from the list of waiting vehicles to a given edge.
bool executeMove()
Executes planned vehicle movements with regards to right-of-way.
double getSafeFollowSpeed(const std::pair< const MSVehicle *, double > leaderInfo, const double seen, const MSLane *const lane, double distToCrossing) const
compute safe speed for following the given leader
std::vector< const MSEdge * > ConstMSEdgeVector
std::set< std::string > awaitedPersons
IDs of persons the vehicle has to wait for until departing.
static double computeNoise(SUMOEmissionClass c, double v, double a)
Returns the noise produced by the a vehicle of the given type at the given speed. ...
SUMOTime myMemorySize
the maximal memory to store
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle's end speed shall be chosen.
int myArrivalLane
The destination lane where the vehicle stops.
const SUMOVehicleParameter * myParameter
This vehicle's parameter.
const std::string & getID() const
Returns the id.
const std::vector< MSMoveReminder *> & getMoveReminders() const
Return the list of this lane's move reminders.
The base class for microscopic and mesoscopic vehicles.
bool myHaveToWaitOnNextLink
A storage for edge travel times and efforts.
int getSpeedMode() const
return the current speed mode
SUMOTime timeToBoardNextPerson
The time at which the vehicle is able to board another person.
double nextOccupation
As occupation, but without the first lane.
double length
The overall length which may be driven when using this lane without a lane change.
This is an uncontrolled, all-way stop link.
The action is due to the wish to be faster (tactical lc)
bool wasRemoteControlled(SUMOTime lookBack=DELTA_T) const
Returns the information whether the vehicle is fully controlled via TraCI within the lookBack time...
double getWidth() const
Returns the lane's width.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list...
bool hasArrived() const
Returns whether this vehicle has already arived (reached the arrivalPosition on its final edge) ...
used by the sublane model
void setApproaching(const SUMOVehicle *approaching, const SUMOTime arrivalTime, const double arrivalSpeed, const double leaveSpeed, const bool setRequest, const SUMOTime arrivalTimeBraking, const double arrivalSpeedBraking, const SUMOTime waitingTime, double dist)
Sets the information about an approaching vehicle.
bool isLeader(const MSVehicle *ego, const MSVehicle *foe) const
void enterLaneAtLaneChange(MSLane *enteredLane)
Update when the vehicle enters a new lane in the laneChange step.
Position getPositionAlongBestLanes(double offset) const
Return the (x,y)-position, which the vehicle would reach if it continued along its best continuation ...
This is an uncontrolled, zipper-merge link.
The link is a (hard) left direction.
std::string parkingarea
(Optional) parking area if one is assigned to the stop
#define WRITE_WARNING(msg)
The simulated network and simulation perfomer.
void planMoveInternal(const SUMOTime t, MSLeaderInfo ahead, DriveItemVector &lfLinks, double &myStopDist) const
The car-following model and parameter.
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
virtual void saveState(OutputDevice &out)
Saves the (common) state of a vehicle.
bool containerTriggered
whether an arriving container lets the vehicle continue
WaitingTimeCollector(SUMOTime memory=MSGlobals::gWaitingTimeMemory)
Constructor.
MSAbstractLaneChangeModel & getLaneChangeModel()
bool isVaporizing() const
Returns whether vehicles on this edge shall be vaporized.
bool isStoppedInRange(double pos) const
return whether the given position is within range of the current stop
MSCFModel::VehicleVariables * myCFVariables
The per vehicle variables of the car following model.
MSLink * getParallelLink(int direction) const
return the link that is parallel to this lane or 0
double implicitDeltaPosRemote(const MSVehicle *veh)
return the change in longitudinal position that is implicit in the new remote position ...
bool isVehicleSpecific() const
Returns whether this type belongs to a single vehicle only (was modified)
bool isFrontOnLane(const MSLane *lane) const
Returns the information whether the front of the vehicle is on the given lane.
virtual std::string getString(int id) const =0
Returns the string-value of the named (by its enum-value) attribute.
double getBackPositionOnLane() const
Get the vehicle's position relative to its current lane.
LinkState getState() const
Returns the current state of the link.
Right blinker lights are switched on.
std::vector< Stop > stops
List of the stops the vehicle will make, TraCI may add entries here.
virtual MSTransportableControl & getContainerControl()
Returns the container control.
void writeParams(OutputDevice &out) const
const ConstMSEdgeVector getStopEdges() const
Returns the list of still pending stop edges.
static CollisionAction getCollisionAction()
The vehicles starts to stop.
double getMaxAccel() const
Get the vehicle type's maximum acceleration [m/s^2].
Needs to stay on the current lane.
double getMaxSpeed() const
Returns the maximum speed.
void calculateArrivalParams()
(Re-)Calculates the arrival position and lane from the vehicle parameters
std::vector< std::pair< SUMOTime, int > > myLaneTimeLine
The lane usage time line to apply.
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.
std::vector< double > myFurtherLanesPosLat
lateral positions on further lanes
bool signalSet(int which) const
Returns whether the given signal is on.
bool getEmergencyBrakeRedLight() const
Returns whether red lights shall be a reason to brake.
WaitingTimeCollector & operator=(const WaitingTimeCollector &wt)
Assignment operator.
std::string busstop
(Optional) bus stop if one is assigned to the stop
bool operator!=(const State &state)
Operator !=.
static std::vector< MSTransportable * > myEmptyTransportableVector
double getDistanceToPosition(double destPos, const MSEdge *destEdge) const
double departSpeed
(optional) The initial speed of the vehicle
bool lastWasContMajor() const
whether this is a link past an internal junction which currently has priority
A road/street connecting two junctions.
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
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.
void setSpeedTimeLine(const std::vector< std::pair< SUMOTime, double > > &speedTimeLine)
Sets a new velocity timeline.
double getLatOffset(const MSLane *lane) const
Get the offset that that must be added to interpret myState.myPosLat for the given lane...
double getEndLanePosition() const
Returns the end position of this stop.
The vehicle changes lanes (micro only)
LaneChangeModel getLaneChangeModel() const
MSLane * lane
The described lane.
double getBruttoVehLenSum() const
Returns the sum of lengths of vehicles, including their minGaps, which were on the lane during the la...
void setSpeedMode(int speedMode)
Sets speed-constraining behaviors.
static double naviDegree(const double angle)
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
double getCO2Emissions() const
Returns CO2 emission of the current state.
Left blinker lights are switched on.
double myDepartPos
The real depart position.
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
void setSublaneChange(double latDist)
Sets a new sublane-change request.
void setAngle(double angle, bool straightenFurther=false)
Set a custom vehicle angle in rad, optionally updates furtherLanePosLat.
blocked in all directions
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
MSLane * getViaLane() const
Returns the following inner lane.
The vehicle got a new route.
Position validatePosition(Position result, double offset=0) const
ensure that a vehicle-relative position is not invalid
vehicle want's to change to right lane
void updateState(double vNext)
updates the vehicles state, given a next value for its speed. This value can be negative in case of t...
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
#define DIST_TO_STOPLINE_EXPECT_PRIORITY
double getFoeVisibilityDistance() const
Returns the distance on the approaching lane from which an approaching vehicle is able to see all rel...
double getLateralOverlap() const
return the amount by which the vehicle extends laterally outside it's primary lane ...
The action is urgent (to be defined by lc-model)
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
Representation of a vehicle.
SUMOTime myLastRemoteAccess
render as a hatchback passenger vehicle ("Fliessheck")
Stores the waiting intervals over the previous seconds (memory is to be specified in ms...
bool opened(SUMOTime arrivalTime, double arrivalSpeed, double leaveSpeed, double vehicleLength, double impatience, double decel, SUMOTime waitingTime, double posLat=0, std::vector< const SUMOVehicle *> *collectFoes=0, bool ignoreRed=false, const SUMOVehicle *ego=0) const
Returns the information whether the link may be passed.
double startPos
The stopping position start.
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
const MSTrafficLightLogic * getTLLogic() const
Returns the TLS index.
Encapsulated SAX-Attributes.
std::set< std::string > awaitedContainers
IDs of containers the vehicle has to wait for until departing.
static MSPModel * getModel()
SUMOTime myCollisionImmunity
amount of time for which the vehicle is immune from collisions
virtual MSTransportableControl & getPersonControl()
Returns the person control.
void adaptLeaveSpeed(const double v)
double implicitSpeedRemote(const MSVehicle *veh, double oldSpeed)
return the speed that is implicit in the new remote position
double getCommittedSpeed() const
ChangeRequest
Requests set via TraCI.
std::string chargingStation
(Optional) charging station if one is assigned to the stop
A point in 2D or 3D with translation and scaling methods.
SUMOTime getActionStepLength() const
Returns the vehicle's action step length in millisecs, i.e. the interval between two action points...
double getCenterOnEdge() const
MSRouteIterator edge
The edge in the route to stop at.
TraciLaneChangePriority myTraciLaneChangePriority
flags for determining the priority of traci lane change requests
double posLat() const
Lateral Position of this state (m relative to the centerline of the lane).
void updateBestLanes(bool forceRebuild=false, const MSLane *startLane=0)
computes the best lanes to use in order to continue the route
bool replaceRoute(const MSRoute *route, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true)
Replaces the current route by the given one.
static void clear()
Clears the dictionary.
const std::vector< MSLane * > & getBestLanesContinuation() const
Returns the best sequence of lanes to continue the route starting at myLane.
void registerOneWaiting(const bool isPerson)
increases the count of vehicles waiting for a transport to allow recognition of person / container re...
Position myCachedPosition
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
double getSpaceTillLastStanding(const MSLane *l, bool &foundStopped) const
const MSLeaderInfo & getLastVehicleInformation(const MSVehicle *ego, double latOffset, double minPos=0, bool allowCached=true) const
Returns the last vehicles on the lane.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
const std::set< MSTransportable * > & getPersons() const
Returns this edge's persons set.
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) ...
double currentLength
The length which may be driven on this lane.
int getVehicleNumber() const
Returns the number of vehicles on this lane (for which this lane is responsible)
bool triggered
whether an arriving person lets the vehicle continue
const std::vector< MSLane * > & getFurtherLanes() const
std::list< Stop > myStops
The vehicle's list of stops.
ConstMSEdgeVector::const_iterator MSRouteIterator
void removeVType(const MSVehicleType *vehType)
bool hasContainers() const
Returns whether containers are simulated.
int parametersSet
Information for the output which parameter were set.
int getCapacity() const
Returns the area capacity.
bool collision
Whether this stop was triggered by a collision.
bool havePriority() const
Returns whether this link is a major link.
bool myConsiderMaxDeceleration
Whether the maximum deceleration shall be regarded.
MSLane * myLane
The lane the vehicle is on.
bool myAmRegisteredAsWaitingForContainer
Whether this vehicle is registered as waiting for a container (for deadlock-recognition) ...
bool loadAnyWaiting(MSEdge *edge, MSVehicle *vehicle, MSVehicle::Stop *stop)
load any applicable containers Loads any container that is waiting on that edge for the given vehicle...
void getSubLanes(const MSVehicle *veh, double latOffset, int &rightmost, int &leftmost) const
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic, in MSLink and GNEInternalLane.
Influencer * myInfluencer
An instance of a velocity/lane influencing instance; built in "getInfluencer".
void resetRoutePosition(int index)
std::vector< LaneQ >::iterator myCurrentLaneInBestLanes
void postProcessRemoteControl(MSVehicle *v)
void processTraCISpeedControl(double vSafe, double &vNext)
Check for speed advices from the traci client and adjust the speed vNext in the current (euler) / aft...
double getDeltaPos(double accel)
calculates the distance covered in the next integration step given an acceleration and assuming the c...
void forceVehicleInsertion(MSVehicle *veh, double pos, MSMoveReminder::Notification notification, double posLat=0)
Inserts the given vehicle at the given position.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
const MSEdge * getNormalBefore() const
if this edge is an internal edge, return its first normal predecessor, otherwise the edge itself ...
bool keepClear(const MSLink *link) const
decide whether the given link must be kept clear
double getMaxSpeed() const
Get vehicle's maximum speed [m/s].
double getHarmonoise_NoiseEmissions() const
Returns noise emissions of the current state.
MSVehicle()
invalidated default constructor
void resetActionOffset(const SUMOTime timeUntilNextAction=0)
Resets the action offset for the vehicle.
The link is a (hard) right direction.
const MSLane * getInternalLaneBefore() const
return myInternalLaneBefore (always 0 when compiled without internal lanes)
The action is needed to follow the route (navigational lc)
const std::string & getID() const
returns the id of the transportable
std::vector< LinkLeader > LinkLeaders
bool replaceRouteEdges(ConstMSEdgeVector &edges, bool onInit=false, bool check=false, bool removeStops=true)
Replaces the current route by the given edges.
double getImpatience() const
Returns this vehicles impatience.
void write(OutputDevice &dev) const
Write the current stop configuration (used for state saving)
void addTransportable(MSTransportable *transportable)
Add a passenger.
A blue emergency light is on.
A structure representing the best lanes for continuing the current route starting at 'lane'...
void loadState(const SUMOSAXAttributes &attrs, const SUMOTime offset)
Loads the state of this vehicle from the given description.
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
void stopStarted(const SUMOVehicle *veh, int numPersons, int numContainers)
virtual PersonDist nextBlocking(const MSLane *lane, double minPos, double minRight, double maxLeft, double stopTime=0)
returns the next pedestrian beyond minPos that is laterally between minRight and maxLeft or 0 ...
double myStopDist
distance to the next stop or -1 if there is none
bool isStoppedTriggered() const
Returns whether the vehicle is on a triggered stop.
bool hasInfluencer() const
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
double endPos
The stopping position end.
double getMinGap() const
Get the free space in front of vehicles of this class.
SUMOTime collisionStopTime() const
Returns the remaining time a vehicle needs to stop due to a collision. A negative value indicates tha...
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
void removeTransportable(MSTransportable *p)
Removes a transportable from this stop.
double myAcceleration
The current acceleration after dawdling in m/s.
MSLane * getOpposite() const
return the opposite direction lane for lane changing or 0
void fixPosition()
repair errors in vehicle position after changing between internal edges
bool myActionStep
The flag myActionStep indicates whether the current time step is an action point for the vehicle...
double myPreviousSpeed
the speed at the begin of the previous time step
render as a passenger vehicle
bool isFringe() const
return whether this edge is at the fringe of the network
void setShadowApproachingInformation(MSLink *link) const
set approach information for the shadow vehicle
SUMOTime myWaitingTime
The time the vehicle waits (is not faster than 0.1m/s) in seconds.
void setRemoteControlled(Position xyPos, MSLane *l, double pos, double posLat, double angle, int edgeOffset, const ConstMSEdgeVector &route, SUMOTime t)
LaneChangeMode mySpeedGainLC
lane changing to travel with higher speed
double maximumSafeStopSpeed(double gap, double currentSpeed, bool onInsertion=false, double headway=-1) const
Returns the maximum next velocity for stopping within gap.
bool isInternal() const
return whether this edge is an internal edge
double getMinimalArrivalSpeedEuler(double dist, double currentSpeed) const
Computes the minimal possible arrival speed after covering a given distance for Euler update...
The link is a partial right direction.
int personNumber
The static number of persons in the vehicle when it departs (not including boarding persons) ...
LaneChangeMode myCooperativeLC
lane changing with the intent to help other vehicles
const SUMOVTypeParameter & getParameter() const
int getOccupancy() const
Returns the area occupancy.
std::vector< MSVehicle * > VehCont
Container for vehicles.
const MSLane * lane
The lane to stop at.
bool containerTriggered
whether an arriving container lets the vehicle continue
void move2side(double amount)
move position vector to side using certain ammount
static MSLinkCont::const_iterator succLinkSec(const SUMOVehicle &veh, int nRouteSuccs, const MSLane &succLinkSource, const std::vector< MSLane *> &conts)
bool allowsContinuation
Whether this lane allows to continue the drive.
const waitingIntervalList & getWaitingIntervals() const
void stopEnded(const SUMOVehicle *veh, const MSVehicle::Stop &stop)
Container that holds the vehicles driving state (position+speed).
Base class for objects which have an id.
void saveState(OutputDevice &out)
Saves the states of a vehicle.
void processLaneAdvances(std::vector< MSLane *> &passedLanes, bool &moved, std::string &emergencyReason)
This method checks if the vehicle has advanced over one or several lanes along its route and triggers...
double getOriginalSpeed() const
Returns the originally longitudinal speed to use.
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
double getRightSideOnEdge() const
void setBrakingSignals(double vNext)
sets the braking lights on/off
std::string lane
The lane to stop at.
bool myEmergencyBrakeRedLight
Whether red lights are a reason to brake.
double getCOEmissions() const
Returns CO emission of the current state.
std::vector< std::string > via
List of the via-edges the vehicle must visit.
static MSVehicleTransfer * getInstance()
Returns the instance of this object.
void removePassedDriveItems()
Erase passed drive items from myLFLinkLanes (and unregister approaching information for corresponding...
virtual void drawOutsideNetwork(bool)
register vehicle for drawing while outside the network
int numExpectedContainer
The number of still expected containers.
void removeShadowApproachingInformation() const
double slopeDegreeAtOffset(double pos) const
Returns the slope at the given length.
bool boardAnyWaiting(MSEdge *edge, MSVehicle *vehicle, MSVehicle::Stop *stop)
board any applicable persons Boards any people who wait on that edge for the given vehicle and remove...
void updateOccupancyAndCurrentBestLane(const MSLane *startLane)
updates LaneQ::nextOccupation and myCurrentLaneInBestLanes
std::pair< const MSPerson *, double > PersonDist
void setEmergencyBlueLight(SUMOTime currentTime)
sets the blue flashing light for emergency vehicles
const int STOP_PARKING_SET
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
bool addTraciStop(MSLane *const lane, const double startPos, const double endPos, const SUMOTime duration, const SUMOTime until, const bool parking, const bool triggered, const bool containerTriggered, std::string &errorMsg)
virtual std::string toString() const
print a debugging representation
double departPos
(optional) The position the vehicle shall depart from
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
vehicle want's to change to left lane
int numExpectedPerson
The number of still expected persons.
std::pair< const MSVehicle *, double > CLeaderDist
The vehicle starts or ends parking.
virtual double getFloat(int id) const =0
Returns the double-value of the named (by its enum-value) attribute.
const int STOP_TRIGGER_SET
static double compute(const SUMOEmissionClass c, const EmissionType e, const double v, const double a, const double slope, const std::map< int, double > *param=0)
Returns the amount of the emitted pollutant given the vehicle type and state (in mg/s or ml/s for fue...
void addStops(const bool ignoreStopErrors)
Adds stops to the built vehicle.
Influencer & getInfluencer()
Returns the velocity/lane influencer.
Structure representing possible vehicle parameter.
DriveItemVector::iterator myNextDriveItem
iterator pointing to the next item in myLFLinkLanes
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.
double getOppositePos(double pos) const
return the corresponding position on the opposite lane
double occupation
The overall vehicle sum on consecutive lanes which can be passed without a lane change.
LaneChangeMode mySublaneLC
changing to the prefered lateral alignment
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists or 0.
bool keepStopping(bool afterProcessing=false) const
Returns whether the vehicle is stopped and must continue to do so.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
void removeApproachingInformation(DriveItemVector &lfLinks) const
unregister approach from all upcoming links
double processNextStop(double currentVelocity)
Processes stops, returns the velocity needed to reach the stop.
void setNoShadowPartialOccupator(MSLane *lane)
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...
static MSLink * getConnectingLink(const MSLane &from, const MSLane &to)
Returns the link connecting both lanes Both lanes have to be non-internal; 0 may be returned if no co...
void processLinkAproaches(double &vSafe, double &vSafeMin, double &vSafeMinDist)
This method iterates through the driveprocess items for the vehicle and adapts the given in/out param...
std::vector< std::pair< SUMOTime, double > > mySpeedTimeLine
The velocity time line to apply.
MSVehicleType * myType
This vehicle's type.
void passTime(SUMOTime dt, bool waiting)
void workOnMoveReminders(double oldPos, double newPos, double newSpeed)
Processes active move reminder.
double getEndPos(const SUMOVehicle &veh) const
return halting position for upcoming stop;
virtual double getHeadwayTime() const
Get the driver's desired headway [s].
The vehicle is blocked being overlapping.
void checkRewindLinkLanes(const double lengthsInFront, DriveItemVector &lfLinks) const
int mySignals
State of things of the vehicle that can be on or off.
bool isRemoteControlled() const
void passedJunction(const MSVehicle *vehicle) const
erase vehicle from myLinkLeaders of this links junction
void resetChanged()
reset the flag whether a vehicle already moved to false
ConstMSEdgeVector myRemoteRoute
std::vector< MSLane * > bestContinuations
MSStoppingPlace * chargingStation
(Optional) charging station if one is assigned to the stop
Definition of vehicle stop (position and duration)
void setRemoteState(Position xyPos)
sets position outside the road network
void scaleRelative(double factor)
enlarges/shrinks the polygon by a factor based at the centroid
MSStoppingPlace * containerstop
(Optional) container stop if one is assigned to the stop
int getLanechangeMode() const
return the current lane change mode
void onDepart()
Called when the vehicle is inserted into the network.
double getMinimalArrivalSpeed(double dist, double currentSpeed) const
Computes the minimal possible arrival speed after covering a given distance.
double interpolateLanePosToGeometryPos(double lanePos) const
const MSEdge * getRerouteOrigin() const
Returns the starting point for reroutes (usually the current edge)
const std::string & getID() const
Returns the name of the vehicle type.
double getPMxEmissions() const
Returns PMx emission of the current state.
int index
at which position in the stops list
SUMOTime getMinimalArrivalTime(double dist, double currentSpeed, double arrivalSpeed) const
Computes the minimal time needed to cover a distance given the desired speed at arrival.
MSVehicle * getLastAnyVehicle() const
returns the last vehicle that is fully or partially on this lane
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
MSLane * getViaLaneOrLane() const
return the via lane if it exists and the lane otherwise
The arrival lane is given.
int containerNumber
The static number of containers in the vehicle when it departs.
The vehicle ends to stop.
void activateReminders(const MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
"Activates" all current move reminder
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...
void addReference() const
increments the reference counter for the route
void updateActionOffset(const SUMOTime oldActionStepLength, const SUMOTime newActionStepLength)
Process an updated action step length value (only affects the vehicle's action offset, The actionStepLength is stored in the (singular) vtype)
A device which collects info on the vehicle trip (mainly on departure and arrival) ...
int myNumberReroutes
The number of reroutings.
int getContainerNumber() const
Returns the number of containers.
double getLength() const
Get vehicle's length [m].
void informVehicleStateListener(const SUMOVehicle *const vehicle, VehicleState to)
Informs all added listeners about a vehicle's state change.
SUMOTime cumulatedWaitingTime(SUMOTime memory=-1) const
void setLaneChangeMode(int value)
Sets lane changing behavior.
const MSLane * getBackLane() const
virtual void prepareStep()
bool allowsVehicleClass(SUMOVehicleClass vclass) const
static MSStopOut * getInstance()
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
double getTimeGapOnLane() const
Returns the time gap in seconds to the leader of the vehicle on the same lane.
waitingIntervalList myWaitingIntervals
std::vector< DriveProcessItem > DriveItemVector
Container for used Links/visited Lanes during planMove() and executeMove.
void updateWaitingTime(double vNext)
Updates the vehicle's waiting time counters (accumulated and consecutive)
void setSignals(int signals)
const MSEdgeWeightsStorage & getWeightsStorage() const
Returns the vehicle's internal edge travel times/efforts container.
bool isRemoteAffected(SUMOTime t) const
The action is due to a TraCI request.
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
const std::vector< MSLane * > & getShadowFurtherLanes() const
double estimateSpeedAfterDistance(const double dist, const double v, const double accel) const
vehicle want's to keep the current lane
Static storage of an output device and its base (abstract) implementation.
double speed() const
Speed of this state.
void changedToOpposite()
called when a vehicle changes between lanes in opposite directions
The vehicle needs another parking area.
bool closeTag()
Closes the most recently opened tag.
void switchOffSignal(int signal)
Switches the given signal off.
static bool gSemiImplicitEulerUpdate
void switchOnSignal(int signal)
Switches the given signal on.
double getSlope() const
Returns the slope of the road at vehicle's position.
bool passingMinor() const
decide whether the vehicle is passing a minor link or has comitted to do so
void addPerson(MSTransportable *person)
Adds a passenger.
static std::vector< MSLane * > myEmptyLaneVector
void removeApproaching(const SUMOVehicle *veh)
removes the vehicle from myApproachingVehicles
MSRouteIterator myCurrEdge
Iterator to current route-edge.
bool isActionStep(SUMOTime t) const
Returns whether the next simulation step will be an action point for the vehicle. ...
bool unsafeLinkAhead(const MSLane *lane) const
whether the vehicle may safely move to the given lane with regard to upcoming links ...
MSEdgeWeightsStorage & _getWeightsStorage() const
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
MSLane * getShadowLane() const
Returns the lane the vehicle's shadow is on during continuous/sublane lane change.
void setLaneTimeLine(const std::vector< std::pair< SUMOTime, int > > &laneTimeLine)
Sets a new lane timeline.
double getHCEmissions() const
Returns HC emission of the current state.
virtual ~MSVehicle()
Destructor.
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
const std::vector< MSTransportable * > & getPersons() const
retrieve riding persons
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const MSEdgeVector &prohibited=MSEdgeVector()) const
bool isStopped() const
Returns whether the vehicle is at a stop.
No information given; use default.
const std::vector< MSTransportable * > & getContainers() const
retrieve riding containers
bool willPass(const MSEdge *const edge) const
Returns whether the vehicle wil pass the given edge.
MSParkingArea * getNextParkingArea()
get the current parking area stop
const Position getBackPosition() const
const MSLinkCont & getLinkCont() const
returns the container with all links !!!
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) ...
const std::vector< LaneQ > & getBestLanes() const
Returns the description of best lanes to use in order to continue the route.
const MSLane & getLane() const
Returns the lane this stop is located at.
bool isParking() const
Returns whether the vehicle is parking.
double getSpeed() const
Returns the vehicle's current speed.
State(double pos, double speed, double posLat, double backPos)
Constructor.
bool mySpeedAdaptationStarted
Whether influencing the speed has already started.
static SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const MSEdgeVector &prohibited=MSEdgeVector())
return the router instance
double estimateLeaveSpeed(const MSLink *const link, const double vLinkPass) const
estimate leaving speed when accelerating across a link
double getLastFreePos(const SUMOVehicle &forVehicle) const
Returns the last free position on this stop.
int influenceChangeDecision(int state)
allow TraCI to influence a lane change decision
public emergency vehicles
render as a wagon passenger vehicle ("Combi")
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
void removeTransportable(MSTransportable *transportable)
Remove a passenger (TraCI)
static SUMOTime gLaneChangeDuration
SUMOTime getLastAccessTimeStep() const
int influenceChangeDecision(const SUMOTime currentTime, const MSEdge ¤tEdge, const int currentLaneIndex, int state)
Applies stored LaneChangeMode information and laneTimeLine.
SUMOTime timeToLoadNextContainer
The time at which the vehicle is able to load another container.
static MSAbstractLaneChangeModel * build(LaneChangeModel lcm, MSVehicle &vehicle)
Factory method for instantiating new lane changing models.
const std::string & getID() const
Returns the name of the vehicle.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
void addReminder(MSMoveReminder *rem)
Adds a MoveReminder dynamically.
Representation of a lane in the micro simulation.
std::vector< MSDevice * > myDevices
The devices this vehicle has.
double myBackPos
the stored back position
SUMOEmissionClass getEmissionClass() const
Get this vehicle type's emission class.
void adaptLaneEntering2MoveReminder(const MSLane &enteredLane)
Adapts the vehicle's entering of a new lane.
const std::vector< SUMOVehicleParameter::Stop > & getStops() const
Returns the stops.
LaneChangeMode myStrategicLC
lane changing which is necessary to follow the current route
void unregisterOneWaiting(const bool isPerson)
decreases the count of vehicles waiting for a transport to allow recognition of person / container re...
MSRouteIterator end() const
Returns the end of the list of edges to pass.
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
bool haveRed() const
Returns whether this link is blocked by a red (or redyellow) traffic light.
Interface for lane-change models.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
double mySpeed
the stored speed (should be >=0 at any time)
bool contains(const MSEdge *const edge) const
bool myConsiderSafeVelocity
Whether the safe velocity shall be regarded.
const std::vector< MSLane * > & getFurtherTargetLanes() const
virtual double stopSpeed(const MSVehicle *const veh, const double speed, double gap) const =0
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling) ...
SUMOTime myDeparture
The real departure time.
void removeTransportable(MSTransportable *t)
removes a person or container
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
MSDevice_Transportable * myContainerDevice
The containers this vehicle may have.
static const SUMOTime NOT_YET_DEPARTED
double getWidth() const
Returns the vehicle's width.
std::string id
The vehicle's id.
static const Position INVALID
used to indicate that a position is valid
double getSpeedWithoutTraciInfluence() const
Returns the uninfluenced velocity.
The vehicle is being teleported.
MSLane * getParallelLane(int offset) const
Returns the lane with the given offset parallel to this one or 0 if it does not exist.
void stopEnded(const MSVehicle::Stop &stop)
Definition of vehicle stop (position and duration)
double pos() const
Position of this state.
void endLaneChangeManeuver(const MSMoveReminder::Notification reason=MSMoveReminder::NOTIFICATION_LANE_CHANGE)
void updateDriveItems()
Check whether the drive items (myLFLinkLanes) are up to date, and update them if required.
double getWidth() const
Returns the edges's width (sum over all lanes)