65 #define DEBUG_COND (isSelected())
73 std::set<std::string> MSBaseVehicle::myShallTraceMoveReminders;
90 throw ProcessError(
"getPreviousSpeed() is not available for non-MSVehicles.");
118 , myTraceMoveReminders(myShallTraceMoveReminders.count(pars->id) > 0)
121 if ((*
myRoute->begin())->isTazConnector() ||
myRoute->getLastEdge()->isTazConnector()) {
225 const std::set<SUMOTrafficObject::NumericalID>
227 std::set<SUMOTrafficObject::NumericalID> result;
229 result.insert((*e)->getNumericalID());
237 if (stop ==
nullptr) {
241 if (s.busstop == stop
242 || s.containerstop == stop
243 || s.parkingarea == stop
244 || s.chargingStation == stop) {
254 if (&s.lane->getEdge() == edge) {
258 return myRoute->getLastEdge() == edge;
266 if (source ==
nullptr) {
269 if (sink ==
nullptr) {
271 if (sink ==
nullptr) {
280 double firstPos = -1;
283 if (stops.size() > 0) {
289 const bool skipFirst = stops.front() == source && (source !=
getEdge() || sourcePos +
getBrakeGap() <= firstPos + NUMERICAL_EPS);
290 const bool skipLast = (stops.back() == sink
292 && (stops.size() < 2 || stops.back() != stops[stops.size() - 2])
293 && (stops.size() > 1 || skipFirst));
298 <<
" source=" << source->
getID() <<
" sourcePos=" << sourcePos <<
" firstPos=" << firstPos <<
" arrivalPos=" <<
myArrivalPos <<
" lastPos=" << lastPos
299 <<
" route=" <<
toString(
myRoute->getEdges()) <<
" stopEdges=" <<
toString(stops) <<
" skipFirst=" << skipFirst <<
" skipLast=" << skipLast <<
"\n";
302 if (stops.size() == 1 && (skipFirst || skipLast)) {
306 stops.erase(stops.begin());
309 stops.erase(stops.end() - 1);
314 std::set<const MSEdge*> jumpEdges;
316 if (stop.pars.jump >= 0) {
317 jumpEdges.insert(*stop.edge);
327 assert(viaEdge != 0);
331 stops.push_back(viaEdge);
332 if (jumpEdges.count(viaEdge) != 0) {
333 jumps.insert((
int)stops.size());
339 for (
const MSEdge*
const stopEdge : stops) {
343 if (jumps.count(stopIndex) != 0) {
344 edges.push_back(source);
348 router.
computeLooped(source, stopEdge,
this, t, into, silent);
350 if (into.size() > 0) {
352 edges.insert(edges.end(), into.begin(), into.end());
353 if (stopEdge->isTazConnector()) {
354 source = into.back();
360 std::string error =
TLF(
"Vehicle '%' has no valid route from edge '%' to stop edge '%'.",
getID(), source->
getID(), stopEdge->getID());
365 edges.push_back(source);
370 if (stops.empty() && source == sink && onInit
376 if (!router.
compute(source, sink,
this, t, edges, silent)) {
382 if (edges.empty() && silent) {
385 if (!edges.empty() && edges.front()->isTazConnector()) {
386 edges.erase(edges.begin());
388 if (!edges.empty() && edges.back()->isTazConnector()) {
392 const double previousCost = onInit ? routeCost : router.
recomputeCosts(oldEdgesRemaining,
this, t);
393 const double savings = previousCost - routeCost;
414 return !edges.empty();
422 if (msgReturn !=
nullptr) {
423 *msgReturn =
"No route found";
428 std::string
id =
getID();
432 const std::string idSuffix =
id +
"!var#";
436 id = idSuffix +
toString(++varIndex);
438 int oldSize = (int)edges.size();
441 if (origin != *
myCurrEdge && edges.front() == origin) {
443 oldSize = (int)edges.size();
458 if (msgReturn !=
nullptr) {
459 *msgReturn =
"duplicate routeID '" +
id +
"'";
468 if (msgReturn !=
nullptr) {
474 if (!
replaceRoute(constRoute, info, onInit, (
int)edges.size() - oldSize,
false, removeStops, msgReturn)) {
489 if (newCurrEdge == edges.end()) {
490 if (msgReturn !=
nullptr) {
491 *msgReturn =
TLF(
"current edge '%' not found in new route", (*myCurrEdge)->getID());
493 #ifdef DEBUG_REPLACE_ROUTE
495 std::cout <<
" newCurrEdge not found\n";
502 (newCurrEdge + 1) == edges.end() || (*(newCurrEdge + 1)) != &(
getLane()->getOutgoingViaLanes().front().first->
getEdge()))) {
503 if (msgReturn !=
nullptr) {
504 *msgReturn =
TL(
"Vehicle is on junction-internal edge leading elsewhere");
506 #ifdef DEBUG_REPLACE_ROUTE
508 std::cout <<
" Vehicle is on junction-internal edge leading elsewhere\n";
514 && (newCurrEdge + 1) != edges.end()
516 if (msgReturn !=
nullptr) {
517 *msgReturn =
TL(
"Vehicle is moving past junction and committed to move to another successor edge");
519 #ifdef DEBUG_REPLACE_ROUTE
521 std::cout <<
" Vehicle is moving past junction and committed to move to another successor edge\n";
529 const bool stopsFromScratch = onInit &&
myRoute->getStops().empty();
539 #ifdef DEBUG_REPLACE_ROUTE
541 std::cout <<
SIMTIME <<
" veh=" <<
getID() <<
" replaceRoute info=" << info <<
" on " << (*myCurrEdge)->getID()
543 <<
" stopsFromScratch=" << stopsFromScratch
544 <<
" newSize=" << newRoute->getEdges().size()
545 <<
" newIndex=" << (
myCurrEdge - newRoute->begin())
546 <<
" edges=" <<
toString(newRoute->getEdges())
551 for (std::vector<SUMOVehicleParameter::Stop>::iterator it =
myPastStops.begin(); it !=
myPastStops.end();) {
560 if (stopsFromScratch) {
571 lastPos += (*myCurrEdge)->getLength();
574 for (std::list<MSStop>::iterator iter =
myStops.begin(); iter !=
myStops.end();) {
575 double endPos = iter->getEndPos(*
this);
576 #ifdef DEBUG_REPLACE_ROUTE
578 std::cout <<
" stopEdge=" << iter->lane->getEdge().getID() <<
" start=" << (searchStart -
myCurrEdge) <<
" endPos=" << endPos <<
" lastPos=" << lastPos <<
"\n";
581 if (*searchStart != &iter->lane->getEdge()
582 || endPos + NUMERICAL_EPS < lastPos) {
583 if (searchStart != edges.end() && !iter->reached) {
589 iter->edge = std::find(searchStart, edges.end(), &iter->lane->getEdge());
590 #ifdef DEBUG_REPLACE_ROUTE
592 std::cout <<
" foundIndex=" << (iter->edge -
myCurrEdge) <<
" end=" << (edges.end() -
myCurrEdge) <<
"\n";
595 if (iter->edge == edges.end()) {
603 searchStart = iter->edge;
610 for (std::vector<SUMOVehicleParameter::Stop>::const_iterator i = newRoute->getStops().begin(); i != newRoute->getStops().end(); ++i) {
680 &&
myStops.begin()->pars.permitted.count(t->
getID()) == 0) {
684 if (taxiDevice !=
nullptr) {
718 if (stop.edge == it) {
719 return stop.pars.jump >= 0;
729 if (route ==
nullptr) {
732 start = route->begin();
734 const bool checkJumps = route ==
myRoute;
738 const MSEdge& next = **(e + 1);
740 if (!checkJumps || !
hasJump(e)) {
743 msg =
TLF(
"No connection between edge '%' and edge '%'.", (*e)->getID(), (*(e + 1))->getID());
752 if ((*e)->prohibits(
this)) {
753 msg =
TLF(
"Edge '%' prohibits.", (*e)->getID());
763 if (!(*myCurrEdge)->isTazConnector()) {
765 msg =
TLF(
"Departure speed for vehicle '%' is too high for the vehicle type '%'.",
getID(),
myType->
getID());
770 if (
myRoute->getEdges().size() > 0 && !(*myCurrEdge)->prohibits(
this)) {
774 msg =
TLF(
"Vehicle '%' is not allowed to depart on any lane of edge '%'.",
getID(), (*myCurrEdge)->getID());
791 }
else if (!silent) {
794 }
else if (msgReturn !=
nullptr) {
814 if (myTraceMoveReminders) {
815 traceMoveReminder(
"add", rem, 0,
true);
825 if (r->first == rem) {
827 if (myTraceMoveReminders) {
828 traceMoveReminder(
"remove", rem, 0,
false);
841 if (rem->first->notifyEnter(*
this, reason, enteredLane)) {
843 if (myTraceMoveReminders) {
844 traceMoveReminder(
"notifyEnter", rem->first, rem->second,
true);
850 if (myTraceMoveReminders) {
851 traceMoveReminder(
"notifyEnter", rem->first, rem->second,
false);
862 if (
myRoute->getLastEdge()->isTazConnector()) {
867 WRITE_WARNINGF(
TL(
"Vehicle '%' ignores attribute arrivalEdge=% after rerouting at time=% (routeLength=%)"),
872 arrivalEdge =
myRoute->getLastEdge();
876 const std::vector<MSLane*>& lanes = arrivalEdge->
getLanes();
877 const double lastLaneLength = lanes[0]->getLength();
906 for (
MSLane* lane : lanes) {
918 std::vector<MSLane*> usable;
919 for (
MSLane* lane : lanes) {
921 usable.push_back(lane);
924 if (usable.empty()) {
932 for (std::vector<MSLane*>::const_iterator l = lanes.begin(); l != lanes.end(); ++l) {
945 const int routeEdges = (int)
myRoute->getEdges().size();
959 const int routeEdges = (int)
myRoute->getEdges().size();
981 if (
typeid(*dev) == type) {
996 std::ostringstream os;
1034 && (
myStops.begin()->parkingarea ==
nullptr || !
myStops.begin()->parkingarea->parkOnRoad())
1069 if (parkingArea == 0) {
1070 errorMsg =
"new parkingArea is NULL";
1074 errorMsg =
"vehicle has no stops";
1077 if (
myStops.front().parkingarea == 0) {
1078 errorMsg =
"first stop is not at parkingArea";
1084 for (std::list<MSStop>::iterator iter = ++
myStops.begin(); iter !=
myStops.end();) {
1085 if (iter->parkingarea == parkingArea) {
1086 stopPar.
duration += iter->duration;
1113 return nextParkingArea;
1121 currentParkingArea =
myStops.begin()->parkingarea;
1123 return currentParkingArea;
1127 const std::vector<std::string>&
1142 && (&
myStops.front().lane->getEdge()) == *
myStops.front().edge) {
1153 if (edge ==
nullptr || edge->
getOppositeEdge() ==
nullptr || stop.
lane.find(
"_") == std::string::npos) {
1170 if (stopPar.
lane ==
"") {
1173 if (stop.
lane ==
nullptr) {
1174 errorMsg =
"Vehicle '" +
myParameter->
id +
"' is not allowed to stop on any lane of edge '" + stopPar.
edge +
"'.";
1179 if (stop.
lane ==
nullptr) {
1183 assert(stop.
lane !=
nullptr);
1186 errorMsg =
"Vehicle '" +
myParameter->
id +
"' is not allowed to stop on lane '" + stopPar.
lane +
"'.";
1193 errorMsg =
"Mesoscopic simulation does not allow stopping on internal edge '" + stopPar.
edge +
"' for vehicle '" +
myParameter->
id +
"'.";
1198 if (stopPar.
until != -1) {
1205 std::string stopType =
"stop";
1206 std::string stopID =
"";
1207 if (stop.
busstop !=
nullptr) {
1208 stopType =
"busStop";
1211 stopType =
"containerStop";
1214 stopType =
"chargingStation";
1217 stopType =
"overheadWireSegment";
1220 stopType =
"parkingArea";
1223 const std::string errorMsgStart = stopID ==
"" ? stopType : stopType +
" '" + stopID +
"'";
1226 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' on lane '" + stop.
lane->
getID() +
"' has an invalid position.";
1231 errorMsg = errorMsgStart +
" on lane '" + stop.
lane->
getID() +
"' is too short for vehicle '" +
myParameter->
id +
"'.";
1235 errorMsg = errorMsgStart +
"on lane '" + stop.
lane->
getID() +
"' forbids access because vehicle '" +
myParameter->
id +
"' does not provide any valid badge.";
1249 if (searchStart ==
nullptr) {
1253 searchStart = ≻
1256 #ifdef DEBUG_ADD_STOP
1258 std::cout <<
"addStop desc=" << stop.
getDescription() <<
" stopEdge=" << stopEdge->
getID()
1259 <<
" searchStart=" << ((*searchStart) ==
myRoute->end() ?
"END" : (**searchStart)->getID())
1264 stop.
edge = std::find(*searchStart,
myRoute->end(), stopEdge);
1269 std::list<MSStop>::iterator iter =
myStops.begin();
1273 prevStopEdge =
myStops.back().edge;
1274 prevEdge = &
myStops.back().lane->getEdge();
1275 prevStopPos =
myStops.back().pars.endPos;
1276 stop.
edge = std::find(prevStopEdge,
myRoute->end(), stopEdge);
1277 if (prevStopEdge == stop.
edge
1281 stop.
edge = std::find(prevStopEdge + 1,
myRoute->end(), stopEdge);
1283 #ifdef DEBUG_ADD_STOP
1285 std::cout <<
" (@end) prevStopEdge=" << (*prevStopEdge)->getID() <<
" prevStopPos=" << prevStopPos <<
" index=" << (int)(prevStopEdge -
myRoute->begin())
1291 int skipLooped = stopPar.
index -
static_cast<int>(
myStops.size());
1292 for (
int j = 0; j < skipLooped; j++) {
1293 auto nextIt = std::find(stop.
edge + 1,
myRoute->end(), stopEdge);
1294 if (nextIt ==
myRoute->end()) {
1297 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' could not skip " +
toString(skipLooped) +
" occurences of stop edge '" + stopEdge->
getID() +
"' in looped route.";
1306 while (iter !=
myStops.end() && (iter->edge < stop.
edge ||
1307 (iter->pars.endPos < stop.
pars.
endPos && iter->edge == stop.
edge) ||
1309 prevStopEdge = iter->edge;
1310 prevStopPos = iter->pars.endPos;
1314 int index = stopPar.
index;
1316 prevStopEdge = iter->edge;
1317 prevStopPos = iter->pars.endPos;
1321 #ifdef DEBUG_ADD_STOP
1323 std::cout <<
" (@fit) prevStopEdge=" << (*prevStopEdge)->getID() <<
" index=" << (int)(prevStopEdge -
myRoute->begin()) <<
"\n";
1326 stop.
edge = std::find(prevStopEdge,
myRoute->end(), stopEdge);
1329 const bool wasTooClose = errorMsg !=
"" && errorMsg.find(
"too close") != std::string::npos;
1332 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' on lane '" + stop.
lane->
getID() +
"' is not downstream the current route.";
1337 const bool tooClose = (prevStopEdge == stop.
edge && prevEdge == &stop.
lane->
getEdge() &&
1340 if (prevStopEdge > stop.
edge ||
1347 if (tooClose && prevStopPos <= stop.
pars.
endPos + POSITION_EPS) {
1348 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' on lane '" + stop.
pars.
lane +
"' is too close to brake.";
1351 return addStop(stopPar, errorMsg, untilOffset, &next);
1368 pos += (*myCurrEdge)->getLength();
1378 return addStop(stopPar, errorMsg, untilOffset, &next);
1380 errorMsg = errorMsgStart +
" for vehicle '" +
myParameter->
id +
"' on lane '" + stop.
lane->
getID() +
"' is before departPos.";
1384 if (iter !=
myStops.begin()) {
1385 std::list<MSStop>::iterator iter2 = iter;
1391 +
" earlier than previous stop at " +
time2string(iter2->getUntil()) +
".";
1396 +
" earlier than previous stop end at " +
time2string(iter2->getUntil()) +
".";
1401 +
" earlier than previous stop arrival at " +
time2string(iter2->pars.arrival) +
".";
1433 if (prevActiveStops > 0) {
1434 assert((
int)
myStops.size() >= prevActiveStops);
1435 auto prevStopIt =
myStops.begin();
1436 std::advance(prevStopIt, prevActiveStops - 1);
1437 const MSStop& prev = *prevStopIt;
1451 while (itPrev < stop.
edge) {
1452 if (*itPrev == *stop.
edge) {
1457 if (foundSkips > 0) {
1467 if (addRouteStops) {
1469 std::string errorMsg;
1473 if (errorMsg !=
"") {
1480 std::string errorMsg;
1481 if (!
addStop(stop, errorMsg, untilOffset, searchStart) && !ignoreStopErrors) {
1484 if (errorMsg !=
"") {
1498 if (stop.lane->isInternal()) {
1501 it = std::find(start,
myRoute->end(), stop.lane->getEdge().getNormalBefore());
1503 it + 1 ==
myRoute->end() || *(it + 1) != stop.lane->getEdge().getNormalSuccessor())) {
1507 it = std::find(start,
myRoute->end(), &stop.lane->getEdge());
1511 WRITE_ERRORF(
"Stop % on edge '%' is not found after edge '%' (% after current) for vehicle '%' at time=%.",
1518 if (it2 == stop.edge) {
1524 WRITE_ERRORF(
"Stop % on edge '%' used invalid route index for vehicle '%' at time=%.",
1528 }
else if (it2 < start) {
1530 WRITE_ERRORF(
"Stop % on edge '%' used invalid (relative) route index % expected after % for vehicle '%' at time=%.",
1548 const MSStop* prev =
nullptr;
1549 const MSEdge* internalSuccessor =
nullptr;
1552 if (stop.pars.jump >= 0) {
1553 jumps.insert((
int)result.size());
1557 const double stopPos = stop.getEndPos(*
this);
1558 if ((prev ==
nullptr
1559 || prev->
edge != stop.edge
1560 || (prev->
lane == stop.lane && prev->
getEndPos(*
this) > stopPos))
1561 && *stop.edge != internalSuccessor) {
1562 result.push_back(*stop.edge);
1563 if (stop.lane->isInternal()) {
1564 internalSuccessor = stop.lane->getNextNormal();
1565 result.push_back(internalSuccessor);
1567 internalSuccessor =
nullptr;
1575 if (stop.pars.jump >= 0) {
1576 jumps.insert((
int)result.size() - 1);
1584 std::vector<std::pair<int, double> >
1586 std::vector<std::pair<int, double> > result;
1587 for (std::list<MSStop>::const_iterator iter =
myStops.begin(); iter !=
myStops.end(); ++iter) {
1588 result.push_back(std::make_pair(
1589 (
int)(iter->edge -
myRoute->begin()),
1590 iter->getEndPos(*
this)));
1605 return myStops.front().duration;
1614 if (nextStopIndex < 0 || (
int)
myStops.size() <= nextStopIndex) {
1617 auto stopIt =
myStops.begin();
1618 std::advance(stopIt, nextStopIndex);
1635 for (std::list<MSStop>::iterator iter =
myStops.begin(); iter !=
myStops.end(); iter++) {
1636 if (iter->lane->getID() == stop.
lane && fabs(iter->pars.endPos - stop.
endPos) < POSITION_EPS) {
1638 if (stop.
duration == 0 && stop.
until < 0 && !iter->reached) {
1650 const bool result =
addStop(stop, errorMsg);
1671 if (nextStopIndex == 0 &&
isStopped()) {
1674 auto stopIt =
myStops.begin();
1675 std::advance(stopIt, nextStopIndex);
1681 std::advance(stopIt2, nextStopIndex);
1693 const int n = (int)
myStops.size();
1694 if (nextStopIndex < 0 || nextStopIndex >= n) {
1695 errorMsg =
TLF(
"invalid nextStopIndex % for % remaining stops", nextStopIndex, n);
1698 if (nextStopIndex == 0 &&
isStopped()) {
1699 errorMsg =
TL(
"cannot replace reached stop");
1706 auto itStop =
myStops.begin();
1707 std::advance(itStop, nextStopIndex);
1708 MSStop& replacedStop = *itStop;
1713 if (pa !=
nullptr && !pa->
accepts(
this)) {
1714 errorMsg =
TLF(
"vehicle '%' does not have the right badge to access parkingArea '%'",
getID(), stop.
parkingarea);
1727 errorMsg =
TLF(
"disallowed stop lane '%'", stopLane->
getID());
1735 double startPos = nextStopIndex == 0 ?
getPositionOnLane() : stops[nextStopIndex - 1].pars.endPos;
1736 MSRouteIterator itEnd = nextStopIndex == n - 1 ? oldEdges.end() - 1 : stops[nextStopIndex + 1].edge;
1737 auto endPos = nextStopIndex == n - 1 ?
getArrivalPos() : stops[nextStopIndex + 1].pars.endPos;
1740 bool newDestination = nextStopIndex == n - 1 && stops[nextStopIndex].edge == oldEdges.end() - 1;
1744 router.
compute(*itStart, startPos, stopEdge, stop.
endPos,
this, t, toNewStop,
true);
1745 if (toNewStop.size() == 0) {
1746 errorMsg =
TLF(
"no route found from edge '%' to stop edge '%'", (*itStart)->getID(), stopEdge->
getID());
1752 if (!newDestination) {
1753 router.
compute(stopEdge, stop.
endPos, *itEnd, endPos,
this, t, fromNewStop,
true);
1754 if (fromNewStop.size() == 0) {
1755 errorMsg =
TLF(
"no route found from stop edge '%' to edge '%'", stopEdge->
getID(), (*itEnd)->getID());
1763 replacedStop.
lane = stopLane;
1767 errorMsg =
TLF(
"Mesoscopic simulation does not allow stopping on internal edge '%' for vehicle '%'.", stop.
edge,
getID());
1774 newEdges.insert(newEdges.end(),
myCurrEdge, itStart);
1776 newEdges.insert(newEdges.end(), toNewStop.begin(), toNewStop.end() - 1);
1778 newEdges.push_back(*itStart);
1780 if (!newDestination) {
1781 newEdges.insert(newEdges.end(), fromNewStop.begin(), fromNewStop.end() - 1);
1782 newEdges.insert(newEdges.end(), itEnd, oldEdges.end());
1784 newEdges.push_back(stopEdge);
1795 const double routeCost = router.
recomputeCosts(newEdges,
this, t);
1796 const double previousCost = router.
recomputeCosts(oldRemainingEdges,
this, t);
1797 const double savings = previousCost - routeCost;
1806 if (!
insertJump(nextStopIndex, itStart, errorMsg)) {
1816 const int n = (int)
myStops.size();
1817 if (nextStopIndex < 0 || nextStopIndex > n) {
1818 errorMsg =
TLF(
"invalid nextStopIndex % for % remaining stops", nextStopIndex, n);
1821 if (nextStopIndex == 0 &&
isStopped()) {
1822 errorMsg =
TL(
"cannot reroute towards reached stop");
1831 double startPos = nextStopIndex == 0 ?
getPositionOnLane() : stops[nextStopIndex - 1].pars.endPos;
1832 MSRouteIterator itEnd = nextStopIndex == n ? oldEdges.end() - 1 : stops[nextStopIndex].edge;
1833 auto endPos = nextStopIndex == n ?
getArrivalPos() : stops[nextStopIndex].pars.endPos;
1838 router.
compute(*itStart, startPos, *itEnd, endPos,
this, t, newBetween,
true);
1839 if (newBetween.size() == 0) {
1840 errorMsg =
TLF(
"no route found from edge '%' to stop edge '%'", (*itStart)->getID(), (*itEnd)->getID());
1847 newEdges.insert(newEdges.end(),
myCurrEdge, itStart);
1849 newEdges.insert(newEdges.end(), newBetween.begin(), newBetween.end() - 1);
1851 newEdges.push_back(*itStart);
1853 newEdges.insert(newEdges.end(), itEnd, oldEdges.end());
1861 const double routeCost = router.
recomputeCosts(newEdges,
this, t);
1862 const double previousCost = router.
recomputeCosts(oldRemainingEdges,
this, t);
1863 const double savings = previousCost - routeCost;
1869 if (!
insertJump(nextStopIndex, itStart, errorMsg)) {
1879 bool needJump =
true;
1880 if (nextStopIndex > 0) {
1881 auto itPriorStop =
myStops.begin();
1882 std::advance(itPriorStop, nextStopIndex - 1);
1883 const MSStop& priorStop = *itPriorStop;
1890 jumpStopPars.
endPos = (*itStart)->getLength();
1891 jumpStopPars.
speed = 1000;
1892 jumpStopPars.
jump = 0;
1893 jumpStopPars.
edge = (*itStart)->getID();
1895 MSLane* jumpStopLane =
nullptr;
1896 for (
MSLane* cand : (*itStart)->getLanes()) {
1897 if (cand->allowsVehicleClass(
getVClass())) {
1898 jumpStopLane = cand;
1902 if (jumpStopLane ==
nullptr) {
1903 errorMsg =
TL(
"unable to replace stop with teleporting");
1906 auto itStop =
myStops.begin();
1907 std::advance(itStop, nextStopIndex);
1908 MSStop jumpStop(jumpStopPars);
1910 jumpStop.
lane = jumpStopLane;
1912 myStops.insert(itStop, jumpStop);
1925 const int n = (int)
myStops.size();
1926 if (nextStopIndex < 0 || nextStopIndex > n) {
1927 errorMsg =
TLF(
"invalid nextStopIndex % for % remaining stops", nextStopIndex, n);
1930 if (nextStopIndex == 0 &&
isStopped()) {
1931 errorMsg =
TL(
"cannot insert stop before the currently reached stop");
1939 errorMsg =
TLF(
"disallowed stop lane '%'", stopLane->
getID());
1946 if (pa !=
nullptr && !pa->
accepts(
this)) {
1947 errorMsg =
TLF(
"Vehicle '%' does not have the right badge to access parkingArea '%'.",
getID(), stop.
parkingarea);
1956 double startPos = nextStopIndex == 0 ?
getPositionOnLane() : stops[nextStopIndex - 1].pars.endPos;
1957 MSRouteIterator itEnd = nextStopIndex == n ? oldEdges.end() - 1 : stops[nextStopIndex].edge;
1958 auto endPos = nextStopIndex == n ?
getArrivalPos() : stops[nextStopIndex].pars.endPos;
1961 bool newDestination = nextStopIndex == n && stopEdge == oldEdges.back();
1965 router.
compute(*itStart, startPos, stopEdge, stop.
endPos,
this, t, toNewStop,
true);
1966 if (toNewStop.size() == 0) {
1967 errorMsg =
TLF(
"no route found from edge '%' to stop edge '%'", (*itStart)->getID(), stopEdge->
getID());
1973 if (!newDestination) {
1974 router.
compute(stopEdge, stop.
endPos, *itEnd, endPos,
this, t, fromNewStop,
true);
1975 if (fromNewStop.size() == 0) {
1976 errorMsg =
TLF(
"no route found from stop edge '%' to edge '%'", stopEdge->
getID(), (*itEnd)->getID());
1981 auto itStop =
myStops.begin();
1982 std::advance(itStop, nextStopIndex);
1986 newStop.
lane = stopLane;
1990 errorMsg =
TLF(
"Mesoscopic simulation does not allow stopping on internal edge '%' for vehicle '%'.", stop.
edge,
getID());
1994 myStops.insert(itStop, newStop);
1998 newEdges.insert(newEdges.end(),
myCurrEdge, itStart);
2000 newEdges.insert(newEdges.end(), toNewStop.begin(), toNewStop.end() - 1);
2002 newEdges.push_back(*itStart);
2004 if (!newDestination) {
2005 newEdges.insert(newEdges.end(), fromNewStop.begin(), fromNewStop.end() - 1);
2006 newEdges.insert(newEdges.end(), itEnd, oldEdges.end());
2008 newEdges.push_back(stopEdge);
2019 const double routeCost = router.
recomputeCosts(newEdges,
this, t);
2020 const double previousCost = router.
recomputeCosts(oldRemainingEdges,
this, t);
2021 const double savings = previousCost - routeCost;
2138 int leavingPersonNumber = 0;
2139 const std::vector<MSTransportable*>& persons =
getPersons();
2140 for (std::vector<MSTransportable*>::const_iterator it_p = persons.begin(); it_p != persons.end(); ++it_p) {
2145 leavingPersonNumber++;
2148 return leavingPersonNumber;
2151 std::vector<std::string>
2153 std::vector<std::string> ret;
2154 const std::vector<MSTransportable*>& persons =
getPersons();
2155 for (std::vector<MSTransportable*>::const_iterator it_p = persons.begin(); it_p != persons.end(); ++it_p) {
2156 ret.push_back((*it_p)->getID());
2180 const std::vector<MSTransportable*>&
2190 const std::vector<MSTransportable*>&
2223 if (dev->deviceName() == deviceName) {
2234 if (deviceName ==
"rerouting") {
2240 assert(routingDevice != 0);
2244 throw InvalidArgument(
TLF(
"creating device of type '%' is not supported", deviceName));
2253 if (dev->deviceName() == deviceName) {
2254 return dev->getParameter(key);
2264 if (dev->deviceName() == deviceName) {
2265 dev->setParameter(key, value);
2296 const std::string attrName = key.substr(15);
2318 const std::string routingModeStr =
getStringParam(
"device.rerouting.mode");
2326 throw ProcessError(
TLF(
"could not interpret routing.mode '%'", routingModeStr));
2343 assert(type !=
nullptr);
2385 if (lane ==
nullptr) {
2396 if (lane ==
nullptr) {
2408 if (tok.
size() < 3) {
2409 error =
TLF(
"Invalid device parameter '%' for vehicle '%'.", key,
getID());
2415 error =
TLF(
"Vehicle '%' does not support device parameter '%' (%).",
getID(), key, e.what());
2419 if (microVeh ==
nullptr) {
2420 error =
TLF(
"Mesoscopic vehicle '%' does not support laneChangeModel parameters.",
getID());
2423 const std::string attrName = key.substr(16);
2427 error =
TLF(
"Vehicle '%' does not support laneChangeModel parameter '%' (%).",
getID(), key, e.what());
2431 if (microVeh ==
nullptr) {
2432 error =
TLF(
"Mesoscopic vehicle '%' does not support carFollowModel parameters.",
getID());
2435 const std::string attrName = key.substr(15);
2439 error =
TLF(
"Vehicle '%' does not support carFollowModel parameter '%' (%).",
getID(), key, e.what());
2444 if (tok.
size() != 3) {
2445 error =
TL(
"Invalid check for device. Expected format is 'has.DEVICENAME.device'.");
2450 }
else if (key ==
"parking.rerouteCount") {
2453 std::vector<std::string> values;
2455 if (key ==
"parking.memory.IDList") {
2457 values.push_back(item.first->getID());
2459 }
else if (key ==
"parking.memory.score") {
2461 values.push_back(item.second.score);
2463 }
else if (key ==
"parking.memory.blockedAtTime") {
2467 }
else if (key ==
"parking.memory.blockedAtTimeLocal") {
2472 error =
TLF(
"Unsupported parking parameter '%' for vehicle '%'.", key,
getID());
2554 MSBaseVehicle::initMoveReminderOutput(
const OptionsCont& oc) {
2555 if (oc.
isSet(
"movereminder-output.vehicles")) {
2556 const std::vector<std::string> vehicles = oc.
getStringVector(
"movereminder-output.vehicles");
2557 myShallTraceMoveReminders.insert(vehicles.begin(), vehicles.end());
2563 MSBaseVehicle::traceMoveReminder(
const std::string& type,
MSMoveReminder* rem,
double pos,
bool keep)
const {
std::vector< const MSEdge * > ConstMSEdgeVector
ConstMSEdgeVector::const_iterator MSRouteIterator
#define WRITE_WARNINGF(...)
#define WRITE_ERRORF(...)
#define WRITE_WARNING(msg)
std::shared_ptr< const MSRoute > ConstMSRoutePtr
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
const int VEHPARS_CFMODEL_PARAMS_SET
const int VEHPARS_PARKING_BADGES_SET
@ RANDOM
The edge is chosen randomly.
@ GIVEN
The edge index is given.
@ DEFAULT
No information given; use default.
const int VEHPARS_JUNCTIONMODEL_PARAMS_SET
DepartLaneDefinition
Possible ways to choose a lane on depart.
@ GIVEN
The speed is given.
@ GIVEN
The position is given.
@ DEFAULT
No information given; use default.
@ BASE
Back-at-zero position.
const int VEHPARS_SPEEDFACTOR_SET
@ RANDOM
The lane is chosen randomly.
@ GIVEN
The arrival lane is given.
@ FIRST_ALLOWED
The rightmost lane the vehicle may use.
@ GIVEN
The speed is given.
const int STOP_INDEX_REPEAT
const int VEHPARS_FORCE_REROUTE
@ RANDOM
The arrival position is chosen randomly.
@ GIVEN
The arrival position is given.
@ CENTER
Half the road length.
const int VEHPARS_LINE_SET
@ CONTAINER_TRIGGERED
The departure is container triggered.
@ TRIGGERED
The departure is person triggered.
@ SUMO_TAG_VEHICLE
description of a vehicle
@ SUMO_TAG_PARKING_AREA
A parking area.
@ SUMO_ATTR_CF_IGNORE_IDS
@ SUMO_ATTR_JM_IGNORE_IDS
@ SUMO_ATTR_JM_IGNORE_TYPES
@ SUMO_ATTR_CF_IGNORE_TYPES
@ SUMO_ATTR_TIME
trigger: the time of the step
#define UNUSED_PARAMETER(x)
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
double getMax() const
Returns the maximum value of this distribution.
double getMin() const
Returns the minimum value of this distribution.
std::vector< double > & getParameter()
Returns the parameters of this distribution.
void setSecondary(const EnergyParams *secondaryParams)
Set secondary params.
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.
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
virtual std::string getParameter(const std::string &key) const
try to retrieve the given parameter from this laneChangeModel. Throw exception for unsupported key
BaseInfluencer()
Constructor.
double getMaxSpeed() const
Returns the maximum speed (the minimum of desired and technical maximum speed)
bool haveValidStopEdges(bool silent=false) const
check whether all stop.edge MSRouteIterators are valid and in order
int myRoutingMode
routing mode (see TraCIConstants.h)
bool hasJump(const MSRouteIterator &it) const
check wether the vehicle has jump at the given part of its route
const StoppingPlaceMemory * getParkingMemory() const
std::list< MSStop > myStops
The vehicle's list of stops.
StoppingPlaceMemory * myParkingMemory
memory for parking search
double getImpatience() const
Returns this vehicles impatience.
void setSkips(MSStop &stop, int prevActiveStops)
patch stop.pars.index to record the number of skipped candidate edges before stop....
virtual ConstMSEdgeVector::const_iterator getRerouteOrigin() const
Returns the starting point for reroutes (usually the current edge)
const std::vector< MSTransportable * > & getPersons() const
retrieve riding persons
virtual void initDevices()
void rememberParkingAreaScore(const MSStoppingPlace *pa, const std::string &score)
score only needed when running with gui
const MSEdge * succEdge(int nSuccs) const
Returns the nSuccs'th successor of edge the vehicle is currently at.
void resetRoutePosition(int index, DepartLaneDefinition departLaneProcedure)
reset index of edge within route
virtual BaseInfluencer & getBaseInfluencer()=0
Returns the velocity/lane influencer.
std::string getDeviceParameter(const std::string &deviceName, const std::string &key) const
try to retrieve the given parameter from any of the vehicles devices, raise InvalidArgument if no dev...
StoppingPlaceMemory * myChargingMemory
bool replaceStop(int nextStopIndex, SUMOVehicleParameter::Stop stop, const std::string &info, bool teleport, std::string &errorMsg)
int getLeavingPersonNumber() const
Returns the number of leaving persons.
MSBaseVehicle(SUMOVehicleParameter *pars, ConstMSRoutePtr route, MSVehicleType *type, const double speedFactor)
Constructor.
void calculateArrivalParams(bool onInit)
(Re-)Calculates the arrival position and lane from the vehicle parameters
virtual double getArrivalPos() const
Returns this vehicle's desired arrivalPos for its current route (may change on reroute)
void setCarFollowModelParameter(const std::string &key, const std::string &value)
set individual carFollow model parameters (not type related)
void setRoutingMode(int value)
Sets routing behavior.
void resetParkingAreaScores()
MSVehicleType * myType
This vehicle's type.
static NumericalID myCurrentNumericalIndex
bool rerouteBetweenStops(int nextStopIndex, const std::string &info, bool teleport, std::string &errorMsg)
MoveReminderCont myMoveReminders
Currently relevant move reminders.
void rememberChargingStationScore(const MSStoppingPlace *cs, const std::string &score)
double myDepartPos
The real depart position.
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
void addReminder(MSMoveReminder *rem)
Adds a MoveReminder dynamically.
double getMaxChargeRate() const
Returns the maximum charge rate allowed by the battery in the current time step (W)
void replaceParameter(const SUMOVehicleParameter *newParameter)
replace the vehicle parameter (deleting the old one)
void rememberBlockedParkingArea(const MSStoppingPlace *pa, bool local)
int getNumberParkingReroutes() const
std::vector< MSVehicleDevice * > myDevices
The devices this vehicle has.
double getPreviousSpeed() const
Returns the vehicle's previous speed.
virtual void addTransportable(MSTransportable *transportable)
Adds a person or container to this vehicle.
const SUMOVehicleParameter::Stop * getNextStopParameter() const
return parameters for the next stop (SUMOVehicle Interface)
void rememberBlockedChargingStation(const MSStoppingPlace *cs, bool local)
virtual bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addRouteStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
double getOdometer() const
Returns the distance that was already driven by this vehicle.
virtual bool hasArrived() const
Returns whether this vehicle has already arived (by default this is true if the vehicle has reached i...
const NumericalID myNumericalID
bool isStoppedInRange(const double pos, const double tolerance, bool checkFuture=false) const
return whether the given position is within range of the current stop
bool isJumping() const
Returns whether the vehicle is perform a jump.
void checkRouteRemoval()
remove route at the end of the simulation
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
virtual void replaceVehicleType(MSVehicleType *type)
Replaces the current vehicle type by the one given.
bool isStoppedParking() const
Returns whether the vehicle is on a parking stop.
void unregisterWaiting()
mark vehicle as active
bool hasValidRoute(std::string &msg, ConstMSRoutePtr route=0) const
Validates the current or given route.
double getLength() const
Returns the vehicle's length.
bool isParking() const
Returns whether the vehicle is parking.
MSParkingArea * getCurrentParkingArea()
get the current parking area stop or nullptr
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
double getHarmonoise_NoiseEmissions() const
Returns noise emissions of the current state.
int getPersonNumber() const
Returns the number of persons.
double getRelativeStateOfCharge() const
Returns actual relative state of charge of battery (-)
void setJunctionModelParameter(const std::string &key, const std::string &value)
set individual junction model paramete (not type related)
void setDepartAndArrivalEdge()
apply departEdge and arrivalEdge attributes
void setID(const std::string &newID)
set the id (inherited from Named but forbidden for vehicles)
MSRouteIterator myCurrEdge
Iterator to current route-edge.
static MSLane * interpretOppositeStop(SUMOVehicleParameter::Stop &stop)
interpret stop lane on opposite side of the road
static std::vector< MSTransportable * > myEmptyTransportableVector
const std::vector< std::string > & getParkingBadges() const
get the valid parking access rights (vehicle settings override vehicle type settings)
bool hasDeparted() const
Returns whether this vehicle has already departed.
bool ignoreTransientPermissions() const
Returns whether this object is ignoring transient permission changes (during routing)
ConstMSRoutePtr myRoute
This vehicle's route.
const ConstMSEdgeVector getStopEdges(double &firstPos, double &lastPos, std::set< int > &jumps) const
Returns the list of still pending stop edges also returns the first and last stop position.
MSDevice_Transportable * myContainerDevice
The containers this vehicle may have.
void resetChargingStationScores()
bool allowsBoarding(const MSTransportable *t) const
whether the given transportable is allowed to board this vehicle
double getStateOfCharge() const
Returns actual state of charge of battery (Wh) RICE_CHECK: This may be a misnomer,...
MSEdgeWeightsStorage & _getWeightsStorage() const
virtual bool handleCollisionStop(MSStop &stop, const double distToStop)
bool hasDevice(const std::string &deviceName) const
check whether the vehicle is equiped with a device of the given name
SUMOTime getDeparture() const
Returns this vehicle's real departure time.
EnergyParams * getEmissionParameters() const
retrieve parameters for the energy consumption model
SUMOTime sawBlockedChargingStation(const MSStoppingPlace *cs, bool local) const
double basePos(const MSEdge *edge) const
departure position where the vehicle fits fully onto the edge (if possible)
const MSRouteIterator & getCurrentRouteEdge() const
Returns an iterator pointing to the current edge in this vehicles route.
void setDeviceParameter(const std::string &deviceName, const std::string &key, const std::string &value)
try to set the given parameter from any of the vehicles devices, raise InvalidArgument if no device p...
MSDevice_Transportable * myPersonDevice
The passengers this vehicle may have.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
bool hasStops() const
Returns whether the vehicle has to stop somewhere.
std::string getFlowID() const
reconstruct flow id from vehicle id
virtual void activateReminders(const MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
"Activates" all current move reminder
bool isLineStop(double position) const
returns whether the vehicle serves a public transport line that serves the given stop
double myChosenSpeedFactor
A precomputed factor by which the driver wants to be faster than the speed limit.
@ ROUTE_INVALID
route was checked and is valid
@ ROUTE_START_INVALID_LANE
@ ROUTE_START_INVALID_PERMISSIONS
std::string getPrefixedParameter(const std::string &key, std::string &error) const
retrieve parameters of devices, models and the vehicle itself
void addStops(const bool ignoreStopErrors, MSRouteIterator *searchStart=nullptr, bool addRouteStops=true)
Adds stops to the built vehicle.
void removeTransportable(MSTransportable *t)
removes a person or container
SUMOTime sawBlockedParkingArea(const MSStoppingPlace *pa, bool local) const
SUMOVehicleClass getVClass() const
Returns the vehicle's access class.
MSParkingArea * getNextParkingArea()
get the upcoming parking area stop or nullptr
int myArrivalLane
The destination lane where the vehicle stops.
int getRouteValidity(bool update=true, bool silent=false, std::string *msgReturn=nullptr)
check for route validity at first insertion attempt
MSStop & getStop(int nextStopIndex)
virtual ~MSBaseVehicle()
Destructor.
bool insertStop(int nextStopIndex, SUMOVehicleParameter::Stop stop, const std::string &info, bool teleport, std::string &errorMsg)
SUMOTime myDeparture
The real departure time.
std::vector< std::string > getPersonIDList() const
Returns the list of persons.
const MSEdgeWeightsStorage & getWeightsStorage() const
Returns the vehicle's internal edge travel times/efforts container.
bool isStoppedTriggered() const
Returns whether the vehicle is on a triggered stop.
virtual bool resumeFromStopping()=0
virtual bool hasInfluencer() const =0
whether the vehicle is individually influenced (via TraCI or special parameters)
const std::set< SUMOTrafficObject::NumericalID > getUpcomingEdgeIDs() const
returns the numerical ids of edges to travel
bool stopsAtEdge(const MSEdge *edge) const
Returns whether the vehicle stops at the given edge.
bool addStop(const SUMOVehicleParameter::Stop &stopPar, std::string &errorMsg, SUMOTime untilOffset=0, MSRouteIterator *searchStart=nullptr)
Adds a stop.
double getChargedEnergy() const
Returns the energy charged to the battery in the current time step (Wh)
std::vector< SUMOVehicleParameter::Stop > myPastStops
The list of stops that the vehicle has already reached.
void onDepart()
Called when the vehicle is inserted into the network.
void removeReminder(MSMoveReminder *rem)
Removes a MoveReminder dynamically.
SUMOTime getStopDuration() const
get remaining stop duration or 0 if the vehicle isn't stopped
virtual double getAcceleration() const
Returns the vehicle's acceleration.
virtual bool addTraciStop(SUMOVehicleParameter::Stop stop, std::string &errorMsg)
int getRoutingMode() const
return routing mode (configures router choice but also handling of transient permission changes)
int getRoutePosition() const
return index of edge within route
bool replaceParkingArea(MSParkingArea *parkingArea, std::string &errorMsg)
replace the current parking area stop with a new stop with merge duration
static const SUMOTime NOT_YET_DEPARTED
SUMOTime getDepartDelay() const
Returns the depart delay.
double getElecHybridCurrent() const
Returns actual current (A) of ElecHybrid device RICE_CHECK: Is this the current consumed from the ove...
bool myAmRegisteredAsWaiting
Whether this vehicle is registered as waiting for a person or container (for deadlock-recognition)
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT() const
EnergyParams * myEnergyParams
The emission parameters this vehicle may have.
const SUMOVehicleParameter * myParameter
This vehicle's parameter.
virtual bool hasValidRouteStart(std::string &msg)
checks wether the vehicle can depart on the first edge
int myRouteValidity
status of the current vehicle route
std::vector< std::pair< int, double > > getStopIndices() const
return list of route indices for the remaining stops
SUMOTime myStopUntilOffset
The offset when adding route stops with 'until' on route replacement.
virtual bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
const std::vector< MSTransportable * > & getContainers() const
retrieve riding containers
const MSRoute & getRoute() const
Returns the current route.
bool reroute(SUMOTime t, const std::string &info, SUMOAbstractRouter< MSEdge, SUMOVehicle > &router, const bool onInit=false, const bool withTaz=false, const bool silent=false, const MSEdge *sink=nullptr)
Performs a rerouting using the given router.
bool stopsAt(MSStoppingPlace *stop) const
Returns whether the vehicle stops at the given stopping place.
MSEdgeWeightsStorage * myEdgeWeights
void createDevice(const std::string &deviceName)
create device of the given type
bool isStopped() const
Returns whether the vehicle is at a stop.
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists, nullptr otherwise.
bool abortNextStop(int nextStopIndex=0)
deletes the next stop at the given index if it exists
int myNumberReroutes
The number of reroutings.
double myArrivalPos
The position on the destination lane where the vehicle stops.
bool insertJump(int nextStopIndex, MSRouteIterator itStart, std::string &errorMsg)
helper function
virtual void saveState(OutputDevice &out)
Saves the (common) state of a vehicle.
double myOdometer
A simple odometer to keep track of the length of the route already driven.
void initTransientModelParams()
init model parameters from generic params
int getContainerNumber() const
Returns the number of containers.
bool replaceRouteEdges(ConstMSEdgeVector &edges, double cost, double savings, const std::string &info, bool onInit=false, bool check=false, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given edges.
virtual std::string getParameter(const MSVehicle *veh, const std::string &key) const
try to get the given parameter for this carFollowingModel
virtual void setParameter(MSVehicle *veh, const std::string &key, const std::string &value) const
try to set the given parameter for this carFollowingModel
Battery device for electric vehicles.
double getActualBatteryCapacity() const
Get the actual vehicle's Battery Capacity in Wh.
double getMaximumChargeRate() const
Get current charge rate in W depending on the state of charge.
double getMaximumBatteryCapacity() const
Get the total vehicle's Battery Capacity in Wh.
double getEnergyCharged() const
Get charged energy.
A device which collects info on the vehicle trip (mainly on departure and arrival)
double getMaximumBatteryCapacity() const
Get the total vehicle's Battery Capacity in kWh.
double getCurrentFromOverheadWire() const
Get actual current in the overhead wire segment.
double getEnergyCharged() const
Get charged energy.
double getActualBatteryCapacity() const
Get the actual vehicle's Battery Capacity in kWh.
A device that performs vehicle rerouting based on current edge speeds.
bool notifyEnter(SUMOTrafficObject &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Computes a new route on vehicle insertion.
static void buildVehicleDevices(SUMOVehicle &v, std::vector< MSVehicleDevice * > &into)
Build devices for the given vehicle, if needed.
A device which collects info on the vehicle trip (mainly on departure and arrival)
bool allowsBoarding(const MSTransportable *t) const
whether the given person is allowed to board this taxi
const std::vector< MSTransportable * > & getTransportables() const
Returns the list of transportables using this vehicle.
static bool willTransferAtJoin(const MSTransportable *t, const MSBaseVehicle *joinVeh)
check if boardingDuration should be applied
static MSDevice_Transportable * buildVehicleDevices(SUMOVehicle &v, std::vector< MSVehicleDevice * > &into, const bool isContainer)
Build devices for the given vehicle, if needed.
int size() const
Return the number of passengers / containers.
void addTransportable(MSTransportable *transportable)
Add a passenger.
void removeTransportable(MSTransportable *transportable)
Remove a passenger (TraCI)
Abstract in-vehicle / in-person device.
static void buildVehicleDevices(SUMOVehicle &v, std::vector< MSVehicleDevice * > &into)
Build devices for the given vehicle, if needed.
A road/street connecting two junctions.
bool hasTransientPermissions() const
const MSEdge * getOppositeEdge() const
Returns the opposite direction edge if on exists else a nullptr.
const std::vector< MSLane * > * allowedLanes(const MSEdge &destination, SUMOVehicleClass vclass=SVC_IGNORING, bool ignoreTransientPermissions=false) const
Get the allowed lanes to reach the destination-edge.
bool isNormal() const
return whether this edge is an internal edge
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
double getLength() const
return the length of the edge
bool isTazConnector() const
bool isInternal() const
return whether this edge is an internal edge
static bool dictionary(const std::string &id, MSEdge *edge)
Inserts edge into the static dictionary Returns true if the key id isn't already in the dictionary....
const MSEdge * getNormalBefore() const
if this edge is an internal edge, return its first normal predecessor, otherwise the edge itself
MSLane * getFirstAllowed(SUMOVehicleClass vClass, bool defaultFirst=false) const
A storage for edge travel times and efforts.
static MELoop * gMesoNet
mesoscopic simulation infrastructure
static SUMOTime gTimeToImpatience
static bool gHaveEmissions
Whether emission output of some type is needed (files or GUI)
static bool gUseStopEnded
whether the simulation should replay previous stop times
void descheduleDeparture(const SUMOVehicle *veh)
stops trying to emit the given vehicle (and delete it)
Representation of a lane in the micro simulation.
SumoRNG * getRNG() const
return the associated RNG
int getRNGIndex() const
returns the associated RNG index
const MSEdge * getNextNormal() const
Returns the lane's follower if it is an internal lane, the edge of the lane otherwise.
double getLength() const
Returns the lane's length.
bool allowsVehicleClass(SUMOVehicleClass vclass) const
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
MSEdge & getEdge() const
Returns the lane's edge.
Something on a lane to be noticed about vehicle movement.
Notification
Definition of a vehicle state.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
const std::string & getDescription() const
bool warnOnce(const std::string &typeAndID)
return whether a warning regarding the given object shall be issued
@ NEWROUTE
The vehicle got a new route.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
static bool hasInstance()
Returns whether the network was already constructed.
MSStoppingPlace * getStoppingPlace(const std::string &id, const SumoXMLTag category) const
Returns the named stopping place of the given category.
MSInsertionControl & getInsertionControl()
Returns the insertion control.
void informVehicleStateListener(const SUMOVehicle *const vehicle, VehicleState to, const std::string &info="")
Informs all added listeners about a vehicle's state change.
MSVehicleRouter & getRouterTT(const int rngIndex, const MSEdgeVector &prohibited=MSEdgeVector()) const
A lane area vehicles can halt at.
bool accepts(MSBaseVehicle *veh) const
Return the parking accepts the vehicle (due to its given badges)
void setCosts(double costs)
Sets the costs of the route.
static bool hasRoute(const std::string &id)
returns whether a route with the given id exists
static bool dictionary(const std::string &id, ConstMSRoutePtr route)
Adds a route to the dictionary.
static void checkDist(const std::string &id)
Checks the distribution whether it is permanent and deletes it if not.
const ConstMSEdgeVector & getEdges() const
void setSavings(double savings)
Sets the savings of the route.
static MSVehicleRouter & getRouterTT(const int rngIndex, SUMOVehicleClass svc, const MSEdgeVector &prohibited=MSEdgeVector())
return the vehicle router instance
bool canLeaveVehicle(const MSTransportable *t, const SUMOVehicle &veh, const MSStop &stop)
checks whether the person may exit at the current vehicle position
const MSLane * lane
The lane to stop at (microsim only)
MSStoppingPlace * containerstop
(Optional) container stop if one is assigned to the stop
bool isOpposite
whether this an opposite-direction stop
void initPars(const SUMOVehicleParameter::Stop &stopPar)
initialize attributes from the given stop parameters
const MESegment * segment
The segment to stop at (mesosim only)
bool reached
Information whether the stop has been reached.
MSRouteIterator edge
The edge in the route to stop at.
double getEndPos(const SUMOVehicle &veh) const
return halting position for upcoming stop;
MSParkingArea * parkingarea
(Optional) parkingArea if one is assigned to the stop
MSStoppingPlace * chargingStation
(Optional) charging station if one is assigned to the stop
std::string getDescription() const
get a short description for showing in the gui
SUMOTime getUntil() const
return until / ended time
const SUMOVehicleParameter::Stop pars
The stop parameter.
MSStoppingPlace * busstop
(Optional) bus stop if one is assigned to the stop
MSStoppingPlace * overheadWireSegment
(Optional) overhead wire segment if one is assigned to the stop
A lane area vehicles can halt at.
double getBeginLanePosition() const
Returns the begin position of this stop.
double getEndLanePosition() const
Returns the end position of this stop.
const MSLane & getLane() const
Returns the lane this stop is located at.
bool isPerson() const
Whether it is a person.
bool hasVTypeDistribution(const std::string &id) const
Asks for a vehicle type distribution.
void vehicleDeparted(const SUMOVehicle &v)
Informs this control about a vehicle's departure.
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
void removeVType(const MSVehicleType *vehType)
void unregisterOneWaiting()
decreases the count of vehicles waiting for a transport to allow recognition of person / container re...
Abstract in-vehicle device.
Representation of a vehicle in the micro simulation.
MSAbstractLaneChangeModel & getLaneChangeModel()
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
The car-following model and parameter.
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
double getMaxSpeed() const
Get vehicle's (technical) maximum speed [m/s].
double getDesiredMaxSpeed() const
Returns the vehicles's desired maximum speed.
const EnergyParams * getEmissionParameters() const
retrieve parameters for the energy consumption model
bool isVehicleSpecific() const
Returns whether this type belongs to a single vehicle only (was modified)
const Distribution_Parameterized & getSpeedFactor() const
Returns this type's speed factor.
SUMOEmissionClass getEmissionClass() const
Get this vehicle type's emission class.
const std::string & getID() const
Returns the name of the vehicle type.
double getLength() const
Get vehicle's length [m].
double computeChosenSpeedDeviation(SumoRNG *rng, const double minDev=-1.) const
Computes and returns the speed deviation.
const std::vector< std::string > & getParkingBadges() const
Returns the parking access rights of this type.
MSVehicleType * buildSingularType(const std::string &id) const
Duplicates the microsim vehicle type giving the newly created type the given id, marking it as vehicl...
static std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
const std::string & getID() const
Returns the id.
A storage for options typed value containers)
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
int precision()
return precision set on the device
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void setPrecision(int precision=gPrecision)
Sets the precision or resets it to default.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
static const RGBColor DEFAULT_COLOR
The default color (for vehicle types and vehicles)
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
bool computeLooped(const E *from, const E *to, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into, bool silent=false)
Builds the route between the given edges using the minimum effort at the given time if from == to,...
virtual bool compute(const E *from, const E *to, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into, bool silent=false)=0
Builds the route between the given edges using the minimum effort at the given time The definition of...
virtual double recomputeCosts(const std::vector< const E * > &edges, const V *const v, SUMOTime msTime, double *lengthp=nullptr) const
std::string getStringParam(const std::string ¶mName, const bool required=false, const std::string &deflt="") const
Retrieve a string parameter for the traffic object.
long long int NumericalID
virtual double getSpeed() const =0
Returns the object's current speed.
virtual SUMOTime getWaitingTime(const bool accumulated=false) const =0
virtual const MSLane * getLane() const =0
Returns the lane the object is currently at.
virtual double getPositionOnLane() const =0
Get the object's position along the lane.
Representation of a vehicle.
virtual bool isIdling() const =0
Returns whether the vehicle is idling (waiting to re-enter the net.
virtual double getBrakeGap(bool delayed=false) const =0
get distance for coming to a stop (used for rerouting checks)
Definition of vehicle stop (position and duration)
std::string edge
The edge to stop at.
ParkingType parking
whether the vehicle is removed from the net while stopping
std::string lane
The lane to stop at.
double speed
the speed at which this stop counts as reached (waypoint mode)
std::string parkingarea
(Optional) parking area if one is assigned to the stop
double startPos
The stopping position start.
int parametersSet
Information for the output which parameter were set.
int index
at which position in the stops list
SUMOTime jump
transfer time if there shall be a jump from this stop to the next route edge
SUMOTime until
The time at which the vehicle may continue its journey.
bool triggered
whether an arriving person lets the vehicle continue
SUMOTime ended
the time at which this stop was ended
double endPos
The stopping position end.
bool containerTriggered
whether an arriving container lets the vehicle continue
bool collision
Whether this stop was triggered by a collision.
SUMOTime arrival
The (expected) time at which the vehicle reaches the stop.
SUMOTime duration
The stopping duration.
Structure representing possible vehicle parameter.
int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle's end speed shall be chosen.
double departSpeed
(optional) The initial speed of the vehicle
std::string vtypeid
The vehicle's type id.
SUMOTime repetitionOffset
The time offset between vehicle reinsertions.
std::vector< std::string > via
List of the via-edges the vehicle must visit.
int repetitionsDone
The number of times the vehicle was already inserted.
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
void write(OutputDevice &dev, const OptionsCont &oc, const SumoXMLTag altTag=SUMO_TAG_VEHICLE, const std::string &typeID="") const
Writes the parameters as a beginning element.
int personNumber
The static number of persons in the vehicle when it departs (not including boarding persons)
RouteIndexDefinition arrivalEdgeProcedure
Information how the vehicle's final edge shall be chosen.
double departPos
(optional) The position the vehicle shall depart from
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
double arrivalPos
(optional) The position the vehicle shall arrive on
std::string routeid
The vehicle's route id.
std::string id
The vehicle's id.
std::vector< std::string > parkingBadges
The parking access rights.
std::vector< Stop > stops
List of the stops the vehicle will make, TraCI may add entries here.
int departEdge
(optional) The initial edge within the route of the vehicle
bool wasSet(int what) const
Returns whether the given parameter was set.
ArrivalPosDefinition arrivalPosProcedure
Information how the vehicle shall choose the arrival position.
std::string toTaz
The vehicle's destination zone (district)
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
int arrivalEdge
(optional) The final edge within the route of the vehicle
std::string fromTaz
The vehicle's origin zone (district)
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
std::string line
The vehicle's line (mainly for public transport)
int containerNumber
The static number of containers in the vehicle when it departs.
RouteIndexDefinition departEdgeProcedure
Information how the vehicle's initial edge shall be chosen.
static std::string getEdgeIDFromLane(const std::string laneID)
return edge id when given the lane ID
static int getIndexFromLane(const std::string laneID)
return lane index when given the lane ID
void resetStoppingPlaceScores()
SUMOTime sawBlockedStoppingPlace(const MSStoppingPlace *stoppingPlace, bool local) const
Get the time the StoppingPlace was confirmed to be blocked.
void rememberStoppingPlaceScore(const MSStoppingPlace *stoppingPlace, const std::string &score)
score only needed when running with gui
void rememberBlockedStoppingPlace(const MSStoppingPlace *stoppingPlace, bool local)
Store the time the StoppingPlace was confirmed to be blocked.
int size() const
returns the number of existing substrings
std::string get(int pos) const
returns the item at the given position
static bool startsWith(const std::string &str, const std::string prefix)
Checks whether a given string starts with the prefix.
static bool endsWith(const std::string &str, const std::string suffix)
Checks whether a given string ends with the suffix.
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
TRACI_CONST int ROUTING_MODE_AGGREGATED
TRACI_CONST int ROUTING_MODE_DEFAULT
TRACI_CONST int ROUTING_MODE_IGNORE_TRANSIENT_PERMISSIONS