90#define DEBUG_COND (isSelected())
92#define DEBUG_COND2(obj) ((obj != 0 && (obj)->isSelected()))
134 for (
auto p : persons) {
163 if (nextIsMyVehicles()) {
164 if (myI1 != myI1End) {
166 }
else if (myI3 != myI3End) {
180 if (nextIsMyVehicles()) {
181 if (myI1 != myI1End) {
182 return myLane->myVehicles[myI1];
183 }
else if (myI3 != myI3End) {
184 return myLane->myTmpVehicles[myI3];
186 assert(myI2 == myI2End);
190 return myLane->myPartialVehicles[myI2];
201 if (myI1 == myI1End && myI3 == myI3End) {
202 if (myI2 != myI2End) {
208 if (myI2 == myI2End) {
211 MSVehicle* cand = myI1 == myI1End ? myLane->myTmpVehicles[myI3] : myLane->myVehicles[myI1];
219 if (cand->
getPositionOnLane() < myLane->myPartialVehicles[myI2]->getPositionOnLane(myLane)) {
222 return !myDownstream;
236 int index,
bool isRampAccel,
237 const std::string& type) :
265 mySimulationTask(*this, 0),
270 assert(
myRNGs.size() > 0);
333 veh->addReminder(rem);
345 std::cout <<
SIMTIME <<
" setPartialOccupation. lane=" <<
getID() <<
" veh=" << v->
getID() <<
"\n";
365 std::cout <<
SIMTIME <<
" resetPartialOccupation. lane=" <<
getID() <<
" veh=" << v->
getID() <<
"\n";
385 std::cout <<
SIMTIME <<
" setManeuverReservation. lane=" <<
getID() <<
" veh=" << v->
getID() <<
"\n";
396 std::cout <<
SIMTIME <<
" resetManeuverReservation(): lane=" <<
getID() <<
" veh=" << v->
getID() <<
"\n";
441 if (leader ==
nullptr) {
446 leader = leaderInfo.first;
452 if (leader ==
nullptr) {
458 if (leaderBack >= frontGapNeeded) {
459 pos =
MIN2(pos, leaderBack - frontGapNeeded);
481 if (missingRearGap > 0) {
482 if (minPos + missingRearGap <=
myLength) {
489 return isInsertionSuccess(&veh, mspeed, minPos + missingRearGap, posLat,
true, notification);
500 const double speed = leader->
getSpeed();
502 if (leaderPos >= frontGapNeeded) {
512 MSLane::VehCont::iterator predIt =
myVehicles.begin();
523 double speed = mspeed;
524 if (leader !=
nullptr) {
530 if (leader !=
nullptr) {
533 frontMax = leaderRearPos - frontGapNeeded;
541 if (frontMax > minPos && backMin + POSITION_EPS < frontMax) {
543 if (
isInsertionSuccess(&veh, speed, backMin + POSITION_EPS, posLat,
true, notification)) {
584 if (last !=
nullptr) {
636 bool patchSpeed =
true;
653 for (
int i = 0; i < 10; i++) {
690 for (
int i = 0; i < 10; i++) {
717#ifdef DEBUG_EXTRAPOLATE_DEPARTPOS
726 double dist = speed *
STEPS2TIME(relevantDelay);
728 if (leaderInfo.first !=
nullptr) {
732 dist =
MIN2(dist, leaderInfo.second - frontGapNeeded);
744 if (nspeed < speed) {
746 speed =
MIN2(nspeed, speed);
748 }
else if (speed > 0) {
755 if (emergencyBrakeGap <= dist) {
763 if (errorMsg !=
"") {
764 WRITE_ERRORF(
TL(
"Vehicle '%' will not be able to depart using the given velocity (%)!"), aVehicle->
getID(), errorMsg);
776 double speed,
double pos,
double posLat,
bool patchSpeed,
780 WRITE_WARNINGF(
TL(
"Invalid departPos % given for vehicle '%'. Inserting at lane end instead."),
781 pos, aVehicle->
getID());
785#ifdef DEBUG_INSERTION
787 std::cout <<
"\nIS_INSERTION_SUCCESS\n"
789 <<
" veh '" << aVehicle->
getID()
792 <<
" speed=" << speed
793 <<
" patchSpeed=" << patchSpeed
802 std::vector<MSLane*>::const_iterator ri = bestLaneConts.begin();
809#ifdef DEBUG_INSERTION
811 std::cout <<
" bidi-lane occupied\n";
817 MSLink* firstRailSignal =
nullptr;
818 double firstRailSignalDist = -1;
824 if (nextStop.
lane ==
this) {
825 std::stringstream msg;
826 msg <<
"scheduled stop on lane '" <<
myID <<
"' too close";
827 const double distToStop = nextStop.
pars.
endPos - pos;
828 if (
checkFailure(aVehicle, speed, dist,
MAX2(0.0, cfModel.
stopSpeed(aVehicle, speed, distToStop, MSCFModel::CalcReason::FUTURE)),
839 MSLane* currentLane =
this;
842 while ((seen < dist || (isRail && firstRailSignal ==
nullptr)) && ri != bestLaneConts.end()) {
844 std::vector<MSLink*>::const_iterator link =
succLinkSec(*aVehicle, nRouteSuccs, *currentLane, bestLaneConts);
867 if (isRail && firstRailSignal ==
nullptr) {
868 std::string constraintInfo;
869 bool isInsertionOrder;
871 setParameter((isInsertionOrder ?
"insertionOrder" :
"insertionConstraint:")
872 + aVehicle->
getID(), constraintInfo);
873#ifdef DEBUG_INSERTION
875 std::cout <<
" insertion constraint at link " << (*link)->getDescription() <<
" not cleared \n";
883 if (firstRailSignal ==
nullptr && (*link)->
getTLLogic() !=
nullptr) {
884 firstRailSignal = *link;
885 firstRailSignalDist = seen;
891 bool brakeBeforeSignal = patchSpeed || speed <= vSafe;
893#ifdef DEBUG_INSERTION
895 std::cout <<
" oncoming rail traffic at link " << (*link)->getDescription() <<
"\n";
903 if (brakeBeforeSignal) {
904 speed =
MIN2(speed, vSafe);
908 cfModel.
getMaxDecel(), 0, posLat,
nullptr,
false, aVehicle)
909 || !(*link)->havePriority()) {
911 std::string errorMsg =
"";
912 const LinkState state = (*link)->getState();
918 errorMsg =
"unpriorised junction too close";
919 }
else if ((*link)->getTLLogic() !=
nullptr && !(*link)->getTLLogic()->getsMajorGreen((*link)->getTLIndex())) {
921 errorMsg =
"tlLogic '" + (*link)->getTLLogic()->getID() +
"' link " +
toString((*link)->getTLIndex()) +
" never switches to 'G'";
933#ifdef DEBUG_INSERTION
935 std::cout <<
SIMTIME <<
" isInsertionSuccess lane=" <<
getID()
936 <<
" veh=" << aVehicle->
getID()
937 <<
" patchSpeed=" << patchSpeed
938 <<
" speed=" << speed
939 <<
" remaining=" << remaining
943 <<
" failed (@926)!\n";
948#ifdef DEBUG_INSERTION
950 std::cout <<
"trying insertion before minor link: "
951 <<
"insertion speed = " << speed <<
" dist=" << dist
958 nextLane = (*link)->getViaLaneOrLane();
960 if (nextLane !=
nullptr) {
973 if (nextStop.
lane == nextLane) {
974 std::stringstream msg;
975 msg <<
"scheduled stop on lane '" << nextStop.
lane->
getID() <<
"' too close";
976 const double distToStop = seen + nextStop.
pars.
endPos;
989#ifdef DEBUG_INSERTION
991 std::cout <<
SIMTIME <<
" leader on lane '" << nextLane->
getID() <<
"': " << leaders.
toString() <<
" nspeed=" << nspeed <<
"\n";
996#ifdef DEBUG_INSERTION
998 std::cout <<
" isInsertionSuccess lane=" <<
getID()
999 <<
" veh=" << aVehicle->
getID()
1001 <<
" posLat=" << posLat
1002 <<
" patchSpeed=" << patchSpeed
1003 <<
" speed=" << speed
1004 <<
" nspeed=" << nspeed
1005 <<
" nextLane=" << nextLane->
getID()
1007 <<
" failed (@641)!\n";
1017 const double nspeed = cfModel.
freeSpeed(aVehicle, speed, seen, nextLane->
getVehicleMaxSpeed(aVehicle),
true, MSCFModel::CalcReason::FUTURE);
1018 if (nspeed < speed) {
1025 WRITE_WARNINGF(
TL(
"Vehicle '%' is inserted too fast and will violate the speed limit on a lane '%'."),
1029 WRITE_ERRORF(
TL(
"Vehicle '%' will not be able to depart using the given velocity (slow lane ahead)!"), aVehicle->
getID());
1040 if ((*link)->hasApproachingFoe(arrivalTime, leaveTime, speed, cfModel.
getMaxDecel())) {
1048 currentLane = nextLane;
1049 if ((*link)->getViaLane() ==
nullptr) {
1063#ifdef DEBUG_INSERTION
1065 std::cout <<
SIMTIME <<
" isInsertionSuccess lane=" <<
getID()
1066 <<
" veh=" << aVehicle->
getID()
1068 <<
" posLat=" << posLat
1069 <<
" patchSpeed=" << patchSpeed
1070 <<
" speed=" << speed
1071 <<
" nspeed=" << nspeed
1072 <<
" nextLane=" << nextLane->
getID()
1073 <<
" leaders=" << leaders.
toString()
1074 <<
" failed (@700)!\n";
1079#ifdef DEBUG_INSERTION
1081 std::cout <<
SIMTIME <<
" speed = " << speed <<
" nspeed = " << nspeed << std::endl;
1086 for (
int i = 0; i < followers.
numSublanes(); ++i) {
1087 const MSVehicle* follower = followers[i].first;
1088 if (follower !=
nullptr) {
1090 if (followers[i].second < backGapNeeded
1094#ifdef DEBUG_INSERTION
1096 std::cout <<
SIMTIME <<
" isInsertionSuccess lane=" <<
getID()
1097 <<
" veh=" << aVehicle->
getID()
1099 <<
" posLat=" << posLat
1100 <<
" speed=" << speed
1101 <<
" nspeed=" << nspeed
1102 <<
" follower=" << follower->
getID()
1103 <<
" backGapNeeded=" << backGapNeeded
1104 <<
" gap=" << followers[i].second
1105 <<
" failure (@719)!\n";
1118#ifdef DEBUG_INSERTION
1123 if (shadowLane !=
nullptr) {
1125 for (
int i = 0; i < shadowFollowers.
numSublanes(); ++i) {
1126 const MSVehicle* follower = shadowFollowers[i].first;
1127 if (follower !=
nullptr) {
1129 if (shadowFollowers[i].second < backGapNeeded
1133#ifdef DEBUG_INSERTION
1136 <<
" isInsertionSuccess shadowlane=" << shadowLane->
getID()
1137 <<
" veh=" << aVehicle->
getID()
1139 <<
" posLat=" << posLat
1140 <<
" speed=" << speed
1141 <<
" nspeed=" << nspeed
1142 <<
" follower=" << follower->
getID()
1143 <<
" backGapNeeded=" << backGapNeeded
1144 <<
" gap=" << shadowFollowers[i].second
1145 <<
" failure (@812)!\n";
1155 if (veh !=
nullptr) {
1162#ifdef DEBUG_INSERTION
1165 <<
" isInsertionSuccess shadowlane=" << shadowLane->
getID()
1166 <<
" veh=" << aVehicle->
getID()
1168 <<
" posLat=" << posLat
1169 <<
" speed=" << speed
1170 <<
" nspeed=" << nspeed
1171 <<
" leader=" << veh->
getID()
1172 <<
" gapNeeded=" << gapNeeded
1174 <<
" failure (@842)!\n";
1186 if (missingRearGap > 0
1189#ifdef DEBUG_INSERTION
1192 <<
" isInsertionSuccess lane=" <<
getID()
1193 <<
" veh=" << aVehicle->
getID()
1195 <<
" posLat=" << posLat
1196 <<
" speed=" << speed
1197 <<
" nspeed=" << nspeed
1198 <<
" missingRearGap=" << missingRearGap
1199 <<
" failure (@728)!\n";
1206 speed =
MAX2(0.0, speed);
1210#ifdef DEBUG_INSERTION
1213 <<
" isInsertionSuccess lane=" <<
getID()
1214 <<
" veh=" << aVehicle->
getID()
1216 <<
" posLat=" << posLat
1217 <<
" speed=" << speed
1218 <<
" nspeed=" << nspeed
1219 <<
" failed (@733)!\n";
1226 if (extraReservation > 0) {
1227 std::stringstream msg;
1228 msg <<
"too many lane changes required on lane '" <<
myID <<
"'";
1231 double stopSpeed = cfModel.
stopSpeed(aVehicle, speed, distToStop, MSCFModel::CalcReason::FUTURE);
1232#ifdef DEBUG_INSERTION
1234 std::cout <<
"\nIS_INSERTION_SUCCESS\n"
1235 <<
SIMTIME <<
" veh=" << aVehicle->
getID() <<
" bestLaneOffset=" << bestLaneOffset <<
" bestLaneDist=" << aVehicle->
getBestLaneDist() <<
" extraReservation=" << extraReservation
1236 <<
" distToStop=" << distToStop <<
" v=" << speed <<
" v2=" << stopSpeed <<
"\n";
1247 return v->getPositionOnLane() >= pos;
1249#ifdef DEBUG_INSERTION
1252 <<
" isInsertionSuccess lane=" <<
getID()
1253 <<
" veh=" << aVehicle->
getID()
1255 <<
" posLat=" << posLat
1256 <<
" speed=" << speed
1257 <<
" nspeed=" << nspeed
1261 <<
"\n leaders=" << leaders.
toString()
1285 return v->getPositionOnLane() >= pos;
1292 double nspeed = speed;
1293#ifdef DEBUG_INSERTION
1295 std::cout <<
SIMTIME <<
" safeInsertionSpeed veh=" << veh->
getID() <<
" speed=" << speed <<
"\n";
1300 if (leader !=
nullptr) {
1309 nspeed =
MIN2(nspeed,
1311#ifdef DEBUG_INSERTION
1313 std::cout <<
" leader=" << leader->
getID() <<
" nspeed=" << nspeed <<
"\n";
1328 int freeSublanes = 1;
1333 while (freeSublanes > 0 && veh !=
nullptr) {
1334#ifdef DEBUG_PLAN_MOVE
1337 std::cout <<
" getLastVehicleInformation lane=" <<
getID() <<
" minPos=" << minPos <<
" veh=" << veh->
getID() <<
" pos=" << veh->
getPositionOnLane(
this) <<
"\n";
1342 freeSublanes = leaderTmp.
addLeader(veh,
true, vehLatOffset);
1343#ifdef DEBUG_PLAN_MOVE
1345 std::cout <<
" latOffset=" << vehLatOffset <<
" newLeaders=" << leaderTmp.
toString() <<
"\n";
1351 if (ego ==
nullptr && minPos == 0) {
1359#ifdef DEBUG_PLAN_MOVE
1388 int freeSublanes = 1;
1390 while (freeSublanes > 0 && veh !=
nullptr) {
1391#ifdef DEBUG_PLAN_MOVE
1393 std::cout <<
" veh=" << veh->
getID() <<
" pos=" << veh->
getPositionOnLane(
this) <<
" maxPos=" << maxPos <<
"\n";
1400#ifdef DEBUG_PLAN_MOVE
1402 std::cout <<
" veh=" << veh->
getID() <<
" latOffset=" << vehLatOffset <<
"\n";
1405 freeSublanes = followerTmp.
addLeader(veh,
true, vehLatOffset);
1409 if (ego ==
nullptr && maxPos == std::numeric_limits<double>::max()) {
1414#ifdef DEBUG_PLAN_MOVE
1437 double cumulatedVehLength = 0.;
1441 VehCont::reverse_iterator veh =
myVehicles.rbegin();
1444#ifdef DEBUG_PLAN_MOVE
1448 <<
" planMovements() lane=" <<
getID()
1456#ifdef DEBUG_PLAN_MOVE
1458 std::cout <<
" plan move for: " << (*veh)->getID();
1462#ifdef DEBUG_PLAN_MOVE
1464 std::cout <<
" leaders=" << leaders.
toString() <<
"\n";
1467 (*veh)->planMove(t, leaders, cumulatedVehLength);
1468 cumulatedVehLength += (*veh)->getVehicleType().getLengthWithGap();
1477 veh->setApproachingForAllLinks(t);
1486 bool nextToConsiderIsPartial;
1489 while (moreReservationsAhead || morePartialVehsAhead) {
1490 if ((!moreReservationsAhead || (*vehRes)->getPositionOnLane(
this) <= veh->
getPositionOnLane())
1491 && (!morePartialVehsAhead || (*vehPart)->getPositionOnLane(
this) <= veh->
getPositionOnLane())) {
1497 if (moreReservationsAhead && !morePartialVehsAhead) {
1498 nextToConsiderIsPartial =
false;
1499 }
else if (morePartialVehsAhead && !moreReservationsAhead) {
1500 nextToConsiderIsPartial =
true;
1502 assert(morePartialVehsAhead && moreReservationsAhead);
1504 nextToConsiderIsPartial = (*vehPart)->getPositionOnLane(
this) > (*vehRes)->getPositionOnLane(
this);
1507 if (nextToConsiderIsPartial) {
1508 const double latOffset = (*vehPart)->getLatOffset(
this);
1509#ifdef DEBUG_PLAN_MOVE
1511 std::cout <<
" partial ahead: " << (*vehPart)->getID() <<
" latOffset=" << latOffset <<
"\n";
1515 && !(*vehPart)->getLaneChangeModel().isChangingLanes())) {
1516 ahead.
addLeader(*vehPart,
false, latOffset);
1521 const double latOffset = (*vehRes)->getLatOffset(
this);
1522#ifdef DEBUG_PLAN_MOVE
1524 std::cout <<
" reservation ahead: " << (*vehRes)->getID() <<
" latOffset=" << latOffset <<
"\n";
1527 ahead.
addLeader(*vehRes,
false, latOffset);
1538#ifdef DEBUG_COLLISIONS
1540 std::vector<const MSVehicle*> all;
1542 all.push_back(*last);
1544 std::cout <<
SIMTIME <<
" detectCollisions stage=" << stage <<
" lane=" <<
getID() <<
":\n"
1547 <<
" all=" <<
toString(all) <<
"\n"
1556 std::set<const MSVehicle*, ComparatorNumericalIdLess> toRemove;
1557 std::set<const MSVehicle*, ComparatorNumericalIdLess> toTeleport;
1560#ifdef DEBUG_JUNCTION_COLLISIONS
1562 std::cout <<
SIMTIME <<
" detect junction Collisions stage=" << stage <<
" lane=" <<
getID() <<
":\n"
1569 const std::vector<const MSLane*>& foeLanes =
myLinks.front()->getFoeLanes();
1576 for (
const MSLane*
const foeLane : foeLanes) {
1577#ifdef DEBUG_JUNCTION_COLLISIONS
1579 std::cout <<
" foeLane " << foeLane->getID()
1580 <<
" foeVehs=" <<
toString(foeLane->myVehicles)
1581 <<
" foePart=" <<
toString(foeLane->myPartialVehicles) <<
"\n";
1586 const MSVehicle*
const victim = *it_veh;
1587 if (victim == collider) {
1591#ifdef DEBUG_JUNCTION_COLLISIONS
1594 <<
" bound=" << colliderBoundary <<
" foeBound=" << victim->
getBoundingBox()
1609 foeLane->handleCollisionBetween(timestep, stage, victim, collider, -1, 0, toRemove, toTeleport);
1618 if (
myLinks.front()->getWalkingAreaFoe() !=
nullptr) {
1621 if (
myLinks.front()->getWalkingAreaFoeExit() !=
nullptr) {
1629#ifdef DEBUG_PEDESTRIAN_COLLISIONS
1631 std::cout <<
SIMTIME <<
" detect pedestrian collisions stage=" << stage <<
" lane=" <<
getID() <<
"\n";
1645#ifdef DEBUG_PEDESTRIAN_COLLISIONS
1648 <<
" dist=" << leader.second <<
" jammed=" << leader.first->isJammed() <<
"\n";
1651 if (leader.first != 0 && leader.second < length && !leader.first->isJammed()) {
1658 WRITE_WARNINGF(
TL(
"Vehicle '%' collision with person '%', lane='%', gap=%, time=%, stage=%."),
1671 VehCont::reverse_iterator lastVeh =
myVehicles.rend() - 1;
1672 for (VehCont::reverse_iterator pred =
myVehicles.rbegin(); pred != lastVeh; ++pred) {
1673 VehCont::reverse_iterator veh = pred + 1;
1684 double high = (*veh)->getPositionOnLane(
this);
1685 double low = (*veh)->getBackPositionOnLane(
this);
1693 if (*veh == *veh2 && !
isRailway((*veh)->getVClass())) {
1696 double low2 =
myLength - (*veh2)->getPositionOnLane(bidiLane);
1697 double high2 =
myLength - (*veh2)->getBackPositionOnLane(bidiLane);
1703 if (!(high < low2 || high2 < low)) {
1704#ifdef DEBUG_COLLISIONS
1706 std::cout <<
SIMTIME <<
" bidi-collision veh=" << (*veh)->getID() <<
" bidiVeh=" << (*veh2)->getID()
1707 <<
" vehFurther=" <<
toString((*veh)->getFurtherLanes())
1708 <<
" high=" << high <<
" low=" << low <<
" high2=" << high2 <<
" low2=" << low2 <<
"\n";
1737 if (lead == follow) {
1752 for (std::set<const MSVehicle*, ComparatorNumericalIdLess>::iterator it = toRemove.begin(); it != toRemove.end(); ++it) {
1756 if (toTeleport.count(veh) > 0) {
1768 SUMOTime timestep,
const std::string& stage) {
1770#ifdef DEBUG_PEDESTRIAN_COLLISIONS
1772 std::cout <<
SIMTIME <<
" detect pedestrian junction collisions stage=" << stage <<
" lane=" <<
getID() <<
" foeLane=" << foeLane->
getID() <<
"\n";
1776 for (std::vector<MSTransportable*>::const_iterator it_p = persons.begin(); it_p != persons.end(); ++it_p) {
1777#ifdef DEBUG_PEDESTRIAN_COLLISIONS
1779 std::cout <<
" collider=" << collider->
getID()
1780 <<
" ped=" << (*it_p)->getID()
1781 <<
" jammed=" << (*it_p)->isJammed()
1782 <<
" colliderBoundary=" << colliderBoundary
1783 <<
" pedBoundary=" << (*it_p)->getBoundingBox()
1787 if ((*it_p)->isJammed()) {
1790 if (colliderBoundary.
overlapsWith((*it_p)->getBoundingBox())
1792 std::string collisionType =
"junctionPedestrian";
1794 collisionType =
"crossing";
1796 collisionType =
"walkingarea";
1800 WRITE_WARNINGF(
TL(
"Vehicle '%' collision with person '%', lane='%', time=%, stage=%."),
1812 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
1813 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport)
const {
1820 if (collider == victim) {
1826 const bool bothOpposite = victimOpposite && colliderOpposite;
1842 }
else if (colliderOpposite) {
1846#ifdef DEBUG_COLLISIONS
1849 <<
" thisLane=" <<
getID()
1850 <<
" collider=" << collider->
getID()
1851 <<
" victim=" << victim->
getID()
1852 <<
" colOpposite=" << colliderOpposite
1853 <<
" vicOpposite=" << victimOpposite
1856 <<
" colPos=" << colliderPos
1857 <<
" vicBack=" << victimBack
1861 <<
" minGapFactor=" << minGapFactor
1870 if (gap < -NUMERICAL_EPS) {
1875 if (latGap + NUMERICAL_EPS > 0) {
1881 double gapDelta = 0;
1882 const MSVehicle* otherLaneVeh = collider->
getLane() ==
this ? victim : collider;
1887 if (&cand->getEdge() == &
getEdge()) {
1888 gapDelta =
getLength() - cand->getLength();
1893 if (gap + gapDelta >= 0) {
1901 && victim->
getLane() !=
this) {
1905#ifdef DEBUG_COLLISIONS
1907 std::cout <<
SIMTIME <<
" detectedCollision gap=" << gap <<
" latGap=" << latGap <<
"\n";
1919 double gap,
double latGap, std::set<const MSVehicle*, ComparatorNumericalIdLess>& toRemove,
1920 std::set<const MSVehicle*, ComparatorNumericalIdLess>& toTeleport)
const {
1926 ?
"frontal collision"
1927 : (
isInternal() ?
"junction collision" :
"collision"));
1932 std::string prefix =
"Vehicle '" + collider->
getID() +
"'; " + collisionType +
" with vehicle '" + victim->
getID() ;
1937 std::string dummyError;
1943 double victimSpeed = victim->
getSpeed();
1944 double colliderSpeed = collider->
getSpeed();
1947 if (collisionAngle < 45) {
1949 colliderSpeed =
MIN2(colliderSpeed, victimSpeed);
1950 }
else if (collisionAngle < 135) {
1989 prefix =
"Teleporting vehicle '" + collider->
getID() +
"'; " + collisionType +
" with vehicle '" + victim->
getID() ;
1990 toRemove.insert(collider);
1991 toTeleport.insert(collider);
1994 prefix =
"Removing " + collisionType +
" participants: vehicle '" + collider->
getID() +
"', vehicle '" + victim->
getID();
1995 bool removeCollider =
true;
1996 bool removeVictim =
true;
2000 toRemove.insert(victim);
2002 if (removeCollider) {
2003 toRemove.insert(collider);
2005 if (!removeVictim) {
2006 if (!removeCollider) {
2007 prefix =
"Keeping remote-controlled " + collisionType +
" participants: vehicle '" + collider->
getID() +
"', vehicle '" + victim->
getID();
2009 prefix =
"Removing " + collisionType +
" participant: vehicle '" + collider->
getID() +
"', keeping remote-controlled vehicle '" + victim->
getID();
2011 }
else if (!removeCollider) {
2012 prefix =
"Keeping remote-controlled " + collisionType +
" participant: vehicle '" + collider->
getID() +
"', removing vehicle '" + victim->
getID();
2020 if (collisionType ==
"frontal collision") {
2021 collisionType =
"frontal";
2022 }
else if (collisionType ==
"junction collision") {
2023 collisionType =
"junction";
2028 +
"', lane='" +
getID()
2032 +
" stage=" + stage +
".");
2037#ifdef DEBUG_COLLISIONS
2039 toRemove.erase(collider);
2040 toTeleport.erase(collider);
2043 toRemove.erase(victim);
2044 toTeleport.erase(victim);
2069#ifdef DEBUG_EXEC_MOVE
2071 std::cout <<
SIMTIME <<
" veh " << veh->
getID() <<
" has arrived." << std::endl;
2076 }
else if (target !=
nullptr && moved) {
2101 WRITE_WARNINGF(
TL(
"Teleporting vehicle '%'; beyond end of lane, target lane='%', time=%."),
2108 WRITE_WARNINGF(
TL(
"Removing vehicle '%' after earlier collision, lane='%', time=%."),
2113 WRITE_WARNINGF(
TL(
"Teleporting vehicle '%' after earlier collision, lane='%', time=%."),
2117 if (firstNotStopped ==
nullptr && !(*i)->
isStopped() && (*i)->getLane() ==
this) {
2118 firstNotStopped = *i;
2124 if (firstNotStopped ==
nullptr && !(*i)->
isStopped() && (*i)->getLane() ==
this) {
2125 firstNotStopped = *i;
2133 i = VehCont::reverse_iterator(
myVehicles.erase(i.base()));
2135 if (firstNotStopped !=
nullptr) {
2139 const bool wrongLane = !
appropriate(firstNotStopped);
2140 const bool r1 = ttt > 0 && firstNotStopped->
getWaitingTime() > ttt;
2145 && firstNotStopped->
succEdge(1) !=
nullptr
2147 const bool r4 = !r1 && !r2 && !r3 && tttb > 0
2149 if (r1 || r2 || r3 || r4) {
2151 const bool minorLink = !wrongLane && (link !=
myLinks.end()) && !((*link)->havePriority());
2152 std::string reason = (wrongLane ?
" (wrong lane" : (minorLink ?
" (yield" :
" (jam"));
2159 reason =
" (blocked";
2161 WRITE_WARNINGF(
"Teleporting vehicle '%'; waited too long" + reason
2162 + (r2 ?
", highway" :
"")
2163 + (r3 ?
", disconnected" :
"")
2164 + (r4 ?
", bidi" :
"")
2168 }
else if (minorLink) {
2221 const MSLane* firstInternal =
this;
2223 while (pred !=
nullptr && pred->
isInternal()) {
2224 firstInternal = pred;
2228 return firstInternal;
2235 const DictType::iterator it =
myDict.lower_bound(
id);
2236 if (it ==
myDict.end() || it->first !=
id) {
2238 myDict.emplace_hint(it,
id, ptr);
2247 const DictType::iterator it =
myDict.find(
id);
2248 if (it ==
myDict.end()) {
2258 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
2267 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
2268 into.push_back((*i).first);
2273template<
class RTREE>
void
2275 for (DictType::iterator i =
myDict.begin(); i !=
myDict.end(); ++i) {
2279 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
2280 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
2281 into.Insert(cmin, cmax, l);
2285template void MSLane::fill<NamedRTree>(
NamedRTree& into);
2306 return (link !=
myLinks.end());
2316 assert(veh->getLane() ==
this);
2330#ifdef DEBUG_VEHICLE_CONTAINER
2350 std::cout <<
"sortManeuverReservations on lane " <<
getID()
2419std::vector<MSLink*>::const_iterator
2421 const MSLane& succLinkSource,
const std::vector<MSLane*>& conts) {
2424 if (nRouteEdge ==
nullptr) {
2426 return succLinkSource.
myLinks.end();
2430 assert(succLinkSource.
myLinks.size() == 1);
2433 return succLinkSource.
myLinks.begin();
2444 if (nRouteSuccs < (
int)conts.size()) {
2446 for (std::vector<MSLink*>::const_iterator link = succLinkSource.
myLinks.begin(); link != succLinkSource.
myLinks.end(); ++link) {
2447 if ((*link)->getLane() !=
nullptr && (*link)->getLane()->myEdge == nRouteEdge && (*link)->getLane()->allowsVehicleClass(veh.
getVehicleType().
getVehicleClass())) {
2449 if ((*link)->getLane() == conts[nRouteSuccs]) {
2456 return succLinkSource.
myLinks.end();
2459#ifdef DEBUG_NO_CONNECTION
2461 WRITE_WARNING(
"Could not find connection between lane " + succLinkSource.
getID() +
" and lane " + conts[nRouteSuccs]->getID() +
2464 return succLinkSource.
myLinks.end();
2472 if ((internal && l->getViaLane() == target) || (!internal && l->getLane() == target)) {
2483 if (l->getLane() == target) {
2484 return l->getViaLane();
2496 const MSLane* internal =
this;
2498 assert(lane !=
nullptr);
2502 assert(lane !=
nullptr);
2545 assert(remVehicle->
getLane() ==
this);
2547 if (remVehicle == *it) {
2582 }
else if (!approachingEdge->
isInternal() && warnMultiCon) {
2585 WRITE_WARNINGF(
TL(
"Lane '%' is approached multiple times from edge '%'. This may cause collisions."),
2594 std::map<MSEdge*, std::vector<MSLane*> >::const_iterator i =
myApproachingLanes.find(edge);
2598 const std::vector<MSLane*>& lanes = (*i).second;
2599 return std::find(lanes.begin(), lanes.end(), lane) != lanes.end();
2610 const MSVehicle* v = followerInfo.first;
2625 return MIN2(maxSpeed * maxSpeed * 0.5 / minDecel,
2630std::pair<MSVehicle* const, double>
2631MSLane::getLeader(
const MSVehicle* veh,
const double vehPos,
const std::vector<MSLane*>& bestLaneConts,
double dist,
bool checkTmpVehicles)
const {
2639 if (checkTmpVehicles) {
2648 std::cout << std::setprecision(
gPrecision) <<
" getLeader lane=" <<
getID() <<
" ego=" << veh->
getID() <<
" egoPos=" << vehPos <<
" pred=" << pred->
getID() <<
" predPos=" << pred->
getPositionOnLane() <<
"\n";
2664 std::cout <<
" getLeader lane=" <<
getID() <<
" ego=" << veh->
getID() <<
" egoPos=" << vehPos
2681 if (bestLaneConts.size() > 0) {
2689 std::cout <<
" getLeader lane=" <<
getID() <<
" seen=" << seen <<
" dist=" << dist <<
"\n";
2693 return std::pair<MSVehicle* const, double>(
static_cast<MSVehicle*
>(
nullptr), -1);
2697 return std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
2702std::pair<MSVehicle* const, double>
2704 const std::vector<MSLane*>& bestLaneConts)
const {
2707 std::cout <<
" getLeaderOnConsecutive lane=" <<
getID() <<
" ego=" << veh.
getID() <<
" seen=" << seen <<
" dist=" << dist <<
" conts=" <<
toString(bestLaneConts) <<
"\n";
2711 return std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
2726 return std::pair<MSVehicle* const, double>(pred, gap);
2734 const MSLane* nextLane =
this;
2738 std::vector<MSLink*>::const_iterator link =
succLinkSec(veh, view, *nextLane, bestLaneConts);
2742 std::cout <<
" cannot continue after nextLane=" << nextLane->
getID() <<
"\n";
2749 const bool laneChanging = veh.
getLane() !=
this;
2752 if (linkLeaders.size() > 0) {
2753 std::pair<MSVehicle*, double> result;
2754 double shortestGap = std::numeric_limits<double>::max();
2755 for (
auto ll : linkLeaders) {
2756 double gap = ll.vehAndGap.second;
2758 if (lVeh !=
nullptr) {
2765 <<
" isLeader=" << veh.
isLeader(*link, lVeh, gap)
2766 <<
" gap=" << ll.vehAndGap.second
2767 <<
" gap+brakeing=" << gap
2772 if (lVeh !=
nullptr && !laneChanging && !veh.
isLeader(*link, lVeh, ll.vehAndGap.second)) {
2775 if (gap < shortestGap) {
2777 result = ll.vehAndGap;
2780 if (shortestGap != std::numeric_limits<double>::max()) {
2783 std::cout <<
" found linkLeader after nextLane=" << nextLane->
getID() <<
"\n";
2790 bool nextInternal = (*link)->getViaLane() !=
nullptr;
2791 nextLane = (*link)->getViaLaneOrLane();
2792 if (nextLane ==
nullptr) {
2797 if (leader !=
nullptr) {
2800 std::cout <<
" found leader " << leader->
getID() <<
" on nextLane=" << nextLane->
getID() <<
"\n";
2805 return std::make_pair(leader, leaderDist);
2812 if (!nextInternal) {
2815 }
while (seen <= dist || nextLane->
isInternal());
2819 return std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
2823std::pair<MSVehicle* const, double>
2827 std::cout <<
SIMTIME <<
" getCriticalLeader. lane=" <<
getID() <<
" veh=" << veh.
getID() <<
"\n";
2831 std::pair<MSVehicle*, double> result = std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
2832 double safeSpeed = std::numeric_limits<double>::max();
2837 const MSLane* nextLane =
this;
2841 std::vector<MSLink*>::const_iterator link =
succLinkSec(veh, view, *nextLane, bestLaneConts);
2858 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
2859 const MSVehicle* leader = (*it).vehAndGap.first;
2860 if (leader !=
nullptr && leader != result.first) {
2864 double tmpSpeed = safeSpeed;
2865 veh.
adaptToJunctionLeader((*it).vehAndGap, seen,
nullptr, nextLane, tmpSpeed, tmpSpeed, (*it).distToCrossing);
2868 std::cout <<
" linkLeader=" << leader->
getID() <<
" gap=" << result.second <<
" tmpSpeed=" << tmpSpeed <<
" safeSpeed=" << safeSpeed <<
"\n";
2871 if (tmpSpeed < safeSpeed) {
2872 safeSpeed = tmpSpeed;
2873 result = (*it).vehAndGap;
2877 bool nextInternal = (*link)->getViaLane() !=
nullptr;
2878 nextLane = (*link)->getViaLaneOrLane();
2879 if (nextLane ==
nullptr) {
2883 if (leader !=
nullptr && leader != result.first) {
2886 if (tmpSpeed < safeSpeed) {
2887 safeSpeed = tmpSpeed;
2888 result = std::make_pair(leader, gap);
2899 if (!nextInternal) {
2902 }
while (seen <= dist || nextLane->
isInternal());
2912 for (MSEdgeVector::iterator i = pred.begin(); i != pred.end();) {
2921 if (pred.size() != 0) {
2923 MSEdge* best = *pred.begin();
2955 if (&(cand.lane->getEdge()) == &fromEdge) {
2980#ifdef DEBUG_LANE_SORTER
2996 std::vector<MSLink*> candidateLinks =
myLinks;
2999 MSLane* best = (*candidateLinks.begin())->getViaLaneOrLane();
3000#ifdef DEBUG_LANE_SORTER
3001 std::cout <<
"\nBest successor lane for lane '" <<
myID <<
"': '" << best->
getID() <<
"'" << std::endl;
3011 if (pred ==
nullptr) {
3019const std::vector<std::pair<const MSLane*, const MSEdge*> >
3021 std::vector<std::pair<const MSLane*, const MSEdge*> > result;
3023 assert(link->getLane() !=
nullptr);
3024 result.push_back(std::make_pair(link->getLane(), link->getViaLane() ==
nullptr ?
nullptr : &link->getViaLane()->getEdge()));
3029std::vector<const MSLane*>
3031 std::vector<const MSLane*> result = {};
3033 for (std::vector<MSLane*>::const_iterator it_lane = (*it).second.begin(); it_lane != (*it).second.end(); ++it_lane) {
3034 if (!((*it_lane)->isInternal())) {
3035 result.push_back(*it_lane);
3059 for (std::vector<MSLink*>::const_iterator i =
myLinks.begin(); i !=
myLinks.end(); ++i) {
3060 if ((*i)->getLane()->getEdge().isCrossing()) {
3061 return (
int)(i -
myLinks.begin());
3077 if (cand->getLane() == bidi) {
3078 sum += (brutto ? cand->getVehicleType().getLengthWithGap() : cand->getVehicleType().getLength());
3080 sum +=
myLength - cand->getBackPositionOnLane(
this);
3124 wtime += (*i)->getWaitingSeconds();
3139 v += veh->getSpeed();
3161 v += veh->getSpeed();
3180 if (vehs.size() == 0) {
3184 for (MSLane::VehCont::const_iterator i = vehs.begin(); i != vehs.end(); ++i) {
3185 double sv = (*i)->getHarmonoise_NoiseEmissions();
3186 ret += (double) pow(10., (sv / 10.));
3219 myLaneDir(e->getLanes()[0]->
getShape().angleAt2D(0)) {
3230 if (ae1 !=
nullptr && ae1->size() != 0) {
3240 if (ae2 !=
nullptr && ae2->size() != 0) {
3260 myLaneDir(targetLane->
getShape().angleAt2D(0)) {}
3278#ifdef DEBUG_LANE_SORTER
3279 std::cout <<
"\nincoming_lane_priority sorter()\n"
3280 <<
"noninternal predecessor for lane '" << laneInfo1.
lane->
getID()
3281 <<
"': '" << noninternal1->
getID() <<
"'\n"
3282 <<
"noninternal predecessor for lane '" << laneInfo2.
lane->
getID()
3283 <<
"': '" << noninternal2->
getID() <<
"'\n";
3291 bool priorized1 =
true;
3292 bool priorized2 =
true;
3294#ifdef DEBUG_LANE_SORTER
3295 std::cout <<
"FoeLinks of '" << noninternal1->
getID() <<
"'" << std::endl;
3298#ifdef DEBUG_LANE_SORTER
3299 std::cout << foeLink->getLaneBefore()->getID() << std::endl;
3301 if (foeLink == link2) {
3307#ifdef DEBUG_LANE_SORTER
3308 std::cout <<
"FoeLinks of '" << noninternal2->
getID() <<
"'" << std::endl;
3311#ifdef DEBUG_LANE_SORTER
3312 std::cout << foeLink->getLaneBefore()->getID() << std::endl;
3315 if (foeLink == link1) {
3323 if (priorized1 != priorized2) {
3337 myLaneDir(sourceLane->
getShape().angleAt2D(0)) {}
3343 if (target2 ==
nullptr) {
3346 if (target1 ==
nullptr) {
3350#ifdef DEBUG_LANE_SORTER
3351 std::cout <<
"\noutgoing_lane_priority sorter()\n"
3352 <<
"noninternal successors for lane '" << myLane->
getID()
3353 <<
"': '" << target1->
getID() <<
"' and "
3354 <<
"'" << target2->
getID() <<
"'\n";
3361 if (priority1 != priority2) {
3362 return priority1 > priority2;
3388 if (link->getApproaching().size() > 0) {
3397 const bool toRailJunction =
myLinks.size() > 0 && (
3400 const bool hasVehicles =
myVehicles.size() > 0;
3409 if (toRailJunction) {
3411 if (link->getApproaching().size() > 0) {
3414 for (
auto item : link->getApproaching()) {
3424 if (item.second.latOffset != 0) {
3456 for (
const std::string&
id : vehIds) {
3499 bool allSublanes,
double searchDist,
MinorLinkMode mLinkMode)
const {
3508 std::cout <<
SIMTIME <<
" getFollowers lane=" <<
getID() <<
" ego=" << ego->
getID()
3509 <<
" backOffset=" << backOffset <<
" pos=" << egoPos
3510 <<
" allSub=" << allSublanes <<
" searchDist=" << searchDist <<
" ignoreMinor=" << mLinkMode
3511 <<
" egoLatDist=" << egoLatDist
3512 <<
" getOppositeLeaders=" << getOppositeLeaders
3528 std::cout <<
SIMTIME <<
" getFollowers lane=" <<
getID() <<
" ego=" << ego->
getID()
3551 std::cout <<
" (1) added veh=" << veh->
getID() <<
" latOffset=" << latOffset <<
" result=" << result.
toString() <<
"\n";
3558 std::cout <<
" result.numFreeSublanes=" << result.
numFreeSublanes() <<
"\n";
3566 if (searchDist == -1) {
3570 std::cout <<
" computed searchDist=" << searchDist <<
"\n";
3574 std::set<const MSEdge*> egoFurther;
3576 egoFurther.insert(&further->getEdge());
3589 std::vector<MSLane::IncomingLaneInfo> newFound;
3591 while (toExamine.size() != 0) {
3592 for (std::vector<MSLane::IncomingLaneInfo>::iterator it = toExamine.begin(); it != toExamine.end(); ++it) {
3593 MSLane* next = (*it).lane;
3599 std::cout <<
" next=" << next->
getID() <<
" seen=" << (*it).length <<
" first=" << first.
toString() <<
" firstFront=" << firstFront.
toString() <<
" backOffset=" << backOffset <<
"\n";
3603 if (backOffset + (*it).length - next->
getLength() < 0
3604 && egoFurther.count(&next->
getEdge()) != 0
3610 for (
const auto& ll : linkLeaders) {
3611 if (ll.vehAndGap.first !=
nullptr) {
3612 const bool egoIsLeader = ll.vehAndGap.first->isLeader((*it).viaLink, ego, ll.vehAndGap.second);
3615 const double gap = (egoIsLeader
3616 ? -ll.vehAndGap.second - ll.vehAndGap.first->getVehicleType().getLengthWithGap() - ego->
getVehicleType().
getMinGap()
3621 std::cout <<
SIMTIME <<
" ego=" << ego->
getID() <<
" link=" << (*it).viaLink->getViaLaneOrLane()->getID()
3623 <<
" gap=" << ll.vehAndGap.second <<
" dtC=" << ll.distToCrossing
3624 <<
" egoIsLeader=" << egoIsLeader <<
" gap2=" << gap
3638 const MSVehicle* v = first[i] == ego ? firstFront[i] : first[i];
3641 if (v !=
nullptr && v != ego) {
3648 agap = (*it).length - next->
getLength() + backOffset
3653 std::cout <<
" agap1=" << agap <<
"\n";
3659 if (!getOppositeLeaders) {
3664 if (v !=
nullptr && v != ego) {
3673 if (!(*it).viaLink->havePriority() && !ego->
onFurtherEdge(&(*it).lane->getEdge())
3678 agap =
MAX2(agap, 0.0);
3689 if ((*it).length < searchDist) {
3690 const std::vector<MSLane::IncomingLaneInfo>& followers = next->
getIncomingLanes();
3691 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator j = followers.begin(); j != followers.end(); ++j) {
3692 if (visited.find((*j).lane) == visited.end() && (((*j).viaLink->havePriority() && !(*j).viaLink->isTurnaround())
3693 || mLinkMode == MinorLinkMode::FOLLOW_ALWAYS
3694 || (mLinkMode == MinorLinkMode::FOLLOW_ONCOMING && (*j).viaLink->getDirection() ==
LinkDirection::STRAIGHT))) {
3695 visited.insert((*j).lane);
3697 ili.
lane = (*j).lane;
3698 ili.
length = (*j).length + (*it).length;
3700 newFound.push_back(ili);
3706 swap(newFound, toExamine);
3718 bool oppositeDirection)
const {
3737 const MSLane* nextLane =
this;
3742 bool nextInternal =
false;
3743 if (oppositeDirection) {
3744 if (view >= (
int)bestLaneConts.size()) {
3747 nextLane = bestLaneConts[view];
3749 std::vector<MSLink*>::const_iterator link =
succLinkSec(*ego, view, *nextLane, bestLaneConts);
3755 if (linkLeaders.size() > 0) {
3765 std::cout <<
" linkleader=" << veh->
getID() <<
" gap=" << ll.
vehAndGap.second <<
" leaderOffset=" << ll.
latOffset <<
" flags=" << ll.
llFlags <<
"\n";
3782 nextInternal = (*link)->getViaLane() !=
nullptr;
3783 nextLane = (*link)->getViaLaneOrLane();
3784 if (nextLane ==
nullptr) {
3792 std::cout <<
SIMTIME <<
" getLeadersOnConsecutive lane=" <<
getID() <<
" nextLane=" << nextLane->
getID() <<
" leaders=" << leaders.
toString() <<
"\n";
3797 for (
int i = 0; i < iMax; ++i) {
3799 if (veh !=
nullptr) {
3816 if (!nextInternal) {
3830#ifdef DEBUG_SURROUNDING
3832 std::cout <<
" addLeaders lane=" <<
getID() <<
" veh=" << vehicle->
getID() <<
" vehPos=" << vehPos <<
" opposite=" << opposite <<
"\n";
3836 for (
int i = 0; i < aheadSamePos.
numSublanes(); ++i) {
3838 if (veh !=
nullptr && veh != vehicle) {
3840#ifdef DEBUG_SURROUNDING
3851 double speed = vehicle->
getSpeed();
3859#ifdef DEBUG_SURROUNDING
3861 std::cout <<
" aborting forward search. dist=" << dist <<
" seen=" << seen <<
"\n";
3866#ifdef DEBUG_SURROUNDING
3868 std::cout <<
" add consecutive before=" << result.
toString() <<
" seen=" << seen <<
" dist=" << dist;
3873#ifdef DEBUG_SURROUNDING
3875 std::cout <<
" upstreamOpposite=" <<
toString(bestLaneConts);
3883#ifdef DEBUG_SURROUNDING
3885 std::cout <<
" after=" << result.
toString() <<
"\n";
3901 std::cout <<
SIMTIME <<
" getPartialBehind lane=" <<
getID() <<
" ego=" << ego->
getID() <<
" found=" << veh->
getID() <<
"\n";
3932 assert(checkedLanes !=
nullptr);
3933 if (checkedLanes->find(
this) != checkedLanes->end()) {
3934#ifdef DEBUG_SURROUNDING
3935 std::cout <<
"Skipping previously scanned lane: " <<
getID() << std::endl;
3937 return std::set<MSVehicle*>();
3940 (*checkedLanes)[
this] = std::make_pair(
MAX2(0.0, startPos - upstreamDist),
MIN2(startPos + downstreamDist,
getLength()));
3942#ifdef DEBUG_SURROUNDING
3943 std::cout <<
"Scanning on lane " <<
myID <<
"(downstr. " << downstreamDist <<
", upstr. " << upstreamDist <<
", startPos " << startPos <<
"): " << std::endl;
3946 if (startPos < upstreamDist) {
3949 MSLane* incoming = incomingInfo.lane;
3950#ifdef DEBUG_SURROUNDING
3951 std::cout <<
"Checking on incoming: " << incoming->
getID() << std::endl;
3952 if (checkedLanes->find(incoming) != checkedLanes->end()) {
3953 std::cout <<
"Skipping previous: " << incoming->
getID() << std::endl;
3957 foundVehicles.insert(newVehs.begin(), newVehs.end());
3961 if (
getLength() < startPos + downstreamDist) {
3965#ifdef DEBUG_SURROUNDING
3966 std::cout <<
"Checking on outgoing: " << l->getViaLaneOrLane()->getID() << std::endl;
3968 std::set<MSVehicle*> newVehs = l->getViaLaneOrLane()->getSurroundingVehicles(0.0, downstreamDist - (
myLength - startPos), upstreamDist, checkedLanes);
3969 foundVehicles.insert(newVehs.begin(), newVehs.end());
3972#ifdef DEBUG_SURROUNDING
3973 std::cout <<
"On lane (2) " <<
myID <<
": \nFound vehicles: " << std::endl;
3975 std::cout << v->getID() <<
" pos = " << v->getPositionOnLane() << std::endl;
3978 return foundVehicles;
3984 std::set<MSVehicle*> res;
3987 if (!vehs.empty()) {
3989 if (veh->getPositionOnLane() >= a) {
3990 if (veh->getBackPositionOnLane() > b) {
4002std::vector<const MSJunction*>
4005 std::vector<const MSJunction*> junctions;
4007 junctions.insert(junctions.end(), l->getJunction());
4013std::vector<const MSLink*>
4015#ifdef DEBUG_SURROUNDING
4016 std::cout <<
"getUpcoming links on lane '" <<
getID() <<
"' with pos=" << pos
4017 <<
" range=" << range << std::endl;
4020 std::vector<const MSLink*> links;
4023 const MSLane* lane =
this;
4026 std::vector<MSLane*>::const_iterator contLanesIt = contLanes.begin();
4030 const MSLink* link =
nullptr;
4032 assert(*contLanesIt ==
nullptr);
4034 links.insert(links.end(), link);
4039 assert(*(contLanesIt + 1) == lane);
4041 while (++contLanesIt != contLanes.end()) {
4045#ifdef DEBUG_SURROUNDING
4046 std::cout <<
"Distance until end of lane '" << lane->
getID() <<
"' is " << dist <<
"." << std::endl;
4052 if (link !=
nullptr) {
4053 links.insert(links.end(), link);
4055 lane = *contLanesIt;
4078std::pair<MSVehicle* const, double>
4085 std::cout <<
" getFollower lane=" <<
getID() <<
" egoPos=" << egoPos <<
" pred=" << pred->
getID() <<
" predPos=" << pred->
getPositionOnLane(
this) <<
"\n";
4093 if (dist > 0 && backOffset > dist) {
4094 return std::make_pair(
nullptr, -1);
4098 return std::make_pair(
const_cast<MSVehicle*
>(result.first), result.second);
4101std::pair<MSVehicle* const, double>
4103#ifdef DEBUG_OPPOSITE
4105 <<
" ego=" << ego->
getID()
4109 <<
" oppositeDir=" << oppositeDir
4117 std::pair<MSVehicle* const, double> result =
getFollower(ego, egoPos + egoLength, dist, mLinkMode);
4118 if (result.first !=
nullptr) {
4120 if (result.first->getLaneChangeModel().isOpposite()) {
4121 result.second -= result.first->getVehicleType().getLength();
4129std::pair<MSVehicle* const, double>
4131#ifdef DEBUG_OPPOSITE
4133 <<
" ego=" << ego->
getID()
4143 std::pair<MSVehicle*, double> result =
getLeader(ego, vehPos, std::vector<MSLane*>());
4146 while (result.first ==
nullptr && dist > 0) {
4151 if (next ==
nullptr) {
4155 result = next->
getLeader(ego, vehPos, std::vector<MSLane*>());
4157 if (result.first !=
nullptr) {
4158 if (result.first->getLaneChangeModel().isOpposite()) {
4159 result.second -= result.first->getVehicleType().getLength();
4161 if (result.second > POSITION_EPS) {
4163 return std::make_pair(
static_cast<MSVehicle*
>(
nullptr), -1);
4174 const std::string action = oc.
getString(
"collision.action");
4175 if (action ==
"none") {
4177 }
else if (action ==
"warn") {
4179 }
else if (action ==
"teleport") {
4181 }
else if (action ==
"remove") {
4255#ifdef DEBUG_INSERTION
4257 std::cout <<
SIMTIME <<
" check for pedestrians on lane=" <<
getID() <<
" pos=" << pos <<
"\n";
4262 if (leader.first != 0) {
4268#ifdef DEBUG_INSERTION
4270 <<
" isInsertionSuccess lane=" <<
getID()
4271 <<
" veh=" << aVehicle->
getID()
4274 <<
" patchSpeed=" << patchSpeed
4275 <<
" speed=" << speed
4276 <<
" stopSpeed=" << stopSpeed
4277 <<
" pedestrianLeader=" << leader.first->getID()
4278 <<
" failed (@796)!\n";
4291 const int numRNGs = oc.
getInt(
"thread-rngs");
4292 const bool random = oc.
getBool(
"random");
4293 int seed = oc.
getInt(
"seed");
4295 for (
int i = 0; i < numRNGs; i++) {
4341 foundStopped =
true;
4342 const double lastBrakeGap = last->getCarFollowModel().brakeGap(last->getSpeed());
4343 const double ret = last->getBackPositionOnLane() + lastBrakeGap - lengths;
4347 lengths += last->getVehicleType().getLengthWithGap() * (last->getVehicleType().getWidth() + last->getVehicleType().getMinGapLat()) /
getWidth();
4349 lengths += last->getVehicleType().getLengthWithGap();
std::vector< MSEdge * > MSEdgeVector
std::pair< const MSVehicle *, double > CLeaderDist
std::pair< const MSPerson *, double > PersonDist
ConstMSEdgeVector::const_iterator MSRouteIterator
#define WRITE_WARNINGF(...)
#define WRITE_ERRORF(...)
#define WRITE_WARNING(msg)
std::string time2string(SUMOTime t)
convert SUMOTime to string
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
const SVCPermissions SVCAll
all VClasses are allowed
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
@ SVC_SHIP
is an arbitrary ship
@ SVC_BICYCLE
vehicle is a bicycle
@ AIRCRAFT
render as aircraft
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
const int STOP_DURATION_SET
@ GIVEN
The speed is given.
@ RANDOM
The lateral position is chosen randomly.
@ RIGHT
At the rightmost side of the lane.
@ GIVEN
The position is given.
@ DEFAULT
No information given; use default.
@ LEFT
At the leftmost side of the lane.
@ FREE
A free lateral position is chosen.
@ CENTER
At the center of the lane.
@ RANDOM_FREE
If a fixed number of random choices fails, a free lateral position is chosen.
@ RANDOM
The position is set by the vehroute device.
@ GIVEN
The position is given.
@ DEFAULT
No information given; use default.
@ STOP
depart position is endPos of first stop
@ FREE
A free position is chosen.
@ BASE
Back-at-zero position.
@ LAST
Insert behind the last vehicle as close as possible to still allow the specified departSpeed....
@ RANDOM_FREE
If a fixed number of random choices fails, a free position is chosen.
@ RANDOM
The speed is chosen randomly.
@ MAX
The maximum safe speed is used.
@ GIVEN
The speed is given.
@ LIMIT
The maximum lane speed is used (speedLimit)
@ DEFAULT
No information given; use default.
@ DESIRED
The maximum lane speed is used (speedLimit * speedFactor)
@ LAST
The speed of the last vehicle. Fallback to DepartSpeedDefinition::DESIRED if there is no vehicle on t...
@ AVG
The average speed on the lane. Fallback to DepartSpeedDefinition::DESIRED if there is no vehicle on t...
InsertionCheck
different checking levels for vehicle insertion
@ SUMO_TAG_LINK
Link information for state-saving.
@ SUMO_TAG_APPROACHING
Link-approaching vehicle information for state-saving.
@ SUMO_TAG_VIEWSETTINGS_VEHICLES
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ STRAIGHT
The link is a straight direction.
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_ALLWAY_STOP
This is an uncontrolled, all-way stop link.
@ LINKSTATE_STOP
This is an uncontrolled, minor link, has to stop.
@ LINKSTATE_EQUAL
This is an uncontrolled, right-before-left link.
@ LINKSTATE_DEADEND
This is a dead end link.
@ LINKSTATE_MINOR
This is an uncontrolled, minor link, has to brake.
@ SUMO_ATTR_ARRIVALSPEEDBRAKING
@ SUMO_ATTR_STATE
The state of a link.
int gPrecision
the precision for floating point outputs
double roundDecimal(double x, int precision)
round to the given number of decimal digits
bool gDebugFlag1
global utility flags for debugging
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)
A class that stores a 2D geometrical boundary.
double ymin() const
Returns minimum y-coordinate.
double xmin() const
Returns minimum x-coordinate.
Boundary & grow(double by)
extends the boundary by the given amount
double ymax() const
Returns maximum y-coordinate.
double xmax() const
Returns maximum x-coordinate.
static double angleDiff(const double angle1, const double angle2)
Returns the difference of the second angle to the first angle in radiants.
static double sum(double val)
Computes the resulting noise.
Container & getContainer()
bool hasBlueLight() const
MSLane * getShadowLane() const
Returns the lane the vehicle's shadow is on during continuous/sublane lane change.
virtual double getExtraReservation(int) const
reserve extra space for unseen blockers when more tnan one lane change is required
bool isChangingLanes() const
return true if the vehicle currently performs a lane change maneuver
The base class for microscopic and mesoscopic vehicles.
double getImpatience() const
Returns this vehicles impatience.
const MSEdge * succEdge(int nSuccs) const
Returns the nSuccs'th successor of edge the vehicle is currently at.
virtual double getArrivalPos() const
Returns this vehicle's desired arrivalPos for its current route (may change on reroute)
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
double getChosenSpeedFactor() const
Returns the precomputed factor by which the driver wants to be faster than the speed limit.
bool isJumping() const
Returns whether the vehicle is perform a jump.
double getLength() const
Returns the vehicle's length.
bool isParking() const
Returns whether the vehicle is parking.
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
bool hasDeparted() const
Returns whether this vehicle has already departed.
double basePos(const MSEdge *edge) const
departure position where the vehicle fits fully onto the edge (if possible)
bool hasStops() const
Returns whether the vehicle has to stop somewhere.
SUMOVehicleClass getVClass() const
Returns the vehicle's access class.
NumericalID getNumericalID() const
return the numerical ID which is only for internal usage
const MSRoute & getRoute() const
Returns the current route.
SUMOTime getDepartDelay() const
Returns the depart delay.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
bool isStopped() const
Returns whether the vehicle is at a stop.
The car-following model abstraction.
double getCollisionMinGapFactor() const
Get the factor of minGap that must be maintained to avoid a collision event.
double getEmergencyDecel() const
Get the vehicle type's maximal phisically possible deceleration [m/s^2].
virtual double freeSpeed(const MSVehicle *const veh, double speed, double seen, double maxSpeed, const bool onInsertion=false, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed without a leader.
virtual double insertionFollowSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0) const
Computes the vehicle's safe speed (no dawdling) This method is used during the insertion stage....
virtual double getSecureGap(const MSVehicle *const veh, const MSVehicle *const, const double speed, const double leaderSpeed, const double leaderMaxDecel) const
Returns the minimum gap to reserve if the leader is braking at maximum (>=0)
double brakeGap(const double speed) const
Returns the distance the vehicle needs to halt including driver's reaction time tau (i....
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
double stopSpeed(const MSVehicle *const veh, const double speed, double gap, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
virtual double insertionStopSpeed(const MSVehicle *const veh, double speed, double gap) const
Computes the vehicle's safe speed for approaching an obstacle at insertion without constraints due to...
std::string toString() const
print a debugging representation
int addFollower(const MSVehicle *veh, const MSVehicle *ego, double gap, double latOffset=0, int sublane=-1)
void gotActive(MSLane *l)
Informs the control that the given lane got active.
void checkCollisionForInactive(MSLane *l)
trigger collision checking for inactive lane
void needsVehicleIntegration(MSLane *const l)
A road/street connecting two junctions.
void changeLanes(SUMOTime t) const
Performs lane changing on this edge.
bool isCrossing() const
return whether this edge is a pedestrian crossing
int getPriority() const
Returns the priority of the edge.
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersons() const
Returns this edge's persons set.
bool isWalkingArea() const
return whether this edge is walking area
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
const MSEdge * getNormalSuccessor() const
if this edge is an internal edge, return its first normal successor, otherwise the edge itself
const MSEdge * getBidiEdge() const
return opposite superposable/congruent edge, if it exist and 0 else
bool isNormal() const
return whether this edge is an internal edge
std::vector< MSTransportable * > getSortedPersons(SUMOTime timestep, bool includeRiding=false) const
Returns this edge's persons sorted by pos.
const std::vector< MSLane * > * allowedLanes(const MSEdge &destination, SUMOVehicleClass vclass=SVC_IGNORING) const
Get the allowed lanes to reach the destination-edge.
void recalcCache()
Recalculates the cached values.
bool hasLaneChanger() const
const MSJunction * getToJunction() const
bool isInternal() const
return whether this edge is an internal edge
bool isVaporizing() const
Returns whether vehicles on this edge shall be vaporized.
MSLane * parallelLane(const MSLane *const lane, int offset, bool includeOpposite=true) const
Returns the lane with the given offset parallel to the given lane one or 0 if it does not exist.
const std::string & getEdgeType() const
Returns the type of the edge.
const MSEdgeVector & getPredecessors() const
static SUMOTime gTimeToTeleportDisconnected
static SUMOTime gTimeToGridlockHighways
static double gGridlockHighwaysSpeed
static bool gRemoveGridlocked
static SUMOTime gTimeToTeleportBidi
static double gLateralResolution
static bool gClearState
whether the simulation is in the process of clearing state (MSNet::clearState)
static bool gComputeLC
whether the simulationLoop is in the lane changing phase
static bool gEmergencyInsert
static int gNumSimThreads
how many threads to use for simulation
static bool gSublane
whether sublane simulation is enabled (sublane model or continuous lanechanging)
static SUMOTime gLaneChangeDuration
static bool gUnitTests
whether unit tests are being run
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
static SUMOTime gTimeToGridlock
void retractDescheduleDeparture(const SUMOVehicle *veh)
reverts a previous call to descheduleDeparture (only needed for departPos="random_free")
void descheduleDeparture(const SUMOVehicle *veh)
stops trying to emit the given vehicle (and delete it)
SumoXMLNodeType getType() const
return the type of this Junction
AnyVehicleIterator is a structure, which manages the iteration through all vehicles on the lane,...
bool nextIsMyVehicles() const
AnyVehicleIterator & operator++()
const MSVehicle * operator*()
void add(const MSLane *const l) const
Adds the given object to the container.
std::set< const Named * > & myObjects
The container.
const PositionVector & myShape
Sorts edges by their angle relative to the given edge (straight comes first)
by_connections_to_sorter(const MSEdge *const e)
constructor
int operator()(const MSEdge *const e1, const MSEdge *const e2) const
comparing operator
Sorts lanes (IncomingLaneInfos) by their priority or, if this doesn't apply, wrt. the angle differenc...
incoming_lane_priority_sorter(const MSLane *targetLane)
constructor
int operator()(const IncomingLaneInfo &lane1, const IncomingLaneInfo &lane2) const
comparing operator
Sorts lanes (their origin link) by the priority of their noninternal target edges or,...
outgoing_lane_priority_sorter(const MSLane *sourceLane)
constructor
int operator()(const MSLink *link1, const MSLink *link2) const
comparing operator
int operator()(MSVehicle *v1, MSVehicle *v2) const
Comparing operator.
Sorts vehicles by their position (descending)
int operator()(MSVehicle *v1, MSVehicle *v2) const
Comparing operator.
Representation of a lane in the micro simulation.
void addApproachingLane(MSLane *lane, bool warnMultiCon)
bool detectCollisionBetween(SUMOTime timestep, const std::string &stage, MSVehicle *collider, MSVehicle *victim, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport) const
detect whether there is a collision between the two vehicles
MFXSynchQue< MSVehicle *, std::vector< MSVehicle * > > myVehBuffer
Buffer for vehicles that moved from their previous lane onto this one. Integrated after all vehicles ...
SVCPermissions myPermissions
The vClass permissions for this lane.
MSLane * myLogicalPredecessorLane
virtual void setJunctionApproaches(const SUMOTime t) const
Register junction approaches for all vehicles after velocities have been planned.
std::set< const MSBaseVehicle * > myParkingVehicles
bool checkForPedestrians(const MSVehicle *aVehicle, double &speed, double &dist, double pos, bool patchSpeed) const
check whether pedestrians on this lane interfere with vehicle insertion
std::pair< MSVehicle *const, double > getFollower(const MSVehicle *ego, double egoPos, double dist, MinorLinkMode mLinkMode) const
Find follower vehicle for the given ego vehicle (which may be on the opposite direction lane)
std::pair< const MSPerson *, double > nextBlocking(double minPos, double minRight, double maxLeft, double stopTime=0, bool bidi=false) const
This is just a wrapper around MSPModel::nextBlocking. You should always check using hasPedestrians be...
MSLane * getParallelLane(int offset, bool includeOpposite=true) const
Returns the lane with the given offset parallel to this one or 0 if it does not exist.
double myRightSideOnEdge
the combined width of all lanes with lower index on myEdge
const StopOffset & getLaneStopOffsets() const
Returns vehicle class specific stopOffsets.
virtual void removeParking(MSBaseVehicle *veh)
remove parking vehicle. This must be syncrhonized when running with GUI
virtual ~MSLane()
Destructor.
bool insertVehicle(MSVehicle &v)
Tries to insert the given vehicle.
const MSLeaderInfo getFirstVehicleInformation(const MSVehicle *ego, double latOffset, bool onlyFrontOnLane, double maxPos=std::numeric_limits< double >::max(), bool allowCached=true) const
analogue to getLastVehicleInformation but in the upstream direction
virtual void integrateNewVehicles()
Insert buffered vehicle into the real lane.
double myLength
Lane length [m].
bool isApproachedFrom(MSEdge *const edge)
double getNettoOccupancy() const
Returns the netto (excluding minGaps) occupancy of this lane during the last step (including minGaps)
virtual MSVehicle * removeVehicle(MSVehicle *remVehicle, MSMoveReminder::Notification notification, bool notify=true)
int getCrossingIndex() const
return the index of the link to the next crossing if this is walkingArea, else -1
PositionVector myShape
The shape of the lane.
std::map< long long, SVCPermissions > myPermissionChanges
const std::map< SUMOVehicleClass, double > * myRestrictions
The vClass speed restrictions for this lane.
virtual void incorporateVehicle(MSVehicle *veh, double pos, double speed, double posLat, const MSLane::VehCont::iterator &at, MSMoveReminder::Notification notification=MSMoveReminder::NOTIFICATION_DEPARTED)
Inserts the vehicle into this lane, and informs it about entering the network.
void initRestrictions()
initialized vClass-specific speed limits
std::vector< MSMoveReminder * > myMoveReminders
This lane's move reminder.
bool hasApproaching() const
void addParking(MSBaseVehicle *veh)
add parking vehicle. This should only used during state loading
VehCont myTmpVehicles
Container for lane-changing vehicles. After completion of lane-change- process, the containers will b...
double getDepartSpeed(const MSVehicle &veh, bool &patchSpeed)
MSLeaderInfo myFollowerInfo
followers on all sublanes as seen by vehicles on consecutive lanes (cached)
const MSLane * getNormalSuccessorLane() const
get normal lane following this internal lane, for normal lanes, the lane itself is returned
int getVehicleNumber() const
Returns the number of vehicles on this lane (for which this lane is responsible)
static SUMOTime myCollisionStopTime
static CollisionAction myCollisionAction
the action to take on collisions
MSLane * myCanonicalSuccessorLane
Main successor lane,.
SVCPermissions myChangeLeft
The vClass permissions for changing from this lane.
void getLeadersOnConsecutive(double dist, double seen, double speed, const MSVehicle *ego, const std::vector< MSLane * > &bestLaneConts, MSLeaderDistanceInfo &result, bool oppositeDirection=false) const
Returns the immediate leaders and the distance to them (as getLeaderOnConsecutive but for the sublane...
std::vector< IncomingLaneInfo > myIncomingLanes
All direct predecessor lanes.
AnyVehicleIterator anyVehiclesEnd() const
end iterator for iterating over all vehicles touching this lane in downstream direction
static void insertIDs(std::vector< std::string > &into)
Adds the ids of all stored lanes into the given vector.
bool hadPermissionChanges() const
void sortPartialVehicles()
sorts myPartialVehicles
double myFrictionCoefficient
Lane-wide friction coefficient [0..1].
MSVehicle * getFirstAnyVehicle() const
returns the first vehicle that is fully or partially on this lane
const MSLink * getEntryLink() const
Returns the entry link if this is an internal lane, else nullptr.
int getVehicleNumberWithPartials() const
Returns the number of vehicles on this lane (including partial occupators)
static bool myCheckJunctionCollisions
static void clear()
Clears the dictionary.
virtual void resetManeuverReservation(MSVehicle *v)
Unregisters a vehicle, which previously registered for maneuvering into this lane.
SVCPermissions myOriginalPermissions
The original vClass permissions for this lane (before temporary modifications)
MSEdge *const myEdge
The lane's edge, for routing only.
double myNettoVehicleLengthSum
The current length of all vehicles on this lane, excluding their minGaps.
static std::vector< MSLink * >::const_iterator succLinkSec(const SUMOVehicle &veh, int nRouteSuccs, const MSLane &succLinkSource, const std::vector< MSLane * > &conts)
double getMissingRearGap(const MSVehicle *leader, double backOffset, double leaderSpeed) const
return by how much further the leader must be inserted to avoid rear end collisions
double myMaxSpeed
Lane-wide speedlimit [m/s].
void saveState(OutputDevice &out)
Saves the state of this lane into the given stream.
const MSLink * getLinkTo(const MSLane *const) const
returns the link to the given lane or nullptr, if it is not connected
int myRightmostSublane
the index of the rightmost sublane of this lane on myEdge
void setChangeRight(SVCPermissions permissions)
Sets the permissions for changing to the right neighbour lane.
const bool myIsRampAccel
whether this lane is an acceleration lane
virtual void planMovements(const SUMOTime t)
Compute safe velocities for all vehicles based on positions and speeds from the last time step....
static void saveRNGStates(OutputDevice &out)
save random number generator states to the given output device
SUMOTime myFollowerInfoTime
time step for which myFollowerInfo was last updated
MSLeaderInfo myLeaderInfo
leaders on all sublanes as seen by approaching vehicles (cached)
bool isInsertionSuccess(MSVehicle *vehicle, double speed, double pos, double posLat, bool recheckNextLanes, MSMoveReminder::Notification notification)
Tries to insert the given vehicle with the given state (speed and pos)
void forceVehicleInsertion(MSVehicle *veh, double pos, MSMoveReminder::Notification notification, double posLat=0)
Inserts the given vehicle at the given position.
double getVehicleStopOffset(const MSVehicle *veh) const
Returns vehicle class specific stopOffset for the vehicle.
static void initCollisionOptions(const OptionsCont &oc)
int myNumericalID
Unique numerical ID (set on reading by netload)
VehCont myVehicles
The lane's vehicles. This container holds all vehicles that have their front (longitudinally) and the...
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
MSLeaderInfo getPartialBeyond() const
get all vehicles that are inlapping from consecutive edges
std::vector< MSVehicle * > VehCont
Container for vehicles.
bool checkFailure(const MSVehicle *aVehicle, double &speed, double &dist, const double nspeed, const bool patchSpeed, const std::string errorMsg, InsertionCheck check) const
static DictType myDict
Static dictionary to associate string-ids with objects.
static void fill(RTREE &into)
Fills the given RTree with lane instances.
double safeInsertionSpeed(const MSVehicle *veh, double seen, const MSLeaderInfo &leaders, double speed)
return the maximum safe speed for insertion behind leaders (a negative value indicates that safe inse...
std::vector< const MSJunction * > getUpcomingJunctions(double pos, double range, const std::vector< MSLane * > &contLanes) const
Returns all upcoming junctions within given range along the given (non-internal) continuation lanes m...
void addIncomingLane(MSLane *lane, MSLink *viaLink)
const MSEdge * getNextNormal() const
Returns the lane's follower if it is an internal lane, the edge of the lane otherwise.
void addLink(MSLink *link)
Delayed initialization.
std::set< MSVehicle * > getVehiclesInRange(const double a, const double b) const
Returns all vehicles on the lane overlapping with the interval [a,b].
void enteredByLaneChange(MSVehicle *v)
double getDepartPosLat(const MSVehicle &veh)
std::pair< MSVehicle *const, double > getOppositeLeader(const MSVehicle *ego, double dist, bool oppositeDir, MinorLinkMode mLinkMode=MinorLinkMode::FOLLOW_NEVER) const
LinkState getIncomingLinkState() const
get the state of the link from the logical predecessor to this lane
void updateLengthSum()
updated current vehicle length sum (delayed to avoid lane-order-dependency)
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
static const long CHANGE_PERMISSIONS_PERMANENT
MSLane * getCanonicalPredecessorLane() const
void resetPermissions(long long transientID)
MSVehicle * getLastFullVehicle() const
returns the last vehicle for which this lane is responsible or 0
static void loadRNGState(int index, const std::string &state)
load random number generator state for the given rng index
const std::string myLaneType
the type of this lane
VehCont myManeuverReservations
The vehicles which registered maneuvering into the lane within their current action step....
void addLeaders(const MSVehicle *vehicle, double vehPos, MSLeaderDistanceInfo &result, bool oppositeDirection=false)
get leaders for ego on the given lane
static double myCheckJunctionCollisionMinGap
double getLength() const
Returns the lane's length.
double myBruttoVehicleLengthSum
The current length of all vehicles on this lane, including their minGaps.
const PositionVector & getShape() const
Returns this lane's shape.
void setChangeLeft(SVCPermissions permissions)
Sets the permissions for changing to the left neighbour lane.
std::vector< const MSLink * > getUpcomingLinks(double pos, double range, const std::vector< MSLane * > &contLanes) const
Returns all upcoming links within given range along the given (non-internal) continuation lanes measu...
const MSLane * getFirstInternalInConnection(double &offset) const
Returns 0 if the lane is not internal. Otherwise the first part of the connection (sequence of intern...
static int getNumRNGs()
return the number of RNGs
void handleCollisionBetween(SUMOTime timestep, const std::string &stage, const MSVehicle *collider, const MSVehicle *victim, double gap, double latGap, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toRemove, std::set< const MSVehicle *, ComparatorNumericalIdLess > &toTeleport) const
take action upon collision
double getMaximumBrakeDist() const
compute maximum braking distance on this lane
const MSLane * getInternalFollowingLane(const MSLane *const) const
returns the internal lane leading to the given lane or nullptr, if there is none
static std::vector< SumoRNG > myRNGs
virtual void swapAfterLaneChange(SUMOTime t)
moves myTmpVehicles int myVehicles after a lane change procedure
std::pair< MSVehicle *const, double > getCriticalLeader(double dist, double seen, double speed, const MSVehicle &veh) const
Returns the most dangerous leader and the distance to him.
StopOffset myLaneStopOffset
const MSLeaderInfo getLastVehicleInformation(const MSVehicle *ego, double latOffset, double minPos=0, bool allowCached=true) const
Returns the last vehicles on the lane.
static void initRNGs(const OptionsCont &oc)
initialize rngs
std::set< MSVehicle * > getSurroundingVehicles(double startPos, double downstreamDist, double upstreamDist, std::shared_ptr< LaneCoverageInfo > checkedLanes) const
Returns all vehicles closer than downstreamDist along the road network starting on the given position...
MSLane(const std::string &id, double maxSpeed, double friction, double length, MSEdge *const edge, int numericalID, const PositionVector &shape, double width, SVCPermissions permissions, SVCPermissions changeLeft, SVCPermissions changeRight, int index, bool isRampAccel, const std::string &type)
Constructor.
void clearState()
Remove all vehicles before quick-loading state.
MSLane * myCanonicalPredecessorLane
Similar to LogicalPredecessorLane,.
bool myNeedsCollisionCheck
whether a collision check is currently needed
bool isLinkEnd(std::vector< MSLink * >::const_iterator &i) const
virtual double setPartialOccupation(MSVehicle *v)
Sets the information about a vehicle lapping into this lane.
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
void setBidiLane(MSLane *bidyLane)
Adds the (overlapping) reverse direction lane to this lane.
double getRightSideOnEdge() const
std::pair< MSVehicle *const, double > getOppositeFollower(const MSVehicle *ego) const
bool hasPedestrians() const
whether the lane has pedestrians on it
const std::vector< std::pair< const MSLane *, const MSEdge * > > getOutgoingViaLanes() const
get the list of outgoing lanes
MSVehicle * getPartialBehind(const MSVehicle *ego) const
void setLaneStopOffset(const StopOffset &stopOffset)
Set vehicle class specific stopOffsets.
double myBruttoVehicleLengthSumToRemove
The length of all vehicles that have left this lane in the current step (this lane,...
void leftByLaneChange(MSVehicle *v)
MSLane * getCanonicalSuccessorLane() const
std::vector< StopWatch< std::chrono::nanoseconds > > myStopWatch
void setPermissions(SVCPermissions permissions, long long transientID)
Sets the permissions to the given value. If a transientID is given, the permissions are recored as te...
const double myWidth
Lane width [m].
bool lastInsertion(MSVehicle &veh, double mspeed, double posLat, bool patchSpeed)
inserts vehicle as close as possible to the last vehicle on this lane (or at the end of the lane if t...
void changeLanes(const SUMOTime time)
double getOppositePos(double pos) const
return the corresponding position on the opposite lane
SVCPermissions myChangeRight
const double myLengthGeometryFactor
precomputed myShape.length / myLength
virtual void executeMovements(const SUMOTime t)
Executes planned vehicle movements with regards to right-of-way.
const std::set< const MSBaseVehicle * > & getParkingVehicles() const
retrieve the parking vehicles (see GUIParkingArea)
MSLane * getLogicalPredecessorLane() const
get the most likely precedecessor lane (sorted using by_connections_to_sorter). The result is cached ...
double getBruttoOccupancy() const
Returns the brutto (including minGaps) occupancy of this lane during the last step.
AnyVehicleIterator anyVehiclesUpstreamEnd() const
end iterator for iterating over all vehicles touching this lane in upstream direction
int myIndex
The lane index.
double getMeanSpeedBike() const
get the mean speed of all bicycles on this lane
void updateLeaderInfo(const MSVehicle *veh, VehCont::reverse_iterator &vehPart, VehCont::reverse_iterator &vehRes, MSLeaderInfo &ahead) const
This updates the MSLeaderInfo argument with respect to the given MSVehicle. All leader-vehicles on th...
double getWaitingSeconds() const
Returns the overall waiting time on this lane.
void setMaxSpeed(double val)
Sets a new maximum speed for the lane (used by TraCI and MSCalibrator)
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
void detectPedestrianJunctionCollision(const MSVehicle *collider, const PositionVector &colliderBoundary, const MSLane *foeLane, SUMOTime timestep, const std::string &stage)
detect whether a vehicle collids with pedestrians on the junction
virtual void detectCollisions(SUMOTime timestep, const std::string &stage)
Check if vehicles are too close.
std::vector< MSLink * > myLinks
MSVehicle * getLastAnyVehicle() const
returns the last vehicle that is fully or partially on this lane
VehCont myPartialVehicles
The lane's partial vehicles. This container holds all vehicles that are partially on this lane but wh...
void sortManeuverReservations()
sorts myManeuverReservations
MinorLinkMode
determine whether/how getFollowers looks upstream beyond minor links
AnyVehicleIterator anyVehiclesUpstreamBegin() const
begin iterator for iterating over all vehicles touching this lane in upstream direction
std::vector< const MSLane * > getNormalIncomingLanes() const
get the list of all direct (disregarding internal predecessors) non-internal predecessor lanes of thi...
virtual void resetPartialOccupation(MSVehicle *v)
Removes the information about a vehicle lapping into this lane.
void setOpposite(MSLane *oppositeLane)
Adds a neighbor to this lane.
AnyVehicleIterator anyVehiclesBegin() const
begin iterator for iterating over all vehicles touching this lane in downstream direction
double getHarmonoise_NoiseEmissions() const
Returns the sum of last step noise emissions.
std::pair< MSVehicle *const, double > getLeader(const MSVehicle *veh, const double vehPos, const std::vector< MSLane * > &bestLaneConts, double dist=-1, bool checkTmpVehicles=false) const
Returns the immediate leader of veh and the distance to veh starting on this lane.
static bool myExtrapolateSubstepDepart
MSLane * getOpposite() const
return the neighboring opposite direction lane for lane changing or nullptr
void setLength(double val)
Sets a new length for the lane (used by TraCI only)
std::map< MSEdge *, std::vector< MSLane * > > myApproachingLanes
All direct internal and direct (disregarding internal predecessors) non-internal predecessor lanes of...
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
bool mustCheckJunctionCollisions() const
whether this lane must check for junction collisions
virtual void setManeuverReservation(MSVehicle *v)
Registers the lane change intentions (towards this lane) for the given vehicle.
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
static double myCollisionMinGapFactor
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.
SUMOTime myLeaderInfoTime
time step for which myLeaderInfo was last updated
@ COLLISION_ACTION_TELEPORT
@ COLLISION_ACTION_REMOVE
virtual const PositionVector & getShape(bool) const
MSLane * getParallelOpposite() const
return the opposite direction lane of this lanes edge or nullptr
std::map< std::string, MSLane * > DictType
definition of the static dictionary type
double getFractionalVehicleLength(bool brutto) const
return length of fractional vehicles on this lane
MSEdge & getEdge() const
Returns the lane's edge.
double getSpaceTillLastStanding(const MSVehicle *ego, bool &foundStopped) const
return the empty space up to the last standing vehicle or the empty space on the whole lane if no veh...
const MSLane * getNormalPredecessorLane() const
get normal lane leading to this internal lane, for normal lanes, the lane itself is returned
virtual bool appropriate(const MSVehicle *veh) const
MSLeaderDistanceInfo getFollowersOnConsecutive(const MSVehicle *ego, double backOffset, bool allSublanes, double searchDist=-1, MinorLinkMode mLinkMode=FOLLOW_ALWAYS) const
return the sublane followers with the largest missing rear gap among all predecessor lanes (within di...
double getWidth() const
Returns the lane's width.
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
bool freeInsertion(MSVehicle &veh, double speed, double posLat, MSMoveReminder::Notification notification=MSMoveReminder::NOTIFICATION_DEPARTED)
Tries to insert the given vehicle on any place.
virtual void addMoveReminder(MSMoveReminder *rem)
Add a move-reminder to move-reminder container.
double getMeanSpeed() const
Returns the mean speed on this lane.
double myNettoVehicleLengthSumToRemove
The length of all vehicles that have left this lane in the current step (this lane,...
void loadState(const std::vector< std::string > &vehIDs, MSVehicleControl &vc)
Loads the state of this segment with the given parameters.
void setFrictionCoefficient(double val)
Sets a new friction coefficient for the lane [to be later (used by TraCI and MSCalibrator)].
static CollisionAction getCollisionAction()
saves leader/follower vehicles and their distances relative to an ego vehicle
virtual std::string toString() const
print a debugging representation
CLeaderDist getClosest() const
return vehicle with the smalles gap
virtual int addLeader(const MSVehicle *veh, double gap, double latOffset=0, int sublane=-1)
void setSublaneOffset(int offset)
set number of sublanes by which to shift positions
int numFreeSublanes() const
virtual int addLeader(const MSVehicle *veh, bool beyond, double latOffset=0.)
virtual std::string toString() const
print a debugging representation
int getSublaneOffset() const
LinkState getState() const
Returns the current state of the link.
MSJunction * getJunction() const
MSLane * getLane() const
Returns the connected lane.
const std::vector< MSLink * > & getFoeLinks() const
std::vector< LinkLeader > LinkLeaders
double getInternalLengthsAfter() const
Returns the cumulative length of all internal lanes after this link.
const MSTrafficLightLogic * getTLLogic() const
Returns the TLS index.
Something on a lane to be noticed about vehicle movement.
Notification
Definition of a vehicle state.
@ NOTIFICATION_ARRIVED
The vehicle arrived at its destination (is deleted)
@ NOTIFICATION_TELEPORT_ARRIVED
The vehicle was teleported out of the net.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NOTIFICATION_VAPORIZED_VAPORIZER
The vehicle got vaporized with a vaporizer.
@ NOTIFICATION_VAPORIZED_COLLISION
The vehicle got removed by a collision.
@ NOTIFICATION_LOAD_STATE
The vehicle has been loaded from a state file.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
The simulated network and simulation perfomer.
@ COLLISION
The vehicle is involved in a collision.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
static const std::string STAGE_MOVEMENTS
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
const std::map< SUMOVehicleClass, double > * getRestrictions(const std::string &id) const
Returns the restrictions for an edge type If no restrictions are present, 0 is returned.
void informVehicleStateListener(const SUMOVehicle *const vehicle, VehicleState to, const std::string &info="")
Informs all added listeners about a vehicle's state change.
bool hasPersons() const
Returns whether persons are simulated.
MSInsertionControl & getInsertionControl()
Returns the insertion control.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
virtual MSTransportableControl & getPersonControl()
Returns the person control.
bool registerCollision(const SUMOTrafficObject *collider, const SUMOTrafficObject *victim, const std::string &collisionType, const MSLane *lane, double pos)
register collision and return whether it was the first one involving these vehicles
MSEdgeControl & getEdgeControl()
Returns the edge control.
virtual PersonDist nextBlocking(const MSLane *lane, double minPos, double minRight, double maxLeft, double stopTime=0, bool bidi=false)
returns the next pedestrian beyond minPos that is laterally between minRight and maxLeft or 0
virtual bool hasPedestrians(const MSLane *lane)
whether the given lane has pedestrians on it
static bool hasOncomingRailTraffic(MSLink *link, const MSVehicle *ego, bool &brakeBeforeSignal)
static bool hasInsertionConstraint(MSLink *link, const MSVehicle *veh, std::string &info, bool &isInsertionOrder)
const MSEdge * getLastEdge() const
returns the destination edge
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
const MSLane * lane
The lane to stop at (microsim only)
double getEndPos(const SUMOVehicle &veh) const
return halting position for upcoming stop;
const SUMOVehicleParameter::Stop pars
The stop parameter.
MSPModel * getMovementModel()
Returns the default movement model for this kind of transportables.
bool isRemoteAffected(SUMOTime t) const
The class responsible for building and deletion of vehicles.
void registerTeleportYield()
register one non-collision-related teleport
double getMinDeceleration() const
return the minimum deceleration capability for all road vehicles that ever entered the network
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
void registerTeleportJam()
register one non-collision-related teleport
double getMaxSpeedFactor() const
return the maximum speed factor for all vehicles that ever entered the network
double getMinDecelerationRail() const
return the minimum deceleration capability for all ral vehicles that ever entered the network
void scheduleVehicleRemoval(SUMOVehicle *veh, bool checkDuplicate=false)
Removes a vehicle after it has ended.
void registerTeleportWrongLane()
register one non-collision-related teleport
void registerCollision(bool teleport)
registers one collision-related teleport
Representation of a vehicle in the micro simulation.
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)
void updateBestLanes(bool forceRebuild=false, const MSLane *startLane=0)
computes the best lanes to use in order to continue the route
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
SUMOTime getLastActionTime() const
Returns the time of the vehicle's last action point.
PositionVector getBoundingPoly(double offset=0) const
get bounding polygon
void setTentativeLaneAndPosition(MSLane *lane, double pos, double posLat=0)
set tentative lane and position during insertion to ensure that all cfmodels work (some of them requi...
SUMOTime getWaitingTime() const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
void registerInsertionApproach(MSLink *link, double dist)
register approach on insertion
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.
bool isFrontOnLane(const MSLane *lane) const
Returns the information whether the front of the vehicle is on the given lane.
MSAbstractLaneChangeModel & getLaneChangeModel()
double getLeftSideOnLane() const
Get the lateral position of the vehicles left side on the lane:
double getActionStepLengthSecs() const
Returns the vehicle's action step length in secs, i.e. the interval between two action points.
const std::vector< MSLane * > getUpstreamOppositeLanes() const
Returns the sequence of opposite lanes corresponding to past lanes.
PositionVector getBoundingBox(double offset=0) const
get bounding rectangle
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
const std::vector< MSLane * > & getBestLanesContinuation() const
Returns the best sequence of lanes to continue the route starting at myLane.
bool ignoreCollision() const
whether this vehicle is except from collision checks
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
bool resumeFromStopping()
int getBestLaneOffset() const
void adaptToJunctionLeader(const std::pair< const MSVehicle *, double > leaderInfo, const double seen, DriveProcessItem *const lastLink, const MSLane *const lane, double &v, double &vLinkPass, double distToCrossing=-1) const
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
void resetActionOffset(const SUMOTime timeUntilNextAction=0)
Resets the action offset for the vehicle.
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.
double getLatOffset(const MSLane *lane) const
Get the offset that that must be added to interpret myState.myPosLat for the given lane.
bool hasArrived() const
Returns whether this vehicle has already arived (reached the arrivalPosition on its final edge)
SUMOTime collisionStopTime() const
Returns the remaining time a vehicle needs to stop due to a collision. A negative value indicates tha...
double getBestLaneDist() const
returns the distance that can be driven without lane change
bool executeMove()
Executes planned vehicle movements with regards to right-of-way.
const MSLane * getLane() const
Returns the lane the vehicle is on.
bool isLeader(const MSLink *link, const MSVehicle *veh, const double gap) const
whether the given vehicle must be followed at the given junction
MSLane * getMutableLane() const
Returns the lane the vehicle is on Non const version indicates that something volatile is going on.
Influencer & getInfluencer()
double getRightSideOnLane() const
Get the lateral position of the vehicles right side on the lane:
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
double getSpeed() const
Returns the vehicle's current speed.
const std::vector< MSLane * > & getFurtherLanes() const
const std::vector< LaneQ > & getBestLanes() const
Returns the description of best lanes to use in order to continue the route.
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
double processNextStop(double currentVelocity)
Processes stops, returns the velocity needed to reach the stop.
double getPositionOnLane() const
Get the vehicle's position along the lane.
bool onFurtherEdge(const MSEdge *edge) const
whether this vehicle has its back (and no its front) on the given edge
double getLateralOverlap() const
return the amount by which the vehicle extends laterally outside it's primary lane
double getAngle() const
Returns the vehicle's direction in radians.
bool hasInfluencer() const
whether the vehicle is individually influenced (via TraCI or special parameters)
void executeFractionalMove(double dist)
move vehicle forward by the given distance during insertion
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)
static MSVehicleTransfer * getInstance()
Returns the instance of this object.
void add(const SUMOTime t, MSVehicle *veh)
Adds a vehicle to this transfer object.
double getLengthWithGap() const
Get vehicle's length including the minimum gap [m].
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
double getMinGap() const
Get the free space in front of vehicles of this class.
double getLength() const
Get vehicle's length [m].
SUMOVehicleShape getGuiShape() const
Get this vehicle type's shape.
const SUMOVTypeParameter & getParameter() const
Base class for objects which have an id.
std::string myID
The name of the object.
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 RT-tree for efficient storing of SUMO's Named objects.
A storage for options typed value containers)
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void unsetParameter(const std::string &key)
Removes a parameter.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
bool overlapsWith(const AbstractPoly &poly, double offset=0) const
Returns the information whether the given polygon overlaps with this.
double distance2D(const Position &p, bool perpendicular=false) const
closest 2D-distance to point p (or -1 if perpendicular is true and the point is beyond this vector)
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
double angleAt2D(int pos) const
get angle in certain position of position vector
static void loadState(const std::string &state, SumoRNG *rng=nullptr)
load rng state from string
static void initRand(SumoRNG *which=nullptr, const bool random=false, const int seed=23423)
Initialises the random number generator with hardware randomness or seed.
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
static std::string saveState(SumoRNG *rng=nullptr)
save rng state to string
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
SUMOTime getTimeToTeleport(SUMOTime defaultValue) const
return time-to-teleport (either custom or default)
SUMOTime getTimeToTeleportBidi(SUMOTime defaultValue) const
return time-to-teleport.bidi (either custom or default)
Representation of a vehicle.
virtual const MSEdge * succEdge(int nSuccs) const =0
Returns the nSuccs'th successor of edge the vehicle is currently at.
Definition of vehicle stop (position and duration)
std::string lane
The lane to stop at.
double startPos
The stopping position start.
int parametersSet
Information for the output which parameter were set.
double endPos
The stopping position end.
bool collision
Whether this stop was triggered by a collision.
SUMOTime duration
The stopping duration.
Structure representing possible vehicle parameter.
double departPosLat
(optional) The lateral position the vehicle shall depart from
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle's end speed shall be chosen.
double departSpeed
(optional) The initial speed of the vehicle
DepartPosLatDefinition departPosLatProcedure
Information how the vehicle shall choose the lateral departure position.
double departPos
(optional) The position the vehicle shall depart from
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
int insertionChecks
bitset of InsertionCheck
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
A scoped lock which only triggers on condition.
bool isDefined() const
check if stopOffset was defined
SVCPermissions getPermissions() const
get permissions
double getOffset() const
get offset
TRACI_CONST int CMD_GET_VEHICLE_VARIABLE
TRACI_CONST int CMD_GET_EDGE_VARIABLE
TRACI_CONST int CMD_GET_PERSON_VARIABLE
TRACI_CONST int CMD_GET_LANE_VARIABLE
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
std::pair< MSVehicle *, double > vehAndGap