72#define FAR_AWAY 1000.0
100 std::cout <<
" '" << veh->
getID() <<
"' on lane '" << ((
SUMOVehicle*)veh)->getLane()->getID() <<
"'\n";
102 std::cout <<
" '" << veh->
getID() <<
"' on edge '" << veh->
getEdge()->
getID() <<
"'\n";
111 const int contextDomain,
const double range) {
113 if (variables.empty()) {
115 if (j->id ==
id && j->commandId == commandId && j->contextDomain == contextDomain) {
123 std::vector<std::shared_ptr<tcpip::Storage> > parameters;
124 for (
const int var : variables) {
125 const auto& p = params.find(var);
126 if (p == params.end()) {
127 parameters.push_back(std::make_shared<tcpip::Storage>());
136 s.
range = std::numeric_limits<double>::max();
139 if (contextDomain == 0) {
143 s.
parameters.push_back(std::make_shared<tcpip::Storage>());
174 wrapper.second->clear();
182 if (s.
endTime < t || isArrivedVehicle || isArrivedPerson) {
189 if (s.beginTime <= t) {
202 std::vector<std::shared_ptr<tcpip::Storage> >::const_iterator k = s.
parameters.begin();
204 const int offset = (int)(std::find(o.variables.begin(), o.variables.end(), v) - o.variables.begin());
205 if (offset == (
int)o.variables.size() || o.parameters[offset]->size() != (*k)->size() || !std::equal((*k)->begin(), (*k)->end(), o.parameters[offset]->begin())) {
206 o.variables.push_back(v);
207 o.parameters.push_back(*k);
211 modifiedSubscription = &o;
215 subscriptions.push_back(s);
216 modifiedSubscription = &subscriptions.back();
236 int index = (int)filter;
240 while (index >>= 1) {
244 throw TraCIException(
"No previous vehicle context subscription exists to apply filter type " +
toHex(filterType, 2));
253 std::set<std::string> objIDs;
269#ifdef HAVE_LIBSUMOGUI
292 auto wrapper =
myWrapper.find(getCommandId);
296 std::shared_ptr<VariableWrapper> handler = wrapper->second;
300 if (containerWrapper ==
myWrapper.end()) {
303 container = containerWrapper->second.get();
308 for (
const std::string& objID : objIDs) {
310 std::vector<std::shared_ptr<tcpip::Storage> >::const_iterator k = s.
parameters.begin();
313 container->
empty(objID);
317 if (!handler->handle(objID, variable, container, k->get())) {
320 }
catch (
const std::invalid_argument&) {
328 container->
empty(objID);
335Helper::fuseLaneCoverage(std::shared_ptr<LaneCoverageInfo> aggregatedLaneCoverage,
const std::shared_ptr<LaneCoverageInfo> newLaneCoverage) {
336 for (
auto& p : *newLaneCoverage) {
337 const MSLane* lane = p.first;
338 if (aggregatedLaneCoverage->find(lane) == aggregatedLaneCoverage->end()) {
340 (*aggregatedLaneCoverage)[lane] = (*newLaneCoverage)[lane];
343 std::pair<double, double>& range1 = (*aggregatedLaneCoverage)[lane];
344 std::pair<double, double>& range2 = (*newLaneCoverage)[lane];
345 std::pair<double, double> hull = std::make_pair(
MIN2(range1.first, range2.first),
MAX2(range1.second, range2.second));
346 (*aggregatedLaneCoverage)[lane] = hull;
355 for (
int i = 0; i < (int)positionVector.size(); ++i) {
366 if (std::isnan(pos.x) || std::isnan(pos.y)) {
369 pv.push_back(
Position(pos.x, pos.y));
388 return RGBColor((
unsigned char)c.
r, (
unsigned char)c.
g, (
unsigned char)c.
b, (
unsigned char)c.
a);
411 if (edge ==
nullptr) {
412 throw TraCIException(
"Referenced edge '" + edgeID +
"' is not known.");
421 if (edge ==
nullptr) {
424 if (laneIndex < 0 || laneIndex >= (
int)edge->
getLanes().size()) {
428 if (pos < 0 || pos > lane->
getLength()) {
435std::pair<MSLane*, double>
438 std::pair<MSLane*, double> result(
nullptr, -1);
439 double range = 1000.;
442 while (range < maxRange) {
443 std::set<const Named*> lanes;
445 double minDistance = std::numeric_limits<double>::max();
446 for (
const Named* named : lanes) {
452 if (newDistance < minDistance ||
453 (newDistance == minDistance
454 && result.first !=
nullptr
455 && lane->
getID() < result.first->getID())) {
456 minDistance = newDistance;
461 if (minDistance < std::numeric_limits<double>::max()) {
473 if (roadPos1.first == roadPos2.first && roadPos1.second <= roadPos2.second) {
475 return roadPos2.second - roadPos1.second;
477 double distance = 0.0;
479 while (roadPos2.first->isInternal() && roadPos2.first != roadPos1.first) {
480 distance += roadPos2.second;
481 roadPos2.first = roadPos2.first->getLogicalPredecessorLane();
482 roadPos2.second = roadPos2.first->getLength();
485 if (newRoute.empty()) {
489 return distance + route.
getDistanceBetween(roadPos1.second, roadPos2.second, roadPos1.first, roadPos2.first);
496 if (sumoVehicle ==
nullptr) {
501 throw TraCIException(
"Vehicle '" +
id +
"' is not a proper vehicle.");
555 double pos,
int laneIndex,
double startPos,
int flags,
double duration,
double until) {
561 throw TraCIException(
"Duration or until parameter exceed the time value range.");
569 if (newStop.
until >= 0) {
572 if ((flags & 1) != 0) {
576 if ((flags & 2) != 0) {
580 if ((flags & 4) != 0) {
586 if ((flags & 8) != 0) {
589 if ((flags & 16) != 0) {
592 if ((flags & 32) != 0) {
595 if ((flags & 64) != 0) {
598 if ((flags & 128) != 0) {
605 throw TraCIException(
"The " +
toString(stoppingPlaceType) +
" '" + edgeOrStoppingPlaceID +
"' is not known");
611 switch (stoppingPlaceType) {
613 newStop.
busstop = edgeOrStoppingPlaceID;
632 startPos =
MAX2(0.0, pos - POSITION_EPS);
637 if (pos < startPos) {
638 throw TraCIException(
"End position on lane must be after start position.");
642 if (road ==
nullptr) {
643 throw TraCIException(
"Edge '" + edgeOrStoppingPlaceID +
"' is not known.");
645 const std::vector<MSLane*>& allLanes = road->
getLanes();
646 if ((laneIndex < 0) || laneIndex >= (
int)(allLanes.size())) {
647 throw TraCIException(
"No lane with index '" +
toString(laneIndex) +
"' on edge '" + edgeOrStoppingPlaceID +
"'.");
649 newStop.
lane = allLanes[laneIndex]->getID();
650 newStop.
edge = allLanes[laneIndex]->getEdge().getID();
661 std::string stoppingPlaceID =
"";
663 stoppingPlaceID = stopPar.
busstop;
702 InductionLoop::cleanup();
725const std::vector<std::string>&
731const std::vector<std::string>&
768 MSCalibrator*
const calib = Calibrator::getCalibrator(
id);
779 Edge::storeShape(
id, shape);
782 InductionLoop::storeShape(
id, shape);
785 Junction::storeShape(
id, shape);
788 Lane::storeShape(
id, shape);
791 LaneArea::storeShape(
id, shape);
796 shape.push_back(cs.myLane->getShape().positionAtOffset(cs.myPosition));
799 shape.push_back(cs.myLane->getShape().positionAtOffset(cs.myPosition));
810 Person::storeShape(
id, shape);
813 POI::storeShape(
id, shape);
816 Polygon::storeShape(
id, shape);
819 Vehicle::storeShape(
id, shape);
822 Simulation::storeShape(shape);
830 std::set<const Named*> objects;
832 for (
const Named* obj : objects) {
833 into.insert(obj->getID());
841 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
842 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
846 if (shape.
distance2D(stop.second->getCenterPos()) <= range) {
847 into.insert(stop.second);
853 if (shape.
distance2D(stop.second->getCenterPos()) <= range) {
854 into.insert(stop.second);
860 if (shape.
distance2D(calib.second->getLane()->getShape()[0]) <= range) {
861 into.insert(calib.second);
876 if (shape.
distance2D(stop.second->getCenterPos()) <= range) {
877 into.insert(stop.second);
910#ifdef DEBUG_SURROUNDING
912 std::cout <<
SIMTIME <<
" applySubscriptionFilters for vehicle '" << _veh->
getID() <<
"' on lane '" << _veh->
getLane()->
getID() <<
"'"
914 <<
"objIDs = " <<
toString(objIDs) << std::endl;
929 WRITE_WARNINGF(
TL(
"Ignoring veh '%' no-opposite subscription filter for geographic range object collection. Consider using the 'lanes' filter."), v->
getID())
933 std::set<const SUMOTrafficObject*> vehs;
936 double downstreamDist = s.
range, upstreamDist = s.
range, lateralDist = s.
range;
950 throw TraCIException(
"Subscription filter not yet implemented for meso vehicle");
956 if (vehLane ==
nullptr) {
960 std::vector<int> filterLanes;
971#ifdef DEBUG_SURROUNDING
972 std::cout <<
"Filter lanes: " <<
toString(filterLanes) << std::endl;
973 std::cout <<
"Downstream distance: " << downstreamDist << std::endl;
974 std::cout <<
"Upstream distance: " << upstreamDist << std::endl;
975 std::cout <<
"Lateral distance: " << lateralDist << std::endl;
982 for (
int offset : filterLanes) {
984 if (lane !=
nullptr) {
989 vehs.insert(vehs.end(), leader);
990 vehs.insert(vehs.end(), follower);
992#ifdef DEBUG_SURROUNDING
993 std::cout <<
"Lane at index " << offset <<
": '" << lane->
getID() << std::endl;
994 std::cout <<
"Leader: '" << (leader !=
nullptr ? leader->
getID() :
"NULL") <<
"'" << std::endl;
995 std::cout <<
"Follower: '" << (follower !=
nullptr ? follower->
getID() :
"NULL") <<
"'" << std::endl;
998 }
else if (!disregardOppositeDirection && offset > 0) {
1001 if (opposite ==
nullptr) {
1002#ifdef DEBUG_SURROUNDING
1003 std::cout <<
"No lane at index " << offset << std::endl;
1009 const int ix_opposite = (int)opposite->
getLanes().size() - 1 - (vehLane->
getIndex() + offset - (int)vehEdge->
getLanes().size());
1010 if (ix_opposite < 0) {
1011#ifdef DEBUG_SURROUNDING
1012 std::cout <<
"No lane on opposite at index " << ix_opposite << std::endl;
1017 lane = opposite->
getLanes()[ix_opposite];
1024 vehs.insert(vehs.end(), lane->
getLeader(v, posOnOpposite - v->
getLength(), std::vector<MSLane*>()).first);
1038#ifdef DEBUG_SURROUNDING
1039 std::cout <<
SIMTIME <<
" applySubscriptionFilters() for veh '" << v->
getID() <<
"'. Found the following vehicles:\n";
1040 for (
auto veh : vehs) {
1052 if (veh !=
nullptr) {
1053 objIDs.insert(objIDs.end(), veh->getID());
1060 auto i = objIDs.begin();
1061 while (i != objIDs.end()) {
1064 i = objIDs.erase(i);
1072 auto i = objIDs.begin();
1073 while (i != objIDs.end()) {
1076 i = objIDs.erase(i);
1090 double upstreamDist,
bool disregardOppositeDirection) {
1095 assert(filterLanes.size() > 0);
1100 auto checkedLanesInDrivingDir = std::make_shared<LaneCoverageInfo>();
1101 for (
int offset : filterLanes) {
1103 if (lane !=
nullptr) {
1104#ifdef DEBUG_SURROUNDING
1105 std::cout <<
"Checking for surrounding vehicles starting on lane '" << lane->
getID() <<
"' at index " << offset << std::endl;
1110 std::shared_ptr<LaneCoverageInfo> checkedLanes = std::make_shared<LaneCoverageInfo>();
1111 const std::set<MSVehicle*> new_vehs =
1113 vehs.insert(new_vehs.begin(), new_vehs.end());
1115 }
else if (!disregardOppositeDirection && offset > 0) {
1119 if (opposite ==
nullptr) {
1120#ifdef DEBUG_SURROUNDING
1121 std::cout <<
"No opposite edge, thus no lane at index " << offset << std::endl;
1127 const int ix_opposite = (int)opposite->
getLanes().size() - 1 - (vehLane->
getIndex() + offset - (int)vehEdge->
getLanes().size());
1128 if (ix_opposite < 0) {
1129#ifdef DEBUG_SURROUNDING
1130 std::cout <<
"No lane on opposite at index " << ix_opposite << std::endl;
1135 lane = opposite->
getLanes()[ix_opposite];
1138 downstreamDist, std::make_shared<LaneCoverageInfo>());
1139 vehs.insert(new_vehs.begin(), new_vehs.end());
1141#ifdef DEBUG_SURROUNDING
1143 std::cout <<
"No lane at index " << offset << std::endl;
1147 if (!disregardOppositeDirection) {
1154 const int nOpp =
MAX2(0, (*std::max_element(filterLanes.begin(), filterLanes.end())) - ((
int)vehEdge->
getLanes().size() - 1 - vehLane->
getIndex()));
1157 for (
auto& laneCov : *checkedLanesInDrivingDir) {
1158 const MSLane*
const l = laneCov.first;
1163 const std::pair<double, double>& range = laneCov.second;
1164 auto leftMostOppositeLaneIt = opposite->
getLanes().rbegin();
1165 for (
auto oppositeLaneIt = leftMostOppositeLaneIt; oppositeLaneIt != opposite->
getLanes().rend(); ++oppositeLaneIt) {
1166 if ((
int)(oppositeLaneIt - leftMostOppositeLaneIt) == nOpp) {
1170 const MSLane* oppositeLane = *oppositeLaneIt;
1172 vehs.insert(new_vehs.begin(), new_vehs.end());
1177#ifdef DEBUG_SURROUNDING
1178 std::cout <<
SIMTIME <<
" applySubscriptionFilterLanes() for veh '" << v->
getID() <<
"', lane offset '" << offset <<
"'. Found the following vehicles so far:\n";
1179 for (
auto veh : vehs) {
1196#ifdef DEBUG_SURROUNDING
1197 std::cout <<
"Applying turn filter for vehicle '" << v->
getID() <<
"'\n Gathering foes ..." << std::endl;
1200 for (
auto& l : links) {
1201#ifdef DEBUG_SURROUNDING
1202 std::cout <<
" On junction '" << l->getJunction()->getID() <<
"' (no. foe links = " << l->getFoeLinks().size() <<
"):" << std::endl;
1204 for (
auto& foeLane : l->getFoeLanes()) {
1205 if (foeLane->isCrossing()) {
1206#ifdef DEBUG_SURROUNDING
1207 std::cout <<
" skipping crossing foeLane '" << foeLane->getID() <<
"'" << std::endl;
1211#ifdef DEBUG_SURROUNDING
1212 std::cout <<
" foeLane '" << foeLane->getID() <<
"'" << std::endl;
1215 const MSLink* foeLink = foeLane->getEntryLink();
1218#ifdef DEBUG_SURROUNDING
1219 std::cout <<
" Approaching foeLane entry link '" << vi.first->getID() <<
"'" << std::endl;
1221 vehs.insert(vehs.end(),
dynamic_cast<const MSVehicle*
>(vi.first));
1225 for (
const MSVehicle* foe : foeLane->getVehiclesSecure()) {
1226#ifdef DEBUG_SURROUNDING
1227 std::cout <<
" On foeLane '" << foe->getID() <<
"'" << std::endl;
1229 vehs.insert(vehs.end(), foe);
1231 foeLane->releaseVehicles();
1232 for (
auto& laneInfo : foeLane->getIncomingLanes()) {
1233 const MSLane* foeLanePred = laneInfo.lane;
1235#ifdef DEBUG_SURROUNDING
1236 std::cout <<
" foeLanePred '" << foeLanePred->
getID() <<
"'" << std::endl;
1239#ifdef DEBUG_SURROUNDING
1240 std::cout <<
" On foeLanePred '" << foe->getID() <<
"'" << std::endl;
1242 vehs.insert(vehs.end(), foe);
1262#ifdef DEBUG_SURROUNDING
1263 std::cout <<
"FOVFILTER: ego direction = " <<
toString(
RAD2DEG(egoVehicle->
getAngle())) <<
" (deg)" << std::endl;
1266 auto i = objIDs.begin();
1267 while (i != objIDs.end()) {
1268 if (s.
id.compare(*i) == 0) {
1276#ifdef DEBUG_SURROUNDING
1279 std::cout <<
"FOVFILTER: " << objType <<
" '" << *i <<
"' alpha = " <<
toString(
RAD2DEG(alpha)) <<
" (deg)" << std::endl;
1282 if (abs(alpha) > openingAngle * 0.5) {
1283 i = objIDs.erase(i);
1292 double lateralDist) {
1296 double range =
MAX3(downstreamDist, upstreamDist, lateralDist);
1297 std::set<std::string> objIDs;
1300#ifdef DEBUG_SURROUNDING
1301 std::cout <<
"FILTER_LATERAL_DIST: collected object IDs (range " << range <<
"):" << std::endl;
1302 for (std::string i : objIDs) {
1303 std::cout << i << std::endl;
1308#ifdef DEBUG_SURROUNDING
1326 std::set<const SUMOTrafficObject*>& vehs,
1327 const std::vector<const MSLane*>& lanes,
double posOnLane,
double posLat,
bool isDownstream) {
1329 double distRemaining = streamDist;
1330 bool isFirstLane =
true;
1332 for (
const MSLane* lane : lanes) {
1333#ifdef DEBUG_SURROUNDING
1334 std::cout <<
"FILTER_LATERAL_DIST: current lane " << (isDownstream ?
"down" :
"up") <<
" is '" << lane->getID() <<
"', length " << lane->getLength()
1335 <<
", pos " << posOnLane <<
", distRemaining " << distRemaining << std::endl;
1339 isFirstLane =
false;
1340 double geometryPos = lane->interpolateLanePosToGeometryPos(posOnLane);
1341 if (geometryPos <= POSITION_EPS) {
1342 if (!isDownstream) {
1346 if (geometryPos >= laneShape.
length() - POSITION_EPS) {
1349 auto pair = laneShape.
splitAt(geometryPos,
false);
1350 laneShape = isDownstream ? pair.second : pair.first;
1354 double laneLength = lane->interpolateGeometryPosToLanePos(laneShape.
length());
1355 if (distRemaining - laneLength < 0.) {
1356 double geometryPos = lane->interpolateLanePosToGeometryPos(isDownstream ? distRemaining : laneLength - distRemaining);
1357 if (geometryPos > POSITION_EPS && geometryPos < laneShape.
length() - POSITION_EPS) {
1358 auto pair = laneShape.
splitAt(geometryPos,
false);
1359 laneShape = isDownstream ? pair.first : pair.second;
1362 distRemaining -= laneLength;
1366 WRITE_WARNINGF(
TL(
"addSubscriptionFilterLateralDistance could not determine shape of lane '%' with a lateral shift of %."),
1369#ifdef DEBUG_SURROUNDING
1370 std::cout <<
" posLat=" << posLat <<
" laneShape=" << laneShape <<
"\n";
1373 combinedShape.
append(laneShape);
1375 combinedShape.
prepend(laneShape);
1377 if (distRemaining <= POSITION_EPS) {
1381#ifdef DEBUG_SURROUNDING
1382 std::cout <<
" combinedShape=" << combinedShape <<
"\n";
1385 auto i = objIDs.begin();
1386 while (i != objIDs.end()) {
1389#ifdef DEBUG_SURROUNDING
1390 std::cout << (isDownstream ?
"DOWN" :
"UP") <<
" obj " << obj->
getID() <<
" perpendicular dist=" << minPerpendicularDist <<
" filterLateralDist=" << s.
filterLateralDist <<
"\n";
1394 i = objIDs.erase(i);
1418 int numControlled = 0;
1421 controlled.second->getInfluencer().postProcessRemoteControl(controlled.second);
1424 WRITE_WARNINGF(
TL(
"Vehicle '%' was removed though being controlled by TraCI"), controlled.first);
1430 controlled.second->getInfluencer().postProcessRemoteControl(controlled.second);
1433 WRITE_WARNINGF(
TL(
"Person '%' was removed though being controlled by TraCI"), controlled.first);
1437 return numControlled;
1443 double speed,
const ConstMSEdgeVector& currentRoute,
const int routePosition,
const MSLane* currentLane,
double currentLanePos,
bool onRoad,
1448 std::cout <<
SIMTIME <<
" moveToXYMap pos=" << pos <<
" angle=" << angle <<
" vClass=" <<
toString(vClass) <<
"\n";
1450 const MSEdge*
const currentRouteEdge = currentRoute[routePosition];
1451 std::set<const Named*> into;
1453 shape.push_back(pos);
1456 std::map<MSLane*, LaneUtility, ComparatorNumericalIdLess> lane2utility;
1458 for (
const Named* namedEdge : into) {
1459 const MSEdge* e =
dynamic_cast<const MSEdge*
>(namedEdge);
1463 const MSEdge* prevEdge =
nullptr;
1464 const MSEdge* nextEdge =
nullptr;
1465 bool onRoute =
false;
1466 bool useCurrentAngle =
false;
1472 for (
int i = routePosition; i < (int)currentRoute.size(); i++) {
1473 const MSEdge* cand = currentRoute[i];
1476 if (i + 1 < (
int)currentRoute.size()) {
1478 nextEdge = currentRoute[i + 1];
1485 for (
int i = routePosition - 1; i >= 0; i--) {
1486 const MSEdge* cand = currentRoute[i];
1490 nextEdge = currentRoute[i + 1];
1495 if (prevEdge ==
nullptr) {
1501 if (e2 != nextEdge) {
1508 if (nextEdge ==
nullptr) {
1513 if (e2 != prevEdge) {
1520#ifdef DEBUG_MOVEXY_ANGLE
1530 ConstMSEdgeVector::const_iterator searchStart = currentRoute.begin() + routePosition;
1534 ConstMSEdgeVector::const_iterator edgePos = std::find(searchStart, currentRoute.end(), e);
1535 onRoute = edgePos != currentRoute.end();
1536 if (edgePos == currentRoute.end() - 1 && currentRouteEdge == e) {
1542 nextEdge = !onRoute || edgePos == currentRoute.end() - 1 ? nullptr : *(edgePos + 1);
1543#ifdef DEBUG_MOVEXY_ANGLE
1550 while (prevEdge !=
nullptr && prevEdge->
isInternal()) {
1553 prevEdge = l ==
nullptr ? nullptr : &l->
getEdge();
1556 ConstMSEdgeVector::const_iterator prevEdgePos = std::find(currentRoute.begin() + routePosition, currentRoute.end(), prevEdge);
1558 while (nextEdge !=
nullptr && nextEdge->
isInternal()) {
1561 if (prevEdgePos != currentRoute.end() && (prevEdgePos + 1) != currentRoute.end()) {
1562 onRoute = *(prevEdgePos + 1) == nextEdge;
1568#ifdef DEBUG_MOVEXY_ANGLE
1575 const bool perpendicular =
false;
1577 if (!l->allowsVehicleClass(vClass)) {
1580 if (l->getShape().length() == 0) {
1584 double langle = 180.;
1586 double perpendicularDist =
FAR_AWAY;
1589 const double slack = POSITION_EPS *
TS;
1594 perpendicularDist = laneShape.
distance2D(pos,
true);
1597 off = l->getShape().nearest_offset_to_point2D(pos, perpendicular);
1599 dist = l->getShape().distance2D(pos, perpendicular);
1604 bool sameEdge = onRoad && e == ¤tLane->
getEdge() && currentRouteEdge->
getLength() > currentLanePos +
SPEED2DIST(speed) && !e->isWalkingArea();
1612 double dist2 = dist;
1613 if (mayLeaveNetwork && fabs(dist - perpendicularDist) > slack) {
1617 const double angle2 = useCurrentAngle ? currentAngle : angle;
1619#ifdef DEBUG_MOVEXY_ANGLE
1621 <<
" candLane=" << l->getID() <<
" lAngle=" << langle <<
" lLength=" << l->getLength()
1622 <<
" angleDiff=" << angleDiff
1624 <<
" pDist=" << perpendicularDist
1626 <<
" dist2=" << dist2
1628 std::cout << l->getID() <<
" param=" << l->getParameter(
SUMO_PARAM_ORIGID,
"") <<
" origID='" << origID <<
"\n";
1632 if (origIDMatch && setLateralPos
1633 && perpendicularDist > l->getWidth() / 2) {
1634 origIDMatch =
false;
1637 dist2, perpendicularDist, off, angleDiff,
1639 onRoute, sameEdge, prevEdge, nextEdge));
1647 double bestValue = 0;
1648 MSLane* bestLane =
nullptr;
1649 for (
const auto& it : lane2utility) {
1650 MSLane*
const l = it.first;
1652 double distN = u.
dist > 999 ? -10 : 1. - (u.
dist / maxDist);
1653 double angleDiffN = 1. - (u.
angleDiff / 180.);
1654 double idN = u.
ID ? 1 : 0;
1655 double onRouteN = u.
onRoute ? 1 : 0;
1659 double value = (distN * .5 /
TS
1665 std::cout <<
" x; l:" << l->
getID() <<
" d:" << u.
dist <<
" dN:" << distN <<
" aD:" << angleDiffN <<
1666 " ID:" << idN <<
" oRN:" << onRouteN <<
" sEN:" << sameEdgeN <<
" value:" << value << std::endl;
1668 if (value > bestValue || bestLane ==
nullptr) {
1678 if (bestLane ==
nullptr) {
1681 const LaneUtility& u = lane2utility.find(bestLane)->second;
1682 bestDistance = u.
dist;
1684 lanePos =
MAX2(0.,
MIN2(
double((*lane)->getLength() - NUMERICAL_EPS),
1689 ConstMSEdgeVector::const_iterator prevEdgePos = std::find(currentRoute.begin(), currentRoute.end(), prevEdge);
1690 routeOffset = (int)std::distance(currentRoute.begin(), prevEdgePos);
1703#ifdef DEBUG_MOVEXY_ANGLE
1715 if (edge ==
nullptr) {
1718 bool newBest =
false;
1720 if (!candidateLane->allowsVehicleClass(vClass)) {
1723 if (candidateLane->getShape().length() == 0) {
1727 double dist = candidateLane->getShape().distance2D(pos);
1730 std::cout <<
" b at lane " << candidateLane->getID() <<
" dist:" << dist <<
" best:" << bestDistance << std::endl;
1732 if (dist < bestDistance || (dist == bestDistance && candidateLane->getNumericalID() < (*lane)->getNumericalID())) {
1734 bestDistance = dist;
1735 *lane = candidateLane;
1742 if (l->getIndex() == 0) {
1745 for (
const MSLink*
const link : l->getLinkCont()) {
1746 if (link->isInternalJunctionLink()) {
1747 if (
findCloserLane(&link->getViaLane()->getEdge(), pos, vClass, bestDistance, lane)) {
1762 double& bestDistance,
MSLane** lane,
double& lanePos,
int& routeOffset) {
1764 std::cout <<
SIMTIME <<
" moveToXYMap_matchingRoutePosition pos=" << pos <<
" vClass=" <<
toString(vClass) <<
"\n";
1772 const MSEdge* prev =
nullptr;
1773 for (
int i = routeIndex; i < (int)currentRoute.size(); ++i) {
1774 const MSEdge* cand = currentRoute[i];
1775 while (prev !=
nullptr) {
1781 if (
findCloserLane(internalCand, pos, vClass, bestDistance, lane)) {
1782 routeOffset = i - 1;
1784 prev = internalCand;
1792 const MSEdge* next = currentRoute[routeIndex];
1793 for (
int i = routeIndex; i >= 0; --i) {
1794 const MSEdge* cand = currentRoute[i];
1797 while (prev !=
nullptr) {
1800 if (
findCloserLane(internalCand, pos, vClass, bestDistance, lane)) {
1803 prev = internalCand;
1812 std::map<const MSJunction*, int> routeJunctions;
1813 for (
int i = 0; i < (int)currentRoute.size() - 1; ++i) {
1814 routeJunctions[currentRoute[i]->getToJunction()] = i;
1816 std::set<const Named*> into;
1818 shape.push_back(pos);
1820 for (
const Named* named : into) {
1821 const MSLane* cand =
dynamic_cast<const MSLane*
>(named);
1831 assert(lane !=
nullptr);
1833 if (*lane ==
nullptr) {
1835 std::cout <<
" b failed - no best route lane" << std::endl;
1843 if (!(*lane)->getEdge().isInternal()) {
1844 const std::vector<MSLane*>& lanes = (*lane)->getEdge().getLanes();
1845 for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
1847 if (setLateralPos) {
1850 const double dist = (*i)->getShape().distance2D(pos);
1851 if (dist < (*i)->getWidth() / 2) {
1863 lanePos =
MAX2(0.,
MIN2(
double((*lane)->getLength() - NUMERICAL_EPS),
1864 (*lane)->interpolateGeometryPosToLanePos(
1865 (*lane)->getShape().nearest_offset_to_point25D(pos,
false))));
1868 std::cout <<
" b ok lane " << (*lane)->getID() <<
" lanePos:" << lanePos << std::endl;
1905 throw TraCIException(
"Unknown position format used for distance request.");
1916 :
VariableWrapper(handler), myResults(into), myContextResults(context), myActiveResults(&into) {
1923 myActiveResults = refID ==
nullptr ? &myResults : &myContextResults[*refID];
1929 myActiveResults = &myResults;
1931 myContextResults.clear();
1937 auto sl = std::make_shared<TraCIConnectionVectorWrapped>();
1939 (*myActiveResults)[objID][variable] = sl;
1946 (*myActiveResults)[objID][variable] = std::make_shared<TraCIDouble>(value);
1953 (*myActiveResults)[objID][variable] = std::make_shared<TraCIInt>(value);
1960 (*myActiveResults)[objID][variable] = std::make_shared<TraCIString>(value);
1967 auto sl = std::make_shared<TraCIStringList>();
1969 (*myActiveResults)[objID][variable] = sl;
1976 auto sl = std::make_shared<TraCIDoubleList>();
1978 (*myActiveResults)[objID][variable] = sl;
1985 (*myActiveResults)[objID][variable] = std::make_shared<TraCIPosition>(value);
1992 (*myActiveResults)[objID][variable] = std::make_shared<TraCIPositionVector>(value);
1999 (*myActiveResults)[objID][variable] = std::make_shared<TraCIColor>(value);
2006 (*myActiveResults)[objID][variable] = std::make_shared<TraCIRoadPosition>(value.first, value.second);
2013 auto sl = std::make_shared<TraCIStringDoublePairList>();
2015 (*myActiveResults)[objID][variable] = sl;
2022 auto sl = std::make_shared<TraCIStringList>();
2023 sl->value.push_back(value.first);
2024 sl->value.push_back(value.second);
2025 (*myActiveResults)[objID][variable] = sl;
2032 auto sl = std::make_shared<TraCIIntList>();
2033 sl->value.push_back(value.first);
2034 sl->value.push_back(value.second);
2035 (*myActiveResults)[objID][variable] = sl;
2042 (*myActiveResults)[objID][variable] = std::make_shared<TraCIStage>(value);
2049 auto sl = std::make_shared<TraCIReservationVectorWrapped>();
2051 (*myActiveResults)[objID][variable] = sl;
2058 auto sl = std::make_shared<TraCILogicVectorWrapped>();
2060 (*myActiveResults)[objID][variable] = sl;
2067 auto sl = std::make_shared<TraCILinkVectorVectorWrapped>();
2069 (*myActiveResults)[objID][variable] = sl;
2076 auto sl = std::make_shared<TraCISignalConstraintVectorWrapped>();
2078 (*myActiveResults)[objID][variable] = sl;
2085 auto sl = std::make_shared<TraCIJunctionFoeVectorWrapped>();
2087 (*myActiveResults)[objID][variable] = sl;
2094 auto sl = std::make_shared<TraCINextStopDataVectorWrapped>();
2096 (*myActiveResults)[objID][variable] = sl;
2103 auto sl = std::make_shared<TraCIVehicleDataVectorWrapped>();
2105 (*myActiveResults)[objID][variable] = sl;
2112 auto sl = std::make_shared<TraCIBestLanesDataVectorWrapped>();
2114 (*myActiveResults)[objID][variable] = sl;
2121 auto sl = std::make_shared<TraCINextTLSDataVectorWrapped>();
2123 (*myActiveResults)[objID][variable] = sl;
2130 (*myActiveResults)[objID];
2136 myVehicleStateChanges[to].push_back(vehicle->
getID());
2142 myTransportableStateChanges[to].push_back(transportable->
getID());
std::vector< const MSEdge * > ConstMSEdgeVector
#define WRITE_WARNINGF(...)
void checkTimeBounds(const double time)
check the valid SUMOTime range of double input and throw an error if out of bounds
constexpr SUMOTime TIME2STEPS(double x)
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_PEDESTRIAN
pedestrian
const int STOP_DURATION_SET
const int STOP_PARKING_SET
std::vector< SUMOVehicleParameter::Stop > StopParVector
const int STOP_CONTAINER_TRIGGER_SET
const int STOP_TRIGGER_SET
const std::string SUMO_PARAM_ORIGID
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_CHARGING_STATION
A Charging Station.
@ SUMO_TAG_NOTHING
invalid tag, must be the last one
@ SUMO_TAG_CONTAINER_STOP
A container stop.
@ SUMO_TAG_BUS_STOP
A bus stop.
@ SUMO_TAG_PARKING_AREA
A parking area.
@ SUMO_TAG_OVERHEAD_WIRE_SEGMENT
An overhead wire segment.
int gPrecision
the precision for floating point outputs
const double SUMO_const_laneWidth
std::string toHex(const T i, std::streamsize numDigits=0)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A class that stores a 2D geometrical boundary.
double ymin() const
Returns minimum y-coordinate.
double xmin() const
Returns minimum x-coordinate.
Boundary & grow(double by)
extends the boundary by the given amount
double distanceTo2D(const Position &p) const
returns the euclidean distance in the x-y-plane
double getHeight() const
Returns the height of the boundary (y-axis)
double getWidth() const
Returns the width of the boudary (x-axis)
double ymax() const
Returns maximum y-coordinate.
double xmax() const
Returns maximum x-coordinate.
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
const Boundary & getConvBoundary() const
Returns the converted boundary.
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.
The base class for microscopic and mesoscopic vehicles.
double getLength() const
Returns the vehicle's length.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
Calibrates the flow on a segment to a specified one.
const MSLane * getLane() const
AspiredState getCurrentStateInterval() const
static const std::map< std::string, MSCalibrator * > & getInstances()
return all calibrator instances
A simple description of a position on a lane (crossing of a lane)
A detector of vehicles passing an area between entry/exit points.
const CrossSectionVector & getEntries() const
Returns the entry cross sections.
const CrossSectionVector & getExits() const
Returns the exit cross sections.
A road/street connecting two junctions.
bool isCrossing() const
return whether this edge is a pedestrian crossing
SVCPermissions getPermissions() const
Returns the combined permissions of all lanes of this edge.
bool isWalkingArea() const
return whether this edge is walking area
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
const MSEdge * getOppositeEdge() const
Returns the opposite direction edge if on exists else a nullptr.
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
static bool dictionary(const std::string &id, MSEdge *edge)
Inserts edge into the static dictionary Returns true if the key id isn't already in the dictionary....
const MSEdgeVector & getPredecessors() const
const MSEdge * getInternalFollowingEdge(const MSEdge *followerAfterInternal, SUMOVehicleClass vClass) const
const MSEdgeVector & getSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Returns the following edges, restricted by vClass.
The base class for an intersection.
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.
std::pair< MSVehicle *const, double > getFollower(const MSVehicle *ego, double egoPos, double dist, MinorLinkMode mLinkMode, bool maxSearchDist=false) const
Find follower vehicle for the given ego vehicle (which may be on the opposite direction lane)
void visit(const MSLane::StoringVisitor &cont) const
Callback for visiting the lane when traversing an RTree.
static void fill(RTREE &into)
Fills the given RTree with lane instances.
bool isWalkingArea() const
std::set< MSVehicle * > getVehiclesInRange(const double a, const double b) const
Returns all vehicles on the lane overlapping with the interval [a,b].
double getLength() const
Returns the lane's length.
std::vector< const MSLink * > getUpcomingLinks(double pos, double range, const std::vector< MSLane * > &contLanes) const
Returns all upcoming links within given range along the given (non-internal) continuation lanes measu...
std::set< MSVehicle * > getSurroundingVehicles(double startPos, double downstreamDist, double upstreamDist, std::shared_ptr< LaneCoverageInfo > checkedLanes) const
Returns all vehicles closer than downstreamDist along the road network starting on the given position...
bool allowsVehicleClass(SUMOVehicleClass vclass) const
int getIndex() const
Returns the lane's index.
double getOppositePos(double pos) const
return the corresponding position on the opposite lane
MSLane * getLogicalPredecessorLane() const
get the most likely predecessor lane (sorted using by_connections_to_sorter). The result is cached in...
double interpolateGeometryPosToLanePos(double geometryPos) const
std::pair< MSVehicle *const, double > getLeader(const MSVehicle *veh, const double vehPos, const std::vector< MSLane * > &bestLaneConts, double dist=-1, bool checkTmpVehicles=false) const
Returns the immediate leader of veh and the distance to veh starting on this lane.
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.
virtual const PositionVector & getShape(bool) const
MSLane * getParallelOpposite() const
return the opposite direction lane of this lanes edge or nullptr
MSEdge & getEdge() const
Returns the lane's edge.
double getWidth() const
Returns the lane's width.
ApproachingVehicleInformation getApproaching(const SUMOVehicle *veh) const
VehicleState
Definition of a vehicle state.
@ ARRIVED
The vehicle arrived at his destination (is deleted)
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
MSVehicleRouter & getRouterTT(int rngIndex, const Prohibitions &prohibited={}) const
static bool hasInstance()
Returns whether the network was already constructed.
MSStoppingPlace * getStoppingPlace(const std::string &id, const SumoXMLTag category) const
Returns the named stopping place of the given category.
void addVehicleStateListener(VehicleStateListener *listener)
Adds a vehicle states listener.
void addTransportableStateListener(TransportableStateListener *listener)
Adds a transportable states listener.
TransportableState
Definition of a transportable state.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
virtual MSTransportableControl & getPersonControl()
Returns the person control.
const NamedObjectCont< MSStoppingPlace * > & getStoppingPlaces(SumoXMLTag category) const
void setRemoteControlled(Position xyPos, MSLane *l, double pos, double posLat, double angle, int edgeOffset, const ConstMSEdgeVector &route, SUMOTime t)
Influencer & getInfluencer()
Returns the velocity/lane influencer.
double getDistanceBetween(double fromPos, double toPos, const MSLane *fromLane, const MSLane *toLane, int routePosition=0) const
Compute the distance between 2 given edges on this route, optionally including the length of internal...
A lane area vehicles can halt at.
double getBeginLanePosition() const
Returns the begin position of this stop.
double getEndLanePosition() const
Returns the end position of this stop.
const MSLane & getLane() const
Returns the lane this stop is located at.
Storage for all programs of a single tls.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
MSTransportable * get(const std::string &id) const
Returns the named transportable, if existing.
void setRemoteControlled(Position xyPos, MSLane *l, double pos, double posLat, double angle, int edgeOffset, const ConstMSEdgeVector &route, SUMOTime t)
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
Representation of a vehicle in the micro simulation.
const std::vector< const MSLane * > getUpcomingLanesUntil(double distance) const
Returns the upcoming (best followed by default 0) sequence of lanes to continue the route starting at...
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
MSAbstractLaneChangeModel & getLaneChangeModel()
const std::vector< MSLane * > & getBestLanesContinuation() const
Returns the best sequence of lanes to continue the route starting at myLane.
const std::vector< const MSLane * > getPastLanesUntil(double distance) const
Returns the sequence of past lanes (right-most on edge) based on the route starting at the current la...
const MSLane * getLane() const
Returns the lane the vehicle is on.
Influencer & getInfluencer()
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
double getPositionOnLane() const
Get the vehicle's position along the lane.
The car-following model and parameter.
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
const std::string & getID() const
Returns the name of the vehicle type.
double getLength() const
Get vehicle's length [m].
Allows to store the object; used as context while traveling the rtree in TraCI.
Base class for objects which have an id.
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 point in 2D or 3D with translation and scaling methods.
void setx(double x)
set position x
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
double x() const
Returns the x-position.
void setz(double z)
set position z
double z() const
Returns the z-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...
void sety(double y)
set position y
double y() const
Returns the y-position.
void append(const PositionVector &v, double sameThreshold=2.0)
double length() const
Returns the length.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
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)
void prepend(const PositionVector &v, double sameThreshold=2.0)
double nearest_offset_to_point2D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D
std::pair< PositionVector, PositionVector > splitAt(double where, bool use2D=false) const
Returns the two lists made when this list vector is splitted at the given point.
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
void extrapolate2D(const double val, const bool onlyFirst=false)
extrapolate position vector in two dimensions (Z is ignored)
double nearest_offset_to_point25D(const Position &p, bool perpendicular=true) const
return the nearest offest to point 2D projected onto the 3D geometry
unsigned char red() const
Returns the red-amount of the color.
unsigned char alpha() const
Returns the alpha-amount of the color.
unsigned char green() const
Returns the green-amount of the color.
unsigned char blue() const
Returns the blue-amount of the color.
virtual bool compute(const E *from, const E *to, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into, bool silent=false)=0
Builds the route between the given edges using the minimum effort at the given time The definition of...
Representation of a vehicle, person, or container.
virtual bool isVehicle() const
Whether it is a vehicle.
virtual const MSLane * getLane() const =0
Returns the lane the object is currently at.
virtual Position getPosition(const double offset=0) const =0
Return current position (x/y, cartesian)
virtual const MSEdge * getEdge() const =0
Returns the (normal) route edge the object is currently at.
Representation of a vehicle.
virtual double getAngle() const =0
Get the vehicle's angle.
Definition of vehicle stop (position and duration)
int getFlags() const
return flags as per Vehicle::getStops
SUMOTime started
the time at which this stop was reached
std::string edge
The edge to stop at.
ParkingType parking
whether the vehicle is removed from the net while stopping
std::string lane
The lane to stop at.
double speed
the speed at which this stop counts as reached (waypoint mode)
std::string parkingarea
(Optional) parking area if one is assigned to the stop
std::string split
the id of the vehicle (train portion) that splits of upon reaching this stop
double startPos
The stopping position start.
std::string line
the new line id of the trip within a cyclical public transport route
std::string chargingStation
(Optional) charging station if one is assigned to the stop
std::string overheadWireSegment
(Optional) overhead line segment if one is assigned to the stop
int parametersSet
Information for the output which parameter were set.
int index
at which position in the stops list
std::string join
the id of the vehicle (train portion) to which this vehicle shall be joined
SUMOTime until
The time at which the vehicle may continue its journey.
std::string actType
act Type (only used by Persons) (used by netedit)
bool triggered
whether an arriving person lets the vehicle continue
SUMOTime ended
the time at which this stop was ended
double endPos
The stopping position end.
std::string busstop
(Optional) bus stop if one is assigned to the stop
std::string tripId
id of the trip within a cyclical public transport route
std::string containerstop
(Optional) container stop if one is assigned to the stop
bool containerTriggered
whether an arriving container lets the vehicle continue
SUMOTime arrival
The (expected) time at which the vehicle reaches the stop.
SUMOTime duration
The stopping duration.
bool wrapIntPair(const std::string &objID, const int variable, const std::pair< int, int > &value)
bool wrapJunctionFoeVector(const std::string &objID, const int variable, const std::vector< TraCIJunctionFoe > &value)
bool wrapDouble(const std::string &objID, const int variable, const double value)
void empty(const std::string &objID)
bool wrapConnectionVector(const std::string &objID, const int variable, const std::vector< TraCIConnection > &value)
bool wrapStringDoublePairList(const std::string &objID, const int variable, const std::vector< std::pair< std::string, double > > &value)
bool wrapPositionVector(const std::string &objID, const int variable, const TraCIPositionVector &value)
bool wrapLinkVectorVector(const std::string &objID, const int variable, const std::vector< std::vector< TraCILink > > &value)
bool wrapSignalConstraintVector(const std::string &objID, const int variable, const std::vector< TraCISignalConstraint > &value)
bool wrapColor(const std::string &objID, const int variable, const TraCIColor &value)
bool wrapInt(const std::string &objID, const int variable, const int value)
bool wrapReservationVector(const std::string &objID, const int variable, const std::vector< TraCIReservation > &value)
bool wrapNextTLSDataVector(const std::string &objID, const int variable, const std::vector< TraCINextTLSData > &value)
bool wrapBestLanesDataVector(const std::string &objID, const int variable, const std::vector< TraCIBestLanesData > &value)
bool wrapStringList(const std::string &objID, const int variable, const std::vector< std::string > &value)
bool wrapPosition(const std::string &objID, const int variable, const TraCIPosition &value)
bool wrapString(const std::string &objID, const int variable, const std::string &value)
bool wrapLogicVector(const std::string &objID, const int variable, const std::vector< TraCILogic > &value)
bool wrapNextStopDataVector(const std::string &objID, const int variable, const std::vector< TraCINextStopData > &value)
bool wrapStage(const std::string &objID, const int variable, const TraCIStage &value)
bool wrapStringPair(const std::string &objID, const int variable, const std::pair< std::string, std::string > &value)
bool wrapStringDoublePair(const std::string &objID, const int variable, const std::pair< std::string, double > &value)
SubscriptionWrapper(VariableWrapper::SubscriptionHandler handler, SubscriptionResults &into, ContextSubscriptionResults &context)
bool wrapVehicleDataVector(const std::string &objID, const int variable, const std::vector< TraCIVehicleData > &value)
void setContext(const std::string *const refID)
bool wrapDoubleList(const std::string &objID, const int variable, const std::vector< double > &value)
void transportableStateChanged(const MSTransportable *const transportable, MSNet::TransportableState to, const std::string &info="")
Called if a transportable changes its state.
std::map< MSNet::TransportableState, std::vector< std::string > > myTransportableStateChanges
Changes in the states of simulated transportables.
std::map< MSNet::VehicleState, std::vector< std::string > > myVehicleStateChanges
Changes in the states of simulated vehicles.
void vehicleStateChanged(const SUMOVehicle *const vehicle, MSNet::VehicleState to, const std::string &info="")
Called if a vehicle changes its state.
static Position makePosition(const TraCIPosition &position)
static MSEdge * getEdge(const std::string &edgeID)
static double patchShapeDistance(const MSLane *lane, const Position &pos, double dist, bool wasPerpendicular)
return the distance of pos from the area covered by this lane
static double getDrivingDistance(std::pair< const MSLane *, double > &roadPos1, std::pair< const MSLane *, double > &roadPos2)
static void collectObjectsInRange(int domain, const PositionVector &shape, double range, std::set< const Named * > &into)
static MSCalibrator::AspiredState getCalibratorState(const MSCalibrator *c)
static TraCIPosition makeTraCIPosition(const Position &position, const bool includeZ=false)
static LANE_RTREE_QUAL * myLaneTree
A lookup tree of lanes.
static void applySubscriptionFilterTurn(const Subscription &s, std::set< const SUMOTrafficObject * > &vehs)
Apply the subscription filter "turn": Gather upcoming junctions and vialanes within downstream distan...
static void findObjectShape(int domain, const std::string &id, PositionVector &shape)
static void clearStateChanges()
static PositionVector makePositionVector(const TraCIPositionVector &vector)
static void fuseLaneCoverage(std::shared_ptr< LaneCoverageInfo > aggregatedLaneCoverage, const std::shared_ptr< LaneCoverageInfo > newLaneCoverage)
Adds lane coverage information from newLaneCoverage into aggregatedLaneCoverage.
static bool moveToXYMap_matchingRoutePosition(const Position &pos, const std::string &origID, const ConstMSEdgeVector ¤tRoute, int routeIndex, SUMOVehicleClass vClass, bool setLateralPos, double &bestDistance, MSLane **lane, double &lanePos, int &routeOffset)
static void debugPrint(const SUMOTrafficObject *veh)
static MSPerson * getPerson(const std::string &id)
static void subscribe(const int commandId, const std::string &id, const std::vector< int > &variables, const double beginTime, const double endTime, const libsumo::TraCIResults ¶ms, const int contextDomain=0, const double range=0.)
static TraCIPositionVector makeTraCIPositionVector(const PositionVector &positionVector)
helper functions
static int readDistanceRequest(tcpip::Storage &data, TraCIRoadPosition &roadPos, Position &pos)
static const std::vector< std::string > & getTransportableStateChanges(const MSNet::TransportableState state)
static std::map< int, std::shared_ptr< VariableWrapper > > myWrapper
Map of commandIds -> their executors; applicable if the executor applies to the method footprint.
static void clearSubscriptions()
static MSBaseVehicle * getVehicle(const std::string &id)
static void applySubscriptionFilterLateralDistanceSinglePass(const Subscription &s, std::set< std::string > &objIDs, std::set< const SUMOTrafficObject * > &vehs, const std::vector< const MSLane * > &lanes, double posOnLane, double posLat, bool isDownstream)
static MSStoppingPlace * getStoppingPlace(const std::string &id, const SumoXMLTag type)
static TraCIColor makeTraCIColor(const RGBColor &color)
static void applySubscriptionFilterFieldOfVision(const Subscription &s, std::set< std::string > &objIDs)
static Subscription * myLastContextSubscription
The last context subscription.
static TraCINextStopData buildStopData(const SUMOVehicleParameter::Stop &stopPar)
static void registerStateListener()
static TransportableStateListener myTransportableStateListener
Changes in the states of simulated transportables.
static void setRemoteControlled(MSVehicle *v, Position xyPos, MSLane *l, double pos, double posLat, double angle, int edgeOffset, ConstMSEdgeVector route, SUMOTime t)
static int postProcessRemoteControl()
return number of remote-controlled entities
static void applySubscriptionFilters(const Subscription &s, std::set< std::string > &objIDs)
Filter the given ID-Set (which was obtained from an R-Tree search) according to the filters set by th...
static std::map< std::string, MSVehicle * > myRemoteControlledVehicles
static const MSVehicleType & getVehicleType(const std::string &vehicleID)
static bool moveToXYMap(const Position &pos, double maxRouteDistance, bool mayLeaveNetwork, const std::string &origID, const double angle, double speed, const ConstMSEdgeVector ¤tRoute, const int routePosition, const MSLane *currentLane, double currentLanePos, bool onRoad, SUMOVehicleClass vClass, double currentAngle, bool setLateralPos, double &bestDistance, MSLane **lane, double &lanePos, int &routeOffset, ConstMSEdgeVector &edges)
static std::pair< MSLane *, double > convertCartesianToRoadMap(const Position &pos, const SUMOVehicleClass vClass)
static MSTLLogicControl::TLSLogicVariants & getTLS(const std::string &id)
static SUMOTrafficObject * getTrafficObject(int domain, const std::string &id)
static VehicleStateListener myVehicleStateListener
Changes in the states of simulated vehicles.
static std::vector< Subscription > mySubscriptions
The list of known, still valid subscriptions.
static SUMOVehicleParameter::Stop buildStopParameters(const std::string &edgeOrStoppingPlaceID, double pos, int laneIndex, double startPos, int flags, double duration, double until)
static void handleSingleSubscription(const Subscription &s)
static void applySubscriptionFilterLateralDistance(const Subscription &s, std::set< const SUMOTrafficObject * > &vehs, double downstreamDist, double upstreamDist, double lateralDist)
Apply the subscription filter "lateral distance": Only return vehicles within the given lateral dista...
static const std::vector< std::string > & getVehicleStateChanges(const MSNet::VehicleState state)
static void collectObjectIDsInRange(int domain, const PositionVector &shape, double range, std::set< std::string > &into)
static void handleSubscriptions(const SUMOTime t)
static Subscription * addSubscriptionFilter(SubscriptionFilterType filter)
static const MSLane * getLaneChecking(const std::string &edgeID, int laneIndex, double pos)
static RGBColor makeRGBColor(const TraCIColor &color)
static void applySubscriptionFilterLanes(const Subscription &s, std::set< const SUMOTrafficObject * > &vehs, std::vector< int > &filterLanes, double downstreamDist, double upstreamDist, bool disregardOppositeDirection)
Apply the subscription filter "lanes": Only return vehicles on list of lanes relative to ego vehicle....
static std::map< std::string, MSPerson * > myRemoteControlledPersons
static bool needNewSubscription(libsumo::Subscription &s, std::vector< Subscription > &subscriptions, libsumo::Subscription *&modifiedSubscription)
static bool findCloserLane(const MSEdge *edge, const Position &pos, SUMOVehicleClass vClass, double &bestDistance, MSLane **lane)
static int readCompound(tcpip::Storage &ret, int expectedSize=-1, const std::string &error="")
static std::shared_ptr< tcpip::Storage > toStorage(const TraCIResult &v)
Representation of a subscription.
double filterUpstreamDist
Upstream distance specified by the upstream distance filter.
int commandId
commandIdArg The command id of the subscription
std::set< std::string > filterVTypes
vTypes specified by the vTypes filter
double filterFieldOfVisionOpeningAngle
Opening angle (in deg) specified by the field of vision filter.
std::vector< int > filterLanes
lanes specified by the lanes filter
std::string id
The id of the object that is subscribed.
SUMOTime endTime
The end time of the subscription.
int contextDomain
The domain ID of the context.
double filterFoeDistToJunction
Foe distance to junction specified by the turn filter.
bool isVehicleToVehicleContextSubscription() const
SUMOTime beginTime
The begin time of the subscription.
std::vector< int > variables
The subscribed variables.
SVCPermissions filterVClasses
vClasses specified by the vClasses filter,
bool isVehicleToPersonContextSubscription() const
double filterDownstreamDist
Downstream distance specified by the downstream distance filter.
double filterLateralDist
Lateral distance specified by the lateral distance filter.
int activeFilters
Active filters for the subscription (bitset,.
double range
The range of the context.
std::vector< std::shared_ptr< tcpip::Storage > > parameters
The parameters for the subscribed variables.
An error which allows to continue.
virtual void empty(const std::string &)
bool(* SubscriptionHandler)(const std::string &objID, const int variable, VariableWrapper *wrapper, tcpip::Storage *paramData)
Definition of a method to be called for serving an associated commandID.
virtual void setContext(const std::string *const)
virtual std::string readString()
virtual int readUnsignedByte()
virtual double readDouble()
TRACI_CONST double INVALID_DOUBLE_VALUE
TRACI_CONST int LAST_STEP_VEHICLE_NUMBER
TRACI_CONST int POSITION_3D
TRACI_CONST int CMD_GET_CHARGINGSTATION_VARIABLE
TRACI_CONST int POSITION_ROADMAP
TRACI_CONST int CMD_SUBSCRIBE_EDGE_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_LANE_CONTEXT
TRACI_CONST int TRACI_ID_LIST
TRACI_CONST int CMD_GET_PARKINGAREA_VARIABLE
TRACI_CONST int CMD_GET_POI_VARIABLE
TRACI_CONST int CMD_GET_TL_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_VEHICLE_CONTEXT
std::map< std::string, libsumo::SubscriptionResults > ContextSubscriptionResults
TRACI_CONST int CMD_GET_REROUTER_VARIABLE
TRACI_CONST int VAR_ROAD_ID
TRACI_CONST int CMD_GET_VEHICLE_VARIABLE
TRACI_CONST int CMD_GET_EDGE_VARIABLE
TRACI_CONST int CMD_GET_CALIBRATOR_VARIABLE
TRACI_CONST int CMD_GET_PERSON_VARIABLE
TRACI_CONST int CMD_GET_ROUTEPROBE_VARIABLE
TRACI_CONST int CMD_GET_LANEAREA_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_BUSSTOP_CONTEXT
TRACI_CONST int POSITION_2D
TRACI_CONST int CMD_GET_BUSSTOP_VARIABLE
TRACI_CONST int CMD_GET_ROUTE_VARIABLE
TRACI_CONST int CMD_GET_MEANDATA_VARIABLE
TRACI_CONST int CMD_GET_JUNCTION_VARIABLE
std::map< std::string, libsumo::TraCIResults > SubscriptionResults
{object->{variable->value}}
TRACI_CONST int CMD_GET_VARIABLESPEEDSIGN_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_CALIBRATOR_CONTEXT
TRACI_CONST int VAR_LANEPOSITION
TRACI_CONST int CMD_GET_SIM_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_PERSON_CONTEXT
TRACI_CONST int CMD_GET_VEHICLETYPE_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_CHARGINGSTATION_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_POLYGON_CONTEXT
TRACI_CONST int REQUEST_DRIVINGDIST
TRACI_CONST int CMD_GET_LANE_VARIABLE
TRACI_CONST int CMD_GET_GUI_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_PARKINGAREA_CONTEXT
TRACI_CONST int CMD_GET_POLYGON_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_MULTIENTRYEXIT_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_VEHICLE_VARIABLE
TRACI_CONST int CMD_GET_MULTIENTRYEXIT_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_INDUCTIONLOOP_CONTEXT
SubscriptionFilterType
Filter types for context subscriptions.
@ SUBS_FILTER_LEAD_FOLLOW
@ SUBS_FILTER_UPSTREAM_DIST
@ SUBS_FILTER_DOWNSTREAM_DIST
@ SUBS_FILTER_LATERAL_DIST
@ SUBS_FILTER_FIELD_OF_VISION
TRACI_CONST int CMD_SUBSCRIBE_LANEAREA_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_POI_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_INDUCTIONLOOP_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_SIM_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_MULTIENTRYEXIT_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_LANE_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_PERSON_VARIABLE
TRACI_CONST int CMD_GET_INDUCTIONLOOP_VARIABLE
TRACI_CONST int CMD_GET_OVERHEADWIRE_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_LANEAREA_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_JUNCTION_CONTEXT
std::map< int, std::shared_ptr< libsumo::TraCIResult > > TraCIResults
{variable->value}
TRACI_CONST int CMD_SUBSCRIBE_EDGE_VARIABLE
A 2D or 3D-position, for 2D positions z == INVALID_DOUBLE_VALUE.
std::vector< TraCIPosition > value
An edgeId, position and laneIndex.