59 #define FAR_AWAY 1000.0
85 for (
auto p : persons) {
131 if (veh !=
nullptr) {
133 std::cout <<
" '" << veh->
getID() <<
"' on lane '" << ((
SUMOVehicle*)veh)->getLane()->getID() <<
"'\n";
135 std::cout <<
" '" << veh->
getID() <<
"' on edge '" << veh->
getEdge()->
getID() <<
"'\n";
142 Helper::subscribe(
const int commandId,
const std::string&
id,
const std::vector<int>& variables,
144 const int contextDomain,
const double range) {
146 if (variables.empty()) {
148 if (j->id ==
id && j->commandId == commandId && j->contextDomain == contextDomain) {
156 std::vector<std::shared_ptr<tcpip::Storage> > parameters;
157 for (
const int var : variables) {
158 const auto& p = params.find(var);
159 if (p == params.end()) {
160 parameters.push_back(std::make_shared<tcpip::Storage>());
185 wrapper.second->clear();
193 if (s.
endTime < t || isArrivedVehicle || isArrivedPerson) {
200 if (s.beginTime <= t) {
213 std::vector<std::shared_ptr<tcpip::Storage> >::const_iterator k = s.
parameters.begin();
215 const int offset = (int)(std::find(o.variables.begin(), o.variables.end(), v) - o.variables.begin());
216 if (offset == (
int)o.variables.size() || o.parameters[offset]->size() != (*k)->size() || !std::equal((*k)->begin(), (*k)->end(), o.parameters[offset]->begin())) {
217 o.variables.push_back(v);
218 o.parameters.push_back(*k);
222 modifiedSubscription = &o;
226 subscriptions.push_back(s);
227 modifiedSubscription = &subscriptions.back();
244 WRITE_WARNING(
"addSubscriptionFilter: No previous vehicle context subscription exists to apply the context filter.");
253 std::set<std::string> objIDs;
280 auto wrapper =
myWrapper.find(getCommandId);
284 std::shared_ptr<VariableWrapper> handler = wrapper->second;
288 if (containerWrapper ==
myWrapper.end()) {
291 container = containerWrapper->second.get();
296 for (
const std::string& objID : objIDs) {
298 std::vector<std::shared_ptr<tcpip::Storage> >::const_iterator k = s.
parameters.begin();
301 handler->handle(objID, variable, container, k->get());
307 handler->handle(objID,
VAR_ROAD_ID, container,
nullptr);
320 Helper::fuseLaneCoverage(std::shared_ptr<LaneCoverageInfo> aggregatedLaneCoverage,
const std::shared_ptr<LaneCoverageInfo> newLaneCoverage) {
321 for (
auto& p : *newLaneCoverage) {
322 const MSLane* lane = p.first;
323 if (aggregatedLaneCoverage->find(lane) == aggregatedLaneCoverage->end()) {
325 (*aggregatedLaneCoverage)[lane] = (*newLaneCoverage)[lane];
328 std::pair<double, double>& range1 = (*aggregatedLaneCoverage)[lane];
329 std::pair<double, double>& range2 = (*newLaneCoverage)[lane];
330 std::pair<double, double> hull = std::make_pair(
MIN2(range1.first, range2.first),
MAX2(range1.second, range2.second));
331 (*aggregatedLaneCoverage)[lane] = hull;
340 for (
int i = 0; i < (int)positionVector.size(); ++i) {
351 if (std::isnan(pos.
x) || std::isnan(pos.
y)) {
373 return RGBColor((
unsigned char)c.
r, (
unsigned char)c.
g, (
unsigned char)c.
b, (
unsigned char)c.
a);
396 if (edge ==
nullptr) {
397 throw TraCIException(
"Referenced edge '" + edgeID +
"' is not known.");
406 if (edge ==
nullptr) {
409 if (laneIndex < 0 || laneIndex >= (
int)edge->
getLanes().size()) {
413 if (pos < 0 || pos > lane->
getLength()) {
420 std::pair<MSLane*, double>
423 std::pair<MSLane*, double> result;
424 double range = 1000.;
427 while (range < maxRange) {
428 std::set<const Named*> lanes;
430 double minDistance = std::numeric_limits<double>::max();
431 for (
const Named* named : lanes) {
436 if (newDistance < minDistance) {
437 minDistance = newDistance;
442 if (minDistance < std::numeric_limits<double>::max()) {
454 if (roadPos1.first == roadPos2.first && roadPos1.second <= roadPos2.second) {
456 return roadPos2.second - roadPos1.second;
458 double distance = 0.0;
460 while (roadPos2.first->isInternal() && roadPos2.first != roadPos1.first) {
461 distance += roadPos2.second;
462 roadPos2.first = roadPos2.first->getLogicalPredecessorLane();
463 roadPos2.second = roadPos2.first->getLength();
466 if (newRoute.empty()) {
469 MSRoute route(
"", newRoute,
false,
nullptr, std::vector<SUMOVehicleParameter::Stop>());
470 return distance + route.
getDistanceBetween(roadPos1.second, roadPos2.second, &roadPos1.first->getEdge(), &roadPos2.first->getEdge());
477 if (sumoVehicle ==
nullptr) {
482 throw TraCIException(
"Vehicle '" +
id +
"' is not a proper vehicle.");
526 double pos,
int laneIndex,
double startPos,
int flags,
double duration,
double until) {
534 if (newStop.
until >= 0) {
537 if ((flags & 1) != 0) {
541 if ((flags & 2) != 0) {
545 if ((flags & 4) != 0) {
551 if ((flags & 8) != 0) {
554 if ((flags & 16) != 0) {
557 if ((flags & 32) != 0) {
560 if ((flags & 64) != 0) {
563 if ((flags & 128) != 0) {
570 throw TraCIException(
"The " +
toString(stoppingPlaceType) +
" '" + edgeOrStoppingPlaceID +
"' is not known");
576 switch (stoppingPlaceType) {
578 newStop.
busstop = edgeOrStoppingPlaceID;
597 startPos = pos - POSITION_EPS;
602 if (pos < startPos) {
603 throw TraCIException(
"End position on lane must be after start position.");
607 if (road ==
nullptr) {
608 throw TraCIException(
"Edge '" + edgeOrStoppingPlaceID +
"' is not known.");
610 const std::vector<MSLane*>& allLanes = road->
getLanes();
611 if ((laneIndex < 0) || laneIndex >= (
int)(allLanes.size())) {
612 throw TraCIException(
"No lane with index '" +
toString(laneIndex) +
"' on edge '" + edgeOrStoppingPlaceID +
"'.");
614 newStop.
lane = allLanes[laneIndex]->getID();
615 newStop.
edge = allLanes[laneIndex]->getEdge().getID();
626 std::string stoppingPlaceID =
"";
628 stoppingPlaceID = stopPar.
busstop;
646 (stopPar.
busstop !=
"" ? 8 : 0) +
678 InductionLoop::cleanup();
696 const std::vector<std::string>&
718 const std::vector<std::string>&
736 InductionLoop::storeShape(
id, shape);
739 Lane::storeShape(
id, shape);
742 Vehicle::storeShape(
id, shape);
745 Person::storeShape(
id, shape);
748 POI::storeShape(
id, shape);
751 Polygon::storeShape(
id, shape);
754 Junction::storeShape(
id, shape);
757 Edge::storeShape(
id, shape);
767 std::set<const Named*> objects;
769 for (
const Named* obj : objects) {
770 into.insert(obj->getID());
778 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
779 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
783 InductionLoop::getTree()->Search(cmin, cmax, sv);
786 POI::getTree()->Search(cmin, cmax, sv);
789 Polygon::getTree()->Search(cmin, cmax, sv);
792 Junction::getTree()->Search(cmin, cmax, sv);
815 #ifdef DEBUG_SURROUNDING
817 std::cout <<
SIMTIME <<
" applySubscriptionFilters for vehicle '" << _veh->
getID() <<
"' on lane '" << _veh->
getLane()->
getID() <<
"'"
819 <<
"objIDs = " <<
toString(objIDs) << std::endl;
834 WRITE_WARNINGF(
"Ignoring veh '%' no-opposite subscription filter for geographic range object collection. Consider using the 'lanes' filter.", v->
getID())
837 WRITE_WARNINGF(
"Ignoring veh '%' field of vision subscription filter due to incompatibility with other filter(s).", v->
getID())
842 std::set<const SUMOTrafficObject*> vehs;
845 double downstreamDist = s.
range, upstreamDist = s.
range, lateralDist = s.
range;
859 throw TraCIException(
"Subscription filter not yet implemented for meso vehicle");
865 if (vehLane ==
nullptr) {
869 std::vector<int> filterLanes;
880 #ifdef DEBUG_SURROUNDING
881 std::cout <<
"Filter lanes: " <<
toString(filterLanes) << std::endl;
882 std::cout <<
"Downstream distance: " << downstreamDist << std::endl;
883 std::cout <<
"Upstream distance: " << upstreamDist << std::endl;
884 std::cout <<
"Lateral distance: " << lateralDist << std::endl;
891 for (
int offset : filterLanes) {
893 if (lane !=
nullptr) {
897 vehs.insert(vehs.end(), leader);
898 vehs.insert(vehs.end(), follower);
900 #ifdef DEBUG_SURROUNDING
901 std::cout <<
"Lane at index " << offset <<
": '" << lane->
getID() << std::endl;
902 std::cout <<
"Leader: '" << (leader !=
nullptr ? leader->
getID() :
"NULL") <<
"'" << std::endl;
903 std::cout <<
"Follower: '" << (follower !=
nullptr ? follower->
getID() :
"NULL") <<
"'" << std::endl;
906 }
else if (!disregardOppositeDirection && offset > 0) {
909 if (opposite ==
nullptr) {
910 #ifdef DEBUG_SURROUNDING
911 std::cout <<
"No lane at index " << offset << std::endl;
917 const int ix_opposite = (int)opposite->
getLanes().size() - 1 - (vehLane->
getIndex() + offset - (int)vehEdge->
getLanes().size());
918 if (ix_opposite < 0) {
919 #ifdef DEBUG_SURROUNDING
920 std::cout <<
"No lane on opposite at index " << ix_opposite << std::endl;
925 lane = opposite->
getLanes()[ix_opposite];
930 vehs.insert(vehs.end(), lane->
getFollower(v, posOnOpposite, downstreamDist,
true).first);
932 vehs.insert(vehs.end(), lane->
getLeader(v, posOnOpposite - v->
getLength(), std::vector<MSLane*>()).first);
946 #ifdef DEBUG_SURROUNDING
947 std::cout <<
SIMTIME <<
" applySubscriptionFilters() for veh '" << v->
getID() <<
"'. Found the following vehicles:\n";
948 for (
auto veh : vehs) {
961 auto i = vehs.begin();
962 while (i != vehs.end()) {
963 if (((*i)->getVehicleType().getVehicleClass() & s.
filterVClasses) == 0) {
972 auto i = vehs.begin();
973 while (i != vehs.end()) {
984 if (veh !=
nullptr) {
985 objIDs.insert(objIDs.end(), veh->getID());
991 auto i = objIDs.begin();
992 while (i != objIDs.end()) {
1003 auto i = objIDs.begin();
1004 while (i != objIDs.end()) {
1007 i = objIDs.erase(i);
1022 double upstreamDist,
bool disregardOppositeDirection) {
1027 assert(filterLanes.size() > 0);
1032 auto checkedLanesInDrivingDir = std::make_shared<LaneCoverageInfo>();
1033 for (
int offset : filterLanes) {
1035 if (lane !=
nullptr) {
1036 #ifdef DEBUG_SURROUNDING
1037 std::cout <<
"Checking for surrounding vehicles starting on lane '" << lane->
getID() <<
"' at index " << offset << std::endl;
1042 std::shared_ptr<LaneCoverageInfo> checkedLanes = std::make_shared<LaneCoverageInfo>();
1043 const std::set<MSVehicle*> new_vehs =
1045 vehs.insert(new_vehs.begin(), new_vehs.end());
1047 }
else if (!disregardOppositeDirection && offset > 0) {
1051 if (opposite ==
nullptr) {
1052 #ifdef DEBUG_SURROUNDING
1053 std::cout <<
"No opposite edge, thus no lane at index " << offset << std::endl;
1059 const int ix_opposite = (int)opposite->
getLanes().size() - 1 - (vehLane->
getIndex() + offset - (int)vehEdge->
getLanes().size());
1060 if (ix_opposite < 0) {
1061 #ifdef DEBUG_SURROUNDING
1062 std::cout <<
"No lane on opposite at index " << ix_opposite << std::endl;
1067 lane = opposite->
getLanes()[ix_opposite];
1070 downstreamDist, std::make_shared<LaneCoverageInfo>());
1071 vehs.insert(new_vehs.begin(), new_vehs.end());
1073 #ifdef DEBUG_SURROUNDING
1075 std::cout <<
"No lane at index " << offset << std::endl;
1079 if (!disregardOppositeDirection) {
1086 const int nOpp =
MAX2(0, (*std::max_element(filterLanes.begin(), filterLanes.end())) - ((
int)vehEdge->
getLanes().size() - 1 - vehLane->
getIndex()));
1089 for (
auto& laneCov : *checkedLanesInDrivingDir) {
1090 const MSLane*
const l = laneCov.first;
1095 const std::pair<double, double>& range = laneCov.second;
1096 auto leftMostOppositeLaneIt = opposite->
getLanes().rbegin();
1097 for (
auto oppositeLaneIt = leftMostOppositeLaneIt; oppositeLaneIt != opposite->
getLanes().rend(); ++oppositeLaneIt) {
1098 if ((
int)(oppositeLaneIt - leftMostOppositeLaneIt) == nOpp) {
1102 const MSLane* oppositeLane = *oppositeLaneIt;
1104 vehs.insert(new_vehs.begin(), new_vehs.end());
1109 #ifdef DEBUG_SURROUNDING
1110 std::cout <<
SIMTIME <<
" applySubscriptionFilterLanes() for veh '" << v->
getID() <<
"', lane offset '" << offset <<
"'. Found the following vehicles so far:\n";
1111 for (
auto veh : vehs) {
1128 #ifdef DEBUG_SURROUNDING
1129 std::cout <<
"Applying turn filter for vehicle '" << v->
getID() <<
"'\n Gathering foes ..." << std::endl;
1132 for (
auto& l : links) {
1133 #ifdef DEBUG_SURROUNDING
1134 std::cout <<
" On junction '" << l->getJunction()->getID() <<
"' (no. foe links = " << l->getFoeLinks().size() <<
"):" << std::endl;
1136 for (
auto& foeLane : l->getFoeLanes()) {
1137 if (foeLane->getEdge().isCrossing()) {
1138 #ifdef DEBUG_SURROUNDING
1139 std::cout <<
" skipping crossing foeLane '" << foeLane->getID() <<
"'" << std::endl;
1143 #ifdef DEBUG_SURROUNDING
1144 std::cout <<
" foeLane '" << foeLane->getID() <<
"'" << std::endl;
1147 const MSLink* foeLink = foeLane->getEntryLink();
1150 #ifdef DEBUG_SURROUNDING
1151 std::cout <<
" Approaching foeLane entry link '" << vi.first->getID() <<
"'" << std::endl;
1153 vehs.insert(vehs.end(),
dynamic_cast<const MSVehicle*
>(vi.first));
1157 for (
const MSVehicle* foe : foeLane->getVehiclesSecure()) {
1158 #ifdef DEBUG_SURROUNDING
1159 std::cout <<
" On foeLane '" << foe->getID() <<
"'" << std::endl;
1161 vehs.insert(vehs.end(), foe);
1163 foeLane->releaseVehicles();
1164 for (
auto& laneInfo : foeLane->getIncomingLanes()) {
1165 const MSLane* foeLanePred = laneInfo.lane;
1167 #ifdef DEBUG_SURROUNDING
1168 std::cout <<
" foeLanePred '" << foeLanePred->
getID() <<
"'" << std::endl;
1171 #ifdef DEBUG_SURROUNDING
1172 std::cout <<
" On foeLanePred '" << foe->getID() <<
"'" << std::endl;
1174 vehs.insert(vehs.end(), foe);
1194 #ifdef DEBUG_SURROUNDING
1195 std::cout <<
"FOVFILTER: ego direction = " <<
toString(
RAD2DEG(egoVehicle->
getAngle())) <<
" (deg)" << std::endl;
1198 auto i = objIDs.begin();
1199 while (i != objIDs.end()) {
1200 if (s.
id.compare(*i) == 0) {
1208 #ifdef DEBUG_SURROUNDING
1211 std::cout <<
"FOVFILTER: " << objType <<
" '" << *i <<
"' alpha = " <<
toString(
RAD2DEG(alpha)) <<
" (deg)" << std::endl;
1214 if (abs(alpha) > openingAngle * 0.5) {
1215 i = objIDs.erase(i);
1224 double lateralDist) {
1228 double range =
MAX3(downstreamDist, upstreamDist, lateralDist);
1229 std::set<std::string> objIDs;
1232 #ifdef DEBUG_SURROUNDING
1233 std::cout <<
"FILTER_LATERAL_DIST: collected object IDs (range " << range <<
"):" << std::endl;
1234 for (std::string i : objIDs) {
1235 std::cout << i << std::endl;
1240 #ifdef DEBUG_SURROUNDING
1258 std::set<const SUMOTrafficObject*>& vehs,
1259 const std::vector<const MSLane*>& lanes,
double posOnLane,
double posLat,
bool isDownstream) {
1261 double distRemaining = streamDist;
1262 bool isFirstLane =
true;
1264 for (
const MSLane* lane : lanes) {
1265 #ifdef DEBUG_SURROUNDING
1266 std::cout <<
"FILTER_LATERAL_DIST: current lane " << (isDownstream ?
"down" :
"up") <<
" is '" << lane->getID() <<
"', length " << lane->getLength()
1267 <<
", pos " << posOnLane <<
", distRemaining " << distRemaining << std::endl;
1271 isFirstLane =
false;
1272 double geometryPos = lane->interpolateLanePosToGeometryPos(posOnLane);
1273 if (geometryPos <= POSITION_EPS) {
1274 if (!isDownstream) {
1278 if (geometryPos >= laneShape.
length() - POSITION_EPS) {
1281 auto pair = laneShape.
splitAt(geometryPos,
false);
1282 laneShape = isDownstream ? pair.second : pair.first;
1286 double laneLength = lane->interpolateGeometryPosToLanePos(laneShape.
length());
1287 if (distRemaining - laneLength < 0.) {
1288 double geometryPos = lane->interpolateLanePosToGeometryPos(isDownstream ? distRemaining : laneLength - distRemaining);
1289 if (geometryPos > POSITION_EPS && geometryPos < laneShape.
length() - POSITION_EPS) {
1290 auto pair = laneShape.
splitAt(geometryPos,
false);
1291 laneShape = isDownstream ? pair.first : pair.second;
1294 distRemaining -= laneLength;
1298 WRITE_WARNING(
"addSubscriptionFilterLateralDistance could not determine shape of lane '" + lane->getID() +
"' with lateral shift of " +
toString(posLat));
1300 #ifdef DEBUG_SURROUNDING
1301 std::cout <<
" posLat=" << posLat <<
" laneShape=" << laneShape <<
"\n";
1304 combinedShape.
append(laneShape);
1306 combinedShape.
prepend(laneShape);
1308 if (distRemaining <= POSITION_EPS) {
1312 #ifdef DEBUG_SURROUNDING
1313 std::cout <<
" combinedShape=" << combinedShape <<
"\n";
1316 auto i = objIDs.begin();
1317 while (i != objIDs.end()) {
1320 #ifdef DEBUG_SURROUNDING
1321 std::cout << (isDownstream ?
"DOWN" :
"UP") <<
" obj " << obj->
getID() <<
" perpendicular dist=" << minPerpendicularDist <<
" filterLateralDist=" << s.
filterLateralDist <<
"\n";
1325 i = objIDs.erase(i);
1351 controlled.second->getInfluencer().postProcessRemoteControl(controlled.second);
1353 WRITE_WARNING(
"Vehicle '" + controlled.first +
"' was removed though being controlled by TraCI");
1359 controlled.second->getInfluencer().postProcessRemoteControl(controlled.second);
1361 WRITE_WARNING(
"Person '" + controlled.first +
"' was removed though being controlled by TraCI");
1370 double speed,
const ConstMSEdgeVector& currentRoute,
const int routePosition,
const MSLane* currentLane,
double currentLanePos,
bool onRoad,
1375 std::cout <<
SIMTIME <<
" moveToXYMap pos=" << pos <<
" angle=" << angle <<
" vClass=" <<
toString(vClass) <<
"\n";
1377 const MSEdge*
const currentRouteEdge = currentRoute[routePosition];
1378 std::set<const Named*> into;
1380 shape.push_back(pos);
1383 std::map<MSLane*, LaneUtility, ComparatorNumericalIdLess> lane2utility;
1385 for (
const Named* namedEdge : into) {
1386 const MSEdge* e =
dynamic_cast<const MSEdge*
>(namedEdge);
1390 const MSEdge* prevEdge =
nullptr;
1391 const MSEdge* nextEdge =
nullptr;
1392 bool onRoute =
false;
1398 for (
int i = routePosition; i < (int)currentRoute.size(); i++) {
1399 const MSEdge* cand = currentRoute[i];
1402 if (i + 1 < (
int)currentRoute.size()) {
1404 nextEdge = currentRoute[i + 1];
1409 if (onRoute ==
false) {
1411 for (
int i = routePosition - 1; i >= 0; i--) {
1412 const MSEdge* cand = currentRoute[i];
1416 nextEdge = currentRoute[i + 1];
1421 if (prevEdge ==
nullptr) {
1427 if (e2 != nextEdge) {
1434 if (nextEdge ==
nullptr) {
1439 if (e2 != prevEdge) {
1446 #ifdef DEBUG_MOVEXY_ANGLE
1456 ConstMSEdgeVector::const_iterator searchStart = currentRoute.begin() + routePosition;
1460 ConstMSEdgeVector::const_iterator edgePos = std::find(searchStart, currentRoute.end(), e);
1461 onRoute = edgePos != currentRoute.end();
1462 if (edgePos == currentRoute.end() - 1 && currentRouteEdge == e) {
1468 nextEdge = !onRoute || edgePos == currentRoute.end() - 1 ? nullptr : *(edgePos + 1);
1469 #ifdef DEBUG_MOVEXY_ANGLE
1476 while (prevEdge !=
nullptr && prevEdge->
isInternal()) {
1479 prevEdge = l ==
nullptr ? nullptr : &l->
getEdge();
1482 ConstMSEdgeVector::const_iterator prevEdgePos = std::find(currentRoute.begin() + routePosition, currentRoute.end(), prevEdge);
1484 while (nextEdge !=
nullptr && nextEdge->
isInternal()) {
1487 if (prevEdgePos != currentRoute.end() && (prevEdgePos + 1) != currentRoute.end()) {
1488 onRoute = *(prevEdgePos + 1) == nextEdge;
1490 #ifdef DEBUG_MOVEXY_ANGLE
1497 const bool perpendicular =
false;
1499 if (!l->allowsVehicleClass(vClass)) {
1502 if (l->getShape().length() == 0) {
1506 double langle = 180.;
1508 double perpendicularDist =
FAR_AWAY;
1510 const double slack = POSITION_EPS;
1515 perpendicularDist = laneShape.
distance2D(pos,
true);
1517 off = l->getShape().nearest_offset_to_point2D(pos, perpendicular);
1519 dist = l->getShape().distance2D(pos, perpendicular);
1523 bool sameEdge = onRoad && e == ¤tLane->
getEdge() && currentRouteEdge->
getLength() > currentLanePos +
SPEED2DIST(speed) && !e->isWalkingArea();
1531 double dist2 = dist;
1532 if (mayLeaveNetwork && fabs(dist - perpendicularDist) > slack) {
1537 #ifdef DEBUG_MOVEXY_ANGLE
1539 <<
" candLane=" << l->getID() <<
" lAngle=" << langle <<
" lLength=" << l->getLength()
1540 <<
" angleDiff=" << angleDiff
1542 <<
" pDist=" << perpendicularDist
1544 <<
" dist2=" << dist2
1546 std::cout << l->getID() <<
" param=" << l->getParameter(
SUMO_PARAM_ORIGID,
"") <<
" origID='" << origID <<
"\n";
1550 if (origIDMatch && setLateralPos
1551 && perpendicularDist > l->getWidth() / 2) {
1552 origIDMatch =
false;
1555 dist2, perpendicularDist, off, angleDiff,
1557 onRoute, sameEdge, prevEdge, nextEdge));
1565 double bestValue = 0;
1566 MSLane* bestLane =
nullptr;
1567 for (
const auto& it : lane2utility) {
1568 MSLane*
const l = it.first;
1570 double distN = u.
dist > 999 ? -10 : 1. - (u.
dist / maxDist);
1571 double angleDiffN = 1. - (u.
angleDiff / 180.);
1572 double idN = u.
ID ? 1 : 0;
1573 double onRouteN = u.
onRoute ? 1 : 0;
1575 double value = (distN * .5
1581 std::cout <<
" x; l:" << l->
getID() <<
" d:" << u.
dist <<
" dN:" << distN <<
" aD:" << angleDiffN <<
1582 " ID:" << idN <<
" oRN:" << onRouteN <<
" sEN:" << sameEdgeN <<
" value:" << value << std::endl;
1584 if (value > bestValue || bestLane ==
nullptr) {
1594 if (bestLane ==
nullptr) {
1597 const LaneUtility& u = lane2utility.find(bestLane)->second;
1598 bestDistance = u.
dist;
1600 lanePos =
MAX2(0.,
MIN2(
double((*lane)->getLength() - POSITION_EPS),
1605 ConstMSEdgeVector::const_iterator prevEdgePos = std::find(currentRoute.begin(), currentRoute.end(), prevEdge);
1606 routeOffset = (int)std::distance(currentRoute.begin(), prevEdgePos);
1619 #ifdef DEBUG_MOVEXY_ANGLE
1631 if (edge ==
nullptr) {
1634 bool newBest =
false;
1636 if (!candidateLane->allowsVehicleClass(vClass)) {
1639 if (candidateLane->getShape().length() == 0) {
1643 const double dist = candidateLane->getShape().distance2D(pos);
1645 std::cout <<
" b at lane " << candidateLane->getID() <<
" dist:" << dist <<
" best:" << bestDistance << std::endl;
1647 if (dist < bestDistance || (dist == bestDistance && candidateLane->getNumericalID() < (*lane)->getNumericalID())) {
1649 bestDistance = dist;
1650 *lane = candidateLane;
1662 double& bestDistance,
MSLane** lane,
double& lanePos,
int& routeOffset) {
1664 std::cout <<
SIMTIME <<
" moveToXYMap_matchingRoutePosition pos=" << pos <<
" vClass=" <<
toString(vClass) <<
"\n";
1672 const MSEdge* prev =
nullptr;
1673 for (
int i = routeIndex; i < (int)currentRoute.size(); ++i) {
1674 const MSEdge* cand = currentRoute[i];
1675 while (prev !=
nullptr) {
1679 prev = internalCand;
1687 const MSEdge* next = currentRoute[routeIndex];
1688 for (
int i = routeIndex; i >= 0; --i) {
1689 const MSEdge* cand = currentRoute[i];
1692 while (prev !=
nullptr) {
1695 if (
findCloserLane(internalCand, pos, vClass, bestDistance, lane)) {
1698 prev = internalCand;
1707 std::map<const MSJunction*, int> routeJunctions;
1708 for (
int i = 0; i < (int)currentRoute.size() - 1; ++i) {
1709 routeJunctions[currentRoute[i]->getToJunction()] = i;
1711 std::set<const Named*> into;
1713 shape.push_back(pos);
1715 for (
const Named* named : into) {
1716 const MSLane* cand =
dynamic_cast<const MSLane*
>(named);
1728 if (lane ==
nullptr) {
1730 std::cout <<
" b failed - no best route lane" << std::endl;
1738 if (!(*lane)->getEdge().isInternal()) {
1739 const std::vector<MSLane*>& lanes = (*lane)->getEdge().getLanes();
1740 for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
1742 if (setLateralPos) {
1745 const double dist = (*i)->getShape().distance2D(pos);
1746 if (dist < (*i)->getWidth() / 2) {
1758 lanePos =
MAX2(0.,
MIN2(
double((*lane)->getLength() - POSITION_EPS),
1759 (*lane)->interpolateGeometryPosToLanePos(
1760 (*lane)->getShape().nearest_offset_to_point25D(pos,
false))));
1763 std::cout <<
" b ok lane " << (*lane)->getID() <<
" lanePos:" << lanePos << std::endl;
1770 :
VariableWrapper(handler), myResults(into), myContextResults(context), myActiveResults(&into) {
1777 myActiveResults = refID ==
"" ? &myResults : &myContextResults[refID];
1783 myActiveResults = &myResults;
1785 myContextResults.clear();
1791 (*myActiveResults)[objID][variable] = std::make_shared<TraCIDouble>(value);
1798 (*myActiveResults)[objID][variable] = std::make_shared<TraCIInt>(value);
1805 (*myActiveResults)[objID][variable] = std::make_shared<TraCIString>(value);
1812 auto sl = std::make_shared<TraCIStringList>();
1814 (*myActiveResults)[objID][variable] = sl;
1821 (*myActiveResults)[objID][variable] = std::make_shared<TraCIPosition>(value);
1828 (*myActiveResults)[objID][variable] = std::make_shared<TraCIPositionVector>(value);
1835 (*myActiveResults)[objID][variable] = std::make_shared<TraCIColor>(value);
1842 (*myActiveResults)[objID][variable] = std::make_shared<TraCIRoadPosition>(value.first, value.second);
1849 auto sl = std::make_shared<TraCIStringList>();
1850 sl->value.push_back(value.first);
1851 sl->value.push_back(value.second);
1852 (*myActiveResults)[objID][variable] = sl;
1859 myVehicleStateChanges[to].push_back(vehicle->
getID());
1865 myTransportableStateChanges[to].push_back(transportable->
getID());
std::vector< const MSEdge * > ConstMSEdgeVector
#define WRITE_WARNINGF(...)
#define WRITE_WARNING(msg)
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
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
@ 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.
std::set< const Named * > & myObjects
The container.
void add(const MSLane *const l) const
Adds the given object to the container.
const PositionVector & myShape
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.
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.
const MSEdgeVector & getPredecessors() const
const MSEdge * getInternalFollowingEdge(const MSEdge *followerAfterInternal) const
bool isWalkingArea() const
return whether this edge is walking area
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
std::vector< MSTransportable * > getSortedPersons(SUMOTime timestep, bool includeRiding=false) const
Returns this edge's persons sorted by pos.
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
const MSJunction * getFromJunction() const
double getLength() const
return the length of the edge
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 MSJunction * getToJunction() 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.
void visit(const LaneStoringVisitor &cont) const
Callback for visiting the lane when traversing an RTree.
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
static void fill(RTREE &into)
Fills the given RTree with lane instances.
std::pair< MSVehicle *const, double > getFollower(const MSVehicle *ego, double egoPos, double dist, bool ignoreMinorLinks) const
Find follower vehicle for the given ego vehicle (which may be on the opposite direction lane)
std::set< MSVehicle * > getVehiclesInRange(const double a, const double b) const
Returns all vehicles on the lane overlapping with the interval [a,b].
const std::set< const MSBaseVehicle * > & getParkingVehicles() const
retrieve the parking vehicles (see GUIParkingArea)
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 precedecessor lane (sorted using by_connections_to_sorter). The result is cached ...
MSEdge & getEdge() const
Returns the lane's edge.
const PositionVector & getShape() const
Returns this lane's shape.
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 void releaseVehicles() const
Allows to use the container for microsimulation again.
MSLane * getParallelOpposite() const
return the opposite direction lane of this lanes edge or nullptr
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.
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const int rngIndex, const MSEdgeVector &prohibited=MSEdgeVector()) const
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
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.
virtual MSTransportableControl & getPersonControl()
Returns the person control.
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 MSEdge *fromEdge, const MSEdge *toEdge, bool includeInternal=true, int routePosition=0) const
Compute the distance between 2 given edges on this route, including the length of internal lanes....
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...
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.
const MSLane * getLane() const
Returns the lane the vehicle is on.
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.
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
double x() const
Returns the x-position.
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
double y() const
Returns the y-position.
void append(const PositionVector &v, double sameThreshold=2.0)
double length() const
Returns the 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 ammount
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 Position getPosition(const double offset=0) const =0
Return current position (x/y, cartesian)
virtual const MSLane * getLane() const =0
Returns the lane the object is currently at.
virtual const MSEdge * getEdge() const =0
Returns the 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)
SUMOTime started
the time at which this stop was reached
std::string edge
The edge to stop at (used only in NETEDIT)
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.
bool parking
whether the vehicle is removed from the net while stopping
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.
void setContext(const std::string &refID)
bool wrapDouble(const std::string &objID, const int variable, const double value)
bool wrapPositionVector(const std::string &objID, const int variable, const TraCIPositionVector &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 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 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)
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 void postProcessRemoteControl()
static void registerTransportableStateListener()
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 TraCIPosition makeTraCIPosition(const Position &position, const bool includeZ=false)
static LANE_RTREE_QUAL * myLaneTree
A storage 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 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 void registerVehicleStateListener()
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 clearVehicleStates()
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 void clearTransportableStates()
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 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 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, 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 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.
int filterVClasses
vClasses specified by the vClasses filter,
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.
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.
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 &)
TRACI_CONST double INVALID_DOUBLE_VALUE
TRACI_CONST int LAST_STEP_VEHICLE_NUMBER
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_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 VAR_ROAD_ID
TRACI_CONST int CMD_GET_VEHICLE_VARIABLE
TRACI_CONST int CMD_GET_EDGE_VARIABLE
TRACI_CONST int CMD_GET_PERSON_VARIABLE
TRACI_CONST int CMD_GET_LANEAREA_VARIABLE
TRACI_CONST int CMD_GET_ROUTE_VARIABLE
TRACI_CONST int CMD_GET_JUNCTION_VARIABLE
std::map< std::string, libsumo::TraCIResults > SubscriptionResults
{object->{variable->value}}
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_POLYGON_CONTEXT
TRACI_CONST int CMD_GET_LANE_VARIABLE
TRACI_CONST int CMD_GET_POLYGON_VARIABLE
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_POI_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_PERSON_VARIABLE
TRACI_CONST int CMD_GET_INDUCTIONLOOP_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_JUNCTION_CONTEXT
std::map< int, std::shared_ptr< libsumo::TraCIResult > > TraCIResults
{variable->value}
std::vector< TraCIPosition > value