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 void
354 Lane::setAllowed(const std::string& laneID, std::string allowedClass) {
355  setAllowed(laneID, std::vector<std::string>({allowedClass}));
356 }
357 
358 
359 void
360 Lane::setAllowed(const std::string& laneID, std::vector<std::string> allowedClasses) {
361  MSLane* const l = getLane(laneID);
364 }
365 
366 
367 void
368 Lane::setDisallowed(const std::string& laneID, std::string disallowedClasses) {
369  setDisallowed(laneID, std::vector<std::string>({disallowedClasses}));
370 }
371 
372 
373 void
374 Lane::setDisallowed(const std::string& laneID, std::vector<std::string> disallowedClasses) {
375  MSLane* const l = getLane(laneID);
376  l->setPermissions(invertPermissions(parseVehicleClasses(disallowedClasses)), MSLane::CHANGE_PERMISSIONS_PERMANENT); // negation yields allowed
378 }
379 
380 
381 void
382 Lane::setChangePermissions(const std::string& laneID, std::vector<std::string> allowedClasses, const int direction) {
383  MSLane* const l = getLane(laneID);
384  if (direction == libsumo::LANECHANGE_LEFT) {
385  l->setChangeLeft(parseVehicleClasses(allowedClasses));
386  } else if (direction == libsumo::LANECHANGE_RIGHT) {
387  l->setChangeRight(parseVehicleClasses(allowedClasses));
388  } else {
389  throw TraCIException("Invalid direction for change permission (must be " + toString(libsumo::LANECHANGE_LEFT) + " or " + toString(libsumo::LANECHANGE_RIGHT));
390  }
391 }
392 
393 
394 void
395 Lane::setMaxSpeed(const std::string& laneID, double speed) {
396  getLane(laneID)->setMaxSpeed(speed, false, true);
397 }
398 
399 
400 void
401 Lane::setLength(const std::string& laneID, double length) {
402  getLane(laneID)->setLength(length);
403 }
404 
405 
406 void
407 Lane::setFriction(const std::string& laneID, double friction) {
408  getLane(laneID)->setFrictionCoefficient(friction);
409 }
410 
411 
412 std::string
413 Lane::getParameter(const std::string& laneID, const std::string& param) {
414  return getLane(laneID)->getParameter(param, "");
415 }
416 
417 
419 
420 
421 void
422 Lane::setParameter(const std::string& laneID, const std::string& key, const std::string& value) {
423  getLane(laneID)->setParameter(key, value);
424 }
425 
426 
428 
429 
430 MSLane*
431 Lane::getLane(const std::string& id) {
432  MSLane* const lane = MSLane::dictionary(id);
433  if (lane == nullptr) {
434  throw TraCIException("Lane '" + id + "' is not known");
435  }
436  return lane;
437 }
438 
439 
440 void
441 Lane::storeShape(const std::string& id, PositionVector& shape) {
442  shape = getLane(id)->getShape();
443 }
444 
445 
446 std::shared_ptr<VariableWrapper>
447 Lane::makeWrapper() {
448  return std::make_shared<Helper::SubscriptionWrapper>(handleVariable, mySubscriptionResults, myContextSubscriptionResults);
449 }
450 
451 
452 bool
453 Lane::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper, tcpip::Storage* paramData) {
454  switch (variable) {
455  case TRACI_ID_LIST:
456  return wrapper->wrapStringList(objID, variable, getIDList());
457  case ID_COUNT:
458  return wrapper->wrapInt(objID, variable, getIDCount());
459  case LANE_LINK_NUMBER:
460  return wrapper->wrapInt(objID, variable, getLinkNumber(objID));
461  case LANE_EDGE_ID:
462  return wrapper->wrapString(objID, variable, getEdgeID(objID));
463  case VAR_LENGTH:
464  return wrapper->wrapDouble(objID, variable, getLength(objID));
465  case VAR_MAXSPEED:
466  return wrapper->wrapDouble(objID, variable, getMaxSpeed(objID));
467  case VAR_FRICTION:
468  return wrapper->wrapDouble(objID, variable, getFriction(objID));
469  case LANE_ALLOWED:
470  return wrapper->wrapStringList(objID, variable, getAllowed(objID));
471  case LANE_DISALLOWED:
472  return wrapper->wrapStringList(objID, variable, getDisallowed(objID));
473  case LANE_CHANGES:
474  paramData->readUnsignedByte();
475  return wrapper->wrapStringList(objID, variable, getChangePermissions(objID, paramData->readByte()));
476  case VAR_CO2EMISSION:
477  return wrapper->wrapDouble(objID, variable, getCO2Emission(objID));
478  case VAR_COEMISSION:
479  return wrapper->wrapDouble(objID, variable, getCOEmission(objID));
480  case VAR_HCEMISSION:
481  return wrapper->wrapDouble(objID, variable, getHCEmission(objID));
482  case VAR_PMXEMISSION:
483  return wrapper->wrapDouble(objID, variable, getPMxEmission(objID));
484  case VAR_NOXEMISSION:
485  return wrapper->wrapDouble(objID, variable, getNOxEmission(objID));
486  case VAR_FUELCONSUMPTION:
487  return wrapper->wrapDouble(objID, variable, getFuelConsumption(objID));
488  case VAR_NOISEEMISSION:
489  return wrapper->wrapDouble(objID, variable, getNoiseEmission(objID));
491  return wrapper->wrapDouble(objID, variable, getElectricityConsumption(objID));
493  return wrapper->wrapInt(objID, variable, getLastStepVehicleNumber(objID));
495  return wrapper->wrapDouble(objID, variable, getLastStepMeanSpeed(objID));
497  return wrapper->wrapStringList(objID, variable, getLastStepVehicleIDs(objID));
498  case LAST_STEP_OCCUPANCY:
499  return wrapper->wrapDouble(objID, variable, getLastStepOccupancy(objID));
501  return wrapper->wrapInt(objID, variable, getLastStepHaltingNumber(objID));
502  case LAST_STEP_LENGTH:
503  return wrapper->wrapDouble(objID, variable, getLastStepLength(objID));
504  case VAR_WAITING_TIME:
505  return wrapper->wrapDouble(objID, variable, getWaitingTime(objID));
507  return wrapper->wrapDouble(objID, variable, getTraveltime(objID));
508  case VAR_WIDTH:
509  return wrapper->wrapDouble(objID, variable, getWidth(objID));
510  case VAR_SHAPE:
511  return wrapper->wrapPositionVector(objID, variable, getShape(objID));
513  return wrapper->wrapStringList(objID, variable, getPendingVehicles(objID));
514  case VAR_ANGLE:
515  paramData->readUnsignedByte();
516  return wrapper->wrapDouble(objID, variable, getAngle(objID, paramData->readDouble()));
518  paramData->readUnsignedByte();
519  return wrapper->wrapString(objID, variable, getParameter(objID, paramData->readString()));
521  paramData->readUnsignedByte();
522  return wrapper->wrapStringPair(objID, variable, getParameterWithKey(objID, paramData->readString()));
523  default:
524  return false;
525  }
526 }
527 }
528 
529 
530 /****************************************************************************/
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:317
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:712
static void insertIDs(std::vector< std::string > &into)
Adds the ids of all stored lanes into the given vector.
Definition: MSLane.cpp:2387
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:4407
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:1351
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:4401
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:4368
bool isCrossing() const
Definition: MSLane.cpp:2498
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition: MSLane.cpp:2355
bool isInternal() const
Definition: MSLane.cpp:2486
MSEdge & getEdge() const
Returns the lane's edge.
Definition: MSLane.h:752
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
double getMeanSpeed() const
Returns the mean speed on this lane.
Definition: MSLane.cpp:3288
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:182
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition: MSNet.h:320
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:281
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:60
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_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