Eclipse SUMO - Simulation of Urban MObility
libsumo/Lane.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2017-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
23 // C++ TraCI client API implementation
24 /****************************************************************************/
25 #include <config.h>
26 
27 #include <microsim/MSNet.h>
28 #include <microsim/MSLane.h>
29 #include <microsim/MSEdge.h>
30 #include <microsim/MSVehicle.h>
31 #include <microsim/MSLink.h>
33 #include <utils/geom/GeomHelper.h>
34 #include <libsumo/Helper.h>
35 #include <libsumo/TraCIConstants.h>
36 #include "Lane.h"
37 
38 
39 namespace libsumo {
40 // ===========================================================================
41 // static member initializations
42 // ===========================================================================
43 SubscriptionResults Lane::mySubscriptionResults;
44 ContextSubscriptionResults Lane::myContextSubscriptionResults;
45 
46 
47 // ===========================================================================
48 // static member definitions
49 // ===========================================================================
50 std::vector<std::string>
51 Lane::getIDList() {
52  MSNet::getInstance(); // just to check that we actually have a network
53  std::vector<std::string> ids;
54  MSLane::insertIDs(ids);
55  return ids;
56 }
57 
58 
59 int
60 Lane::getIDCount() {
61  return (int)getIDList().size();
62 }
63 
64 
65 std::string
66 Lane::getEdgeID(const std::string& laneID) {
67  return getLane(laneID)->getEdge().getID();
68 }
69 
70 
71 double
72 Lane::getLength(const std::string& laneID) {
73  return getLane(laneID)->getLength();
74 }
75 
76 
77 double
78 Lane::getMaxSpeed(const std::string& laneID) {
79  return getLane(laneID)->getSpeedLimit();
80 }
81 
82 double
83 Lane::getFriction(const std::string& laneID) {
84  return getLane(laneID)->getFrictionCoefficient();
85 }
86 
87 int
88 Lane::getLinkNumber(const std::string& laneID) {
89  return (int)getLane(laneID)->getLinkCont().size();
90 }
91 
92 
93 std::vector<TraCIConnection>
94 Lane::getLinks(const std::string& laneID) {
95  std::vector<TraCIConnection> v;
96  const MSLane* const lane = getLane(laneID);
97  const SUMOTime currTime = MSNet::getInstance()->getCurrentTimeStep();
98  for (const MSLink* const link : lane->getLinkCont()) {
99  const std::string approachedLane = link->getLane() != nullptr ? link->getLane()->getID() : "";
100  const bool hasPrio = link->havePriority();
101  const double speed = MIN2(lane->getSpeedLimit(), link->getLane()->getSpeedLimit());
102  const bool isOpen = link->opened(currTime, speed, speed, SUMOVTypeParameter::getDefault().length,
104  const bool hasFoe = link->hasApproachingFoe(currTime, currTime, 0, SUMOVTypeParameter::getDefaultDecel());
105  const std::string approachedInternal = link->getViaLane() != nullptr ? link->getViaLane()->getID() : "";
106  const std::string state = SUMOXMLDefinitions::LinkStates.getString(link->getState());
107  const std::string direction = SUMOXMLDefinitions::LinkDirections.getString(link->getDirection());
108  const double length = link->getLength();
109  v.push_back(TraCIConnection(approachedLane, hasPrio, isOpen, hasFoe, approachedInternal, state, direction, length));
110  }
111  return v;
112 }
113 
114 
115 std::vector<std::string>
116 Lane::getAllowed(const std::string& laneID) {
117  SVCPermissions permissions = getLane(laneID)->getPermissions();
118  if (permissions == SVCAll) { // special case: write nothing
119  permissions = 0;
120  }
121  return getVehicleClassNamesList(permissions);
122 }
123 
124 
125 std::vector<std::string>
126 Lane::getDisallowed(const std::string& laneID) {
127  return getVehicleClassNamesList(invertPermissions((getLane(laneID)->getPermissions()))); // negation yields disallowed
128 }
129 
130 
131 std::vector<std::string>
132 Lane::getChangePermissions(const std::string& laneID, const int direction) {
133  if (direction == libsumo::LANECHANGE_LEFT) {
134  return getVehicleClassNamesList(getLane(laneID)->getChangeLeft());
135  } else if (direction == libsumo::LANECHANGE_RIGHT) {
136  return getVehicleClassNamesList(getLane(laneID)->getChangeRight());
137  } else {
138  throw TraCIException("Invalid direction for change permission (must be " + toString(libsumo::LANECHANGE_LEFT) + " or " + toString(libsumo::LANECHANGE_RIGHT));
139  }
140 }
141 
142 
143 TraCIPositionVector
144 Lane::getShape(const std::string& laneID) {
145  TraCIPositionVector pv;
146  const PositionVector& shp = getLane(laneID)->getShape();
147  for (PositionVector::const_iterator pi = shp.begin(); pi != shp.end(); ++pi) {
148  TraCIPosition p;
149  p.x = pi->x();
150  p.y = pi->y();
151  p.z = pi->z();
152  pv.value.push_back(p);
153  }
154  return pv;
155 }
156 
157 
158 double
159 Lane::getWidth(const std::string& laneID) {
160  return getLane(laneID)->getWidth();
161 }
162 
163 
164 double
165 Lane::getCO2Emission(const std::string& laneID) {
166  return getLane(laneID)->getEmissions<PollutantsInterface::CO2>();
167 }
168 
169 
170 double
171 Lane::getCOEmission(const std::string& laneID) {
172  return getLane(laneID)->getEmissions<PollutantsInterface::CO>();
173 }
174 
175 
176 double
177 Lane::getHCEmission(const std::string& laneID) {
178  return getLane(laneID)->getEmissions<PollutantsInterface::HC>();
179 }
180 
181 
182 double
183 Lane::getPMxEmission(const std::string& laneID) {
184  return getLane(laneID)->getEmissions<PollutantsInterface::PM_X>();
185 }
186 
187 
188 double
189 Lane::getNOxEmission(const std::string& laneID) {
190  return getLane(laneID)->getEmissions<PollutantsInterface::NO_X>();
191 }
192 
193 double
194 Lane::getFuelConsumption(const std::string& laneID) {
195  return getLane(laneID)->getEmissions<PollutantsInterface::FUEL>();
196 }
197 
198 
199 double
200 Lane::getNoiseEmission(const std::string& laneID) {
201  return getLane(laneID)->getHarmonoise_NoiseEmissions();
202 }
203 
204 
205 double
206 Lane::getElectricityConsumption(const std::string& laneID) {
207  return getLane(laneID)->getEmissions<PollutantsInterface::ELEC>();
208 }
209 
210 
211 double
212 Lane::getLastStepMeanSpeed(const std::string& laneID) {
213  return getLane(laneID)->getMeanSpeed();
214 }
215 
216 
217 double
218 Lane::getLastStepOccupancy(const std::string& laneID) {
219  return getLane(laneID)->getNettoOccupancy();
220 }
221 
222 
223 double
224 Lane::getLastStepLength(const std::string& laneID) {
225  const MSLane* lane = getLane(laneID);
226  double length = 0;
227  const MSLane::VehCont& vehs = lane->getVehiclesSecure();
228  for (MSLane::VehCont::const_iterator j = vehs.begin(); j != vehs.end(); ++j) {
229  length += (*j)->getVehicleType().getLength();
230  }
231  if (vehs.size() > 0) {
232  length = length / (double)vehs.size();
233  }
234  lane->releaseVehicles();
235  return length;
236 }
237 
238 
239 double
240 Lane::getWaitingTime(const std::string& laneID) {
241  return getLane(laneID)->getWaitingSeconds();
242 }
243 
244 
245 double
246 Lane::getTraveltime(const std::string& laneID) {
247  const MSLane* lane = getLane(laneID);
248  double meanSpeed = lane->getMeanSpeed();
249  if (meanSpeed != 0) {
250  return lane->getLength() / meanSpeed;
251  } else {
252  return 1000000.;
253  }
254 }
255 
256 
257 int
258 Lane::getLastStepVehicleNumber(const std::string& laneID) {
259  return (int)getLane(laneID)->getVehicleNumber();
260 }
261 
262 
263 int
264 Lane::getLastStepHaltingNumber(const std::string& laneID) {
265  const MSLane* lane = getLane(laneID);
266  int halting = 0;
267  const MSLane::VehCont& vehs = lane->getVehiclesSecure();
268  for (MSLane::VehCont::const_iterator j = vehs.begin(); j != vehs.end(); ++j) {
269  if ((*j)->getSpeed() < SUMO_const_haltingSpeed) {
270  ++halting;
271  }
272  }
273  lane->releaseVehicles();
274  return halting;
275 }
276 
277 
278 std::vector<std::string>
279 Lane::getLastStepVehicleIDs(const std::string& laneID) {
280  const MSLane* lane = getLane(laneID);
281  std::vector<std::string> vehIDs;
282  const MSLane::VehCont& vehs = lane->getVehiclesSecure();
283  for (MSLane::VehCont::const_iterator j = vehs.begin(); j != vehs.end(); ++j) {
284  vehIDs.push_back((*j)->getID());
285  }
286  lane->releaseVehicles();
287  return vehIDs;
288 }
289 
290 
291 std::vector<std::string>
292 Lane::getFoes(const std::string& laneID, const std::string& toLaneID) {
293  std::vector<std::string> foeIDs;
294  const MSLink* const link = getLane(laneID)->getLinkTo(getLane(toLaneID));
295  if (link == nullptr) {
296  throw TraCIException("No connection from lane '" + laneID + "' to lane '" + toLaneID + "'");
297  }
298  for (const MSLink* foe : link->getFoeLinks()) {
299  foeIDs.push_back(foe->getLaneBefore()->getID());
300  }
301  return foeIDs;
302 }
303 
304 
305 std::vector<std::string>
306 Lane::getInternalFoes(const std::string& laneID) {
307  const MSLane* lane = getLane(laneID);
308  const std::vector<const MSLane*>* foeLanes;
309  std::vector<const MSLane*>::const_iterator it;
310  std::vector<std::string> foeIDs;
311 
312  if ((lane->isInternal() || lane->isCrossing()) && lane->getLinkCont().size() > 0) {
313  MSLink* link = lane->getLinkCont().front();
314  foeLanes = &link->getFoeLanes();
315 
316  for (it = foeLanes->begin(); foeLanes->end() != it; ++it) {
317  foeIDs.push_back((*it)->getID());
318  }
319  }
320  return foeIDs;
321 }
322 
323 
324 const std::vector<std::string>
325 Lane::getPendingVehicles(const std::string& laneID) {
326  MSLane* const l = getLane(laneID); // validate laneID
327  std::vector<std::string> vehIDs;
328  for (const SUMOVehicle* veh : MSNet::getInstance()->getInsertionControl().getPendingVehicles()) {
329  if (veh->getLane() == l) {
330  vehIDs.push_back(veh->getID());
331  }
332  }
333  return vehIDs;
334 }
335 
336 
337 double
338 Lane::getAngle(const std::string& laneID, double relativePosition) {
339  double angle;
340  MSLane* lane = getLane(laneID);
341  if (relativePosition == libsumo::INVALID_DOUBLE_VALUE) {
342  Position start = lane->getShape().front();
343  Position end = lane->getShape().back();
344  angle = start.angleTo2D(end);
345  } else {
346  angle = lane->getShape().rotationAtOffset(lane->interpolateLanePosToGeometryPos(relativePosition));
347  }
348 
349  return GeomHelper::naviDegree(angle);
350 }
351 
352 
353 std::string
354 Lane::getBidiLane(const std::string& laneID) {
355  const MSLane* bidi = getLane(laneID)->getBidiLane();
356  return bidi == nullptr ? "" : bidi->getID();
357 }
358 
359 void
360 Lane::setAllowed(const std::string& laneID, std::string allowedClass) {
361  setAllowed(laneID, std::vector<std::string>({allowedClass}));
362 }
363 
364 
365 void
366 Lane::setAllowed(const std::string& laneID, std::vector<std::string> allowedClasses) {
367  MSLane* const l = getLane(laneID);
370 }
371 
372 
373 void
374 Lane::setDisallowed(const std::string& laneID, std::string disallowedClasses) {
375  setDisallowed(laneID, std::vector<std::string>({disallowedClasses}));
376 }
377 
378 
379 void
380 Lane::setDisallowed(const std::string& laneID, std::vector<std::string> disallowedClasses) {
381  MSLane* const l = getLane(laneID);
382  l->setPermissions(invertPermissions(parseVehicleClasses(disallowedClasses)), MSLane::CHANGE_PERMISSIONS_PERMANENT); // negation yields allowed
384 }
385 
386 
387 void
388 Lane::setChangePermissions(const std::string& laneID, std::vector<std::string> allowedClasses, const int direction) {
389  MSLane* const l = getLane(laneID);
390  if (direction == libsumo::LANECHANGE_LEFT) {
391  l->setChangeLeft(parseVehicleClasses(allowedClasses));
392  } else if (direction == libsumo::LANECHANGE_RIGHT) {
393  l->setChangeRight(parseVehicleClasses(allowedClasses));
394  } else {
395  throw TraCIException("Invalid direction for change permission (must be " + toString(libsumo::LANECHANGE_LEFT) + " or " + toString(libsumo::LANECHANGE_RIGHT));
396  }
397 }
398 
399 
400 void
401 Lane::setMaxSpeed(const std::string& laneID, double speed) {
402  getLane(laneID)->setMaxSpeed(speed, false, true);
403 }
404 
405 
406 void
407 Lane::setLength(const std::string& laneID, double length) {
408  getLane(laneID)->setLength(length);
409 }
410 
411 
412 void
413 Lane::setFriction(const std::string& laneID, double friction) {
414  getLane(laneID)->setFrictionCoefficient(friction);
415 }
416 
417 
418 std::string
419 Lane::getParameter(const std::string& laneID, const std::string& param) {
420  return getLane(laneID)->getParameter(param, "");
421 }
422 
423 
425 
426 
427 void
428 Lane::setParameter(const std::string& laneID, const std::string& key, const std::string& value) {
429  getLane(laneID)->setParameter(key, value);
430 }
431 
432 
434 
435 
436 MSLane*
437 Lane::getLane(const std::string& id) {
438  MSLane* const lane = MSLane::dictionary(id);
439  if (lane == nullptr) {
440  throw TraCIException("Lane '" + id + "' is not known");
441  }
442  return lane;
443 }
444 
445 
446 void
447 Lane::storeShape(const std::string& id, PositionVector& shape) {
448  shape = getLane(id)->getShape();
449 }
450 
451 
452 std::shared_ptr<VariableWrapper>
453 Lane::makeWrapper() {
454  return std::make_shared<Helper::SubscriptionWrapper>(handleVariable, mySubscriptionResults, myContextSubscriptionResults);
455 }
456 
457 
458 bool
459 Lane::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper, tcpip::Storage* paramData) {
460  switch (variable) {
461  case TRACI_ID_LIST:
462  return wrapper->wrapStringList(objID, variable, getIDList());
463  case ID_COUNT:
464  return wrapper->wrapInt(objID, variable, getIDCount());
465  case LANE_LINK_NUMBER:
466  return wrapper->wrapInt(objID, variable, getLinkNumber(objID));
467  case LANE_EDGE_ID:
468  return wrapper->wrapString(objID, variable, getEdgeID(objID));
469  case VAR_LENGTH:
470  return wrapper->wrapDouble(objID, variable, getLength(objID));
471  case VAR_MAXSPEED:
472  return wrapper->wrapDouble(objID, variable, getMaxSpeed(objID));
473  case VAR_FRICTION:
474  return wrapper->wrapDouble(objID, variable, getFriction(objID));
475  case LANE_ALLOWED:
476  return wrapper->wrapStringList(objID, variable, getAllowed(objID));
477  case LANE_DISALLOWED:
478  return wrapper->wrapStringList(objID, variable, getDisallowed(objID));
479  case LANE_CHANGES:
480  paramData->readUnsignedByte();
481  return wrapper->wrapStringList(objID, variable, getChangePermissions(objID, paramData->readByte()));
482  case VAR_CO2EMISSION:
483  return wrapper->wrapDouble(objID, variable, getCO2Emission(objID));
484  case VAR_COEMISSION:
485  return wrapper->wrapDouble(objID, variable, getCOEmission(objID));
486  case VAR_HCEMISSION:
487  return wrapper->wrapDouble(objID, variable, getHCEmission(objID));
488  case VAR_PMXEMISSION:
489  return wrapper->wrapDouble(objID, variable, getPMxEmission(objID));
490  case VAR_NOXEMISSION:
491  return wrapper->wrapDouble(objID, variable, getNOxEmission(objID));
492  case VAR_FUELCONSUMPTION:
493  return wrapper->wrapDouble(objID, variable, getFuelConsumption(objID));
494  case VAR_NOISEEMISSION:
495  return wrapper->wrapDouble(objID, variable, getNoiseEmission(objID));
497  return wrapper->wrapDouble(objID, variable, getElectricityConsumption(objID));
499  return wrapper->wrapInt(objID, variable, getLastStepVehicleNumber(objID));
501  return wrapper->wrapDouble(objID, variable, getLastStepMeanSpeed(objID));
503  return wrapper->wrapStringList(objID, variable, getLastStepVehicleIDs(objID));
504  case LAST_STEP_OCCUPANCY:
505  return wrapper->wrapDouble(objID, variable, getLastStepOccupancy(objID));
507  return wrapper->wrapInt(objID, variable, getLastStepHaltingNumber(objID));
508  case LAST_STEP_LENGTH:
509  return wrapper->wrapDouble(objID, variable, getLastStepLength(objID));
510  case VAR_WAITING_TIME:
511  return wrapper->wrapDouble(objID, variable, getWaitingTime(objID));
513  return wrapper->wrapDouble(objID, variable, getTraveltime(objID));
514  case VAR_WIDTH:
515  return wrapper->wrapDouble(objID, variable, getWidth(objID));
516  case VAR_SHAPE:
517  return wrapper->wrapPositionVector(objID, variable, getShape(objID));
519  return wrapper->wrapStringList(objID, variable, getPendingVehicles(objID));
520  case VAR_ANGLE:
521  paramData->readUnsignedByte();
522  return wrapper->wrapDouble(objID, variable, getAngle(objID, paramData->readDouble()));
523  case VAR_BIDI:
524  return wrapper->wrapString(objID, variable, getBidiLane(objID));
526  paramData->readUnsignedByte();
527  return wrapper->wrapString(objID, variable, getParameter(objID, paramData->readString()));
529  paramData->readUnsignedByte();
530  return wrapper->wrapStringPair(objID, variable, getParameterWithKey(objID, paramData->readString()));
531  default:
532  return false;
533  }
534 }
535 }
536 
537 
538 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
const SVCPermissions SVCAll
all VClasses are allowed
SVCPermissions invertPermissions(SVCPermissions permissions)
negate the given permissions and ensure that only relevant bits are set
const std::vector< std::string > & getVehicleClassNamesList(SVCPermissions permissions)
Returns the ids of the given classes, divided using a ' '.
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
T MIN2(T a, T b)
Definition: StdDefs.h:76
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
Definition: StdDefs.h:58
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
#define LIBSUMO_SUBSCRIPTION_IMPLEMENTATION(CLASS, DOM)
Definition: TraCIDefs.h:76
#define LIBSUMO_GET_PARAMETER_WITH_KEY_IMPLEMENTATION(CLASS)
Definition: TraCIDefs.h:123
static double naviDegree(const double angle)
Definition: GeomHelper.cpp:191
C++ TraCI client API implementation.
Definition: Lane.h:33
void rebuildAllowedLanes(const bool onInit=false)
Definition: MSEdge.cpp:322
Representation of a lane in the micro simulation.
Definition: MSLane.h:84
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
Definition: MSLane.h:716
static void insertIDs(std::vector< std::string > &into)
Adds the ids of all stored lanes into the given vector.
Definition: MSLane.cpp:2427
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
Definition: MSLane.h:475
void setChangeRight(SVCPermissions permissions)
Sets the permissions for changing to the right neighbour lane.
Definition: MSLane.cpp:4458
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
Definition: MSLane.h:584
std::vector< MSVehicle * > VehCont
Container for vehicles.
Definition: MSLane.h:119
static const long CHANGE_PERMISSIONS_PERMANENT
Definition: MSLane.h:1357
double getLength() const
Returns the lane's length.
Definition: MSLane.h:598
void setChangeLeft(SVCPermissions permissions)
Sets the permissions for changing to the left neighbour lane.
Definition: MSLane.cpp:4452
void setPermissions(SVCPermissions permissions, long long transientID)
Sets the permissions to the given value. If a transientID is given, the permissions are recored as te...
Definition: MSLane.cpp:4419
bool isCrossing() const
Definition: MSLane.cpp:2538
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition: MSLane.cpp:2395
bool isInternal() const
Definition: MSLane.cpp:2526
MSEdge & getEdge() const
Returns the lane's edge.
Definition: MSLane.h:756
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
Definition: MSLane.h:505
double interpolateLanePosToGeometryPos(double lanePos) const
Definition: MSLane.h:546
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
Definition: MSLane.cpp:4545
double getMeanSpeed() const
Returns the mean speed on this lane.
Definition: MSLane.cpp:3339
virtual const PositionVector & getShape(bool) const
Definition: MSLane.h:294
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:184
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition: MSNet.h:320
const std::string & getID() const
Returns the id.
Definition: Named.h:74
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
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...
Definition: Position.h:286
A list of positions.
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
static double getDefaultDecel(const SUMOVehicleClass vc=SVC_IGNORING)
Returns the default deceleration for the given vehicle class This needs to be a function because the ...
static const SUMOVTypeParameter & getDefault()
return the default parameters, this is a function due to the http://www.parashift....
Representation of a vehicle.
Definition: SUMOVehicle.h:62
static StringBijection< LinkState > LinkStates
link states
static StringBijection< LinkDirection > LinkDirections
link directions
const std::string & getString(const T key) const
virtual std::string readString()
Definition: storage.cpp:180
virtual int readUnsignedByte()
Definition: storage.cpp:155
virtual int readByte()
Definition: storage.cpp:128
virtual double readDouble()
Definition: storage.cpp:362
TRACI_CONST double INVALID_DOUBLE_VALUE
TRACI_CONST int LAST_STEP_VEHICLE_ID_LIST
TRACI_CONST int LAST_STEP_VEHICLE_NUMBER
TRACI_CONST int VAR_NOXEMISSION
TRACI_CONST int TRACI_ID_LIST
TRACI_CONST int VAR_WAITING_TIME
std::map< std::string, libsumo::SubscriptionResults > ContextSubscriptionResults
Definition: TraCIDefs.h:338
TRACI_CONST int LANE_LINK_NUMBER
TRACI_CONST int LANE_CHANGES
TRACI_CONST int LAST_STEP_LENGTH
TRACI_CONST int VAR_ANGLE
TRACI_CONST int LANE_EDGE_ID
TRACI_CONST int VAR_PMXEMISSION
TRACI_CONST int VAR_COEMISSION
TRACI_CONST int VAR_WIDTH
TRACI_CONST int VAR_MAXSPEED
TRACI_CONST int LAST_STEP_MEAN_SPEED
TRACI_CONST int VAR_CO2EMISSION
TRACI_CONST int LANECHANGE_RIGHT
TRACI_CONST int VAR_PENDING_VEHICLES
TRACI_CONST int VAR_FUELCONSUMPTION
std::map< std::string, libsumo::TraCIResults > SubscriptionResults
{object->{variable->value}}
Definition: TraCIDefs.h:337
TRACI_CONST int VAR_SHAPE
TRACI_CONST int LAST_STEP_VEHICLE_HALTING_NUMBER
TRACI_CONST int VAR_LENGTH
TRACI_CONST int VAR_HCEMISSION
TRACI_CONST int ID_COUNT
TRACI_CONST int VAR_PARAMETER
TRACI_CONST int LANECHANGE_LEFT
TRACI_CONST int LAST_STEP_OCCUPANCY
TRACI_CONST int VAR_BIDI
TRACI_CONST int VAR_NOISEEMISSION
TRACI_CONST int LANE_DISALLOWED
TRACI_CONST int VAR_PARAMETER_WITH_KEY
TRACI_CONST int VAR_FRICTION
TRACI_CONST int VAR_CURRENT_TRAVELTIME
TRACI_CONST int LANE_ALLOWED
TRACI_CONST int VAR_ELECTRICITYCONSUMPTION