Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
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-2026 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>
34#include <libsumo/Helper.h>
37#include "Lane.h"
38
39
40namespace libsumo {
41// ===========================================================================
42// static member initializations
43// ===========================================================================
44SubscriptionResults Lane::mySubscriptionResults;
45ContextSubscriptionResults Lane::myContextSubscriptionResults;
46
47
48// ===========================================================================
49// static member definitions
50// ===========================================================================
51std::vector<std::string>
52Lane::getIDList() {
53 MSNet::getInstance(); // just to check that we actually have a network
54 std::vector<std::string> ids;
56 return ids;
57}
58
59
60int
61Lane::getIDCount() {
62 return (int)getIDList().size();
63}
64
65
66std::string
67Lane::getEdgeID(const std::string& laneID) {
68 return getLane(laneID)->getEdge().getID();
69}
70
71
72double
73Lane::getLength(const std::string& laneID) {
74 return getLane(laneID)->getLength();
75}
76
77
78double
79Lane::getMaxSpeed(const std::string& laneID) {
80 return getLane(laneID)->getSpeedLimit();
81}
82
83double
84Lane::getFriction(const std::string& laneID) {
85 return getLane(laneID)->getFrictionCoefficient();
86}
87
88int
89Lane::getLinkNumber(const std::string& laneID) {
90 return (int)getLane(laneID)->getLinkCont().size();
91}
92
93
94std::vector<TraCIConnection>
95Lane::getLinks(const std::string& laneID) {
96 std::vector<TraCIConnection> v;
97 const MSLane* const lane = getLane(laneID);
99 for (const MSLink* const link : lane->getLinkCont()) {
100 const std::string approachedLane = link->getLane() != nullptr ? link->getLane()->getID() : "";
101 const bool hasPrio = link->havePriority();
102 const double speed = MIN2(lane->getSpeedLimit(), link->getLane()->getSpeedLimit());
103 const bool isOpen = link->opened(currTime, speed, speed, SUMOVTypeParameter::getDefault().length,
105 const bool hasFoe = link->hasApproachingFoe(currTime, currTime, 0, SUMOVTypeParameter::getDefaultDecel());
106 const std::string approachedInternal = link->getViaLane() != nullptr ? link->getViaLane()->getID() : "";
107 const std::string state = SUMOXMLDefinitions::LinkStates.getString(link->getState());
108 const std::string direction = SUMOXMLDefinitions::LinkDirections.getString(link->getDirection());
109 const double length = link->getLength();
110 v.push_back(TraCIConnection(approachedLane, hasPrio, isOpen, hasFoe, approachedInternal, state, direction, length));
111 }
112 return v;
113}
114
115
116std::vector<std::string>
117Lane::getAllowed(const std::string& laneID) {
118 return getVehicleClassNamesList(getLane(laneID)->getPermissions());
119}
120
121
122std::vector<std::string>
123Lane::getDisallowed(const std::string& laneID) {
124 return getVehicleClassNamesList(invertPermissions((getLane(laneID)->getPermissions()))); // negation yields disallowed
125}
126
127
128std::vector<std::string>
129Lane::getChangePermissions(const std::string& laneID, const int direction) {
130 if (direction == libsumo::LANECHANGE_LEFT) {
131 return getVehicleClassNamesList(getLane(laneID)->getChangeLeft());
132 } else if (direction == libsumo::LANECHANGE_RIGHT) {
133 return getVehicleClassNamesList(getLane(laneID)->getChangeRight());
134 } else {
135 throw TraCIException("Invalid direction for change permission (must be " + toString(libsumo::LANECHANGE_LEFT) + " or " + toString(libsumo::LANECHANGE_RIGHT));
136 }
137}
138
139
140TraCIPositionVector
141Lane::getShape(const std::string& laneID) {
142 TraCIPositionVector pv;
143 const PositionVector& shp = getLane(laneID)->getShape();
144 for (PositionVector::const_iterator pi = shp.begin(); pi != shp.end(); ++pi) {
145 TraCIPosition p;
146 p.x = pi->x();
147 p.y = pi->y();
148 p.z = pi->z();
149 pv.value.push_back(p);
150 }
151 return pv;
152}
153
154
155double
156Lane::getWidth(const std::string& laneID) {
157 return getLane(laneID)->getWidth();
158}
159
160
161double
162Lane::getCO2Emission(const std::string& laneID) {
163 return getLane(laneID)->getEmissions<PollutantsInterface::CO2>();
164}
165
166
167double
168Lane::getCOEmission(const std::string& laneID) {
169 return getLane(laneID)->getEmissions<PollutantsInterface::CO>();
170}
171
172
173double
174Lane::getHCEmission(const std::string& laneID) {
175 return getLane(laneID)->getEmissions<PollutantsInterface::HC>();
176}
177
178
179double
180Lane::getPMxEmission(const std::string& laneID) {
181 return getLane(laneID)->getEmissions<PollutantsInterface::PM_X>();
182}
183
184
185double
186Lane::getNOxEmission(const std::string& laneID) {
187 return getLane(laneID)->getEmissions<PollutantsInterface::NO_X>();
188}
189
190double
191Lane::getFuelConsumption(const std::string& laneID) {
192 return getLane(laneID)->getEmissions<PollutantsInterface::FUEL>();
193}
194
195
196double
197Lane::getNoiseEmission(const std::string& laneID) {
198 return getLane(laneID)->getHarmonoise_NoiseEmissions();
199}
200
201
202double
203Lane::getElectricityConsumption(const std::string& laneID) {
204 return getLane(laneID)->getEmissions<PollutantsInterface::ELEC>();
205}
206
207
208double
209Lane::getLastStepMeanSpeed(const std::string& laneID) {
210 return getLane(laneID)->getMeanSpeed();
211}
212
213
214double
215Lane::getLastStepOccupancy(const std::string& laneID) {
216 return getLane(laneID)->getNettoOccupancy();
217}
218
219
220double
221Lane::getLastStepLength(const std::string& laneID) {
222 const MSLane* lane = getLane(laneID);
223 double length = 0;
224 const MSLane::VehCont& vehs = lane->getVehiclesSecure();
225 for (MSLane::VehCont::const_iterator j = vehs.begin(); j != vehs.end(); ++j) {
226 length += (*j)->getVehicleType().getLength();
227 }
228 if (vehs.size() > 0) {
229 length = length / (double)vehs.size();
230 }
231 lane->releaseVehicles();
232 return length;
233}
234
235
236double
237Lane::getWaitingTime(const std::string& laneID) {
238 return getLane(laneID)->getWaitingSeconds();
239}
240
241
242double
243Lane::getTraveltime(const std::string& laneID) {
244 const MSLane* lane = getLane(laneID);
245 double meanSpeed = lane->getMeanSpeed();
246 if (meanSpeed != 0) {
247 return lane->getLength() / meanSpeed;
248 } else {
249 return 1000000.;
250 }
251}
252
253
254int
255Lane::getLastStepVehicleNumber(const std::string& laneID) {
256 return (int)getLane(laneID)->getVehicleNumber();
257}
258
259
260int
261Lane::getLastStepHaltingNumber(const std::string& laneID) {
262 const MSLane* lane = getLane(laneID);
263 int halting = 0;
264 const MSLane::VehCont& vehs = lane->getVehiclesSecure();
265 for (MSLane::VehCont::const_iterator j = vehs.begin(); j != vehs.end(); ++j) {
266 if ((*j)->getSpeed() < SUMO_const_haltingSpeed) {
267 ++halting;
268 }
269 }
270 lane->releaseVehicles();
271 return halting;
272}
273
274
275std::vector<std::string>
276Lane::getLastStepVehicleIDs(const std::string& laneID) {
277 const MSLane* lane = getLane(laneID);
278 std::vector<std::string> vehIDs;
279 const MSLane::VehCont& vehs = lane->getVehiclesSecure();
280 for (MSLane::VehCont::const_iterator j = vehs.begin(); j != vehs.end(); ++j) {
281 vehIDs.push_back((*j)->getID());
282 }
283 lane->releaseVehicles();
284 return vehIDs;
285}
286
287
288std::vector<std::string>
289Lane::getFoes(const std::string& laneID, const std::string& toLaneID) {
290 if (toLaneID == "") {
291 return getInternalFoes(laneID);
292 }
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
305std::vector<std::string>
306Lane::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
324const std::vector<std::string>
325Lane::getPendingVehicles(const std::string& laneID) {
326 MSLane* const l = getLane(laneID); // validate laneID
327 std::vector<std::string> vehIDs;
329 if (veh->getLane() == l) {
330 vehIDs.push_back(veh->getID());
331 }
332 }
333 return vehIDs;
334}
335
336
337double
338Lane::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
353std::string
354Lane::getBidiLane(const std::string& laneID) {
355 const MSLane* bidi = getLane(laneID)->getBidiLane();
356 return bidi == nullptr ? "" : bidi->getID();
357}
358
359void
360Lane::setAllowed(const std::string& laneID, std::string allowedClass) {
361 setAllowed(laneID, std::vector<std::string>({allowedClass}));
362}
363
364
365void
366Lane::setAllowed(const std::string& laneID, std::vector<std::string> allowedClasses) {
367 MSLane* const l = getLane(laneID);
369 l->getEdge().rebuildAllowedLanes(false, true);
370}
371
372
373void
374Lane::setDisallowed(const std::string& laneID, std::string disallowedClasses) {
375 setDisallowed(laneID, std::vector<std::string>({disallowedClasses}));
376}
377
378
379void
380Lane::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
383 l->getEdge().rebuildAllowedLanes(false, true);
384}
385
386
387void
388Lane::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
400void
401Lane::setMaxSpeed(const std::string& laneID, double speed) {
402 getLane(laneID)->setMaxSpeed(speed, false, true);
403}
404
405
406void
407Lane::setLength(const std::string& laneID, double length) {
408 getLane(laneID)->setLength(length);
409}
410
411
412void
413Lane::setFriction(const std::string& laneID, double friction) {
414 getLane(laneID)->setFrictionCoefficient(friction);
415}
416
417
418std::string
419Lane::getParameter(const std::string& laneID, const std::string& param) {
420 return getLane(laneID)->getParameter(param, "");
421}
422
423
425
426
427void
428Lane::setParameter(const std::string& laneID, const std::string& key, const std::string& value) {
429 getLane(laneID)->setParameter(key, value);
430}
431
432
434
435
436MSLane*
437Lane::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
446void
447Lane::storeShape(const std::string& id, PositionVector& shape) {
448 shape = getLane(id)->getShape();
449}
450
451
452std::shared_ptr<VariableWrapper>
453Lane::makeWrapper() {
454 return std::make_shared<Helper::SubscriptionWrapper>(handleVariable, mySubscriptionResults, myContextSubscriptionResults);
455}
456
457
458bool
459Lane::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 return wrapper->wrapStringList(objID, variable, getChangePermissions(objID, StoHelp::readTypedByte(*paramData)));
481 case VAR_CO2EMISSION:
482 return wrapper->wrapDouble(objID, variable, getCO2Emission(objID));
483 case VAR_COEMISSION:
484 return wrapper->wrapDouble(objID, variable, getCOEmission(objID));
485 case VAR_HCEMISSION:
486 return wrapper->wrapDouble(objID, variable, getHCEmission(objID));
487 case VAR_PMXEMISSION:
488 return wrapper->wrapDouble(objID, variable, getPMxEmission(objID));
489 case VAR_NOXEMISSION:
490 return wrapper->wrapDouble(objID, variable, getNOxEmission(objID));
492 return wrapper->wrapDouble(objID, variable, getFuelConsumption(objID));
494 return wrapper->wrapDouble(objID, variable, getNoiseEmission(objID));
496 return wrapper->wrapDouble(objID, variable, getElectricityConsumption(objID));
498 return wrapper->wrapInt(objID, variable, getLastStepVehicleNumber(objID));
500 return wrapper->wrapDouble(objID, variable, getLastStepMeanSpeed(objID));
502 return wrapper->wrapStringList(objID, variable, getLastStepVehicleIDs(objID));
504 return wrapper->wrapDouble(objID, variable, getLastStepOccupancy(objID));
506 return wrapper->wrapInt(objID, variable, getLastStepHaltingNumber(objID));
507 case LAST_STEP_LENGTH:
508 return wrapper->wrapDouble(objID, variable, getLastStepLength(objID));
509 case VAR_WAITING_TIME:
510 return wrapper->wrapDouble(objID, variable, getWaitingTime(objID));
512 return wrapper->wrapDouble(objID, variable, getTraveltime(objID));
513 case VAR_WIDTH:
514 return wrapper->wrapDouble(objID, variable, getWidth(objID));
515 case VAR_SHAPE:
516 return wrapper->wrapPositionVector(objID, variable, getShape(objID));
518 return wrapper->wrapStringList(objID, variable, getPendingVehicles(objID));
519 case VAR_ANGLE:
520 return wrapper->wrapDouble(objID, variable, getAngle(objID, StoHelp::readTypedDouble(*paramData)));
521 case VAR_BIDI:
522 return wrapper->wrapString(objID, variable, getBidiLane(objID));
523 case VAR_FOES:
524 return wrapper->wrapStringList(objID, variable, getFoes(objID, StoHelp::readTypedString(*paramData)));
525 case LANE_LINKS:
526 return wrapper->wrapConnectionVector(objID, variable, getLinks(objID));
527 case VAR_PARAMETER:
528 return wrapper->wrapString(objID, variable, getParameter(objID, StoHelp::readTypedString(*paramData)));
530 return wrapper->wrapStringPair(objID, variable, getParameterWithKey(objID, StoHelp::readTypedString(*paramData)));
531 default:
532 return false;
533 }
534}
535}
536
537
538/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
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...
T MIN2(T a, T b)
Definition StdDefs.h:80
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
Definition StdDefs.h:62
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
#define LIBSUMO_SUBSCRIPTION_IMPLEMENTATION(CLASS, DOM)
Definition TraCIDefs.h:77
#define LIBSUMO_GET_PARAMETER_WITH_KEY_IMPLEMENTATION(CLASS)
Definition TraCIDefs.h:124
static double naviDegree(const double angle)
C++ TraCI client API implementation.
void rebuildAllowedLanes(const bool onInit=false, bool updateVehicles=false)
Definition MSEdge.cpp:323
const MSVehicleContainer::VehicleVector & getPendingVehicles() const
retrieve vehicles waiting for insertion
Representation of a lane in the micro simulation.
Definition MSLane.h:84
static void insertIDs(std::vector< std::string > &into)
Adds the ids of all stored lanes into the given vector.
Definition MSLane.cpp:2553
void setChangeRight(SVCPermissions permissions)
Sets the permissions for changing to the right neighbour lane.
Definition MSLane.cpp:4601
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
Definition MSLane.h:602
std::vector< MSVehicle * > VehCont
Container for vehicles.
Definition MSLane.h:119
static const long CHANGE_PERMISSIONS_PERMANENT
Definition MSLane.h:1405
double getLength() const
Returns the lane's length.
Definition MSLane.h:632
void setChangeLeft(SVCPermissions permissions)
Sets the permissions for changing to the left neighbour lane.
Definition MSLane.cpp:4595
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:4562
bool isCrossing() const
Definition MSLane.cpp:2664
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition MSLane.cpp:2521
bool isInternal() const
Definition MSLane.cpp:2652
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
Definition MSLane.h:484
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
Definition MSLane.h:514
double interpolateLanePosToGeometryPos(double lanePos) const
Definition MSLane.h:555
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
Definition MSLane.cpp:4719
virtual const PositionVector & getShape(bool) const
Definition MSLane.h:294
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:790
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
Definition MSLane.h:750
double getMeanSpeed() const
Returns the mean speed on this lane.
Definition MSLane.cpp:3477
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:199
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
MSInsertionControl & getInsertionControl()
Returns the insertion control.
Definition MSNet.h:455
const std::string & getID() const
Returns the id.
Definition Named.h:73
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:283
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:63
static StringBijection< LinkState > LinkStates
link states
static StringBijection< LinkDirection > LinkDirections
link directions
const std::string & getString(const T key) const
get string
static int readTypedByte(tcpip::Storage &ret, const std::string &error="")
static std::string readTypedString(tcpip::Storage &ret, const std::string &error="")
static double readTypedDouble(tcpip::Storage &ret, const std::string &error="")
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 LANE_LINKS
TRACI_CONST int TRACI_ID_LIST
TRACI_CONST int VAR_WAITING_TIME
std::map< std::string, libsumo::SubscriptionResults > ContextSubscriptionResults
Definition TraCIDefs.h:379
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:378
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 VAR_FOES
TRACI_CONST int LANE_ALLOWED
TRACI_CONST int VAR_ELECTRICITYCONSUMPTION