51#define DEBUGCOND(PED) ((PED).getPerson()->isSelected())
52#define DEBUGCOND2(LANE) ((LANE)->isSelected())
57 for (
int i = 0; i < (int)obs.size(); ++i) {
59 <<
"(" << obs[i].description
60 <<
" x=(" << obs[i].xBack <<
"," << obs[i].xFwd
61 <<
") s=" << obs[i].speed
123 WRITE_WARNINGF(
TL(
"Pedestrian vType '%' width % is larger than pedestrian.striping.stripe-width and this may cause collisions with vehicles."),
171 if (lane ==
nullptr) {
172 const char* error =
TL(
"Person '%' could not find sidewalk on edge '%', time=%.");
210 if (from ==
nullptr || to ==
nullptr) {
212 }
else if (from->
getLinkTo(to) !=
nullptr) {
214 }
else if (to->
getLinkTo(from) !=
nullptr) {
232 for (
MSLink* link : lane->getLinkCont()) {
233 if (link->getWalkingAreaFoe() !=
nullptr) {
235 myWalkingAreaFoes[&link->getWalkingAreaFoe()->getEdge()].push_back(link->getLaneBefore());
238 if (link->getWalkingAreaFoeExit() !=
nullptr) {
240 myWalkingAreaFoes[&link->getWalkingAreaFoeExit()->getEdge()].push_back(link->getLaneBefore());
258 const MSLane* walkingArea = getSidewalk<MSEdge, MSLane>(edge);
262 std::vector<const MSLane*> lanes;
264 if (!in->isTazConnector()) {
265 lanes.push_back(getSidewalk<MSEdge, MSLane>(in));
266 if (lanes.back() ==
nullptr) {
267 throw ProcessError(
"Invalid connection from edge '" + in->getID() +
"' to walkingarea edge '" + edge->
getID() +
"'");
272 if (!out->isTazConnector()) {
273 lanes.push_back(getSidewalk<MSEdge, MSLane>(out));
274 if (lanes.back() ==
nullptr) {
275 throw ProcessError(
"Invalid connection from walkingarea edge '" + edge->
getID() +
"' to edge '" + out->getID() +
"'");
280 for (
int j = 0; j < (int)lanes.size(); ++j) {
281 for (
int k = 0; k < (int)lanes.size(); ++k) {
284 const MSLane*
const from = lanes[j];
285 const MSLane*
const to = lanes[k];
291 const double maxExtent = fromPos.
distanceTo2D(toPos) / 4;
292 const double extrapolateBy =
MIN2(maxExtent, walkingArea->
getWidth() / 2);
294 shape.push_back(fromPos);
295 if (extrapolateBy > POSITION_EPS) {
304 if (shape.size() < 2) {
308 assert(shape.size() == 2);
313 if (shape.size() >= 4 && shape.
length() < walkingArea->
getWidth()) {
314 const double aStart = shape.
angleAt2D(0);
315 const double aEnd = shape.
angleAt2D((
int)shape.size() - 2);
316 if (fabs(aStart - aEnd) <
DEG2RAD(10)) {
317 angleOverride = (aStart + aEnd) / 2;
325 into.insert(std::make_pair(std::make_pair(from, to), wap));
337 std::vector<const MSLane*> lanes;
339 lanes.push_back(getSidewalk<MSEdge, MSLane>(pred));
342 lanes.push_back(getSidewalk<MSEdge, MSLane>(succ));
344 if (lanes.size() < 1) {
345 throw ProcessError(
TLF(
"Invalid walkingarea '%' does not allow continuation.", walkingArea->
getID()));
353 const MSLane* swBefore = getSidewalk<MSEdge, MSLane>(before);
354 const MSLane* swAfter = getSidewalk<MSEdge, MSLane>(after);
357 return &pathIt->second;
361 bool useBefore = swBefore !=
nullptr && std::find(preds.begin(), preds.end(), before) != preds.end();
362 bool useAfter = swAfter !=
nullptr && std::find(succs.begin(), succs.end(), after) != succs.end();
366 }
else if (succs.size() > 0) {
368 return getWalkingAreaPath(walkingArea, swBefore, getSidewalk<MSEdge, MSLane>(succs.front()));
370 }
else if (useAfter && preds.size() > 0) {
372 return getWalkingAreaPath(walkingArea, getSidewalk<MSEdge, MSLane>(preds.front()), swAfter);
383 return &pathIt->second;
387 if (preds.size() > 0) {
389 const auto pathIt2 =
myWalkingAreaPaths.find(std::make_pair(getSidewalk<MSEdge, MSLane>(pred), after));
391 return &pathIt2->second;
407 const MSLane* nextLane = nextRouteLane;
408 const MSLink* link =
nullptr;
414 if (nextRouteLane ==
nullptr && nextRouteEdge !=
nullptr) {
415 std::string error =
"Person '" + ped.
getPerson()->
getID() +
"' could not find sidewalk on edge '" + nextRouteEdge->
getID() +
"', time="
419 nextRouteLane = nextRouteEdge->
getLanes().front();
425 if (nextRouteLane !=
nullptr) {
430 nextLane = currentLane->
getLinkCont()[0]->getViaLaneOrLane();
435 std::cout <<
" internal\n";
440 nextLane = currentLane->
getLinkCont()[0]->getLane();
445 std::cout <<
" crossing\n";
453 const double arrivalPos = (nextRouteEdge == ped.
getStage()->
getRoute().back()
457 if (prevLane !=
nullptr) {
458 prohibited.push_back(&prevLane->
getEdge());
463 <<
" nre=" << nextRouteEdge->
getID()
464 <<
" nreDir=" << nextRouteEdgeDir
465 <<
" aPos=" << arrivalPos
466 <<
" crossingRoute=" <<
toString(crossingRoute)
469 if (crossingRoute.size() > 1) {
470 const MSEdge* nextEdge = crossingRoute[1];
471 nextLane = getSidewalk<MSEdge, MSLane>(crossingRoute[1], ped.
getPerson()->
getVClass());
473 assert(nextLane != prevLane);
476 std::cout <<
" nextDir=" << nextDir <<
"\n";
485 link = oppositeWalkingArea->
getLinkTo(nextLane);
488 assert(link !=
nullptr);
495 <<
" no route from '" << (currentEdge ==
nullptr ?
"NULL" : currentEdge->
getID())
496 <<
"' to '" << (nextRouteEdge ==
nullptr ?
"NULL" : nextRouteEdge->
getID())
501 link = prevLane->
getLinkTo(nextRouteLane);
503 link = nextRouteLane->
getLinkTo(prevLane);
505 if (link !=
nullptr) {
510 +
"' from walkingArea '" + currentEdge->
getID()
511 +
"' to edge '" + nextRouteEdge->
getID() +
"', time=" +
514 nextLane = nextRouteLane;
517 }
else if (currentEdge == nextRouteEdge) {
524 if (nextLane !=
nullptr) {
527 std::cout <<
" next walkingArea " << (nextDir ==
FORWARD ?
"forward" :
"backward") <<
"\n";
546 std::cout <<
" nextEdge=" << nextRouteEdge->
getID() <<
" passedFwd=" << passedFwd <<
" passedBwd=" << passedBwd <<
" futureRoute=" <<
toString(futureRoute) <<
" nextDir=" << nextDir <<
"\n";
552 link = currentLane->
getLinkTo(nextRouteLane);
553 if (link !=
nullptr) {
555 std::cout <<
" direct forward\n";
560 link = nextRouteLane->
getLinkTo(currentLane);
561 if (link !=
nullptr) {
563 std::cout <<
" direct backward\n";
566 if (nextLane !=
nullptr) {
568 while (nextLane->
getLinkCont()[0]->getViaLaneOrLane()->isInternal()) {
569 nextLane = nextLane->
getLinkCont()[0]->getViaLaneOrLane();
575 if (nextLane ==
nullptr) {
577 nextLane = nextRouteLane;
579 std::cout <<
SIMTIME <<
" no next lane found for " << currentLane->
getID() <<
" dir=" << ped.
getDirection() <<
"\n";
583 +
"' from edge '" + currentEdge->
getID()
584 +
"' to edge '" + nextRouteEdge->
getID() +
"', time=" +
587 }
else if (nextLane->
getLength() <= POSITION_EPS) {
599 nextLane = nextRouteLane;
608 <<
" l=" << currentLane->
getID()
609 <<
" nl=" << (nextLane ==
nullptr ?
"NULL" : nextLane->
getID())
610 <<
" nrl=" << (nextRouteLane ==
nullptr ?
"NULL" : nextRouteLane->
getID())
616 assert(nextLane != 0 || nextRouteLane == 0);
625 if (l->getLane()->getEdge().isWalkingArea()) {
631 const std::vector<MSLane::IncomingLaneInfo>& laneInfos = currentLane->
getIncomingLanes();
632 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator it = laneInfos.begin(); it != laneInfos.end(); ++it) {
633 if ((*it).lane->getEdge().isWalkingArea()) {
634 link = (*it).viaLink;
645 const PState& ego = *
static_cast<PState*
>(pedestrians[egoIndex]);
646 const int egoStripe = ego.
stripe();
648 std::vector<bool> haveBlocker(stripes,
false);
649 for (
int index = egoIndex + 1; index < (int)pedestrians.size(); index++) {
650 const PState& p = *
static_cast<PState*
>(pedestrians[index]);
652 std::cout <<
SIMTIME <<
" ped=" << ego.
getID() <<
" cur=" << egoStripe <<
" checking neighbor " << p.
getID()
658 std::cout <<
" dist=" << ego.
distanceTo(o) << std::endl;
666 haveBlocker[p.
stripe()] =
true;
677 if (!haveBlocker[p.
stripe()]) {
696 int offset = (destStripes - origStripes) / 2;
698 offset += (destStripes - origStripes) % 2;
706 MSLane* lane,
const MSLane* nextLane,
int stripes,
int nextDir,
707 double currentLength,
int currentDir) {
708 if (nextLanesObs.count(nextLane) == 0) {
715 const int offset =
getStripeOffset(nextStripes, stripes, currentDir != nextDir && nextStripes > stripes);
726 if (nextStripes < stripes) {
728 for (
int ii = 0; ii < stripes; ++ii) {
729 if (ii < offset || ii >= nextStripes + offset) {
740 if ((stripes - nextStripes) % 2 != 0) {
743 nextDir = currentDir;
745 for (
int ii = 0; ii < (int)pedestrians.size(); ++ii) {
746 const PState& p = *
static_cast<PState*
>(pedestrians[ii]);
755 const double newY = relPos.
y() + lateral_offset;
766 sort(pedestrians.begin(), pedestrians.end(),
by_xpos_sorter(nextDir));
767 for (
int ii = 0; ii < (int)pedestrians.size(); ++ii) {
768 const PState& p = *
static_cast<PState*
>(pedestrians[ii]);
774 if (nextDir != currentDir) {
779 const int stripe = p.
stripe(newY);
780 if (stripe >= 0 && stripe < stripes) {
784 if (otherStripe >= 0 && otherStripe < stripes) {
785 obs[otherStripe] = pObs;
800 nextLanesObs[nextLane] = obs;
802 return nextLanesObs[nextLane];
810 o.xFwd += currentLength;
811 o.xBack += currentLength;
813 const double tmp = o.xFwd;
814 o.xFwd = currentLength + nextLength - o.xBack;
815 o.xBack = currentLength + nextLength - tmp;
819 const double tmp = o.xFwd;
823 o.xFwd -= nextLength;
824 o.xBack -= nextLength;
834 if ((dir ==
FORWARD && x - width / 2. < obs[stripe].xBack) || (dir ==
BACKWARD && x + width / 2. > obs[stripe].xFwd)) {
835 obs[stripe] =
Obstacle(x, 0, type,
id, width);
843 const MSLane* lane = it_lane->first;
845 if (pedestrians.size() == 0) {
851 const double minY =
stripeWidth * - 0.5 + NUMERICAL_EPS;
856 std::set<const WalkingAreaPath*, walkingarea_path_sorter> paths;
857 for (Pedestrians::iterator it = pedestrians.begin(); it != pedestrians.end(); ++it) {
864 std::cout <<
SIMTIME <<
" debugging WalkingAreaPath from=" << debugPath->
from->
getID() <<
" to=" << debugPath->to->getID() <<
" minY=" << minY <<
" maxY=" << maxY <<
" latOffset=" << lateral_offset <<
"\n";
869 for (std::set<const WalkingAreaPath*, walkingarea_path_sorter>::iterator it = paths.begin(); it != paths.end(); ++it) {
873 transformedPeds.reserve(pedestrians.size());
874 for (Pedestrians::iterator it_p = pedestrians.begin(); it_p != pedestrians.end(); ++it_p) {
877 transformedPeds.push_back(p);
878 if (path == debugPath) std::cout <<
" ped=" << p->
getPerson()->
getID() <<
" relX=" << p->
getEdgePos(0) <<
" relY=" << p->
getPosLat() <<
" (untransformed), vecCoord="
883 transformedPeds.push_back(p);
884 if (path == debugPath) std::cout <<
" ped=" << p->
getPerson()->
getID() <<
" relX=" << p->
getEdgePos(0) <<
" relY=" << p->
getPosLat() <<
" (untransformed), vecCoord="
890 toDelete.push_back(tp);
891 transformedPeds.push_back(tp);
892 if (path == debugPath) std::cout <<
" ped=" << p->
getPerson()->
getID() <<
" relX=" << p->
getEdgePos(0) <<
" relY=" << p->
getPosLat() <<
" (semi-transformed), vecCoord="
897 const double newY = relPos.
y() + lateral_offset;
900 tp->
reset(relPos.
x(), newY);
901 toDelete.push_back(tp);
902 transformedPeds.push_back(tp);
903 if (path == debugPath) {
904 std::cout <<
" ped=" << p->
getPerson()->
getID() <<
" relX=" << relPos.
x() <<
" relY=" << newY <<
" (transformed), vecCoord=" << relPos <<
"\n";
907 if (path == debugPath) {
908 std::cout <<
" ped=" << p->
getPerson()->
getID() <<
" relX=" << relPos.
x() <<
" relY=" << newY <<
" (invalid), vecCoord=" << relPos <<
"\n";
918 for (
const MSLane* foeLane : itFoe->second) {
919 for (
auto itVeh = foeLane->anyVehiclesBegin(); itVeh != foeLane->anyVehiclesEnd(); ++itVeh) {
926 WRITE_WARNINGF(
"Could not vehicle '%' front position % onto walkingarea '%' path=%, time=%.",
930 WRITE_WARNINGF(
"Could not vehicle '%' back position % onto walkingarea '%' path=%, time=%.",
934 relCenter.push_back(relFront);
935 relCenter.push_back(relBack);
937 relCorners.
add(relCenter[0]);
938 relCorners.
add(relCenter[1]);
940 relCorners.
add(relCenter[0]);
941 relCorners.
add(relCenter[1]);
945 const double xWidth = relCorners.
getWidth();
946 const double vehYmin =
MAX2(minY - lateral_offset, relCorners.
ymin());
947 const double vehYmax =
MIN2(maxY - lateral_offset, relCorners.
ymax());
948 const double xCenter = relCorners.
getCenter().
x();
951 const bool addFront =
addVehicleFoe(veh, lane, yMinPos, dir * xWidth, 0, lateral_offset, minY, maxY, toDelete, transformedPeds);
952 const bool addBack =
addVehicleFoe(veh, lane, yMaxPos, dir * xWidth, 0, lateral_offset, minY, maxY, toDelete, transformedPeds);
953 if (path == debugPath) {
954 std::cout <<
" veh=" << veh->
getID()
955 <<
" corners=" << relCorners
956 <<
" xWidth=" << xWidth
957 <<
" ymin=" << relCorners.
ymin()
958 <<
" ymax=" << relCorners.
ymax()
959 <<
" vehYmin=" << vehYmin
960 <<
" vehYmax=" << vehYmax
963 if (addFront && addBack) {
965 const double yDist = vehYmax - vehYmin;
967 const double relDist = dist / yDist;
968 Position between = (yMinPos * relDist) + (yMaxPos * (1 - relDist));
969 if (path == debugPath) {
970 std::cout <<
" vehBetween=" << veh->
getID() <<
" pos=" << between <<
"\n";
972 addVehicleFoe(veh, lane, between, dir * xWidth,
stripeWidth, lateral_offset, minY, maxY, toDelete, transformedPeds);
981 for (Pedestrians::iterator it_p = toDelete.begin(); it_p != toDelete.end(); ++it_p) {
997 const double newY = relPos.
y() + lateral_offset;
998 if (newY >= minY && newY <= maxY) {
1001 toDelete.push_back(tp);
1002 transformedPeds.push_back(tp);
1013 sort(pedestrians.begin(), pedestrians.end(),
by_xpos_sorter(dir));
1015 for (
int i = 0; i < (int)pedestrians.size(); i++) {
1016 PState*
const p =
static_cast<PState*
>(pedestrians[i]);
1023 pedestrians.erase(pedestrians.begin() + i);
1026 if (p->
getLane() !=
nullptr) {
1045 sort(pedestrians.begin(), pedestrians.end(),
by_xpos_sorter(dir));
1048 bool hasCrossingVehObs =
false;
1051 hasCrossingVehObs =
addCrossingVehs(lane, stripes, 0, dir, crossingVehs,
true);
1054 for (
int ii = 0; ii < (int)pedestrians.size(); ++ii) {
1092 nextLanesObs, lane, nextLane, stripes,
1112 const double passingLength = p.
getLength() + passingClearanceTime * speed;
1123 && !link->
opened(currentTime -
DELTA_T, speed, speed, passingLength, p.
getImpatience(currentTime), speed, 0, 0,
nullptr, p.
ignoreRed(link), p.
getPerson())) {
1164 if (hasCrossingVehObs) {
1173 p.
walk(currentObs, currentTime);
1184 for (
int coll = 0; coll < ii; ++coll) {
1192 +
"', lane='" + lane->
getID() +
"', time=" +
time2string(currentTime) +
".");
1222 bool hasCrossingVehObs =
false;
1227 if (linkLeaders.size() > 0) {
1228 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
1230 const MSVehicle* veh = (*it).vehAndGap.first;
1231 if (veh !=
nullptr) {
1236 voBlock.
xBack = NUMERICAL_EPS;
1243 const double bGap = (prio
1245 : veh->
getSpeed() * distToCrossBeforeVeh);
1249 if ((*it).fromLeft()) {
1250 vehYmin = -(*it).vehAndGap.second + lateral_offset;
1254 vehYmax = crossing->
getWidth() + (*it).vehAndGap.second - lateral_offset;
1268 hasCrossingVehObs =
true;
1273 <<
" crossingVeh=" << veh->
getID()
1274 <<
" lane=" << crossing->
getID()
1276 <<
" latOffset=" << lateral_offset
1278 <<
" stripes=" << stripes
1279 <<
" dist=" << (*it).distToCrossing
1280 <<
" gap=" << (*it).vehAndGap.second
1281 <<
" brakeGap=" << bGap
1282 <<
" fromLeft=" << (*it).fromLeft()
1283 <<
" distToCrossBefore=" << distToCrossBeforeVeh
1284 <<
" ymin=" << vehYmin
1285 <<
" ymax=" << vehYmax
1293 if (hasCrossingVehObs) {
1296 bool allBlocked =
true;
1298 for (
int i = 0; i < (int)obs.size(); i++) {
1301 (dir ==
FORWARD && i >= reserved) ||
1302 (dir ==
BACKWARD && i < (
int)obs.size() - reserved))) {
1309 std::cout <<
SIMTIME <<
" crossing=" << crossing->
getID() <<
" allBlocked\n";
1313 o.xBack = NUMERICAL_EPS;
1315 o.xFwd = crossing->
getLength() - NUMERICAL_EPS;
1321 return hasCrossingVehObs;
1336 if (ped !=
nullptr) {
1362 double vehXMaxCheck;
1363 double vehXMinCheck;
1367 vehXMin = vehFront - clearance;
1369 vehXMaxCheck = vehBack + NUMERICAL_EPS;
1373 vehXMinCheck = vehFront - clearance;
1376 vehXMax = vehFront + clearance;
1379 vehXMaxCheck = vehFront + clearance;
1383 vehXMinCheck = vehBack - NUMERICAL_EPS;
1387 std::cout <<
SIMTIME <<
" ped=" << pID <<
" veh=" << veh->
getID() <<
" check obstacle on lane=" << lane->
getID()
1389 <<
" vehXMin=" << vehXMin
1390 <<
" vehXMax=" << vehXMax
1391 <<
" vehXMinC=" << vehXMinCheck
1392 <<
" vehXMaxC=" << vehXMaxCheck
1396 <<
" vFront=" << vehFront
1397 <<
" vBack=" << vehBack
1400 if (vehXMaxCheck > minX && vehXMinCheck && vehXMinCheck <= maxX) {
1413 if (s == current && vehFront +
SAFETY_GAP < minX) {
1415 if (pRelY - pWidth < vehYmax &&
1416 pRelY + pWidth > vehYmin && dir ==
FORWARD) {
1418 std::cout <<
" ignoring vehicle '" << veh->
getID() <<
" on stripe " << s <<
" vehFrontSG=" << vehFront +
SAFETY_GAP <<
" minX=" << minX <<
"\n";
1429 std::cout <<
SIMTIME <<
" ped=" << pID <<
" veh=" << veh->
getID() <<
" obstacle on lane=" << lane->
getID()
1431 <<
" ymin=" << vehYmin
1432 <<
" ymax=" << vehYmax
1435 <<
" relY=" << pRelY
1436 <<
" current=" << current
1437 <<
" vo.xFwd=" << vo.xFwd
1438 <<
" vo.xBack=" << vo.xBack
1439 <<
" vFront=" << vehFront
1440 <<
" vBack=" << vehBack
1456 type(OBSTACLE_NONE),
1462 xFwd(ped.getMaxX()),
1463 xBack(ped.getMinX()),
1464 speed(ped.getDirection() * ped.getSpeed(*ped.getStage())),
1465 type(ped.getOType()),
1466 description(ped.getID()) {
1477 return xBack <= o.
xBack;
1479 return xFwd >= o.
xFwd;
1489 myWalkingAreaPath(nullptr) {
1492 assert(!route.empty());
1494 if (route.size() == 1) {
1499 if (route.front()->isWalkingArea()) {
1508 std::cout <<
" initialize dir for " <<
myPerson->
getID() <<
" forward=" << mayStartForward <<
" backward=" << mayStartBackward <<
"\n";
1510 if (mayStartForward && mayStartBackward) {
1514 if (crossingRoute.size() > 1) {
1516 const MSEdge* nextEdge = crossingRoute[1];
1522 std::cout <<
" crossingRoute=" <<
toString(crossingRoute) <<
"\n";
1524 }
else if (!mayStartForward && !mayStartBackward) {
1525 int lastDisconnect = passedFwd >= passedBwd ? passedFwd : passedBwd;
1527 if (route.size() > 2) {
1528 dLoc =
TLF(
" between edge '%' and edge '%'", route[lastDisconnect - 1]->
getID(), route[lastDisconnect]->
getID());
1530 WRITE_WARNINGF(
TL(
"Person '%' walking from edge '%' to edge '%' has a disconnect%, time=%."),
1565 myWalkingAreaPath(nullptr) {
1566 if (in !=
nullptr) {
1568 std::string wapLaneFrom;
1569 std::string wapLaneTo;
1570 std::string nextLaneID;
1571 std::string nextLinkFrom;
1572 std::string nextLinkTo;
1577 >> wapLaneFrom >> wapLaneTo
1587 throw ProcessError(
"Unknown lane '" + laneID +
"' when loading walk for person '" +
myPerson->
getID() +
"' from state.");
1590 MSLane* nextLane =
nullptr;
1591 if (nextLaneID !=
"null") {
1593 if (nextLane ==
nullptr) {
1594 throw ProcessError(
"Unknown next lane '" + nextLaneID +
"' when loading walk for person '" +
myPerson->
getID() +
"' from state.");
1597 const MSLink* link =
nullptr;
1598 if (nextLinkFrom !=
"null") {
1601 if (from ==
nullptr) {
1602 throw ProcessError(
"Unknown link origin lane '" + nextLinkFrom +
"' when loading walk for person '" +
myPerson->
getID() +
"' from state.");
1604 if (to ==
nullptr) {
1605 throw ProcessError(
"Unknown link destination lane '" + nextLinkTo +
"' when loading walk for person '" +
myPerson->
getID() +
"' from state.");
1611 if (wapLaneFrom !=
"null") {
1614 if (from ==
nullptr) {
1615 throw ProcessError(
"Unknown walkingAreaPath origin lane '" + wapLaneFrom +
"' when loading walk for person '" +
myPerson->
getID() +
"' from state.");
1617 if (to ==
nullptr) {
1618 throw ProcessError(
"Unknown walkingAreaPath destination lane '" + wapLaneTo +
"' when loading walk for person '" +
myPerson->
getID() +
"' from state.");
1624 throw ProcessError(
"Unknown walkingAreaPath from lane '" + wapLaneFrom +
"' to lane '" + wapLaneTo +
"' when loading walk for person '" +
myPerson->
getID() +
"' from state.");
1637 std::string wapLaneFrom =
"null";
1638 std::string wapLaneTo =
"null";
1639 if (myWalkingAreaPath !=
nullptr) {
1640 wapLaneFrom = myWalkingAreaPath->from->
getID();
1641 wapLaneTo = myWalkingAreaPath->to->getID();
1643 std::string nextLaneID =
"null";
1644 std::string nextLinkFrom =
"null";
1645 std::string nextLinkTo =
"null";
1646 if (myNLI.lane !=
nullptr) {
1647 nextLaneID = myNLI.lane->getID();
1649 if (myNLI.link !=
nullptr) {
1650 nextLinkFrom = myNLI.link->getLaneBefore()->getID();
1651 nextLinkTo = myNLI.link->getViaLaneOrLane()->getID();
1653 out <<
" " << myLane->getID()
1658 <<
" " << mySpeedLat
1659 <<
" " << myWaitingToEnter
1660 <<
" " << myWaitingTime
1661 <<
" " << wapLaneFrom
1663 <<
" " << myAmJammed
1664 <<
" " << nextLaneID
1665 <<
" " << nextLinkFrom
1666 <<
" " << nextLinkTo
1667 <<
" " << myNLI.dir;
1674 return myEdgePos - getLength();
1676 return myEdgePos - (includeMinGap ? getMinGap() : 0.);
1684 return myEdgePos + (includeMinGap ? getMinGap() : 0.);
1686 return myEdgePos + getLength();
1692 return myPerson->getVehicleType().getLength();
1698 return myPerson->getVehicleType().getMinGap();
1710 const int s = stripe(relY);
1714 if (offset > threshold) {
1716 }
else if (offset < -threshold) {
1741 if (myStage->getNextRouteEdge() ==
nullptr) {
1742 return myDir * (myStage->getArrivalPos() - myEdgePos) - POSITION_EPS - (
1743 (myWaitingTime >
DELTA_T && (myStage->getDestinationStop() ==
nullptr ||
1744 myStage->getDestinationStop()->getWaitingCapacity() > myStage->getDestinationStop()->getNumWaitingPersons()))
1747 const double length = myWalkingAreaPath ==
nullptr ? myLane->getLength() : myWalkingAreaPath->length;
1748 return myDir ==
FORWARD ? length - myEdgePos : myEdgePos;
1755 double dist = distToLaneEnd();
1757 std::cout <<
SIMTIME <<
" ped=" << myPerson->getID() <<
" myEdgePos=" << myEdgePos <<
" dist=" << dist <<
"\n";
1765 const int oldDir = myDir;
1766 const MSLane* oldLane = myLane;
1767 myLane = myNLI.lane;
1769 const bool normalLane = (myLane ==
nullptr || myLane->getEdge().getFunction() ==
SumoXMLEdgeFunc::NORMAL || &myLane->getEdge() == myStage->getNextRouteEdge());
1772 <<
" ped=" << myPerson->
getID()
1773 <<
" moveToNextLane old=" << oldLane->
getID()
1774 <<
" new=" << (myLane ==
nullptr ?
"NULL" : myLane->getID())
1775 <<
" oldDir=" << oldDir
1776 <<
" newDir=" << myDir
1777 <<
" myEdgePos=" << myEdgePos
1781 if (myLane ==
nullptr) {
1782 myEdgePos = myStage->getArrivalPos();
1785 if (myStage->getRouteStep() == myStage->getRoute().end() - 1) {
1788 const bool arrived = myStage->moveToNextEdge(myPerson, currentTime, oldDir, normalLane ?
nullptr : &myLane->getEdge());
1794 myStage->activateEntryReminders(myPerson);
1795 assert(myNLI.lane != oldLane);
1797 std::cout <<
" nextLane=" << (myNLI.lane ==
nullptr ?
"NULL" : myNLI.lane->getID()) <<
"\n";
1799 if (myLane->getEdge().isWalkingArea()) {
1802 assert(myWalkingAreaPath->shape.size() >= 2);
1804 std::cout <<
" mWAPath shape=" << myWalkingAreaPath->shape <<
" length=" << myWalkingAreaPath->length <<
"\n";
1806 }
else if (myNLI.link !=
nullptr) {
1808 myLane = myNLI.lane;
1809 assert(!myLane->getEdge().isWalkingArea());
1810 myStage->moveToNextEdge(myPerson, currentTime, myDir, &myLane->getEdge());
1811 myWalkingAreaPath =
nullptr;
1817 const MSEdge* currRouteEdge = *myStage->getRouteStep();
1818 const MSEdge* nextRouteEdge = myStage->getNextRouteEdge();
1826 myStage->moveToNextEdge(myPerson, currentTime, oldDir,
nullptr);
1827 myLane = myNLI.lane;
1828 assert(myLane != 0);
1831 myWalkingAreaPath =
nullptr;
1833 throw ProcessError(
TLF(
"Disconnected walk for person '%'.", myPerson->getID()));
1837 myWalkingAreaPath =
nullptr;
1842 const double newLength = (myWalkingAreaPath ==
nullptr ? myLane->getLength() : myWalkingAreaPath->length);
1843 if (-dist > newLength) {
1850 myEdgePos = newLength + dist;
1855 std::cout <<
SIMTIME <<
" update myEdgePos ped=" << myPerson->getID()
1856 <<
" newLength=" << newLength
1858 <<
" myEdgePos=" << myEdgePos
1862 if (myDir != oldDir) {
1869 std::cout <<
SIMTIME <<
" transformY ped=" << myPerson->getID()
1871 <<
" newY=" << myPosLat
1873 <<
" od=" << oldDir <<
" nd=" << myDir
1874 <<
" offset=" << offset <<
"\n";
1877 myAngle = std::numeric_limits<double>::max();
1888 (
int)floor(stripes * factor),
1894 const int stripes = (int)obs.size();
1895 const int sMax = stripes - 1;
1899 const double vMax = (myStage->getConfiguredSpeed() >= 0
1900 ? myStage->getConfiguredSpeed()
1901 : (myLane->isNormal() || myLane->isInternal()
1902 ? myLane->getVehicleMaxSpeed(myPerson)
1903 : myStage->getMaxSpeed(myPerson)));
1905 const int current = stripe();
1906 const int other = otherStripe();
1908 std::vector<double> distance(stripes);
1909 for (
int i = 0; i < stripes; ++i) {
1910 distance[i] = distanceTo(obs[i], obs[i].type ==
OBSTACLE_PED);
1913 std::vector<double> utility(stripes, 0);
1915 for (
int i = 0; i < stripes; ++i) {
1917 if (i == current && (!isWaitingToEnter() || stripe() != stripe(myPosLat))) {
1921 for (
int j = 0; j <= i; ++j) {
1926 for (
int j = i; j < stripes; ++j) {
1935 const bool onJunction = myLane->getEdge().isWalkingArea() || myLane->getEdge().isCrossing();
1938 for (
int i = 0; i < reserved; ++i) {
1942 for (
int i = sMax; i > sMax - reserved; --i) {
1947 for (
int i = 0; i < stripes; ++i) {
1948 if (obs[i].speed * myDir < 0) {
1951 utility[i - 1] -= 0.5;
1952 }
else if (myDir ==
BACKWARD && i < sMax) {
1953 utility[i + 1] -= 0.5;
1957 const double walkDist =
MAX2(0., distance[i]);
1959 const double expectedDist =
MIN2(vMax *
LOOKAHEAD_SAMEDIR, walkDist + obs[i].speed * myDir * lookAhead);
1960 if (expectedDist >= 0) {
1961 utility[i] += expectedDist;
1968 if (myDir ==
FORWARD && obs[0].speed < 0) {
1970 }
else if (myDir ==
BACKWARD && obs[sMax].speed > 0) {
1974 if (distance[current] > 0 && myWaitingTime == 0) {
1975 for (
int i = 0; i < stripes; ++i) {
1981 for (
int i = 0; i < stripes; ++i) {
1989 int chosen = current;
1990 for (
int i = 0; i < stripes; ++i) {
1996 const int next = (chosen == current ? current : (chosen < current ? current - 1 : current + 1));
1997 double xDist =
MIN3(distance[current], distance[other], distance[next]);
1998 if (next != chosen) {
2001 const int nextOther = chosen < current ? current - 2 : current + 2;
2002 xDist =
MIN2(xDist, distance[nextOther]);
2005 const double preferredGap = NUMERICAL_EPS;
2007 if (xSpeed < NUMERICAL_EPS) {
2011 std::cout <<
" xSpeedPotential=" << xSpeed <<
"\n";
2018 (xDist == distance[current] && obs[current].type >=
OBSTACLE_END)
2019 || (xDist == distance[other] && obs[other].type >=
OBSTACLE_END)
2020 || (xDist == distance[next] && obs[next].type >=
OBSTACLE_END))
2028 <<
" vehWait=" <<
STEPS2TIME(obs[current].vehicle ? obs[current].vehicle->getWaitingTime() : 0)
2031 if (myWaitingTime > ((myLane->getEdge().isCrossing()
2033 || (myLane->getEdge().isWalkingArea() && obs[current].vehicle !=
nullptr && obs[current].vehicle->getWaitingTime() >
jamTimeCrossing
2035 || (sMax == 0 && obs[0].speed * myDir < 0 && myWaitingTime >
jamTimeNarrow)
2046 }
else if (myAmJammed && stripe(myPosLat) >= 0 && stripe(myPosLat) <= sMax && xDist >=
MIN_STARTUP_DIST) {
2070 if (fabs(yDist) > NUMERICAL_EPS) {
2071 ySpeed = (yDist > 0 ?
2077 && stripe() == stripe(myPosLat)
2079 && !(myLane->getEdge().isCrossing() || myLane->getEdge().isWalkingArea())) {
2081 int stepAsideDir = myDir;
2082 if (myLane->getEdge().getLanes().size() > 1 || current > sMax / 2) {
2088 ySpeed = stepAsideDir * vMax;
2094 <<
" ped=" << myPerson->getID()
2095 <<
" edge=" << myStage->getEdge()->getID()
2096 <<
" x=" << myEdgePos
2097 <<
" y=" << myPosLat
2099 <<
" pvx=" << mySpeed
2100 <<
" cur=" << current
2101 <<
" cho=" << chosen
2105 <<
" dawdle=" << dawdle
2110 <<
" wTime=" << myStage->getWaitingTime(currentTime)
2111 <<
" jammed=" << myAmJammed
2114 for (
int i = 0; i < stripes; ++i) {
2116 std::cout <<
" util=" << utility[i] <<
" dist=" << distance[i] <<
" o=" << o.
description;
2118 std::cout <<
" xF=" << o.
xFwd <<
" xB=" << o.
xBack <<
" v=" << o.
speed;
2121 std::cout <<
" current";
2123 if (i == other && i != current) {
2124 std::cout <<
" other";
2127 std::cout <<
" chosen";
2130 std::cout <<
" next";
2138 mySpeedLat = ySpeed;
2141 myWaitingToEnter =
false;
2146 myAngle = std::numeric_limits<double>::max();
2152 return MAX2(0.,
MIN2(1., myPerson->getVehicleType().getImpatience()
2160 return myRemoteXYPos;
2162 if (myLane ==
nullptr) {
2166 const double lateral_offset = -getLatOffset();
2167 if (myWalkingAreaPath ==
nullptr) {
2182 return myWalkingAreaPath->shape.positionAtOffset(myEdgePos, lateral_offset);
2184 const double rotationOffset = myDir ==
FORWARD ? 0 :
DEG2RAD(180);
2185 return myWalkingAreaPath->shape.sidePositionAtAngle(myEdgePos, lateral_offset, myWalkingAreaPath->angleOverride + rotationOffset);
2193 if (myAngle != std::numeric_limits<double>::max()) {
2196 if (myLane ==
nullptr) {
2200 if (myWalkingAreaPath !=
nullptr && myWalkingAreaPath->angleOverride !=
INVALID_DOUBLE) {
2201 return myWalkingAreaPath->angleOverride;
2203 const PositionVector& shp = myWalkingAreaPath ==
nullptr ? myLane->getShape() : myWalkingAreaPath->shape;
2204 double geomX = myWalkingAreaPath ==
nullptr ? myLane->interpolateLanePosToGeometryPos(myEdgePos) : myEdgePos;
2207 angle += atan2(mySpeedLat,
MAX2(mySpeed, NUMERICAL_EPS));
2209 angle -= atan2(mySpeedLat,
MAX2(mySpeed, NUMERICAL_EPS));
2221 return myNLI.lane ==
nullptr ? nullptr : &myNLI.lane->getEdge();
2227 return myNLI.lane !=
nullptr && myNLI.lane->
isCrossing() ? myNLI.lane :
nullptr;
2233 myEdgePos = pathLength - myEdgePos;
2234 myPosLat = usableWidth - myPosLat;
2235 myDir = -myWalkingAreaPath->dir;
2236 mySpeedLat = -mySpeedLat;
2242 myEdgePos = edgePos;
2253 int routeOffset = 0;
2254 bool laneOnRoute =
false;
2256 for (
const MSEdge* edge : myStage->getRoute()) {
2259 || edge->getFromJunction() == laneOnJunction) {
2266 throw ProcessError(
"Lane '" + lane->
getID() +
"' is not on the route of person '" + getID() +
"'.");
2269 if (lane->
getEdge().
isWalkingArea() && (myWalkingAreaPath ==
nullptr || myWalkingAreaPath->lane != lane)) {
2271 const MSEdge* prevEdge = myStage->getRoute()[routeOffset];
2272 const MSEdge* nextEdge = routeOffset + 1 < (int)myStage->getRoute().size() ? myStage->getRoute()[routeOffset + 1] :
nullptr;
2274 const double maxPos = guessed->
shape.
length() - NUMERICAL_EPS;
2275 if (lanePos > maxPos + POSITION_EPS || lanePos < -POSITION_EPS) {
2277 +
"' (fromLane='" + guessed->
from->
getID()
2278 +
"' toLane='" + guessed->
to->
getID() +
"') for person '" + getID() +
"' time=" +
time2string(t) +
".");
2281 lanePos =
MIN2(maxPos,
MAX2(NUMERICAL_EPS, lanePos));
2285 moveToXY(p, pos, lane, lanePos, lanePosLat, angle, routeOffset, newEdges, t);
2291 double lanePosLat,
double angle,
int routeOffset,
2294 assert(p == myPerson);
2295 assert(pm !=
nullptr);
2298 const double oldX = myEdgePos -
SPEED2DIST(mySpeed * myDir);
2299 const double tmp = myEdgePos;
2301 Position oldPos = getPosition(*myStage, t);
2307#ifdef DEBUG_MOVETOXY
2311 <<
" lane=" << lane->
getID()
2312 <<
" lanePos=" << lanePos
2313 <<
" lanePosLat=" << lanePosLat
2314 <<
" angle=" << angle
2315 <<
" routeOffset=" << routeOffset
2318 <<
" path=" << (myWalkingAreaPath ==
nullptr ?
"null" : (myWalkingAreaPath->from->getID() +
"->" + myWalkingAreaPath->to->getID())) <<
"\n";
2321 if (lane != myLane && myLane !=
nullptr) {
2325 if (lane !=
nullptr &&
2328 const MSEdge* old = myStage->getEdge();
2329 const MSLane* oldLane = myLane;
2330 if (lane != myLane) {
2334 if (edges.empty()) {
2336 myStage->setRouteIndex(myPerson, routeOffset);
2338 myStage->replaceRoute(myPerson, edges, routeOffset);
2341 myStage->moveToNextEdge(myPerson, t, myDir, &lane->
getEdge());
2347 if (myWalkingAreaPath ==
nullptr || myWalkingAreaPath->lane != lane) {
2349 myWalkingAreaPath =
guessPath(&lane->
getEdge(), old, myStage->getNextRouteEdge());
2350#ifdef DEBUG_MOVETOXY
2352 <<
" path=" << myWalkingAreaPath->from->getID() <<
"->" << myWalkingAreaPath->to->getID() <<
"\n";
2357 const Position relPos = myWalkingAreaPath->shape.transformToVectorCoordinates(pos);
2360 +
"' (fromLane='" + myWalkingAreaPath->from->getID()
2361 +
"' toLane='" + myWalkingAreaPath->to->getID() +
"') for person '" + getID() +
"' time=" +
time2string(t) +
".");
2362 myRemoteXYPos = pos;
2364 myEdgePos = relPos.
x();
2365 myPosLat = lateral_offset + relPos.
y();
2368 myWalkingAreaPath =
nullptr;
2369 myEdgePos = lanePos;
2370 myPosLat = lateral_offset - lanePosLat;
2374 if (myStage->getNextRouteEdge() !=
nullptr) {
2375 if (myStage->getEdge()->getToJunction() == myStage->getNextRouteEdge()->getFromJunction() ||
2376 myStage->getEdge()->getToJunction() == myStage->getNextRouteEdge()->getToJunction()) {
2383 if (angleDiff <= 90) {
2394 if (oldLane ==
nullptr || &oldLane->
getEdge() != &myLane->getEdge()) {
2395 const MSLane* sidewalk = getSidewalk<MSEdge, MSLane>(&myLane->getEdge(), p->
getVClass());
2398 myNLI =
getNextLane(*
this, sidewalk ==
nullptr ? myLane : sidewalk,
nullptr);
2399 myStage->activateEntryReminders(myPerson);
2400#ifdef DEBUG_MOVETOXY
2401 std::cout <<
" myNLI=" <<
Named::getIDSecure(myNLI.lane) <<
" link=" << (myNLI.link ==
nullptr ?
"NULL" : myNLI.link->getDescription()) <<
" dir=" << myNLI.
dir <<
"\n";
2404#ifdef DEBUG_MOVETOXY
2405 std::cout <<
" newRelPos=" <<
Position(myEdgePos, myPosLat) <<
" edge=" << myPerson->getEdge()->getID() <<
" newPos=" << myPerson->getPosition()
2406 <<
" oldAngle=" << oldAngle <<
" angleDiff=" << angleDiff <<
" newDir=" << myDir <<
"\n";
2408 if (oldLane == myLane) {
2409 mySpeed =
DIST2SPEED(fabs(oldX - myEdgePos));
2416 myRemoteXYPos = pos;
2425 if (myWalkingAreaPath !=
nullptr) {
2426 return myWalkingAreaPath->length;
2435 const double maxX = getMaxX(includeMinGap);
2436 const double minX = getMinX(includeMinGap);
2440 if ((obs.
xFwd >= maxX && obs.
xBack <= maxX) || (obs.
xFwd <= maxX && obs.
xFwd >= minX)) {
2454 for (
int i = 0; i < (int)into.size(); ++i) {
2456 std::cout <<
" i=" << i <<
" maxX=" << getMaxX(
true) <<
" minX=" << getMinX(
true)
2457 <<
" into=" << into[i].description <<
" iDist=" << distanceTo(into[i], into[i].type ==
OBSTACLE_PED)
2458 <<
" obs2=" << obs2[i].description <<
" oDist=" << distanceTo(obs2[i], obs2[i].type ==
OBSTACLE_PED) <<
"\n";
2460 const double dO = distanceTo(obs2[i], obs2[i].type ==
OBSTACLE_PED);
2461 const double dI = distanceTo(into[i], into[i].type ==
OBSTACLE_PED);
2476 for (
int i = 0; i < (int)into.size(); ++i) {
2477 int i2 = i + offset;
2478 if (i2 >= 0 && i2 < (
int)obs2.size()) {
2480 if (obs2[i2].xBack < into[i].xBack) {
2484 if (obs2[i2].xFwd > into[i].xFwd) {
2497 if (ignoreRedTime >= 0) {
2500 std::cout <<
SIMTIME <<
" ignoreRedTime=" << ignoreRedTime <<
" redDuration=" << redDuration <<
"\n";
2502 return ignoreRedTime > redDuration;
2513 return myPerson->getVehicleType().getWidth();
2519 return myPerson->hasInfluencer() && myPerson->getInfluencer().isRemoteControlled();
2527 myVehicle(veh), myXWidth(xWidth), myYWidth(yWidth) {
2537 return myVehicle->
getID();
2547 return myXWidth > 0 ? myEdgePos - myXWidth : myEdgePos;
2552 return myXWidth > 0 ? myEdgePos : myEdgePos - myXWidth;
2561 std::set<MSPerson*> changedLane;
2562 myModel->moveInDirection(currentTime, changedLane,
FORWARD);
2563 myModel->moveInDirection(currentTime, changedLane,
BACKWARD);
2566 for (ActiveLanes::const_iterator it_lane = myModel->getActiveLanes().begin(); it_lane != myModel->getActiveLanes().end(); ++it_lane) {
2567 const MSLane* lane = it_lane->first;
2569 if (pedestrians.size() == 0) {
2574 for (
int ii = 0; ii < (int)pedestrians.size(); ++ii) {
2575 const PState& p = *pedestrians[ii];
std::vector< const MSEdge * > ConstMSEdgeVector
std::vector< MSEdge * > MSEdgeVector
#define WRITE_WARNINGF(...)
#define WRITE_WARNING(msg)
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
const std::string DEFAULT_PEDTYPE_ID
@ SVC_PEDESTRIAN
pedestrian
@ SUMO_ATTR_JM_DRIVE_AFTER_RED_TIME
bool gDebugFlag1
global utility flags for debugging
const double INVALID_DOUBLE
invalid double
#define UNUSED_PARAMETER(x)
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A class that stores a 2D geometrical boundary.
Position getCenter() const
Returns the center of the boundary.
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
double ymin() const
Returns minimum y-coordinate.
double getWidth() const
Returns the width of the boudary (x-axis)
void growWidth(double by)
Increases the width of the boundary (x-axis)
double ymax() const
Returns maximum y-coordinate.
static double naviDegree(const double angle)
static double fromNaviDegree(const double angle)
static double getMinAngleDiff(double angle1, double angle2)
Returns the minimum distance (clockwise/counter-clockwise) between both angles.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
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].
A road/street connecting two junctions.
static const MSEdgeVector & getAllEdges()
Returns all edges with a numerical id.
bool isCrossing() const
return whether this edge is a pedestrian crossing
bool isWalkingArea() const
return whether this edge is walking area
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
bool isNormal() const
return whether this edge is an internal edge
const MSJunction * getToJunction() const
double getLength() const
return the length of the edge
const MSJunction * getFromJunction() const
bool isInternal() const
return whether this edge is an internal edge
const MSEdgeVector & getPredecessors() const
const MSEdgeVector & getSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Returns the following edges, restricted by vClass.
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
static bool gCheck4Accidents
The base class for an intersection.
AnyVehicleIterator is a structure, which manages the iteration through all vehicles on the lane,...
Representation of a lane in the micro simulation.
AnyVehicleIterator anyVehiclesEnd() const
end iterator for iterating over all vehicles touching this lane in downstream direction
int getVehicleNumberWithPartials() const
Returns the number of vehicles on this lane (including partial occupators)
const MSLink * getLinkTo(const MSLane *const) const
returns the link to the given lane or nullptr, if it is not connected
bool isWalkingArea() const
SVCPermissions getPermissions() const
Returns the vehicle class permissions for this lane.
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
double getLength() const
Returns the lane's length.
const MSLane * getInternalFollowingLane(const MSLane *const) const
returns the internal lane leading to the given lane or nullptr, if there is none
MSLane * getCanonicalSuccessorLane() const
MSLane * getLogicalPredecessorLane() const
get the most likely precedecessor lane (sorted using by_connections_to_sorter). The result is cached ...
AnyVehicleIterator anyVehiclesUpstreamEnd() const
end iterator for iterating over all vehicles touching this lane in upstream direction
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
AnyVehicleIterator anyVehiclesUpstreamBegin() const
begin iterator for iterating over all vehicles touching this lane in upstream direction
AnyVehicleIterator anyVehiclesBegin() const
begin iterator for iterating over all vehicles touching this lane in downstream direction
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
virtual const PositionVector & getShape(bool) const
MSEdge & getEdge() const
Returns the lane's edge.
double getWidth() const
Returns the lane's width.
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
SUMOTime getLastStateChange() 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.
bool havePriority() const
Returns whether this link is a major link.
const LinkLeaders getLeaderInfo(const MSVehicle *ego, double dist, std::vector< const MSPerson * > *collectBlockers=0, bool isShadowLink=false) const
Returns all potential link leaders (vehicles on foeLanes) Valid during the planMove() phase.
std::vector< LinkLeader > LinkLeaders
MSLane * getViaLaneOrLane() const
return the via lane if it exists and the lane otherwise
const MSTrafficLightLogic * getTLLogic() const
Returns the TLS index.
bool haveRed() const
Returns whether this link is blocked by a red (or redyellow) traffic light.
The simulated network and simulation perfomer.
MSPedestrianRouter & getPedestrianRouter(const int rngIndex, const MSEdgeVector &prohibited=MSEdgeVector()) const
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
virtual MSTransportableControl & getPersonControl()
Returns the person control.
std::vector< MSPModel_InteractingState * > Pedestrians
Pedestrians & getPedestrians(const MSLane *lane)
retrieves the pedestrian vector for the given lane (may be empty)
ActiveLanes myActiveLanes
store of all lanes which have pedestrians on them
bool myAmActive
whether an event for pedestrian processing was added
static bool usingInternalLanesStatic()
int myNumActivePedestrians
the total number of active pedestrians
void registerActive()
increase the number of active pedestrians
virtual void remove(MSTransportableStateAdapter *state)
remove the specified person from the pedestrian simulation
static void unregisterCrossingApproach(const MSPModel_InteractingState &ped, const MSLane *crossing)
unregister pedestrian approach with the junction model
Container for pedestrian state and individual position update function.
SUMOTime myWaitingTime
the consecutive time spent at speed 0
MSPerson * myPerson
the person who is being represented
MSStageMoving * getStage() const
return the current stage
int myDir
the walking direction on the current lane (1 forward, -1 backward)
double myEdgePos
the advancement along the current lane
double getEdgePos(SUMOTime) const
abstract methods inherited from MSTransportableStateAdapter
MSPerson * getPerson() const
return the represented person
virtual const std::string & getID() const
return ID of the person (or sometimes vehicle) being represented
const Position & getRemotePosition() const
return the remote position if being controlled by TraCI or JuPedSim
const MSLane * myLane
the current lane of this pedestrian
double mySpeed
the current walking speed
MSStageMoving * myStage
the current stage of this pedestrian
double myPosLat
the orthogonal shift on the current lane
double mySpeedLat
the current lateral walking speed
bool isWaitingToEnter() const
whether the person still waits to entere the network
bool myWaitingToEnter
whether the pedestrian is waiting to start its walk
const MSLane * getLane() const
the current lane of the transportable
int getDirection() const
return the walking direction (FORWARD, BACKWARD, UNDEFINED_DIRECTION)
bool myAmJammed
whether the person is jammed
double getSpeed(const MSStageMoving &) const
return the current speed of the transportable
bool isJammed() const
whether the transportable is jammed
SUMOTime execute(SUMOTime currentTime)
Executes the command.
Container for pedestrian state and individual position update function.
virtual double getMaxX(const bool includeMinGap=true) const
return the maximum position on the lane
const WalkingAreaPath * myWalkingAreaPath
the current walkingAreaPath or 0
PState()
constructor for PStateVehicle
double distToLaneEnd() const
the absolute distance to the end of the lane in walking direction (or to the arrivalPos)
void mergeObstacles(Obstacles &into, const Obstacles &obs2)
replace obstacles in the first vector with obstacles from the second if they are closer to me
bool isRemoteControlled() const
whether the person is currently being controlled via TraCI
const MSEdge * getNextEdge(const MSStageMoving &stage) const
return the list of internal edges if the transportable is on an intersection
const MSLane * getNextCrossing() const
placeholder function for the accessing the next crossing
void walk(const Obstacles &obs, SUMOTime currentTime)
perform position update
virtual double getWidth() const
return the person width
void saveState(std::ostringstream &out)
Saves the current state into the given stream.
bool ignoreRed(const MSLink *link) const
whether the pedestrian may ignore a red light
virtual double getMinX(const bool includeMinGap=true) const
return the minimum position on the lane
bool moveToNextLane(SUMOTime currentTime)
return whether this pedestrian has passed the end of the current lane and update myRelX if so
void reverse(const double pathLength, const double usableWidth)
double getMinGap() const
return the minimum gap of the pedestrian
void moveToXY(MSPerson *p, Position pos, MSLane *lane, double lanePos, double lanePosLat, double angle, int routeOffset, const ConstMSEdgeVector &edges, SUMOTime t)
try to move transportable to the given position
void moveTo(MSPerson *p, MSLane *lane, double lanePos, double lanePosLat, SUMOTime t)
try to move transportable to the given position
Position getPosition(const MSStageMoving &stage, SUMOTime now) const
return the network coordinate of the transportable
NextLaneInfo myNLI
information about the upcoming lane
double getAngle(const MSStageMoving &stage, SUMOTime now) const
return the current orientation in degrees
double getImpatience(SUMOTime now) const
returns the impatience
void reset(const double edgePos, const double latPos)
double distanceTo(const Obstacle &obs, const bool includeMinGap=true) const
double getLength() const
return the length of the pedestrian
double getPathLength() const
return the total length of the current lane (in particular for on a walkingarea)
double getWidth() const
return the person width
double getMaxX(const bool includeMinGap=true) const
return the maximum position on the lane
double getMinX(const bool includeMinGap=true) const
return the minimum position on the lane
const std::string & getID() const
return ID of the person (or sometimes vehicle) being represented
PStateVehicle(const MSVehicle *veh, const MSLane *walkingarea, double relX, double relY, double xWidth, double yWidth)
sorts the persons by position on the lane. If dir is forward, higher x positions come first.
The pedestrian movement model using stripes on sidewalks.
static const double MIN_STARTUP_DIST
the minimum distance to the next obstacle in order to start walking after stopped
static void registerCrossingApproach(const PState &ped, const MSLane *crossing, const MSLane *beforeWA)
register pedestrian approach with the junction model
static double RESERVE_FOR_ONCOMING_FACTOR
fraction of the leftmost lanes to reserve for oncoming traffic
static MinNextLengths myMinNextLengths
static bool addVehicleFoe(const MSVehicle *veh, const MSLane *walkingarea, const Position &relPos, double xWidth, double yWidth, double lateral_offset, double minY, double maxY, Pedestrians &toDelete, Pedestrians &transformedPeds)
MSTransportableStateAdapter * loadState(MSTransportable *transportable, MSStageMoving *stage, std::istringstream &in)
load the state of the given transportable
static double posLatConversion(const double posLat, const double laneWidth)
Convert the striping to the vehicle lateral position and vice versa.
static SUMOTime jamTimeCrossing
void moveInDirection(SUMOTime currentTime, std::set< MSPerson * > &changedLane, int dir)
move all pedestrians forward and advance to the next lane if applicable
static void transformToCurrentLanePositions(Obstacles &o, int currentDir, int nextDir, double currentLength, double nextLength)
static int myWalkingAreaDetail
intermediate points to smooth out lanes within the walkingarea
static const double LOOKAHEAD_SAMEDIR
the distance (in seconds) to look ahead for changing stripes
static double RESERVE_FOR_ONCOMING_MAX
std::map< const MSLane *, Obstacles, ComparatorNumericalIdLess > NextLanesObstacles
static double minGapToVehicle
the safety buffer to vehicles
static NextLaneInfo getNextLane(const PState &ped, const MSLane *currentLane, const MSLane *prevLane)
computes the successor lane for the given pedestrian and sets the link as well as the direction to us...
static const double LOOKAHEAD_ONCOMING_DIST
the distance (in m) to look ahead for obstacles on a subsequent edge
static void initWalkingAreaPaths(const MSNet *net)
static const double LOOKAROUND_VEHICLES
the distance (in m) to look around for vehicles
static const double SQUEEZE
the factor by which pedestrian width is reduced when sqeezing past each other
static SUMOTime jamTimeNarrow
static const WalkingAreaPath * getWalkingAreaPath(const MSEdge *walkingArea, const MSLane *before, const MSLane *after)
void arriveAndAdvance(Pedestrians &pedestrians, SUMOTime currentTime, std::set< MSPerson * > &changedLane, int dir)
handle arrivals and lane advancement
std::map< const MSLane *, double > MinNextLengths
static double RESERVE_FOR_ONCOMING_FACTOR_JUNCTIONS
static int getStripeOffset(int origStripes, int destStripes, bool addRemainder)
static const WalkingAreaPath * guessPath(const MSEdge *walkingArea, const MSEdge *before, const MSEdge *after)
static int getReserved(int stripes, double factor)
static SUMOTime jamTime
the time threshold before becoming jammed
static void insertWalkArePaths(const MSEdge *edge, WalkingAreaPaths &into)
creates and inserts all paths into the given map
void moveInDirectionOnLane(Pedestrians &pedestrians, const MSLane *lane, SUMOTime currentTime, std::set< MSPerson * > &changedLane, int dir, bool debug)
move pedestrians forward on one lane
static double jamFactor
the factor on speed when jammed
static double stripeWidth
model parameters
static const double MAX_WAIT_TOLERANCE
the time pedestrians take to reach maximum impatience
static Obstacles getVehicleObstacles(const MSLane *lane, int dir, PState *ped=0)
retrieve vehicle obstacles on the given lane
static const double OBSTRUCTED_PENALTY
the utility penalty for obstructed (physically blocking me) stripes (corresponds to meters)
static const MSLane * getNextWalkingArea(const MSLane *currentLane, const int dir, const MSLink *&link)
return the next walkingArea in the given direction
MSTransportableStateAdapter * add(MSTransportable *transportable, MSStageMoving *stage, SUMOTime now)
register the given person as a pedestrian
static const double DIST_OVERLAP
static const WalkingAreaPath * getArbitraryPath(const MSEdge *walkingArea)
return an arbitrary path across the given walkingArea
static const double LATERAL_PENALTY
the utility penalty for moving sideways (corresponds to meters)
std::vector< Obstacle > Obstacles
static const double DIST_BEHIND
MSPModel_Striping(const OptionsCont &oc, MSNet *net)
Constructor (it should not be necessary to construct more than one instance)
static Obstacles getNeighboringObstacles(const Pedestrians &pedestrians, int egoIndex, int stripes)
static bool myLegacyPosLat
use old style departPosLat interpretation
static void addCloserObstacle(Obstacles &obs, double x, int stripe, int numStripes, const std::string &id, double width, int dir, ObstacleType type)
static double dawdling
the factor for random slow-down
static int numStripes(const MSLane *lane)
return the maximum number of pedestrians walking side by side
static const double OBSTRUCTION_THRESHOLD
the minimum utility that indicates obstruction
static bool addCrossingVehs(const MSLane *crossing, int stripes, double lateral_offset, int dir, Obstacles &crossingVehs, bool prio)
add vehicles driving across
static int connectedDirection(const MSLane *from, const MSLane *to)
returns the direction in which these lanes are connectioned or 0 if they are not
static void DEBUG_PRINT(const Obstacles &obs)
static const double LATERAL_SPEED_FACTOR
the fraction of forward speed to be used for lateral movemenk
static const double INAPPROPRIATE_PENALTY
the utility penalty for inappropriate (reserved for oncoming traffic or may violate my min gap) strip...
static const double ONCOMING_CONFLICT_PENALTY
the utility penalty for oncoming conflicts on stripes (corresponds to meters)
static const double LOOKAHEAD_ONCOMING
the distance (in seconds) to look ahead for changing stripes (regarding oncoming pedestrians)
static std::map< const MSEdge *, std::vector< const MSLane * > > myWalkingAreaFoes
const Obstacles & getNextLaneObstacles(NextLanesObstacles &nextLanesObs, const MSLane *lane, const MSLane *nextLane, int stripes, int nextDir, double currentLength, int currentDir)
static const double DIST_FAR_AWAY
std::map< std::pair< const MSLane *, const MSLane * >, const WalkingAreaPath > WalkingAreaPaths
static WalkingAreaPaths myWalkingAreaPaths
store for walkinArea elements
static const int BACKWARD
static int canTraverse(int dir, const ConstMSEdgeVector &route, int &passedEdges)
static const double RANDOM_POS_LAT
magic value to encode randomized lateral offset for persons when starting a walk
static const double SIDEWALK_OFFSET
the offset for computing person positions when walking on edges without a sidewalk
static const int UNDEFINED_DIRECTION
static const double UNSPECIFIED_POS_LAT
the default lateral offset for persons when starting a walk
static const double SAFETY_GAP
const MSEdge * getDestination() const
returns the destination edge
virtual double getArrivalPos() const
MSStoppingPlace * getDestinationStop() const
returns the destination stop (if any)
Position getLanePosition(const MSLane *lane, double at, double offset) const
get position on lane at length at with orthogonal offset
virtual int getRoutePosition() const
return index of current edge within route
virtual const MSEdge * getNextRouteEdge() const =0
static const MSLane * checkDepartLane(const MSEdge *edge, SUMOVehicleClass svc, int laneIndex, const std::string &id)
interpret custom depart lane
const std::vector< const MSEdge * > & getRoute() const
int getDepartLane() const
virtual bool moveToNextEdge(MSTransportable *transportable, SUMOTime currentTime, int prevDir, MSEdge *nextInternal=nullptr, const bool isReplay=false)=0
move forward and return whether the transportable arrived
virtual double getMaxSpeed(const MSTransportable *const transportable=nullptr) const =0
the maximum speed of the transportable
int getNumWaitingPersons() const
get number of persons waiting at this stop
int getWaitingCapacity() const
get number of persons that can wait at this stop
MSPModel * getMovementModel()
Returns the default movement model for this kind of transportables.
void registerJammed()
register a jammed transportable
SUMOVehicleClass getVClass() const
Returns the object's access class.
bool isPerson() const
Whether it is a person.
Position getPosition(const double) const
Return current position (x/y, cartesian)
const MSVehicleType & getVehicleType() const
Returns the object's "vehicle" type.
MSStageType getCurrentStageType() const
the current stage type of the transportable
const MSEdge * getEdge() const
Returns the current edge.
abstract base class for managing callbacks to retrieve various state information from the model
MSVehicleType * getVType(const std::string &id=DEFAULT_VTYPE_ID, SumoRNG *rng=nullptr, bool readOnly=false)
Returns the named vehicle type or a sample from the named distribution.
Representation of a vehicle in the micro simulation.
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
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.
const MSLane * getLane() const
Returns the lane the vehicle is on.
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
const Position getBackPosition() const
double getSpeed() const
Returns the vehicle's current speed.
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
The car-following model and parameter.
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
double getLength() const
Get vehicle's length [m].
static std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
const std::string & getID() const
Returns the id.
A storage for options typed value containers)
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 OptionsCont & getOptions()
Retrieves the options.
double compute(const E *from, const E *to, double departPos, double arrivalPos, double speed, SUMOTime msTime, const N *onlyNode, std::vector< const E * > &into, bool allEdges=false)
Builds the route between the given edges using the minimum effort at the given time The definition of...
A point in 2D or 3D with translation and scaling methods.
static const Position INVALID
used to indicate that a position is valid
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
double x() const
Returns the x-position.
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position (in radians bet...
double y() const
Returns the y-position.
double length() const
Returns the length.
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
double angleAt2D(int pos) const
get angle in certain position of position vector (in radians between -M_PI and M_PI)
void extrapolate(const double val, const bool onlyFirst=false, const bool onlyLast=false)
extrapolate position vector
PositionVector bezier(int numPoints)
return a bezier interpolation
void push_back_noDoublePos(const Position &p)
insert in back a non double position
PositionVector reverse() const
reverse position vector
Position transformToVectorCoordinates(const Position &p, bool extend=false) const
return position p within the length-wise coordinate system defined by this position vector....
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
double getFloatParam(const std::string ¶mName, const bool required=false, const double deflt=INVALID_DOUBLE) const
Retrieve a floating point parameter for the traffic object.
int dir
the direction on the next lane
const MSLink * link
the link from the current lane to the next lane
const MSLane * lane
the next lane to be used
information regarding surround Pedestrians (and potentially other things)
double speed
speed relative to lane direction (positive means in the same direction)
double xFwd
maximal position on the current lane in forward direction
Obstacle(int dir, double dist=DIST_FAR_AWAY)
create No-Obstacle
bool closer(const Obstacle &o, int dir)
std::string description
the id / description of the obstacle
const SUMOVehicle * vehicle
a pointer to the vehicle if this obstacle is one
ObstacleType type
whether this obstacle denotes a border, a vehicle or a pedestrian
double xBack
maximal position on the current lane in backward direction
const PositionVector shape