53#define DEBUG_COND2(obj) (obj->isSelected())
58#define DEBUG_COND_ZIPPER (ego->isSelected())
64#define INVALID_TIME -1000
67#define JM_CROSSING_GAP_DEFAULT 10
70#define DIVERGENCE_MIN_WIDTH 2.5
95 if (foeConflictIndex >= 0) {
96 return foeExitLink->
myConflicts[foeConflictIndex].conflictSize;
107 return lengthBehindCrossing;
115 double length,
double foeVisibilityDistance,
bool keepClear,
159 const double dist = from.back().distanceTo2D(to.front());
165 myLateralShift = (from.back().distanceTo2D(to.front()) < dist) ? dist : -dist;
192 if (cc.from == foeFrom && cc.to == foeTo) {
203 const std::vector<MSLink*>& foeLinks,
204 const std::vector<MSLane*>& foeLanes,
205 MSLane* internalLaneBefore) {
215 for (
MSLane* foeLane : foeLanes) {
223 if (internalLaneBefore !=
nullptr) {
225 lane = internalLaneBefore;
237 for (
MSLane* foeLane : foeLanes) {
238 assert(foeLane->isInternal() || foeLane->isCrossing());
239 MSLink* viaLink = foeLane->getIncomingLanes().front().viaLink;
246#ifdef MSLink_DEBUG_CROSSING_POINTS
249 if (lane !=
nullptr) {
250 const bool beforeInternalJunction = lane->
getLinkCont()[0]->getViaLaneOrLane()->getEdge().isInternal();
274 const CustomConflict* rcc = foeLane->getEntryLink()->getCustomConflict(lane);
275 bool haveIntersection =
false;
276 if (rcc ==
nullptr) {
281 const bool foeIsSecondPart = foeLane->getLogicalPredecessorLane()->isInternal();
284 if (foeIsSecondPart) {
285 foeStartPos -= foeLane->getLogicalPredecessorLane()->getLength();
287 const double foeEndPos = foeStartPos + foeConflictSize;
288 haveIntersection = ((foeStartPos > 0 && foeStartPos < foeLane->getLength())
289 || (foeEndPos > 0 && foeEndPos < foeLane->
getLength()));
291 if (haveIntersection) {
296#ifdef MSLink_DEBUG_CROSSING_POINTS
297 std::cout <<
" " << lane->
getID() <<
" custom conflict with " << foeLane->getID() <<
" customReverse=" << (rcc !=
nullptr)
298 <<
" haveIntersection=" << haveIntersection
299 <<
" startPos=" << startPos <<
" conflictSize=" << conflictSize
300 <<
" lbc=" <<
myConflicts.back().lengthBehindCrossing
307 if (sameTarget && !beforeInternalJunction && !
contIntersect(lane, foeLane)) {
311 if (lane->
getShape().back().distanceTo2D(foeLane->getShape().back()) >= minDist) {
313 if (foeLane->getEntryLink()->isIndirect()) {
315#ifdef MSLink_DEBUG_CROSSING_POINTS
316 std::cout <<
" " << lane->
getID() <<
" dummy merge with indirect" << foeLane->getID() <<
"\n";
320#ifdef MSLink_DEBUG_CROSSING_POINTS
321 std::cout <<
" " << lane->
getID() <<
" dummy merge with " << foeLane->getID() <<
"\n";
328#ifdef MSLink_DEBUG_CROSSING_POINTS
330 <<
" " << lane->
getID()
331 <<
" merges with " << foeLane->getID()
332 <<
" nextLane " << lane->
getLinkCont()[0]->getViaLaneOrLane()->getID()
333 <<
" dist1=" <<
myConflicts.back().lengthBehindCrossing
339#ifdef MSLink_DEBUG_CROSSING_POINTS_DETAILS
340 std::cout <<
" intersections1=" <<
toString(intersections1) <<
"\n";
342 bool haveIntersection =
true;
343 if (intersections1.size() == 0) {
345 haveIntersection =
false;
346 }
else if (intersections1.size() > 1) {
347 std::sort(intersections1.begin(), intersections1.end());
349 std::vector<double> intersections2 = foeLane->getShape().intersectsAtLengths2D(lane->
getShape());
350#ifdef MSLink_DEBUG_CROSSING_POINTS_DETAILS
351 std::cout <<
" intersections2=" <<
toString(intersections2) <<
"\n";
353 if (intersections2.size() == 0) {
354 intersections2.push_back(0);
355 }
else if (intersections2.size() > 1) {
356 std::sort(intersections2.begin(), intersections2.end());
360 if (!haveIntersection && foeLane->getLinkCont()[0]->getViaLane() !=
nullptr) {
361 const Position waitPos = foeLane->getShape().back();
365 intersections1.clear();
366 intersections2.clear();
368 intersections2.push_back(foeLane->getShape().length());
369 haveIntersection =
true;
370#ifdef MSLink_DEBUG_CROSSING_POINTS_DETAILS
371 std::cout <<
" link=" <<
myIndex <<
" " <<
getDescription() <<
" almostIntersection with foeLane " << foeLane->getID() <<
" offset=" << intersections1.back() <<
"\n";
376 double conflictSize = foeLane->getWidth();
378 if (haveIntersection) {
381 const double angle2 =
GeomHelper::naviDegree(foeLane->getShape().rotationAtOffset(intersections2.back()));
385 const double widthFactor = 1 /
MAX2(sin(
DEG2RAD(angleDiff)), 0.2) * 2 - 1;
387 conflictSize *= widthFactor;
390 intersections1.back() -= conflictSize / 2;
392 intersections1.back() =
MAX2(0.0, intersections1.back());
401 if (foeLane->isCrossing()) {
408 lane->
getLength() - intersections1.back(),
409 conflictSize, flag));
411#ifdef MSLink_DEBUG_CROSSING_POINTS
413 <<
" intersection of " << lane->
getID()
415 <<
" with " << foeLane->getID()
416 <<
" totalLength=" << foeLane->getLength()
417 <<
" dist1=" <<
myConflicts.back().lengthBehindCrossing
418 <<
" widthFactor=" <<
myConflicts.back().conflictSize / foeLane->getWidth()
428 const MSLane*
const sibling = link->getViaLane();
429 if (sibling != lane && sibling !=
nullptr) {
431 if (lane->
getShape().front().distanceTo2D(sibling->
getShape().front()) >= minDist) {
441 lbcLane = lane->
getLength() - distToDivergence;
449 const int replacedIndex = (int)(it -
myFoeLanes.begin());
455#ifdef MSLink_DEBUG_CROSSING_POINTS
456 std::cout <<
" adding same-origin foe" << sibling->
getID()
457 <<
" dist1=" <<
myConflicts.back().lengthBehindCrossing
460 const MSLane*
const siblingCont = sibling->
getLinkCont().front()->getViaLaneOrLane();
464 const double lengthBehindDivergence =
MAX2(0.0, lane->
getLength() - maxCommonLength);
470#ifdef MSLink_DEBUG_CROSSING_POINTS
471 std::cout <<
" adding same-origin foeContinuation" << siblingCont->
getID()
472 <<
" dist1=" <<
myConflicts.back().lengthBehindCrossing
480 for (
int i = 0; i < (int)
myFoeLanes.size(); i++) {
484 for (
int i2 = 0; i2 < (int)foeExitLink->
myFoeLanes.size(); i2++) {
493#ifdef MSLink_DEBUG_CROSSING_POINTS
494 std::cout << lane->
getID() <<
" foeLane=" << foeLane->
getID() <<
" index=" << i <<
" foundIndex=" << foundIndex <<
"\n";
496 if (foundIndex < 0) {
508 const MSEdge* target = &(it->getLane()->getEdge());
512 if (target == myTarget) {
514#ifdef MSLink_DEBUG_CROSSING_POINTS
515 std::cout <<
" sublaneFoeLink (same target): " << it->getViaLaneOrLane()->
getID() <<
"\n";
520#ifdef MSLink_DEBUG_CROSSING_POINTS
521 std::cout <<
" sublaneFoeLink2 (other target: " << it->getViaLaneOrLane()->getID() <<
"\n";
563#ifdef MSLink_DEBUG_CROSSING_POINTS
564 std::cout <<
" recheck l1=" << item.first->getDescription() <<
" l2=" << item.second->getDescription() <<
"\n";
566 MSLink*
const link = item.first;
567 MSLink*
const foeExitLink = item.second;
570 int conflictIndex = -1;
571 for (
int i = 0; i < (int)link->
myFoeLanes.size(); i++) {
577 if (conflictIndex == -1) {
589#ifdef MSLink_DEBUG_CROSSING_POINTS
590 std::cout <<
" siblingContinuation: distToDivergence=" << distToDivergence <<
" lbcSibCont=" << lbcSibCont <<
"\n";
591 std::cout <<
" conflictIndex=" << conflictIndex <<
" foeLane=" << foeLane->
getID() <<
" foeExitLink=" << foeExitLink->
getDescription() <<
" intLane=" << intLane->
getID() <<
"\n";
602 if (intersections1.size() == 0) {
603#ifdef MSLink_DEBUG_CROSSING_POINTS
604 std::cout <<
" no intersection\n";
609 const double conflictSize2 = lane->
getWidth() * widthFactor;
610 std::sort(intersections1.begin(), intersections1.end());
611 intersections1.back() -= conflictSize2 / 2;
612 intersections1.back() =
MAX2(0.0, intersections1.back());
615#ifdef MSLink_DEBUG_CROSSING_POINTS
616 std::cout <<
" ci=" << conflictIndex <<
" wf=" << widthFactor <<
" flag=" << ci.
flag <<
" flbc=" << foeExitLink->
myConflicts.back().lengthBehindCrossing <<
"\n";
624 double lbcSibling = 0;
638 lbcSibling += s[-1].distanceTo2D(s[-2]);
644 lbcLane += l[-1].distanceTo2D(l[-2]);
648#ifdef MSLink_DEBUG_CROSSING_POINTS_DETAILS
649 std::cout <<
" sameSource=" << sameSource <<
" lane=" << lane->
getID() <<
" sib=" << sibling->
getID() <<
" minDist=" << minDist <<
" backDist=" << l.back().distanceTo2D(s.back()) <<
"\n";
651 if (l.back().distanceTo2D(s.back()) > minDist) {
658 std::vector<double> distances = l.
distances(s);
659#ifdef MSLink_DEBUG_CROSSING_POINTS
660 std::cout <<
" distances=" <<
toString(distances) <<
"\n";
662 assert(distances.size() == l.size() + s.size());
663 if (distances.back() > minDist && distances[l.size() - 1] > minDist) {
665 for (
int j = (
int)s.size() - 2; j >= 0; j--) {
666 const int i = j + (int)l.size();
667 const double segLength = s[j].distanceTo2D(s[j + 1]);
668 if (distances[i] > minDist) {
669 lbcSibling += segLength;
672 lbcSibling += segLength - (minDist - distances[i]) * segLength / (distances[i + 1] - distances[i]);
676 for (
int i = (
int)l.size() - 2; i >= 0; i--) {
677 const double segLength = l[i].distanceTo2D(l[i + 1]);
678 if (distances[i] > minDist) {
679 lbcLane += segLength;
682 lbcLane += segLength - (minDist - distances[i]) * segLength / (distances[i + 1] - distances[i]);
687 assert(lbcSibling >= -NUMERICAL_EPS);
688 assert(lbcLane >= -NUMERICAL_EPS);
690 const double distToDivergence1 = sibling->
getLength() + siblingPredLength - lbcSibling;
691 const double distToDivergence2 = lane->
getLength() - lbcLane;
692 const double distToDivergence =
MIN3(
693 MAX2(distToDivergence1, distToDivergence2),
695#ifdef MSLink_DEBUG_CROSSING_POINTS
696 std::cout <<
" distToDivergence=" << distToDivergence
697 <<
" distTD1=" << distToDivergence1
698 <<
" distTD2=" << distToDivergence2
699 <<
" length=" << length
700 <<
" sibLength=" << sibLength
703 return distToDivergence;
709 if (foe->
getLinkCont()[0]->getViaLane() !=
nullptr) {
711 return intersections.size() > 0;
719 const bool setRequest,
const double arrivalSpeedBraking,
const SUMOTime waitingTime,
double dist,
double latOffset) {
721#ifdef DEBUG_APPROACHING
725 std::cout <<
" curApproaching=";
727 std::cout << i->first->getID() <<
" ";
735 arrivalSpeedBraking, waitingTime, dist, approaching->
getSpeed(), latOffset));
741#ifdef DEBUG_APPROACHING
745 std::cout <<
" curApproaching=";
747 std::cout << i->first->getID() <<
" ";
766#ifdef DEBUG_APPROACHING
770 std::cout <<
" curApproaching=";
772 std::cout << i->first->getID() <<
" ";
788#ifdef DEBUG_APPROACHING
791 std::cout <<
"' Removing approaching person '" << person->
getID() <<
"'\nCurrently registered persons:" << std::endl;
793 std::cout <<
"'" << i->first->getID() <<
"'" << std::endl;
831 const double leaveSpeed,
const double vehicleLength)
const {
838 double impatience,
double decel,
SUMOTime waitingTime,
double posLat,
840#ifdef MSLink_DEBUG_OPENED
855 assert(
myLane != foeLink->getLane());
856 for (
const auto& it : foeLink->myApproachingVehicles) {
860 ((posLat < foe->getLateralPositionOnLane() + it.second.latOffset &&
myLane->
getIndex() > foeLink->myLane->getIndex())
863 && (arrivalTime > it.second.arrivalTime
867 if (
blockedByFoe(foe, it.second, arrivalTime, leaveTime, arrivalSpeed, leaveSpeed,
false,
868 impatience, decel, waitingTime, ego)) {
869#ifdef MSLink_DEBUG_OPENED
871 std::cout <<
SIMTIME <<
" blocked by " << foe->
getID() <<
" arrival=" << arrivalTime <<
" foeArrival=" << it.second.arrivalTime <<
"\n";
874 if (collectFoes ==
nullptr) {
875#ifdef MSLink_DEBUG_OPENED
877 std::cout <<
" link=" <<
getViaLaneOrLane()->
getID() <<
" blocked by sublaneFoe=" << foe->
getID() <<
" foeLink=" << foeLink->getViaLaneOrLane()->getID() <<
" posLat=" << posLat <<
"\n";
882 collectFoes->push_back(it.first);
893 for (
const auto& it : foeLink->myApproachingVehicles) {
903 if (
blockedByFoe(foe, it.second, arrivalTime, leaveTime, arrivalSpeed, leaveSpeed,
false,
904 impatience, decel, waitingTime, ego)) {
905#ifdef MSLink_DEBUG_OPENED
907 std::cout <<
SIMTIME <<
" blocked by sublane foe " << foe->
getID() <<
" arrival=" << arrivalTime <<
" foeArrival=" << it.second.arrivalTime <<
"\n";
910 if (collectFoes ==
nullptr) {
911#ifdef MSLink_DEBUG_OPENED
913 std::cout <<
" link=" <<
getViaLaneOrLane()->
getID() <<
" blocked by sublaneFoe2=" << foe->
getID() <<
" foeLink=" << foeLink->getViaLaneOrLane()->getID() <<
" posLat=" << posLat <<
"\n";
918 collectFoes->push_back(it.first);
925#ifdef MSLink_DEBUG_OPENED
942 return collectFoes ==
nullptr || collectFoes->size() == 0;
958 if (ego ==
nullptr) {
961 double maxOncomingWidth = 0;
964 maxOncomingWidth =
MAX2(maxOncomingWidth, foe->getVehicleType().getWidth());
968 if (ego->
getVehicleType().
getWidth() + maxOncomingWidth + MSGlobals::gLateralResolution < myLane->getWidth()) {
971 }
else if (maxOncomingWidth > 0) {
981 double maxOncomingWidth = 0;
982 if (ili.viaLink->blockedAtTime(arrivalTime, leaveTime, arrivalSpeed, leaveSpeed,
false, 0, decel, 0,
986 maxOncomingWidth =
MAX2(maxOncomingWidth, foe->getVehicleType().getWidth());
988 if (ego->
getVehicleType().
getWidth() + maxOncomingWidth + MSGlobals::gLateralResolution < myLane->getWidth()) {
999 for (
const MSLink*
const link : foeLinks) {
1001 if (link->haveRed()) {
1005#ifdef MSLink_DEBUG_OPENED
1007 std::cout <<
SIMTIME <<
" foeLink=" << link->getViaLaneOrLane()->getID() <<
" numApproaching=" << link->getApproaching().size() <<
"\n";
1008 if (link->getLane()->isCrossing()) {
1009 std::cout <<
SIMTIME <<
" approachingPersons=" << (link->myApproachingPersons ==
nullptr ?
"NULL" :
toString(link->myApproachingPersons->size())) <<
"\n";
1013 if (link->blockedAtTime(arrivalTime, leaveTime, arrivalSpeed, leaveSpeed,
myLane == link->getLane(),
1014 impatience, decel, waitingTime, collectFoes, ego, lastWasContRed, dist)) {
1018 if (collectFoes !=
nullptr && collectFoes->size() > 0) {
1027 bool sameTargetLane,
double impatience,
double decel,
SUMOTime waitingTime,
1030#ifdef MSLink_DEBUG_OPENED
1035 std::stringstream stream;
1037 <<
" foeVeh=" << it.first->getID() <<
" (below ignore speed)"
1040 std::cout << stream.str();
1051 &&
blockedByFoe(it.first, it.second, arrivalTime, leaveTime, arrivalSpeed, leaveSpeed, sameTargetLane,
1052 impatience, decel, waitingTime, ego)) {
1053 if (collectFoes ==
nullptr) {
1056 collectFoes->push_back(it.first);
1061 const SUMOTime lookAhead = (ego ==
nullptr
1065#ifdef MSLink_DEBUG_OPENED
1067 std::cout <<
SIMTIME <<
": " << ego->
getID() <<
" check person " << it.first->getID() <<
" aTime=" << arrivalTime <<
" foeATime=" << it.second.arrivalTime
1068 <<
" lTime=" << leaveTime <<
" foeLTime=" << it.second.leavingTime
1069 <<
" dist=" << dist <<
"\n";
1077 && !((arrivalTime > it.second.leavingTime + lookAhead) || (leaveTime + lookAhead < it.second.arrivalTime))) {
1078 if (ego ==
nullptr) {
1088#ifdef MSLink_DEBUG_OPENED
1090 std::cout <<
SIMTIME <<
": " << ego->
getID() <<
" conflict with person " << it.first->getID() <<
" aTime=" << arrivalTime <<
" foeATime=" << it.second.arrivalTime <<
" dist=" << dist <<
" bGap=" << cfm.brakeGap(ego->
getSpeed(), cfm.getMaxDecel(), 0) <<
"\n";
1093 if (dist > cfm.brakeGap(ego->
getSpeed(), cfm.getMaxDecel(), 0)) {
1094#ifdef MSLink_DEBUG_OPENED
1096 std::cout <<
SIMTIME <<
": " << ego->
getID() <<
" blocked by person " << it.first->getID() <<
"\n";
1099 if (collectFoes ==
nullptr) {
1102 collectFoes->push_back(it.first);
1114 SUMOTime arrivalTime,
SUMOTime leaveTime,
double arrivalSpeed,
double leaveSpeed,
1115 bool sameTargetLane,
double impatience,
double decel,
SUMOTime waitingTime,
1117#ifdef MSLink_DEBUG_OPENED
1119 std::stringstream stream;
1121 <<
" foeVeh=" << veh->
getID()
1126 std::cout << stream.str();
1133 assert(waitingTime > 0);
1134#ifdef MSLink_DEBUG_OPENED
1136 std::stringstream stream;
1137 stream <<
" foeDist=" << avi.
dist
1140 <<
" wait=" << waitingTime
1142 std::cout << stream.str();
1147 if (waitingTime > avi.
waitingTime + actionDelta) {
1156 if (impatience > 0 && arrivalTime < avi.
arrivalTime) {
1157#ifdef MSLink_DEBUG_OPENED
1161 foeArrivalTime = (
SUMOTime)((1. - impatience) * (double)avi.
arrivalTime + impatience * (
double)fatb);
1162#ifdef MSLink_DEBUG_OPENED
1181#ifdef MSLink_DEBUG_OPENED
1183 std::stringstream stream;
1184 stream <<
" imp=" << impatience <<
" fAT2=" << foeArrivalTime <<
" fASb=" << foeArrivalSpeedBraking <<
" lA=" << lookAhead <<
" egoAT=" << arrivalTime <<
" egoLT=" << leaveTime <<
" egoLS=" << leaveSpeed <<
"\n";
1185 std::cout << stream.str();
1190 if (sameTargetLane && (arrivalTime - avi.
leavingTime < lookAhead
1193#ifdef MSLink_DEBUG_OPENED
1195 std::cout <<
" blocked (cannot follow)\n";
1200 }
else if (foeArrivalTime > leaveTime + lookAhead) {
1204#ifdef MSLink_DEBUG_OPENED
1206 std::cout <<
" blocked (cannot lead)\n";
1213#ifdef MSLink_DEBUG_OPENED
1215 std::cout <<
" blocked (hard conflict)\n";
1232 if (arrivalTime - arrivalTime %
DELTA_T == foeArrivalTime - foeArrivalTime %
DELTA_T) {
1234#ifdef MSLink_DEBUG_OPENED
1236 std::cout <<
" foeAT before egoAT\n";
1239 return foeArrivalTime;
1241 if (arrivalTime %
DELTA_T > 0) {
1246 const double dt =
STEPS2TIME(foeArrivalTime - arrivalTime);
1247 const double d = dt * m;
1248 const double a = dt * d / 2;
1251#ifdef MSLink_DEBUG_OPENED
1253 std::cout <<
" dist=" << dist <<
" dist2=" << dist2
1256 <<
" dt=" << dt <<
" v=" << v <<
" m=" << m <<
" d=" << d <<
" a=" << a <<
"\n";
1259 if (0.5 * v * v / m <= dist2) {
1260#ifdef MSLink_DEBUG_OPENED
1262 std::cout <<
" canBrakeToStop\n";
1275 const double x = (sqrt(4 * (v - d) * (v - d) - 8 * m * a) * -0.5 - d + v) / m;
1277#ifdef MSLink_DEBUG_OPENED
1278 const double x2 = (sqrt(4 * (v - d) * (v - d) - 8 * m * a) * 0.5 - d + v) / m;
1280 std::cout <<
SIMTIME <<
" dist=" << dist <<
" dist2=" << dist2 <<
" at=" <<
STEPS2TIME(arrivalTime) <<
" m=" << m <<
" d=" << d <<
" v=" << v <<
" a=" << a <<
" x=" << x <<
" x2=" << x2 <<
"\n";
1283 fasb = v - (dt + x) * m;
1291 if (link->blockedAtTime(arrivalTime, leaveTime, speed, speed,
myLane == link->getLane(), 0, decel, 0)) {
1296 if (lane->getVehicleNumberWithPartials() > 0) {
1304std::pair<const SUMOVehicle*, const MSLink*>
1306 double closetDist = std::numeric_limits<double>::max();
1308 const MSLink* foeLink =
nullptr;
1310 for (
const auto& it : link->myApproachingVehicles) {
1313 return std::make_pair(
nullptr, wrapAround);
1314 }
else if (it.second.dist < closetDist) {
1315 closetDist = it.second.dist;
1316 if (it.second.willPass) {
1323 return std::make_pair(closest, foeLink);
1365 assert(pred2 !=
nullptr);
1367 assert(predLink !=
nullptr);
1391 assert(pred2 !=
nullptr);
1393 assert(predLink !=
nullptr);
1394 return predLink->
getState() == linkState;
1408 std::vector<std::pair<SUMOTime, const SUMOVehicle*> > toSort;
1410 toSort.push_back(std::make_pair(it.second.arrivalTime, it.first));
1412 std::sort(toSort.begin(), toSort.end());
1413 for (std::vector<std::pair<SUMOTime, const SUMOVehicle*> >::const_iterator it = toSort.begin(); it != toSort.end(); ++it) {
1436 while (lane !=
nullptr && lane->
isInternal()) {
1448 while (lane !=
nullptr && lane->
isInternal()) {
1463 double totalDist = 0.;
1464 bool foundCrossing =
false;
1465 while (via !=
nullptr) {
1471 foundCrossing =
true;
1478 if (foundCrossing) {
1489 for (foe_ix = 0; foe_ix != (int)
myFoeLanes.size(); ++foe_ix) {
1496#ifdef MSLink_DEBUG_CROSSING_POINTS
1503 if (dist == -10000.) {
1507#ifdef MSLink_DEBUG_CROSSING_POINTS
1509 <<
"' at distance " << dist <<
" (approach along '"
1556 const MSLink* link =
this;
1557 while (lane !=
nullptr) {
1567 const MSLink* link =
this;
1593 std::cout <<
SIMTIME <<
" getLeaderInfo link=" <<
getDescription() <<
" dist=" << dist <<
" isShadowLink=" << isShadowLink <<
"\n";
1601 std::cout <<
" ignore linkLeaders beyond red light\n";
1608 for (
int i = 0; i < (int)
myFoeLanes.size(); ++i) {
1612 double distToCrossing = dist -
myConflicts[i].getLengthBehindCrossing(
this);
1613 const double foeDistToCrossing = foeLane->
getLength() -
myConflicts[i].getFoeLengthBehindCrossing(foeExitLink);
1616 const double crossingWidth = (sameTarget || sameSource) ? 0 :
myConflicts[i].conflictSize;
1617 const double foeCrossingWidth = (sameTarget || sameSource) ? 0 :
myConflicts[i].getFoeConflictSize(foeExitLink);
1622 std::cout <<
" distToCrossing=" << distToCrossing <<
" foeLane=" << foeLane->
getID() <<
" cWidth=" << crossingWidth
1625 <<
" lbc=" <<
myConflicts[i].getLengthBehindCrossing(
this)
1626 <<
" flbc=" <<
myConflicts[i].getFoeLengthBehindCrossing(foeExitLink)
1627 <<
" cw=" << crossingWidth
1628 <<
" fcw=" << foeCrossingWidth
1629 <<
" contLane=" << contLane
1634 if (distToCrossing + crossingWidth < 0 && !sameTarget
1637 std::cout <<
" ignore:egoBeyondCrossingPoint\n";
1641 bool ignoreGreenCont =
false;
1642 bool foeIndirect =
false;
1647 if (entry !=
nullptr && entry->
haveGreen()
1648 && foeEntry !=
nullptr && foeEntry->
haveGreen()
1651 ignoreGreenCont =
true;
1656 std::cout <<
" ignore:noIntersection\n";
1670 const double leaderBackDist = foeDistToCrossing - leaderBack;
1671 const double l2 = ego !=
nullptr ? ego->
getLength() + 2 : 0;
1673 const bool pastTheCrossingPoint = leaderBackDist + foeCrossingWidth + sagitta < 0;
1677 const bool ignoreIndirectBicycleTurn = pastTheCrossingPoint && foeIsBicycleTurn;
1678 const bool cannotIgnore = ((contLane && !ignoreIndirectBicycleTurn) || sameTarget || (sameSource && !
MSGlobals::gComputeLC)) && ego !=
nullptr;
1679 const bool inTheWay = ((((!pastTheCrossingPoint && distToCrossing > 0) || (sameTarget && distToCrossing > leaderBackDist - leader->
getLength()))
1680 && (enteredTheCrossingPoint || (sameSource && !enteredTheCrossingPoint && foeDistToCrossing < distToCrossing))
1688 std::cout <<
" candidate leader=" << leader->
getID()
1689 <<
" cannotIgnore=" << cannotIgnore
1690 <<
" fdtc=" << foeDistToCrossing
1691 <<
" lb=" << leaderBack
1692 <<
" lbd=" << leaderBackDist
1693 <<
" fcwidth=" << foeCrossingWidth
1695 <<
" sagitta=" << sagitta
1696 <<
" foePastCP=" << pastTheCrossingPoint
1697 <<
" foeEnteredCP=" << enteredTheCrossingPoint
1698 <<
" inTheWay=" << inTheWay
1699 <<
" willPass=" << willPass
1701 <<
" ignoreGreenCont=" << ignoreGreenCont
1702 <<
" foeIndirect=" << foeIndirect
1703 <<
" foeBikeTurn=" << foeIsBicycleTurn
1704 <<
" isOpposite=" << isOpposite <<
"\n";
1706 if (leader == ego) {
1710 if (!inTheWay && ignoreGreenCont) {
1712 std::cout <<
" ignoreGreenCont\n";
1718 && distToCrossing < -POSITION_EPS && !inTheWay
1721 std::cout <<
" ego entered conflict area\n";
1728 && leaderBack + leader->
getLength() < ego->getPositionOnLane() - ego->getLength()) {
1731 std::cout <<
" ego ahead of same-source foe\n";
1737 if ((!cannotIgnore || leader->
isStopped() || sameTarget)
1746 std::cout <<
" foe will not pass\n";
1761 && (!foeStrategicBlocked || sameInternalEdge)) {
1762 if (ego->getLane() == leader->
getLane()) {
1766 const double egoLatOffset = isShadowLink ? ego->getLatOffset(ego->getLaneChangeModel().getShadowLane()) : 0;
1767 const double posLat = ego->getLateralPositionOnLane() + egoLatOffset;
1769 if (foeLaneIsBidi) {
1771 posLatLeader = foeLane->
getWidth() - posLatLeader;
1773 const double latGap = (fabs(posLat - posLatLeader)
1778 <<
" sameSource=" << sameSource
1779 <<
" sameTarget=" << sameTarget
1780 <<
" foeLaneIsBidi=" << foeLaneIsBidi
1781 <<
" foeLane=" << foeLane->
getID()
1782 <<
" leader=" << leader->
getID()
1783 <<
" egoLane=" << ego->getLane()->getID()
1785 <<
" egoLat=" << posLat
1786 <<
" egoLatOffset=" << egoLatOffset
1787 <<
" leaderLat=" << posLatLeader
1788 <<
" leaderLatOffset=" << leader->
getLatOffset(foeLane)
1789 <<
" latGap=" << latGap
1790 <<
" maneuverDist=" << maneuverDist
1792 <<
" egoMaxSpeedLat=" << ego->getVehicleType().getMaxSpeedLat()
1803 if ((posLat > posLatLeader) == leaderFromRight) {
1806 std::cout <<
" ignored (same source) leaderFromRight=" << leaderFromRight <<
"\n";
1810 }
else if (sameTarget) {
1817 leaderFromRight = !leaderFromRight;
1819 if ((posLat > posLatLeader) == leaderFromRight
1823 && (ego->getLaneChangeModel().getSpeedLat() == 0
1824 || leaderFromRight == (ego->getLaneChangeModel().getSpeedLat() > -latGap))) {
1826 std::cout <<
" ignored (different source) leaderFromRight=" << leaderFromRight <<
"\n";
1835 std::cout <<
" ignored oncoming bidi leader\n";
1845 bool fromLeft =
true;
1846 if (ego ==
nullptr) {
1849 gap = leaderBackDist;
1853 distToCrossing +=
myConflicts[i].conflictSize / 2;
1854 if (gap + foeCrossingWidth < 0) {
1861 fromLeft = foeDistToCrossing > 0.5 * foeLane->
getLength();
1862 }
else if ((contLane && !sameSource && !ignoreIndirectBicycleTurn) || isOpposite) {
1863 gap = -std::numeric_limits<double>::max();
1865 if (pastTheCrossingPoint && !sameTarget) {
1869 std::cout <<
" foePastCP ignored\n";
1873 double leaderBackDist2 = leaderBackDist;
1874 if (sameTarget && leaderBackDist2 < 0) {
1875 const double mismatch =
myConflicts[i].getFoeLengthBehindCrossing(foeExitLink) -
myConflicts[i].getLengthBehindCrossing(
this);
1877 leaderBackDist2 += mismatch;
1881 std::cout <<
" distToCrossing=" << distToCrossing <<
" leaderBack=" << leaderBack
1882 <<
" backDist=" << leaderBackDist
1883 <<
" backDist2=" << leaderBackDist2
1887 gap = distToCrossing - ego->getVehicleType().getMinGap() - leaderBackDist2 - foeCrossingWidth;
1892 const bool stopAsap = ((leader->
isFrontOnLane(foeLane) ? cannotIgnore : (sameTarget || sameSource))
1893 || (ego !=
nullptr && ego->getVehicleType().getParameter().getJMParam(
SUMO_ATTR_JM_ADVANCE, 1.0) == 0.0));
1895 std::cout <<
" leader=" << leader->
getID() <<
" contLane=" << contLane <<
" cannotIgnore=" << cannotIgnore <<
" stopAsap=" << stopAsap <<
" gap=" << gap <<
"\n";
1904 result.emplace_back(leader, gap, stopAsap ? -1 : distToCrossing, llFlags, leader->
getLatOffset(foeLane));
1921 result.emplace_back(
nullptr, -1, distToPeds);
1927 const double timeToEnterCrossing = distToCrossing /
MAX2(ego->
getSpeed(), 1.0);
1931 std::cout <<
SIMTIME <<
": " << ego->
getID() <<
" breaking for approaching person " << item.first->getID()
1935 result.emplace_back(
nullptr, -1, distToPeds);
1951 if (ego !=
nullptr) {
1959 const MSLane* foeLane = *it;
1963 if (leader == ego) {
1980 <<
" foeLane=" << foeLane->
getID()
1981 <<
" leader=" << leader->
getID()
1985 <<
" egoLat=" << posLat
1986 <<
" leaderLat=" << posLatLeader
1987 <<
" leaderLatOffset=" << leader->
getLatOffset(foeLane)
1989 <<
" foeIndex=" << foeLane->
getIndex()
1995 if ((posLat < posLatLeader && myInternalLaneBefore->
getIndex() > foeLane->
getIndex())
1998 std::cout <<
SIMTIME <<
" blocked by " << leader->
getID() <<
" (sublane split) foeLane=" << foeLane->
getID() <<
"\n";
2003 result.emplace_back(leader, gap, -1);
2019 double distToPeds = std::numeric_limits<double>::max();
2032#ifdef DEBUG_WALKINGAREA
2038 <<
" inFront=" << inFront
2039 <<
" dist=" << dist <<
"\n";
2042 if (dist < ego->getVehicleType().getWidth() / 2 || inFront) {
2045 if (oncomingFactor > 0) {
2047 const double timeToStop = sqrt(dist) / 2;
2048 const double pedDist = p->
getMaxSpeed() *
MAX2(timeToStop,
TS) * oncomingFactor;
2049 dist =
MAX2(0.0, dist - pedDist);
2050#ifdef DEBUG_WALKINGAREA
2052 std::cout <<
" timeToStop=" << timeToStop <<
" pedDist=" << pedDist <<
" factor=" << oncomingFactor <<
" dist2=" << dist <<
"\n";
2060 distToPeds =
MIN2(distToPeds, dist);
2061 if (collectBlockers !=
nullptr) {
2062 collectBlockers->push_back(p);
2066 if (distToPeds != std::numeric_limits<double>::max()) {
2068 result.emplace_back(
nullptr, -1, distToPeds);
2077#ifdef DEBUG_WALKINGAREA
2079 std::cout <<
" angleDiff=" <<
RAD2DEG(angleDiff) <<
"\n";
2082 if (angleDiff <
DEG2RAD(75)) {
2093#ifdef DEBUG_WALKINGAREA
2095 std::cout <<
" ped-angleDiff=" <<
RAD2DEG(angleDiff) <<
" res=" << cos(angleDiff) <<
"\n";
2098 if (angleDiff <=
DEG2RAD(90)) {
2100 return cos(angleDiff);
2110 const double dist = timeHorizon * p->
getMaxSpeed();
2112 const Position offset(cos(a) * dist, sin(a) * dist);
2119 if (direction == -1) {
2121 }
else if (direction == 1) {
2146 if (before !=
nullptr && after !=
nullptr) {
2148 if (link->getLane() == after) {
2171 <<
" dist=" << dist <<
" bGap=" << brakeGap <<
" ignoring foes (arrival in " <<
STEPS2TIME(arrivalTime - now) <<
")\n")
2177 <<
" egoAT=" << arrivalTime
2179 <<
" brakeGap=" << brakeGap
2180 <<
" vSafe=" << vSafe
2181 <<
" numFoes=" << foes->size()
2184 const bool uniqueFoeLink =
myFoeLinks.size() == 1;
2186 for (
const auto& item : *foes) {
2187 if (!item->isVehicle()) {
2193 if (uniqueFoeLink) {
2198 aviPtr = fl->getApproachingPtr(foe);
2199 if (aviPtr !=
nullptr) {
2204 if (aviPtr ==
nullptr) {
2219 <<
" ignoring foe=" << foe->
getID()
2221 <<
" foeDist=" << avi.
dist
2222 <<
" foeDist2=" << foeDist
2223 <<
" foeSpeed=" << avi.
speed
2225 <<
" deltaDist=" << foeDist - dist
2248 const double uEnd =
MIN2(uMax, uAccel);
2249 const double uAvg = (avi.
speed + uEnd) / 2;
2250 const double tf0 = foeDist /
MAX2(NUMERICAL_EPS, uAvg);
2251 const double tf =
MAX2(1.0, ceil((tf0) /
TS) *
TS);
2256 const double vEnd =
MIN3(vMax, vAccel,
MAX2(uEnd, vDecel));
2257 const double vAvg = (ego->
getSpeed() + vEnd) / 2;
2258 const double te0 = dist /
MAX2(NUMERICAL_EPS, vAvg);
2259 const double te =
MAX2(1.0, ceil((te0) /
TS) *
TS);
2270 const double w =
MIN2(1.0, te / 10);
2274 vSafe =
MIN2(vSafe, vZipper);
2277 <<
" foeDist=" << foeDist
2278 <<
" foeSpeed=" << avi.
speed
2282 <<
" uAccel=" << uAccel
2289 <<
" aSafeGap=" << a
2291 <<
" vAccel=" << vAccel
2292 <<
" vDecel=" << vDecel
2294 <<
" vSafeGap=" << vSafeGap
2295 <<
" vFollow=" << vFollow
2297 <<
" maxDecel=" << maxDecel
2298 <<
" vZipper=" << vZipper
2299 <<
" vSafe=" << vSafe
2310 followDist > leaderDist &&
2328 for (
const MSLink* link : cand->getLinkCont()) {
2339 return fabs(posLat2 - posLat) < (width + width2) / 2;
2360 if (
id == foe->
getID()) {
2374std::pair<const SUMOVehicle* const, const MSLink::ApproachingVehicleInformation>
2377 double minDist = std::numeric_limits<double>::max();
2380 if (apprIt->second.dist < minDist) {
2381 minDist = apprIt->second.dist;
2406 if (item.second.dist <
SPEED2DIST(item.first->getSpeed())) {
#define JM_CROSSING_GAP_DEFAULT
#define DIVERGENCE_MIN_WIDTH
#define DEBUG_COND_ZIPPER
#define WRITE_WARNINGF(...)
#define WRITE_WARNING(msg)
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
const SVCPermissions SVCAll
all VClasses are allowed
@ SVC_BICYCLE
vehicle is a bicycle
const long long int VEHPARS_JUNCTIONMODEL_PARAMS_SET
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)....
@ PARTLEFT
The link is a partial left direction.
@ RIGHT
The link is a (hard) right direction.
@ LEFT
The link is a (hard) left direction.
@ STRAIGHT
The link is a straight direction.
@ PARTRIGHT
The link is a partial right 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_TL_GREEN_MAJOR
The link has green light, may pass.
@ LINKSTATE_ZIPPER
This is an uncontrolled, zipper-merge link.
@ LINKSTATE_TL_OFF_BLINKING
The link is controlled by a tls which is off and blinks, has to brake.
@ LINKSTATE_TL_RED
The link has red light (must brake)
@ LINKSTATE_TL_GREEN_MINOR
The link has green light, has to brake.
@ LINKSTATE_TL_OFF_NOSIGNAL
The link is controlled by a tls which is off, not blinking, may pass.
@ SUMO_ATTR_JM_IGNORE_FOE_SPEED
@ SUMO_ATTR_JM_STOPLINE_CROSSING_GAP
@ SUMO_ATTR_JM_STOPSIGN_WAIT
@ SUMO_ATTR_JM_IGNORE_IDS
@ SUMO_ATTR_JM_IGNORE_TYPES
@ SUMO_ATTR_JM_ALLWAYSTOP_WAIT
@ SUMO_ATTR_JM_IGNORE_FOE_PROB
@ SUMO_ATTR_JM_CROSSING_GAP
@ SUMO_ATTR_JM_TIMEGAP_MINOR
bool gDebugFlag1
global utility flags for debugging
const double INVALID_DOUBLE
invalid double
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
#define DEBUGOUT(cond, msg)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static const double INVALID_OFFSET
a value to signify offsets outside the range of [0, Line.length()]
static double naviDegree(const double angle)
static double angleDiff(const double angle1, const double angle2)
Returns the difference of the second angle to the first angle in radiants.
static double getMinAngleDiff(double angle1, double angle2)
Returns the minimum distance (clockwise/counter-clockwise) between both angles.
bool isStrategicBlocked() const
double getManeuverDist() const
Returns the remaining unblocked distance for the current maneuver. (only used by sublane model)
double getSpeedLat() const
return the lateral speed of the current lane change maneuver
virtual bool isSelected() const
whether this vehicle is selected in the GUI
double getLength() const
Returns the vehicle's length.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
bool isStopped() const
Returns whether the vehicle is at a stop.
double estimateSpeedAfterDistance(const double dist, const double v, const double accel) const
double getEmergencyDecel() const
Get the vehicle type's maximal physically possible deceleration [m/s^2].
static double avoidArrivalAccel(double dist, double time, double speed, double maxDecel)
Computes the acceleration needed to arrive not before the given time.
double getMaxAccel() const
Get the vehicle type's maximum acceleration [m/s^2].
double brakeGap(const double speed) const
Returns the distance the vehicle needs to halt including driver's reaction time tau (i....
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
virtual double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0, const CalcReason usage=CalcReason::CURRENT) const =0
Computes the vehicle's follow speed (no dawdling)
virtual double getHeadwayTime() const
Get the driver's desired headway [s].
A road/street connecting two junctions.
int getPriority() const
Returns the priority of the edge.
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersons() const
Returns this edge's persons set.
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
const MSJunction * getToJunction() const
const MSJunction * getFromJunction() const
bool isRoundabout() const
bool isInternal() const
return whether this edge is an internal edge
static double gLateralResolution
static bool gComputeLC
whether the simulationLoop is in the lane changing phase
static bool gLefthand
Whether lefthand-drive is being simulated.
static SUMOTime gIgnoreJunctionBlocker
static bool gSublane
whether sublane simulation is enabled (sublane model or continuous lanechanging)
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
The base class for an intersection.
SumoXMLNodeType getType() const
return the type of this Junction
AnyVehicleIterator is a structure, which manages the iteration through all vehicles on the lane,...
Representation of a lane in the micro simulation.
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.
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)
AnyVehicleIterator anyVehiclesEnd() const
end iterator for iterating over all vehicles touching this lane in downstream direction
const MSLink * getEntryLink() const
Returns the entry link if this is an internal lane, else nullptr.
const MSLink * getLinkTo(const MSLane *const) const
returns the link to the given lane or nullptr, if it is not connected
std::vector< MSVehicle * > VehCont
Container for vehicles.
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
MSLane * getCanonicalPredecessorLane() const
double getLength() const
Returns the lane's length.
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
int getIndex() const
Returns the lane's index.
MSLane * getLogicalPredecessorLane() const
get the most likely precedecessor lane (sorted using by_connections_to_sorter). The result is cached ...
double interpolateGeometryPosToLanePos(double geometryPos) const
AnyVehicleIterator anyVehiclesBegin() const
begin iterator for iterating over all vehicles touching this lane in downstream direction
MSLane * getOpposite() const
return the neighboring opposite direction lane for lane changing or nullptr
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
virtual const PositionVector & getShape(bool) const
MSEdge & getEdge() const
Returns the lane's edge.
const MSLane * getNormalPredecessorLane() const
get normal lane leading to this internal lane, for normal lanes, the lane itself is returned
double getWidth() const
Returns the lane's width.
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
bool fromInternalLane() const
return whether the fromLane of this link is an internal lane
void writeApproaching(OutputDevice &od, const std::string fromLaneID) const
write information about all approaching vehicles to the given output device
double getLengthBeforeCrossing(const MSLane *foeLane) const
Returns the internal length from the beginning of the link's internal lane before to the crossing wit...
const MSLane * getInternalLaneBefore() const
return myInternalLaneBefore (always 0 when compiled without internal lanes)
LinkState getState() const
Returns the current state of the link.
void setApproachingPerson(const MSPerson *approaching, const SUMOTime arrivalTime, const SUMOTime leaveTime)
Sets the information about an approaching person (only for a pedestrian crossing)
void checkWalkingAreaFoe(const MSVehicle *ego, const MSLane *foeLane, std::vector< const MSPerson * > *collectBlockers, LinkLeaders &result) const
check for persons on walkingarea in the path of ego vehicle
SUMOTime myMesoTLSPenalty
penalty time at tls for mesoscopic simulation
bool hasApproachingFoe(SUMOTime arrivalTime, SUMOTime leaveTime, double speed, double decel) const
Returns the information whether a vehicle is approaching on one of the link's foe streams.
double myDistToFoePedCrossing
distance from the stop line to the first pedestrian crossing or maxdouble
const bool myAmIndirect
whether this connection is an indirect turning movement
std::vector< MSLink * > mySublaneFoeLinks
double myGreenFraction
green fraction at tls for mesoscopic simulation
static const SUMOTime myLookaheadTime
ApproachInfos myApproachingVehicles
double myFoeVisibilityDistance
distance from which an approaching vehicle is able to see all relevant foes and may accelerate if the...
MSLink * computeParallelLink(int direction)
SVCPermissions myPermissions
who may drive on this link
int myIndex
The position within this respond.
bool myHasFoes
Whether any foe links exist.
const ApproachInfos & getApproaching() const
return all approaching vehicles
void setApproaching(const SUMOVehicle *approaching, const SUMOTime arrivalTime, const double arrivalSpeed, const double leaveSpeed, const bool setRequest, const double arrivalSpeedBraking, const SUMOTime waitingTime, double dist, double latOffset)
Sets the information about an approaching vehicle.
const MSLane * myInternalLaneBefore
LinkState myState
The state of the link.
bool lastWasContState(LinkState linkState) const
whether this is a link past an internal junction where the entry to the junction currently has the gi...
void initParallelLinks()
initialize parallel links (to be called after all links are loaded)
void setTLState(LinkState state, SUMOTime t)
Sets the current tl-state.
static const SUMOTime myLookaheadTimeZipper
void removeApproachingPerson(const MSPerson *person)
removes the person from myApproachingPersons
const ApproachingVehicleInformation * getApproachingPtr(const SUMOVehicle *veh) const
MSLane * getLane() const
Returns the connected lane.
bool opened(SUMOTime arrivalTime, double arrivalSpeed, double leaveSpeed, double vehicleLength, double impatience, double decel, SUMOTime waitingTime, double posLat=0, BlockingFoes *collectFoes=nullptr, bool ignoreRed=false, const SUMOTrafficObject *ego=nullptr, double dist=-1) const
Returns the information whether the link may be passed.
std::vector< MSLink * > * myOffFoeLinks
bool isConflictEntryLink() const
return whether this link enters the conflict area (not a continuation link)
double myRadius
the turning radius for this link or doublemax for straight links
int getIndex() const
Returns the respond index (for visualization)
bool havePriority() const
Returns whether this link is a major link.
double myLength
The length of the link.
bool blockedByFoe(const SUMOVehicle *veh, const ApproachingVehicleInformation &avi, SUMOTime arrivalTime, SUMOTime leaveTime, double arrivalSpeed, double leaveSpeed, bool sameTargetLane, double impatience, double decel, SUMOTime waitingTime, const SUMOTrafficObject *ego) const
const LinkState myOffState
The state of the link when switching of traffic light control.
const LinkLeaders getLeaderInfo(const MSVehicle *ego, double dist, std::vector< const MSPerson * > *collectBlockers=0, bool isShadowLink=false) const
Returns all potential link leaders (vehicles on foeLanes) Valid during the planMove() phase.
static bool ignoreFoe(const SUMOTrafficObject *ego, const SUMOTrafficObject *foe)
std::map< const MSPerson *, ApproachingPersonInformation > PersonApproachInfos
bool isEntryLink() const
return whether the toLane of this link is an internal lane and fromLane is a normal lane
const MSLane * getLaneBefore() const
return the internalLaneBefore if it exists and the laneBefore otherwise
ApproachingVehicleInformation getApproaching(const SUMOVehicle *veh) const
const MSTrafficLightLogic * myLogic
the controlling logic or 0
@ CONFLICT_NO_INTERSECTION
@ CONFLICT_SIBLING_CONTINUATION
@ CONFLICT_STOP_AT_INTERNAL_JUNCTION
static bool lateralOverlap(double posLat, double width, double posLat2, double width2)
check whether the given vehicle positions overlap laterally
std::vector< MSLink * > myFoeLinks
bool isInternalJunctionLink() const
return whether the fromLane and the toLane of this link are internal lanes
double computeDistToDivergence(const MSLane *lane, const MSLane *sibling, double minDist, bool sameSource, double siblingPredLength=0) const
compute point of divergence for geomatries with a common start or end
bool isExitLink() const
return whether the fromLane of this link is an internal lane and toLane is a normal lane
std::vector< const MSLane * > myFoeLanes
std::vector< LinkLeader > LinkLeaders
static std::set< std::pair< MSLink *, MSLink * > > myRecheck
links that need post processing after initialization (to deal with legacy networks)
void clearState()
Remove all approaching vehicles before quick-loading state.
MSLane * myLane
The lane behind the junction approached by this link.
static const double NO_INTERSECTION
LinkState getOffState() const
Returns the off-state for the link.
bool isInFront(const MSVehicle *ego, const PositionVector &egoPath, const Position &pPos) const
whether the given person is in front of the car
MSLane * getViaLane() const
Returns the following inner lane.
const int myTLIndex
the traffic light index
double getInternalLengthsAfter() const
Returns the cumulative length of all internal lanes after this link.
std::string getDescription() const
get string description for this link
static void recheckSetRequestInformation()
post-processing for legacy networks
bool hasFoes() const
Returns whether this link belongs to a junction where more than one edge is incoming.
bool blockedAtTime(SUMOTime arrivalTime, SUMOTime leaveTime, double arrivalSpeed, double leaveSpeed, bool sameTargetLane, double impatience, double decel, SUMOTime waitingTime, BlockingFoes *collectFoes=nullptr, const SUMOTrafficObject *ego=nullptr, bool lastWasContRed=false, double dist=-1) const
Returns the information whether this link is blocked Valid after the vehicles have set their requests...
LinkState myLastGreenState
The last green state of the link (minor or major)
static SUMOTime computeFoeArrivalTimeBraking(SUMOTime arrivalTime, const SUMOVehicle *foe, SUMOTime foeArrivalTime, double impatience, double dist, double &fasb)
compute arrival time if foe vehicle is braking for ego
double isOnComingPed(const MSVehicle *ego, const MSPerson *p) const
whether the given person is walking towards the car returned as a factor in [0, 1]
std::pair< const SUMOVehicle *const, const ApproachingVehicleInformation > getClosest() const
get the closest vehicle approaching this link
void updateDistToFoePedCrossing(double dist)
add information about another pedestrian crossing
MSJunction * myJunction
the junction to which this link belongs
const MSLink * getCorrespondingEntryLink() const
returns the corresponding entry link for exitLinks to a junction.
void setRequestInformation(int index, bool hasFoes, bool isCont, const std::vector< MSLink * > &foeLinks, const std::vector< MSLane * > &foeLanes, MSLane *internalLaneBefore=0)
Sets the request information.
void removeApproaching(const SUMOVehicle *veh)
removes the vehicle from myApproachingVehicles
bool contIntersect(const MSLane *lane, const MSLane *foe)
check if the lane intersects with a foe cont-lane
bool isExitLinkAfterInternalJunction() const
return whether the fromLane of this link is an internal lane and its incoming lane is also an interna...
LinkState getLastGreenState() const
Returns the last green state of the link.
std::pair< const SUMOVehicle *, const MSLink * > getFirstApproachingFoe(const MSLink *wrapAround) const
get the foe vehicle that is closest to the intersection or nullptr along with the foe link This funct...
std::vector< MSLink * > mySublaneFoeLinks2
bool railSignalWasPassed() const
whether this link is for a railsignal that was passed in this step
MSLink * getParallelLink(int direction) const
return the link that is parallel to this link or 0
MSLane * getViaLaneOrLane() const
return the via lane if it exists and the lane otherwise
void addCustomConflict(const MSLane *from, const MSLane *to, double startPos, double endPos)
const CustomConflict * getCustomConflict(const MSLane *foeLane) const
return CustomConflict with foeLane if it is defined
MSLane *const myInternalLane
The following junction-internal lane if used.
std::vector< const SUMOTrafficObject * > BlockingFoes
double myLateralShift
lateral shift to be applied when passing this link
std::vector< ConflictInfo > myConflicts
double getInternalLengthsBefore() const
Returns the cumulative length of all internal lanes before this link.
const MSLane * myWalkingAreaFoe
walkingArea that must be checked when entering the intersection
static bool couldBrakeForLeader(double followDist, double leaderDist, const MSVehicle *follow, const MSVehicle *leader)
whether follower could stay behind leader (possibly by braking)
std::vector< CustomConflict > myCustomConflicts
Position getFuturePosition(const MSPerson *p, double timeHorizon=1) const
return extrapolated position of the given person after the given time
const MSLane * myWalkingAreaFoeExit
walkingArea that must be checked when leaving the intersection
MSLane * myLaneBefore
The lane approaching this link.
@ LL_SAME_SOURCE
link leader is coming from the same (normal) lane
@ LL_SAME_TARGET
link leader is targeting the same outgoing lane
@ LL_IN_THE_WAY
vehicle is in the way
@ LL_FROM_LEFT
link leader is passing from left to right
SVCPermissions getPermissions() const
who may use this link
bool lastWasContMajor() const
whether this is a link past an internal junction which currently has priority
double getLengthsBeforeCrossing(const MSLane *foeLane) const
Returns the sum of the lengths along internal lanes following this link to the crossing with the give...
bool myHavePedestrianCrossingFoe
whether on of myFoeLanes is a crossing
SUMOTime myLastStateChange
The time of the last state change.
PersonApproachInfos * myApproachingPersons
LinkDirection myDirection
An abstract (hopefully human readable) definition of the link's direction.
const MSTrafficLightLogic * getTLLogic() const
Returns the TLS index.
bool checkContOff() const
figure out whether the cont status remains in effect when switching off the tls
const MSLink * getCorrespondingExitLink() const
returns the corresponding exit link for entryLinks to a junction.
static bool unsafeMergeSpeeds(double leaderSpeed, double followerSpeed, double leaderDecel, double followerDecel)
return whether the given vehicles may NOT merge safely
SUMOTime getLeaveTime(const SUMOTime arrivalTime, const double arrivalSpeed, const double leaveSpeed, const double vehicleLength) const
return the expected time at which the given vehicle will clear the link
double getZipperSpeed(const MSVehicle *ego, const double dist, double vSafe, SUMOTime arrivalTime, const BlockingFoes *foes) const
return the speed at which ego vehicle must approach the zipper link
MSLink * getOppositeDirectionLink() const
return the link that is the opposite entry link to this one
MSLink(MSLane *predLane, MSLane *succLane, MSLane *via, LinkDirection dir, LinkState state, double length, double foeVisibilityDistance, bool keepClear, MSTrafficLightLogic *logic, int tlLinkIdx, bool indirect)
Constructor for simulation which uses internal lanes.
std::vector< MSLane * > mySublaneFoeLanes
LinkDirection getDirection() const
Returns the direction the vehicle passing this link take.
bool keepClear() const
whether the junction after this link must be kept clear
bool haveRed() const
Returns whether this link is blocked by a red (or redyellow) traffic light.
double getLength() const
Returns the length of this link.
void setTLLogic(const MSTrafficLightLogic *logic)
Sets the currently active tlLogic.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
bool hasPersons() const
Returns whether persons are simulated.
virtual MSTransportableControl & getPersonControl()
Returns the person control.
virtual bool blockedAtDist(const SUMOTrafficObject *ego, const MSLane *lane, double vehCenter, double vehWidth, double oncomingGap, std::vector< const MSPerson * > *collectBlockers)
whether a pedestrian is blocking the crossing of lane for the given vehicle bondaries
static const double SAFETY_GAP
The parent class for traffic light logics.
MSPModel * getMovementModel()
Returns the default movement model for this kind of transportables.
Position getPosition(const double) const override
Return current position (x/y, cartesian)
double getMaxSpeed() const override
Returns the maximum speed (the minimum of desired and physical maximum speed)
const MSVehicleType & getVehicleType() const override
Returns the object's "vehicle" type.
virtual double getAngle() const override
return the current angle of the transportable
Representation of a vehicle in the micro simulation.
bool willStop() const
Returns whether the vehicle will stop on the current edge.
SUMOTime getLastActionTime() const
Returns the time of the vehicle's last action point.
bool isActive() const
Returns whether the current simulation step is an action point for the vehicle.
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
bool isFrontOnLane(const MSLane *lane) const
Returns the information whether the front of the vehicle is on the given lane.
MSAbstractLaneChangeModel & getLaneChangeModel()
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
double getLatOffset(const MSLane *lane) const
Get the offset that that must be added to interpret myState.myPosLat for the given lane.
const MSLane * getLane() const
Returns the lane the vehicle is on.
bool isBidiOn(const MSLane *lane) const
whether this vehicle is driving against lane
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
double getSpeed() const
Returns the vehicle's current speed.
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
bool ignoreRed(const MSLink *link, bool canBrake) const
decide whether a red (or yellow light) may be ignored
double getAngle() const
Returns the vehicle's direction in radians.
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.
const std::string & getID() const
Returns the name of the vehicle type.
double getMinGap() const
Get the free space in front of vehicles of this class.
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
double getLength() const
Get vehicle's length [m].
const SUMOVTypeParameter & getParameter() const
const std::string & getID() const
Returns the id.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false)
writes a named attribute
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
A point in 2D or 3D with translation and scaling methods.
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position (in radians bet...
double length2D() const
Returns the length.
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
std::vector< double > intersectsAtLengths2D(const PositionVector &other) const
For all intersections between this vector and other, return the 2D-length of the subvector from 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)
double nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
std::vector< double > distances(const PositionVector &s, bool perpendicular=false) const
distances of all my points to s and all of s points to myself
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
double angleAt2D(int pos) const
get angle in certain position of position vector (in radians between -M_PI and M_PI)
PositionVector reverse() const
reverse position vector
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
Representation of a vehicle, person, or container.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual double getSpeed() const =0
Returns the object's current speed.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
virtual SumoRNG * getRNG() const =0
Returns the associated RNG for this object.
virtual bool isSelected() const =0
whether this object is selected in the GUI
double getJMParam(const SumoXMLAttr attr, const double defaultValue) const
Returns the named value from the map, or the default if it is not contained there.
Representation of a vehicle.
virtual double getLateralPositionOnLane() const =0
Get the vehicle's lateral position on the lane.
virtual SUMOTime getLastActionTime() const =0
virtual double getBrakeGap(bool delayed=false) const =0
get distance for coming to a stop (used for rerouting checks)
Structure representing possible vehicle parameter.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
std::vector< std::string > getVector()
return vector of strings
pre-computed information for conflict points
double getLengthBehindCrossing(const MSLink *exitLink) const
double getFoeConflictSize(const MSLink *foeExitLink) const
int foeConflictIndex
the conflict from the perspective of the foe
double conflictSize
the length of the conflict space
double getFoeLengthBehindCrossing(const MSLink *foeExitLink) const
double lengthBehindCrossing
length of internal lane after the crossing point
holds user defined conflict positions (must be interpreted for the correct exitLink)