Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
libsumo/Vehicle.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2012-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/****************************************************************************/
19// C++ Vehicle API
20/****************************************************************************/
21#include <config.h>
22
35#include <microsim/MSStop.h>
36#include <microsim/MSVehicle.h>
41#include <microsim/MSNet.h>
42#include <microsim/MSEdge.h>
43#include <microsim/MSLane.h>
48#include <mesosim/MEVehicle.h>
50#include <libsumo/TraCIDefs.h>
52#include "Helper.h"
53#include "Route.h"
54#include "Polygon.h"
55#include "Vehicle.h"
56
57#define CALL_MICRO_FUN(veh, fun, mesoResult) ((dynamic_cast<MSVehicle*>(veh) == nullptr ? (mesoResult) : dynamic_cast<MSVehicle*>(veh)->fun))
58#define CALL_MESO_FUN(veh, fun, microResult) ((dynamic_cast<MEVehicle*>(veh) == nullptr ? (microResult) : dynamic_cast<MEVehicle*>(veh)->fun))
59
60// ===========================================================================
61// debug defines
62// ===========================================================================
63//#define DEBUG_NEIGHBORS
64//#define DEBUG_DYNAMIC_SHAPES
65//#define DEBUG_MOVEXY
66#define DEBUG_COND (veh->isSelected())
67
68
69
70namespace libsumo {
71// ===========================================================================
72// static member initializations
73// ===========================================================================
74SubscriptionResults Vehicle::mySubscriptionResults;
75ContextSubscriptionResults Vehicle::myContextSubscriptionResults;
76
77
78// ===========================================================================
79// static member definitions
80// ===========================================================================
81bool
82Vehicle::isVisible(const SUMOVehicle* veh) {
83 return veh->isOnRoad() || veh->isParking() || veh->wasRemoteControlled();
84}
85
86
87bool
88Vehicle::isOnInit(const std::string& vehID) {
90 return sumoVehicle == nullptr || sumoVehicle->getLane() == nullptr;
91}
92
93
94std::vector<std::string>
95Vehicle::getIDList() {
96 std::vector<std::string> ids;
98 for (MSVehicleControl::constVehIt i = c.loadedVehBegin(); i != c.loadedVehEnd(); ++i) {
99 if (isVisible((*i).second)) {
100 ids.push_back((*i).first);
101 }
102 }
103 return ids;
104}
105
106int
107Vehicle::getIDCount() {
108 return (int)getIDList().size();
109}
110
111
112double
113Vehicle::getSpeed(const std::string& vehID) {
114 MSBaseVehicle* veh = Helper::getVehicle(vehID);
115 return isVisible(veh) ? veh->getSpeed() : INVALID_DOUBLE_VALUE;
116}
117
118double
119Vehicle::getLateralSpeed(const std::string& vehID) {
120 MSBaseVehicle* veh = Helper::getVehicle(vehID);
121 return isVisible(veh) ? CALL_MICRO_FUN(veh, getLaneChangeModel().getSpeedLat(), 0) : INVALID_DOUBLE_VALUE;
122}
123
124
125double
126Vehicle::getAcceleration(const std::string& vehID) {
127 MSBaseVehicle* veh = Helper::getVehicle(vehID);
128 return isVisible(veh) ? CALL_MICRO_FUN(veh, getAcceleration(), 0) : INVALID_DOUBLE_VALUE;
129}
130
131
132double
133Vehicle::getSpeedWithoutTraCI(const std::string& vehID) {
134 MSBaseVehicle* veh = Helper::getVehicle(vehID);
135 return isVisible(veh) ? CALL_MICRO_FUN(veh, getSpeedWithoutTraciInfluence(), veh->getSpeed()) : INVALID_DOUBLE_VALUE;
136}
137
138
139TraCIPosition
140Vehicle::getPosition(const std::string& vehID, const bool includeZ) {
141 MSBaseVehicle* veh = Helper::getVehicle(vehID);
142 if (isVisible(veh)) {
143 return Helper::makeTraCIPosition(veh->getPosition(), includeZ);
144 }
145 return TraCIPosition();
146}
147
148
149TraCIPosition
150Vehicle::getPosition3D(const std::string& vehID) {
151 return getPosition(vehID, true);
152}
153
154
155double
156Vehicle::getAngle(const std::string& vehID) {
157 MSBaseVehicle* veh = Helper::getVehicle(vehID);
158 return isVisible(veh) ? GeomHelper::naviDegree(veh->getAngle()) : INVALID_DOUBLE_VALUE;
159}
160
161
162double
163Vehicle::getSlope(const std::string& vehID) {
164 MSBaseVehicle* veh = Helper::getVehicle(vehID);
165 return (veh->isOnRoad() || veh->isParking()) ? veh->getSlope() : INVALID_DOUBLE_VALUE;
166}
167
168
169std::string
170Vehicle::getRoadID(const std::string& vehID) {
171 MSBaseVehicle* veh = Helper::getVehicle(vehID);
172 return isVisible(veh) ? CALL_MICRO_FUN(veh, getLane()->getEdge().getID(), veh->getEdge()->getID()) : "";
173}
174
175
176std::string
177Vehicle::getLaneID(const std::string& vehID) {
178 MSBaseVehicle* veh = Helper::getVehicle(vehID);
179 return veh->isOnRoad() ? CALL_MICRO_FUN(veh, getLane()->getID(), "") : "";
180}
181
182
183int
184Vehicle::getLaneIndex(const std::string& vehID) {
185 MSBaseVehicle* veh = Helper::getVehicle(vehID);
186 if (veh->isOnRoad()) {
187 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
188 if (microVeh != nullptr) {
189 return microVeh->getLane()->getIndex();
190 } else {
191 MEVehicle* mesoVeh = dynamic_cast<MEVehicle*>(veh);
192 return mesoVeh->getQueIndex();
193 }
194 } else {
195 return INVALID_INT_VALUE;
196 }
197}
198
199std::string
200Vehicle::getSegmentID(const std::string& vehID) {
201 MSBaseVehicle* veh = Helper::getVehicle(vehID);
202 return veh->isOnRoad() ? CALL_MESO_FUN(veh, getSegment()->getID(), "") : "";
203}
204
205int
206Vehicle::getSegmentIndex(const std::string& vehID) {
207 MSBaseVehicle* veh = Helper::getVehicle(vehID);
208 return veh->isOnRoad() ? CALL_MESO_FUN(veh, getSegment()->getIndex(), INVALID_INT_VALUE) : INVALID_INT_VALUE;
209}
210
211std::string
212Vehicle::getTypeID(const std::string& vehID) {
213 return Helper::getVehicleType(vehID).getID();
214}
215
216
217std::string
218Vehicle::getRouteID(const std::string& vehID) {
219 return Helper::getVehicle(vehID)->getRoute().getID();
220}
221
222
223double
224Vehicle::getDeparture(const std::string& vehID) {
225 MSBaseVehicle* veh = Helper::getVehicle(vehID);
227}
228
229
230double
231Vehicle::getDepartDelay(const std::string& vehID) {
232 return STEPS2TIME(Helper::getVehicle(vehID)->getDepartDelay());
233}
234
235
236int
237Vehicle::getRouteIndex(const std::string& vehID) {
238 MSBaseVehicle* veh = Helper::getVehicle(vehID);
239 return veh->hasDeparted() ? veh->getRoutePosition() : INVALID_INT_VALUE;
240}
241
242
243TraCIColor
244Vehicle::getColor(const std::string& vehID) {
245 return Helper::makeTraCIColor(Helper::getVehicle(vehID)->getParameter().color);
246}
247
248double
249Vehicle::getLanePosition(const std::string& vehID) {
250 MSBaseVehicle* veh = Helper::getVehicle(vehID);
251 return (veh->isOnRoad() || veh->isParking()) ? veh->getPositionOnLane() : INVALID_DOUBLE_VALUE;
252}
253
254double
255Vehicle::getLateralLanePosition(const std::string& vehID) {
256 MSBaseVehicle* veh = Helper::getVehicle(vehID);
257 return veh->isOnRoad() ? CALL_MICRO_FUN(veh, getLateralPositionOnLane(), 0) : INVALID_DOUBLE_VALUE;
258}
259
260double
261Vehicle::getCO2Emission(const std::string& vehID) {
262 MSBaseVehicle* veh = Helper::getVehicle(vehID);
263 return isVisible(veh) ? veh->getEmissions<PollutantsInterface::CO2>() : INVALID_DOUBLE_VALUE;
264}
265
266double
267Vehicle::getCOEmission(const std::string& vehID) {
268 MSBaseVehicle* veh = Helper::getVehicle(vehID);
269 return isVisible(veh) ? veh->getEmissions<PollutantsInterface::CO>() : INVALID_DOUBLE_VALUE;
270}
271
272double
273Vehicle::getHCEmission(const std::string& vehID) {
274 MSBaseVehicle* veh = Helper::getVehicle(vehID);
275 return isVisible(veh) ? veh->getEmissions<PollutantsInterface::HC>() : INVALID_DOUBLE_VALUE;
276}
277
278double
279Vehicle::getPMxEmission(const std::string& vehID) {
280 MSBaseVehicle* veh = Helper::getVehicle(vehID);
281 return isVisible(veh) ? veh->getEmissions<PollutantsInterface::PM_X>() : INVALID_DOUBLE_VALUE;
282}
283
284double
285Vehicle::getNOxEmission(const std::string& vehID) {
286 MSBaseVehicle* veh = Helper::getVehicle(vehID);
287 return isVisible(veh) ? veh->getEmissions<PollutantsInterface::NO_X>() : INVALID_DOUBLE_VALUE;
288}
289
290double
291Vehicle::getFuelConsumption(const std::string& vehID) {
292 MSBaseVehicle* veh = Helper::getVehicle(vehID);
293 return isVisible(veh) ? veh->getEmissions<PollutantsInterface::FUEL>() : INVALID_DOUBLE_VALUE;
294}
295
296double
297Vehicle::getNoiseEmission(const std::string& vehID) {
298 MSBaseVehicle* veh = Helper::getVehicle(vehID);
299 return isVisible(veh) ? veh->getHarmonoise_NoiseEmissions() : INVALID_DOUBLE_VALUE;
300}
301
302double
303Vehicle::getElectricityConsumption(const std::string& vehID) {
304 MSBaseVehicle* veh = Helper::getVehicle(vehID);
305 return isVisible(veh) ? veh->getEmissions<PollutantsInterface::ELEC>() : INVALID_DOUBLE_VALUE;
306}
307
308int
309Vehicle::getPersonNumber(const std::string& vehID) {
310 return Helper::getVehicle(vehID)->getPersonNumber();
311}
312
313int
314Vehicle::getPersonCapacity(const std::string& vehID) {
316}
317
318
319double
320Vehicle::getBoardingDuration(const std::string& vehID) {
321 return STEPS2TIME(Helper::getVehicleType(vehID).getLoadingDuration(true));
322}
323
324
325std::vector<std::string>
326Vehicle::getPersonIDList(const std::string& vehID) {
327 return Helper::getVehicle(vehID)->getPersonIDList();
328}
329
330std::pair<std::string, double>
331Vehicle::getLeader(const std::string& vehID, double dist) {
332 MSBaseVehicle* veh = Helper::getVehicle(vehID);
333 if (veh->isOnRoad()) {
334 std::pair<const MSVehicle* const, double> leaderInfo = veh->getLeader(dist, false);
335 const std::string leaderID = leaderInfo.first != nullptr ? leaderInfo.first->getID() : "";
336 double gap = leaderInfo.second;
337 if (leaderInfo.first != nullptr
338 && leaderInfo.first->getLane() != nullptr
339 && leaderInfo.first->getLane()->isInternal()
340 && veh->getLane() != nullptr
341 && (!veh->getLane()->isInternal()
342 || (veh->getLane()->getLinkCont().front()->getIndex() != leaderInfo.first->getLane()->getLinkCont().front()->getIndex()))) {
343 // leader is a linkLeader (see MSLink::getLeaderInfo)
344 // avoid internal gap values which may be negative (or -inf)
345 gap = MAX2(0.0, gap);
346 }
347 return std::make_pair(leaderID, gap);
348 } else {
349 return std::make_pair("", -1);
350 }
351}
352
353
354std::pair<std::string, double>
355Vehicle::getFollower(const std::string& vehID, double dist) {
356 MSBaseVehicle* veh = Helper::getVehicle(vehID);
357 if (veh->isOnRoad()) {
358 std::pair<const MSVehicle* const, double> leaderInfo = veh->getFollower(dist);
359 return std::make_pair(
360 leaderInfo.first != nullptr ? leaderInfo.first->getID() : "",
361 leaderInfo.second);
362 } else {
363 return std::make_pair("", -1);
364 }
365}
366
367
368std::vector<TraCIJunctionFoe>
369Vehicle::getJunctionFoes(const std::string& vehID, double dist) {
370 std::vector<TraCIJunctionFoe> result;
371 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
372 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
373 if (veh == nullptr) {
374 WRITE_WARNING("getJunctionFoes not applicable for meso");
375 } else if (veh->isOnRoad()) {
376 if (dist == 0) {
377 dist = veh->getCarFollowModel().brakeGap(veh->getSpeed()) + veh->getVehicleType().getMinGap();
378 }
379 const std::vector<const MSLane*> internalLanes;
380 // distance to the end of the lane
381 double curDist = -veh->getPositionOnLane();
382 for (const MSLane* lane : veh->getUpcomingLanesUntil(dist)) {
383 curDist += lane->getLength();
384 if (lane->isInternal()) {
385 const MSLink* exitLink = lane->getLinkCont().front();
386 int foeIndex = 0;
387 const std::vector<MSLink::ConflictInfo>& conflicts = exitLink->getConflicts();
388 const MSJunctionLogic* logic = exitLink->getJunction()->getLogic();
389 for (const MSLane* foeLane : exitLink->getFoeLanes()) {
390 const MSLink::ConflictInfo& ci = conflicts[foeIndex];
392 continue;
393 }
394 const double distBehindCrossing = ci.lengthBehindCrossing;
395 const MSLink* foeExitLink = foeLane->getLinkCont().front();
396 const double distToCrossing = curDist - distBehindCrossing;
397 const double foeDistBehindCrossing = ci.getFoeLengthBehindCrossing(foeExitLink);
398 for (auto item : foeExitLink->getApproaching()) {
399 const SUMOVehicle* foe = item.first;
400 TraCIJunctionFoe jf;
401 jf.foeId = foe->getID();
402 jf.egoDist = distToCrossing;
403 // approach information is from the start of the previous step
404 // but the foe vehicle then moved within that steop
405 const double prevFoeDist = SPEED2DIST(MSGlobals::gSemiImplicitEulerUpdate
406 ? foe->getSpeed()
407 : (foe->getSpeed() + foe->getPreviousSpeed()) / 2);
408 jf.foeDist = item.second.dist - foeDistBehindCrossing - prevFoeDist;
409 jf.egoExitDist = jf.egoDist + ci.conflictSize;
410 jf.foeExitDist = jf.foeDist + ci.getFoeConflictSize(foeExitLink);
411 jf.egoLane = lane->getID();
412 jf.foeLane = foeLane->getID();
413 jf.egoResponse = logic->getResponseFor(exitLink->getIndex()).test(foeExitLink->getIndex());
414 jf.foeResponse = logic->getResponseFor(foeExitLink->getIndex()).test(exitLink->getIndex());
415 result.push_back(jf);
416 }
417 foeIndex++;
418 }
419 }
420 }
421 }
422 return result;
423}
424
425
426double
427Vehicle::getWaitingTime(const std::string& vehID) {
428 return STEPS2TIME(Helper::getVehicle(vehID)->getWaitingTime());
429}
430
431
432double
433Vehicle::getAccumulatedWaitingTime(const std::string& vehID) {
434 MSBaseVehicle* veh = Helper::getVehicle(vehID);
435 return CALL_MICRO_FUN(veh, getAccumulatedWaitingSeconds(), INVALID_DOUBLE_VALUE);
436}
437
438
439double
440Vehicle::getAdaptedTraveltime(const std::string& vehID, double time, const std::string& edgeID) {
441 MSEdge* edge = Helper::getEdge(edgeID);
442 double value = INVALID_DOUBLE_VALUE;
444 return value;
445}
446
447
448double
449Vehicle::getEffort(const std::string& vehID, double time, const std::string& edgeID) {
450 MSEdge* edge = Helper::getEdge(edgeID);
451 double value = INVALID_DOUBLE_VALUE;
453 return value;
454}
455
456
457bool
458Vehicle::isRouteValid(const std::string& vehID) {
459 std::string msg;
460 return Helper::getVehicle(vehID)->hasValidRoute(msg);
461}
462
463
464std::vector<std::string>
465Vehicle::getRoute(const std::string& vehID) {
466 std::vector<std::string> result;
467 MSBaseVehicle* veh = Helper::getVehicle(vehID);
468 const MSRoute& r = veh->getRoute();
469 for (MSRouteIterator i = r.begin(); i != r.end(); ++i) {
470 result.push_back((*i)->getID());
471 }
472 return result;
473}
474
475
476int
477Vehicle::getSignals(const std::string& vehID) {
478 MSBaseVehicle* veh = Helper::getVehicle(vehID);
479 return CALL_MICRO_FUN(veh, getSignals(), MSVehicle::VEH_SIGNAL_NONE);
480}
481
482
483std::vector<TraCIBestLanesData>
484Vehicle::getBestLanes(const std::string& vehID) {
485 std::vector<TraCIBestLanesData> result;
486 MSVehicle* veh = dynamic_cast<MSVehicle*>(Helper::getVehicle(vehID));
487 if (veh != nullptr && veh->isOnRoad()) {
488 for (const MSVehicle::LaneQ& lq : veh->getBestLanes()) {
489 TraCIBestLanesData bld;
490 bld.laneID = lq.lane->getID();
491 bld.length = lq.length;
492 bld.occupation = lq.nextOccupation;
493 bld.bestLaneOffset = lq.bestLaneOffset;
494 bld.allowsContinuation = lq.allowsContinuation;
495 for (const MSLane* const lane : lq.bestContinuations) {
496 if (lane != nullptr) {
497 bld.continuationLanes.push_back(lane->getID());
498 }
499 }
500 result.emplace_back(bld);
501 }
502 }
503 return result;
504}
505
506
507std::vector<TraCINextTLSData>
508Vehicle::getNextTLS(const std::string& vehID) {
509 std::vector<TraCINextTLSData> result;
510 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
511 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
512 if (veh != nullptr) {
513 int view = 1;
514 double seen = veh->getEdge()->getLength() - veh->getPositionOnLane();
515 if (vehicle->isOnRoad()) {
516 const MSLane* lane = veh->getLane();
517 const std::vector<MSLane*>& bestLaneConts = veh->getBestLanesContinuation(lane);
518 seen = lane->getLength() - veh->getPositionOnLane();
519 std::vector<MSLink*>::const_iterator linkIt = MSLane::succLinkSec(*veh, view, *lane, bestLaneConts);
520 while (!lane->isLinkEnd(linkIt)) {
521 if (!lane->getEdge().isInternal()) {
522 if ((*linkIt)->isTLSControlled()) {
523 TraCINextTLSData ntd;
524 ntd.id = (*linkIt)->getTLLogic()->getID();
525 ntd.tlIndex = (*linkIt)->getTLIndex();
526 ntd.dist = seen;
527 ntd.state = (char)(*linkIt)->getState();
528 result.push_back(ntd);
529 }
530 }
531 lane = (*linkIt)->getViaLaneOrLane();
532 if (!lane->getEdge().isInternal()) {
533 view++;
534 }
535 seen += lane->getLength();
536 linkIt = MSLane::succLinkSec(*veh, view, *lane, bestLaneConts);
537 }
538 }
539 // consider edges beyond bestLanes
540 const int remainingEdges = (int)(veh->getRoute().end() - veh->getCurrentRouteEdge()) - view;
541 //std::cout << SIMTIME << " remainingEdges=" << remainingEdges << " seen=" << seen << " view=" << view << " best=" << toString(bestLaneConts) << "\n";
542 for (int i = 0; i < remainingEdges; i++) {
543 const MSEdge* prev = *(veh->getCurrentRouteEdge() + view + i - 1);
544 const MSEdge* next = *(veh->getCurrentRouteEdge() + view + i);
545 const std::vector<MSLane*>* allowed = prev->allowedLanes(*next, veh->getVClass());
546 if (allowed != nullptr && allowed->size() != 0) {
547 for (const MSLink* const link : allowed->front()->getLinkCont()) {
548 if (&link->getLane()->getEdge() == next) {
549 if (link->isTLSControlled()) {
550 TraCINextTLSData ntd;
551 ntd.id = link->getTLLogic()->getID();
552 ntd.tlIndex = link->getTLIndex();
553 ntd.dist = seen;
554 ntd.state = (char)link->getState();
555 result.push_back(ntd);
556 }
557 seen += next->getLength() + link->getInternalLengthsAfter();
558 break;
559 }
560 }
561 } else {
562 // invalid route, cannot determine nextTLS
563 break;
564 }
565 }
566
567 } else {
568 WRITE_WARNING("getNextTLS not yet implemented for meso");
569 }
570 return result;
571}
572
573std::vector<TraCINextStopData>
574Vehicle::getNextStops(const std::string& vehID) {
575 return getStops(vehID, 0);
576}
577
578std::vector<libsumo::TraCIConnection>
579Vehicle::getNextLinks(const std::string& vehID) {
580 std::vector<libsumo::TraCIConnection> result;
581 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
582 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
583 if (!vehicle->isOnRoad()) {
584 return result;
585 }
586 if (veh != nullptr) {
587 const MSLane* lane = veh->getLane();
588 const std::vector<MSLane*>& bestLaneConts = veh->getBestLanesContinuation(lane);
589 int view = 1;
590 const SUMOTime currTime = MSNet::getInstance()->getCurrentTimeStep();
591 std::vector<MSLink*>::const_iterator linkIt = MSLane::succLinkSec(*veh, view, *lane, bestLaneConts);
592 while (!lane->isLinkEnd(linkIt)) {
593 if (!lane->getEdge().isInternal()) {
594 const MSLink* link = (*linkIt);
595 const std::string approachedLane = link->getLane() != nullptr ? link->getLane()->getID() : "";
596 const bool hasPrio = link->havePriority();
597 const double speed = MIN2(lane->getSpeedLimit(), link->getLane()->getSpeedLimit());
598 const bool isOpen = link->opened(currTime, speed, speed, veh->getLength(),
600 veh->getWaitingTime(), veh->getLateralPositionOnLane(), nullptr, false, veh);
601 const bool hasFoe = link->hasApproachingFoe(currTime, currTime, 0, SUMOVTypeParameter::getDefaultDecel());
602 const std::string approachedInternal = link->getViaLane() != nullptr ? link->getViaLane()->getID() : "";
603 const std::string state = SUMOXMLDefinitions::LinkStates.getString(link->getState());
604 const std::string direction = SUMOXMLDefinitions::LinkDirections.getString(link->getDirection());
605 const double length = link->getLength();
606 result.push_back(TraCIConnection(approachedLane, hasPrio, isOpen, hasFoe, approachedInternal, state, direction, length));
607 }
608 lane = (*linkIt)->getViaLaneOrLane();
609 if (!lane->getEdge().isInternal()) {
610 view++;
611 }
612 linkIt = MSLane::succLinkSec(*veh, view, *lane, bestLaneConts);
613 }
614 // consider edges beyond bestLanes
615 const int remainingEdges = (int)(veh->getRoute().end() - veh->getCurrentRouteEdge()) - view;
616 for (int i = 0; i < remainingEdges; i++) {
617 const MSEdge* prev = *(veh->getCurrentRouteEdge() + view + i - 1);
618 const MSEdge* next = *(veh->getCurrentRouteEdge() + view + i);
619 const std::vector<MSLane*>* allowed = prev->allowedLanes(*next, veh->getVClass());
620 if (allowed != nullptr && allowed->size() != 0) {
621 for (const MSLink* const link : allowed->front()->getLinkCont()) {
622 if (&link->getLane()->getEdge() == next) {
623 const std::string approachedLane = link->getLane() != nullptr ? link->getLane()->getID() : "";
624 const bool hasPrio = link->havePriority();
625 const double speed = MIN2(lane->getSpeedLimit(), link->getLane()->getSpeedLimit());
626 const bool isOpen = link->opened(currTime, speed, speed, veh->getLength(),
628 veh->getWaitingTime(), veh->getLateralPositionOnLane(), nullptr, false, veh);
629 const bool hasFoe = link->hasApproachingFoe(currTime, currTime, 0, SUMOVTypeParameter::getDefaultDecel());
630 const std::string approachedInternal = link->getViaLane() != nullptr ? link->getViaLane()->getID() : "";
631 const std::string state = SUMOXMLDefinitions::LinkStates.getString(link->getState());
632 const std::string direction = SUMOXMLDefinitions::LinkDirections.getString(link->getDirection());
633 const double length = link->getLength();
634 result.push_back(TraCIConnection(approachedLane, hasPrio, isOpen, hasFoe, approachedInternal, state, direction, length));
635 }
636 }
637 } else {
638 // invalid route, cannot determine nextTLS
639 break;
640 }
641 }
642 } else {
643 WRITE_WARNING("getNextLinks not yet implemented for meso");
644 }
645 return result;
646}
647
648std::vector<TraCINextStopData>
649Vehicle::getStops(const std::string& vehID, int limit) {
650 std::vector<TraCINextStopData> result;
651 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
652 if (limit < 0) {
653 // return past stops up to the given limit
654 const StopParVector& pastStops = vehicle->getPastStops();
655 const int n = (int)pastStops.size();
656 for (int i = MAX2(0, n + limit); i < n; i++) {
657 result.push_back(Helper::buildStopData(pastStops[i]));
658 }
659 } else {
660 for (const MSStop& stop : vehicle->getStops()) {
661 if (!stop.pars.collision) {
662 TraCINextStopData nsd = Helper::buildStopData(stop.pars);
663 nsd.duration = STEPS2TIME(stop.duration);
664 result.push_back(nsd);
665 if (limit > 0 && (int)result.size() >= limit) {
666 break;
667 }
668 }
669 }
670 }
671 return result;
672}
673
674
675int
676Vehicle::getStopState(const std::string& vehID) {
677 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
678 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
679 if (veh == nullptr) {
680 WRITE_WARNING("getStopState not yet implemented for meso");
681 return 0;
682 }
683 int result = 0;
684 if (veh->isStopped()) {
685 const MSStop& stop = veh->getNextStop();
686 result = stop.getStateFlagsOld();
687 }
688 return result;
689}
690
691
692double
693Vehicle::getDistance(const std::string& vehID) {
694 MSBaseVehicle* veh = Helper::getVehicle(vehID);
695 if (veh->hasDeparted()) {
696 return veh->getOdometer();
697 } else {
699 }
700}
701
702
703double
704Vehicle::getDrivingDistance(const std::string& vehID, const std::string& edgeID, double pos, int laneIndex) {
705 MSBaseVehicle* veh = Helper::getVehicle(vehID);
706 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
707 if (veh->isOnRoad()) {
708 const MSLane* lane = microVeh != nullptr ? veh->getLane() : veh->getEdge()->getLanes()[0];
709 double distance = veh->getRoute().getDistanceBetween(veh->getPositionOnLane(), pos,
710 lane, Helper::getLaneChecking(edgeID, laneIndex, pos), veh->getRoutePosition());
711 if (distance == std::numeric_limits<double>::max()) {
713 }
714 return distance;
715 } else {
717 }
718}
719
720
721double
722Vehicle::getDrivingDistance2D(const std::string& vehID, double x, double y) {
723 MSBaseVehicle* veh = Helper::getVehicle(vehID);
724 if (veh == nullptr) {
726 }
727 if (veh->isOnRoad()) {
728 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
729 const MSLane* lane = microVeh != nullptr ? veh->getLane() : veh->getEdge()->getLanes()[0];
730 std::pair<MSLane*, double> roadPos = Helper::convertCartesianToRoadMap(Position(x, y), veh->getVehicleType().getVehicleClass());
731 double distance = veh->getRoute().getDistanceBetween(veh->getPositionOnLane(), roadPos.second,
732 lane, roadPos.first, veh->getRoutePosition());
733 if (distance == std::numeric_limits<double>::max()) {
735 }
736 return distance;
737 } else {
739 }
740}
741
742
743double
744Vehicle::getReferenceDistance(const std::string& vehID) {
745 MSBaseVehicle* veh = Helper::getVehicle(vehID);
746 if (veh->hasDeparted()) {
747 double lanePos = veh->getPositionOnLane();
748 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
749 if (microVeh != nullptr && microVeh->getLane()->isInternal()) {
750 lanePos = microVeh->getRoute().getDistanceBetween(0., lanePos, microVeh->getEdge()->getLanes()[0], microVeh->getLane(),
751 microVeh->getRoutePosition());
752 }
753 return veh->getEdge()->getDistanceAt(lanePos);
754 } else {
756 }
757}
758
759
760double
761Vehicle::getAllowedSpeed(const std::string& vehID) {
762 MSBaseVehicle* veh = Helper::getVehicle(vehID);
763 return veh->isOnRoad() ? CALL_MICRO_FUN(veh, getLane()->getVehicleMaxSpeed(veh), veh->getEdge()->getVehicleMaxSpeed(veh)) : INVALID_DOUBLE_VALUE;
764}
765
766
767double
768Vehicle::getSpeedFactor(const std::string& vehID) {
770}
771
772
773int
774Vehicle::getSpeedMode(const std::string& vehID) {
775 MSBaseVehicle* veh = Helper::getVehicle(vehID);
776 return CALL_MICRO_FUN(veh, getInfluencer().getSpeedMode(), INVALID_INT_VALUE);
777}
778
779
780int
781Vehicle::getLaneChangeMode(const std::string& vehID) {
782 MSBaseVehicle* veh = Helper::getVehicle(vehID);
783 return CALL_MICRO_FUN(veh, getInfluencer().getLaneChangeMode(), INVALID_INT_VALUE);
784}
785
786
787int
788Vehicle::getRoutingMode(const std::string& vehID) {
789 return Helper::getVehicle(vehID)->getRoutingMode();
790}
791
792
793std::string
794Vehicle::getLine(const std::string& vehID) {
795 return Helper::getVehicle(vehID)->getParameter().line;
796}
797
798
799std::vector<std::string>
800Vehicle::getVia(const std::string& vehID) {
801 return Helper::getVehicle(vehID)->getParameter().via;
802}
803
804
805std::pair<int, int>
806Vehicle::getLaneChangeState(const std::string& vehID, int direction) {
807 MSBaseVehicle* veh = Helper::getVehicle(vehID);
808 auto undefined = std::make_pair((int)LCA_UNKNOWN, (int)LCA_UNKNOWN);
809 return veh->isOnRoad() ? CALL_MICRO_FUN(veh, getLaneChangeModel().getSavedState(direction), undefined) : undefined;
810}
811
812
813std::string
814Vehicle::getParameter(const std::string& vehID, const std::string& key) {
815 MSBaseVehicle* veh = Helper::getVehicle(vehID);
816 std::string error;
817 std::string result = veh->getPrefixedParameter(key, error);
818 if (error != "") {
819 throw TraCIException(error);
820 }
821 return result;
822}
823
824
826
827
828std::vector<std::pair<std::string, double> >
829Vehicle::getNeighbors(const std::string& vehID, const int mode) {
830 int dir = (1 & mode) != 0 ? -1 : 1;
831 bool queryLeaders = (2 & mode) != 0;
832 bool blockersOnly = (4 & mode) != 0;
833 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
834 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
835 std::vector<std::pair<std::string, double> > result;
836 if (veh == nullptr) {
837 return result;
838 }
839#ifdef DEBUG_NEIGHBORS
840 if (DEBUG_COND) {
841 std::cout << "getNeighbors() for veh '" << vehID << "': dir=" << dir
842 << ", queryLeaders=" << queryLeaders
843 << ", blockersOnly=" << blockersOnly << std::endl;
844 }
845#endif
846 if (veh->getLaneChangeModel().isOpposite()) {
847 // getParallelLane works relative to lane forward direction
848 dir *= -1;
849 }
850
851 MSLane* targetLane = veh->getLane()->getParallelLane(dir);
852 if (targetLane == nullptr) {
853 return result;
854 }
855 // need to recompute leaders and followers (#8119)
856 const bool opposite = &veh->getLane()->getEdge() != &targetLane->getEdge();
857 MSLeaderDistanceInfo neighbors(targetLane->getWidth(), nullptr, 0.);
858 if (queryLeaders) {
859 if (opposite) {
860 double pos = targetLane->getOppositePos(veh->getPositionOnLane());
861 neighbors = targetLane->getFollowersOnConsecutive(veh, pos, true);
862 } else {
863 targetLane->addLeaders(veh, veh->getPositionOnLane(), neighbors);
864 }
865 } else {
866 if (opposite) {
867 double pos = targetLane->getOppositePos(veh->getPositionOnLane());
868 targetLane->addLeaders(veh, pos, neighbors);
869 neighbors.fixOppositeGaps(true);
870 } else {
871 neighbors = targetLane->getFollowersOnConsecutive(veh, veh->getBackPositionOnLane(), true);
872 }
873 }
874 if (blockersOnly) {
875 // filter out vehicles that aren't blocking
876 MSLeaderDistanceInfo blockers(targetLane->getWidth(), nullptr, 0.);
877 for (int i = 0; i < neighbors.numSublanes(); i++) {
878 CLeaderDist n = neighbors[i];
879 if (n.first != nullptr) {
880 const MSVehicle* follower = veh;
881 const MSVehicle* leader = n.first;
882 if (!queryLeaders) {
883 std::swap(follower, leader);
884 }
885 const double secureGap = (follower->getCarFollowModel().getSecureGap(
886 follower, leader, follower->getSpeed(), leader->getSpeed(), leader->getCarFollowModel().getMaxDecel())
887 * follower->getLaneChangeModel().getSafetyFactor());
888 if (n.second < secureGap) {
889 blockers.addLeader(n.first, n.second, 0, i);
890 }
891 }
892 }
893 neighbors = blockers;
894 }
895
896 if (neighbors.hasVehicles()) {
897 for (int i = 0; i < neighbors.numSublanes(); i++) {
898 CLeaderDist n = neighbors[i];
899 if (n.first != nullptr &&
900 // avoid duplicates
901 (result.size() == 0 || result.back().first != n.first->getID())) {
902 result.push_back(std::make_pair(n.first->getID(), n.second));
903 }
904 }
905 }
906 return result;
907}
908
909
910double
911Vehicle::getFollowSpeed(const std::string& vehID, double speed, double gap, double leaderSpeed, double leaderMaxDecel, const std::string& leaderID) {
912 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
913 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
914 if (veh == nullptr) {
915 WRITE_ERROR("getFollowSpeed not applicable for meso");
917 }
918 MSVehicle* leader = dynamic_cast<MSVehicle*>(MSNet::getInstance()->getVehicleControl().getVehicle(leaderID));
919 return veh->getCarFollowModel().followSpeed(veh, speed, gap, leaderSpeed, leaderMaxDecel, leader, MSCFModel::CalcReason::FUTURE);
920}
921
922
923double
924Vehicle::getSecureGap(const std::string& vehID, double speed, double leaderSpeed, double leaderMaxDecel, const std::string& leaderID) {
925 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
926 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
927 if (veh == nullptr) {
928 WRITE_ERROR("getSecureGap not applicable for meso");
930 }
931 MSVehicle* leader = dynamic_cast<MSVehicle*>(MSNet::getInstance()->getVehicleControl().getVehicle(leaderID));
932 return veh->getCarFollowModel().getSecureGap(veh, leader, speed, leaderSpeed, leaderMaxDecel);
933}
934
935
936double
937Vehicle::getStopSpeed(const std::string& vehID, const double speed, double gap) {
938 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
939 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
940 if (veh == nullptr) {
941 WRITE_ERROR("getStopSpeed not applicable for meso");
943 }
944 return veh->getCarFollowModel().stopSpeed(veh, speed, gap, MSCFModel::CalcReason::FUTURE);
945}
946
947double
948Vehicle::getStopDelay(const std::string& vehID) {
949 return Helper::getVehicle(vehID)->getStopDelay();
950}
951
952
953double
954Vehicle::getImpatience(const std::string& vehID) {
955 return Helper::getVehicle(vehID)->getImpatience();
956}
957
958
959double
960Vehicle::getStopArrivalDelay(const std::string& vehID) {
961 double result = Helper::getVehicle(vehID)->getStopArrivalDelay();
962 if (result == INVALID_DOUBLE) {
964 } else {
965 return result;
966 }
967}
968
969double
970Vehicle::getTimeLoss(const std::string& vehID) {
971 return Helper::getVehicle(vehID)->getTimeLossSeconds();
972}
973
974std::vector<std::string>
975Vehicle::getTaxiFleet(int taxiState) {
976 std::vector<std::string> result;
977 for (MSDevice_Taxi* taxi : MSDevice_Taxi::getFleet()) {
978 if (taxi->getHolder().hasDeparted()) {
979 if (taxiState == -1
980 || (taxiState == 0 && taxi->getState() == 0)
981 || (taxiState != 0 && (taxi->getState() & taxiState) == taxiState)) {
982 result.push_back(taxi->getHolder().getID());
983 }
984 }
985 }
986 return result;
987}
988
989std::vector<std::string>
990Vehicle::getLoadedIDList() {
991 std::vector<std::string> ids;
993 for (MSVehicleControl::constVehIt i = c.loadedVehBegin(); i != c.loadedVehEnd(); ++i) {
994 ids.push_back(i->first);
995 }
996 return ids;
997}
998
999std::vector<std::string>
1000Vehicle::getTeleportingIDList() {
1001 std::vector<std::string> ids;
1003 for (MSVehicleControl::constVehIt i = c.loadedVehBegin(); i != c.loadedVehEnd(); ++i) {
1004 SUMOVehicle* veh = i->second;
1005 if (veh->hasDeparted() && !isVisible(veh)) {
1006 ids.push_back(veh->getID());
1007 }
1008 }
1009 return ids;
1010}
1011
1012std::string
1013Vehicle::getEmissionClass(const std::string& vehID) {
1014 return PollutantsInterface::getName(Helper::getVehicleType(vehID).getEmissionClass());
1015}
1016
1017std::string
1018Vehicle::getShapeClass(const std::string& vehID) {
1019 return getVehicleShapeName(Helper::getVehicleType(vehID).getGuiShape());
1020}
1021
1022
1023double
1024Vehicle::getLength(const std::string& vehID) {
1025 return Helper::getVehicleType(vehID).getLength();
1026}
1027
1028
1029double
1030Vehicle::getAccel(const std::string& vehID) {
1032}
1033
1034
1035double
1036Vehicle::getDecel(const std::string& vehID) {
1038}
1039
1040
1041double Vehicle::getEmergencyDecel(const std::string& vehID) {
1043}
1044
1045
1046double Vehicle::getApparentDecel(const std::string& vehID) {
1048}
1049
1050
1051double Vehicle::getActionStepLength(const std::string& vehID) {
1053}
1054
1055
1056double Vehicle::getLastActionTime(const std::string& vehID) {
1057 MSBaseVehicle* veh = Helper::getVehicle(vehID);
1058 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
1059 if (microVeh != nullptr) {
1060 return STEPS2TIME(microVeh->getLastActionTime());
1061 } else {
1062 MEVehicle* mesoVeh = dynamic_cast<MEVehicle*>(veh);
1063 return STEPS2TIME(mesoVeh->getEventTime());
1064 }
1065}
1066
1067
1068double
1069Vehicle::getTau(const std::string& vehID) {
1071}
1072
1073
1074double
1075Vehicle::getImperfection(const std::string& vehID) {
1077}
1078
1079
1080double
1081Vehicle::getSpeedDeviation(const std::string& vehID) {
1083}
1084
1085
1086std::string
1087Vehicle::getVehicleClass(const std::string& vehID) {
1088 return toString(Helper::getVehicleType(vehID).getVehicleClass());
1089}
1090
1091
1092double
1093Vehicle::getMinGap(const std::string& vehID) {
1094 return Helper::getVehicleType(vehID).getMinGap();
1095}
1096
1097
1098double
1099Vehicle::getMinGapLat(const std::string& vehID) {
1100 try {
1101 return StringUtils::toDouble(getParameter(vehID, "laneChangeModel.minGapLat"));
1102 } catch (const TraCIException&) {
1103 // legacy behavior
1104 return Helper::getVehicleType(vehID).getMinGapLat();
1105 }
1106}
1107
1108
1109double
1110Vehicle::getMaxSpeed(const std::string& vehID) {
1111 return Helper::getVehicleType(vehID).getMaxSpeed();
1112}
1113
1114
1115double
1116Vehicle::getMaxSpeedLat(const std::string& vehID) {
1117 return Helper::getVehicleType(vehID).getMaxSpeedLat();
1118}
1119
1120
1121std::string
1122Vehicle::getLateralAlignment(const std::string& vehID) {
1123 return toString(Helper::getVehicleType(vehID).getPreferredLateralAlignment());
1124}
1125
1126
1127double
1128Vehicle::getWidth(const std::string& vehID) {
1129 return Helper::getVehicleType(vehID).getWidth();
1130}
1131
1132
1133double
1134Vehicle::getHeight(const std::string& vehID) {
1135 return Helper::getVehicleType(vehID).getHeight();
1136}
1137
1138
1139double
1140Vehicle::getMass(const std::string& vehID) {
1141 return Helper::getVehicleType(vehID).getMass();
1142}
1143
1144
1145void
1146Vehicle::setStop(const std::string& vehID,
1147 const std::string& edgeID,
1148 double pos,
1149 int laneIndex,
1150 double duration,
1151 int flags,
1152 double startPos,
1153 double until) {
1154 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1156 pos, laneIndex, startPos, flags, duration, until);
1157 std::string error;
1158 if (!vehicle->addTraciStop(stopPars, error)) {
1159 throw TraCIException(error);
1160 }
1161}
1162
1163
1164void
1165Vehicle::replaceStop(const std::string& vehID,
1166 int nextStopIndex,
1167 const std::string& edgeID,
1168 double pos,
1169 int laneIndex,
1170 double duration,
1171 int flags,
1172 double startPos,
1173 double until,
1174 int teleport) {
1175 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1176 std::string error;
1177 if (edgeID == "") {
1178 // only remove stop
1179 const bool ok = vehicle->abortNextStop(nextStopIndex);
1180 if (teleport != 0) {
1181 if (!vehicle->rerouteBetweenStops(nextStopIndex, "traci:replaceStop", (teleport & 1), error)) {
1182 throw TraCIException("Stop replacement failed for vehicle '" + vehID + "' (" + error + ").");
1183 }
1184 } else {
1185 MSVehicle* msVeh = dynamic_cast<MSVehicle*>(vehicle);
1186 if (msVeh->getLane() != nullptr) {
1187 msVeh->updateBestLanes(true);
1188 }
1189 }
1190 if (!ok) {
1191 throw TraCIException("Stop replacement failed for vehicle '" + vehID + "' (invalid nextStopIndex).");
1192 }
1193 } else {
1195 pos, laneIndex, startPos, flags, duration, until);
1196
1197 if (!vehicle->replaceStop(nextStopIndex, stopPars, "traci:replaceStop", teleport != 0, error)) {
1198 throw TraCIException("Stop replacement failed for vehicle '" + vehID + "' (" + error + ").");
1199 }
1200 }
1201}
1202
1203
1204void
1205Vehicle::insertStop(const std::string& vehID,
1206 int nextStopIndex,
1207 const std::string& edgeID,
1208 double pos,
1209 int laneIndex,
1210 double duration,
1211 int flags,
1212 double startPos,
1213 double until,
1214 int teleport) {
1215 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1217 pos, laneIndex, startPos, flags, duration, until);
1218
1219 std::string error;
1220 if (!vehicle->insertStop(nextStopIndex, stopPars, "traci:insertStop", teleport != 0, error)) {
1221 throw TraCIException("Stop insertion failed for vehicle '" + vehID + "' (" + error + ").");
1222 }
1223}
1224
1225
1226std::string
1227Vehicle::getStopParameter(const std::string& vehID, int nextStopIndex, const std::string& param, bool customParam) {
1228 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1229 try {
1230 if (nextStopIndex >= (int)vehicle->getStops().size() || (nextStopIndex < 0 && -nextStopIndex > (int)vehicle->getPastStops().size())) {
1231 throw ProcessError("Invalid stop index " + toString(nextStopIndex)
1232 + " (has " + toString(vehicle->getPastStops().size()) + " past stops and " + toString(vehicle->getStops().size()) + " remaining stops)");
1233
1234 }
1235 const SUMOVehicleParameter::Stop& pars = (nextStopIndex >= 0
1236 ? vehicle->getStop(nextStopIndex).pars
1237 : vehicle->getPastStops()[vehicle->getPastStops().size() + nextStopIndex]);
1238 if (customParam) {
1239 // custom user parameter
1240 return pars.getParameter(param, "");
1241 }
1242
1243 if (param == toString(SUMO_ATTR_EDGE)) {
1244 return pars.edge;
1245 } else if (param == toString(SUMO_ATTR_LANE)) {
1247 } else if (param == toString(SUMO_ATTR_BUS_STOP)
1248 || param == toString(SUMO_ATTR_TRAIN_STOP)) {
1249 return pars.busstop;
1250 } else if (param == toString(SUMO_ATTR_CONTAINER_STOP)) {
1251 return pars.containerstop;
1252 } else if (param == toString(SUMO_ATTR_CHARGING_STATION)) {
1253 return pars.chargingStation;
1254 } else if (param == toString(SUMO_ATTR_PARKING_AREA)) {
1255 return pars.parkingarea;
1256 } else if (param == toString(SUMO_ATTR_STARTPOS)) {
1257 return toString(pars.startPos);
1258 } else if (param == toString(SUMO_ATTR_ENDPOS)) {
1259 return toString(pars.endPos);
1260 } else if (param == toString(SUMO_ATTR_POSITION_LAT)) {
1261 return toString(pars.posLat == INVALID_DOUBLE ? INVALID_DOUBLE_VALUE : pars.posLat);
1262 } else if (param == toString(SUMO_ATTR_ARRIVAL)) {
1263 return pars.arrival < 0 ? "-1" : time2string(pars.arrival);
1264 } else if (param == toString(SUMO_ATTR_DURATION)) {
1265 return pars.duration < 0 ? "-1" : time2string(pars.duration);
1266 } else if (param == toString(SUMO_ATTR_UNTIL)) {
1267 return pars.until < 0 ? "-1" : time2string(pars.until);
1268 } else if (param == toString(SUMO_ATTR_EXTENSION)) {
1269 return pars.extension < 0 ? "-1" : time2string(pars.extension);
1270 } else if (param == toString(SUMO_ATTR_INDEX)) {
1271 return toString(nextStopIndex + vehicle->getPastStops().size());
1272 } else if (param == toString(SUMO_ATTR_PARKING)) {
1273 return toString(pars.parking);
1274 } else if (param == toString(SUMO_ATTR_TRIGGERED)) {
1275 return joinToString(pars.getTriggers(), " ");
1276 } else if (param == toString(SUMO_ATTR_EXPECTED)) {
1277 return joinToString(pars.awaitedPersons, " ");
1278 } else if (param == toString(SUMO_ATTR_EXPECTED_CONTAINERS)) {
1279 return joinToString(pars.awaitedContainers, " ");
1280 } else if (param == toString(SUMO_ATTR_PERMITTED)) {
1281 return joinToString(pars.permitted, " ");
1282 } else if (param == toString(SUMO_ATTR_ACTTYPE)) {
1283 return pars.actType;
1284 } else if (param == toString(SUMO_ATTR_TRIP_ID)) {
1285 return pars.tripId;
1286 } else if (param == toString(SUMO_ATTR_SPLIT)) {
1287 return pars.split;
1288 } else if (param == toString(SUMO_ATTR_JOIN)) {
1289 return pars.join;
1290 } else if (param == toString(SUMO_ATTR_LINE)) {
1291 return pars.line;
1292 } else if (param == toString(SUMO_ATTR_SPEED)) {
1293 return toString(pars.speed);
1294 } else if (param == toString(SUMO_ATTR_STARTED)) {
1295 return pars.started < 0 ? "-1" : time2string(pars.started);
1296 } else if (param == toString(SUMO_ATTR_ENDED)) {
1297 return pars.ended < 0 ? "-1" : time2string(pars.ended);
1298 } else if (param == toString(SUMO_ATTR_ONDEMAND)) {
1299 return toString(pars.onDemand);
1300 } else if (param == toString(SUMO_ATTR_JUMP)) {
1301 return pars.jump < 0 ? "-1" : time2string(pars.jump);
1302 } else if (param == toString(SUMO_ATTR_JUMP_UNTIL)) {
1303 return pars.jumpUntil < 0 ? "-1" : time2string(pars.jumpUntil);
1304 } else {
1305 throw ProcessError(TLF("Unsupported parameter '%'", param));
1306 }
1307 } catch (ProcessError& e) {
1308 throw TraCIException("Could not get stop parameter for vehicle '" + vehID + "' (" + e.what() + ")");
1309 }
1310}
1311
1312
1313
1314void
1315Vehicle::setStopParameter(const std::string& vehID, int nextStopIndex,
1316 const std::string& param, const std::string& value,
1317 bool customParam) {
1318 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1319 try {
1320 MSStop& stop = vehicle->getStop(nextStopIndex);
1322 if (customParam) {
1323 pars.setParameter(param, value);
1324 return;
1325 }
1326 std::string error;
1327 if (param == toString(SUMO_ATTR_EDGE)
1328 || param == toString(SUMO_ATTR_BUS_STOP)
1329 || param == toString(SUMO_ATTR_TRAIN_STOP)
1332 || param == toString(SUMO_ATTR_PARKING_AREA)
1333 || param == toString(SUMO_ATTR_LANE)
1334 ) {
1335 int laneIndex = stop.lane->getIndex();
1336 int flags = pars.getFlags() & 3;
1337 std::string edgeOrStopID = value;
1338 if (param == toString(SUMO_ATTR_LANE)) {
1339 laneIndex = StringUtils::toInt(value);
1340 edgeOrStopID = pars.edge;
1341 } else if (param == toString(SUMO_ATTR_BUS_STOP)
1342 || param == toString(SUMO_ATTR_TRAIN_STOP)) {
1343 flags |= 8;
1344 } else if (param == toString(SUMO_ATTR_CONTAINER_STOP)) {
1345 flags |= 16;
1346 } else if (param == toString(SUMO_ATTR_CHARGING_STATION)) {
1347 flags |= 32;
1348 } else if (param == toString(SUMO_ATTR_PARKING_AREA)) {
1349 flags |= 64;
1350 }
1351 // special case: replace stop
1352 replaceStop(vehID, nextStopIndex, edgeOrStopID, pars.endPos, laneIndex, STEPS2TIME(pars.duration),
1353 flags, pars.startPos, STEPS2TIME(pars.until), 0);
1354
1355 } else if (param == toString(SUMO_ATTR_STARTPOS)) {
1356 pars.startPos = StringUtils::toDouble(value);
1358 } else if (param == toString(SUMO_ATTR_ENDPOS)) {
1359 pars.endPos = StringUtils::toDouble(value);
1361 } else if (param == toString(SUMO_ATTR_POSITION_LAT)) {
1362 pars.posLat = StringUtils::toDouble(value);
1364 } else if (param == toString(SUMO_ATTR_ARRIVAL)) {
1365 pars.arrival = string2time(value);
1367 } else if (param == toString(SUMO_ATTR_DURATION)) {
1368 pars.duration = string2time(value);
1370 // also update dynamic value
1371 stop.initPars(pars);
1372 } else if (param == toString(SUMO_ATTR_UNTIL)) {
1373 pars.until = string2time(value);
1375 } else if (param == toString(SUMO_ATTR_EXTENSION)) {
1376 pars.extension = string2time(value);
1378 } else if (param == toString(SUMO_ATTR_INDEX)) {
1379 throw TraCIException("Changing stop index is not supported");
1380 } else if (param == toString(SUMO_ATTR_PARKING)) {
1383 } else if (param == toString(SUMO_ATTR_TRIGGERED)) {
1384 if (pars.speed > 0 && value != "") {
1385 throw ProcessError(TLF("Waypoint (speed = %) at index % does not support triggers", pars.speed, nextStopIndex));
1386 }
1387 SUMOVehicleParameter::parseStopTriggers(StringTokenizer(value).getVector(), false, pars);
1389 // also update dynamic value
1390 stop.initPars(pars);
1391 } else if (param == toString(SUMO_ATTR_EXPECTED)) {
1392 pars.awaitedPersons = StringTokenizer(value).getSet();
1394 // also update dynamic value
1395 stop.initPars(pars);
1396 } else if (param == toString(SUMO_ATTR_EXPECTED_CONTAINERS)) {
1399 // also update dynamic value
1400 stop.initPars(pars);
1401 } else if (param == toString(SUMO_ATTR_PERMITTED)) {
1402 pars.permitted = StringTokenizer(value).getSet();
1404 } else if (param == toString(SUMO_ATTR_ACTTYPE)) {
1405 pars.actType = value;
1406 } else if (param == toString(SUMO_ATTR_TRIP_ID)) {
1407 pars.tripId = value;
1409 } else if (param == toString(SUMO_ATTR_SPLIT)) {
1410 pars.split = value;
1412 } else if (param == toString(SUMO_ATTR_JOIN)) {
1413 pars.join = value;
1415 // also update dynamic value
1416 stop.initPars(pars);
1417 } else if (param == toString(SUMO_ATTR_LINE)) {
1418 pars.line = value;
1420 } else if (param == toString(SUMO_ATTR_SPEED)) {
1421 const double speed = StringUtils::toDouble(value);
1422 if (speed > 0 && pars.getTriggers().size() > 0) {
1423 throw ProcessError(TLF("Triggered stop at index % cannot be changed into a waypoint by setting speed to %", nextStopIndex, speed));
1424 }
1425 pars.speed = speed;
1427 } else if (param == toString(SUMO_ATTR_STARTED)) {
1428 pars.started = string2time(value);
1430 } else if (param == toString(SUMO_ATTR_ENDED)) {
1431 pars.ended = string2time(value);
1433 } else if (param == toString(SUMO_ATTR_ONDEMAND)) {
1434 pars.onDemand = StringUtils::toBool(value);
1436 } else if (param == toString(SUMO_ATTR_JUMP)) {
1437 pars.jump = string2time(value);
1439 } else if (param == toString(SUMO_ATTR_JUMP_UNTIL)) {
1440 pars.jumpUntil = string2time(value);
1442 } else {
1443 throw ProcessError(TLF("Unsupported parameter '%'", param));
1444 }
1445 } catch (ProcessError& e) {
1446 throw TraCIException("Could not set stop parameter for vehicle '" + vehID + "' (" + e.what() + ")");
1447 }
1448}
1449
1450
1451void
1452Vehicle::rerouteParkingArea(const std::string& vehID, const std::string& parkingAreaID) {
1453 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1454 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1455 if (veh == nullptr) {
1456 WRITE_WARNING("rerouteParkingArea not yet implemented for meso");
1457 return;
1458 }
1459 std::string error;
1460 // Forward command to vehicle
1461 if (!veh->rerouteParkingArea(parkingAreaID, error)) {
1462 throw TraCIException(error);
1463 }
1464}
1465
1466void
1467Vehicle::resume(const std::string& vehID) {
1468 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1469 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1470 if (veh == nullptr) {
1471 WRITE_WARNING("resume not yet implemented for meso");
1472 return;
1473 }
1474 if (!veh->hasStops()) {
1475 throw TraCIException("Failed to resume vehicle '" + veh->getID() + "', it has no stops.");
1476 }
1477 if (!veh->resumeFromStopping()) {
1478 const MSStop& sto = veh->getNextStop();
1479 std::ostringstream strs;
1480 strs << "reached: " << sto.reached;
1481 strs << ", duration:" << sto.duration;
1482 strs << ", edge:" << (*sto.edge)->getID();
1483 strs << ", startPos: " << sto.pars.startPos;
1484 std::string posStr = strs.str();
1485 throw TraCIException("Failed to resume from stopping for vehicle '" + veh->getID() + "', " + posStr);
1486 }
1487}
1488
1489
1490void
1491Vehicle::changeTarget(const std::string& vehID, const std::string& edgeID) {
1492 MSBaseVehicle* veh = Helper::getVehicle(vehID);
1493 const MSEdge* destEdge = MSEdge::dictionary(edgeID);
1494 const bool onInit = isOnInit(vehID);
1495 if (destEdge == nullptr) {
1496 throw TraCIException("Destination edge '" + edgeID + "' is not known.");
1497 }
1498 // change the final edge of the route and reroute
1499 try {
1500 const bool success = veh->reroute(MSNet::getInstance()->getCurrentTimeStep(), "traci:changeTarget",
1501 veh->getRouterTT(), onInit, false, false, destEdge);
1502 if (!success) {
1503 throw TraCIException("ChangeTarget failed for vehicle '" + veh->getID() + "', destination edge '" + edgeID + "' unreachable.");
1504 }
1505 } catch (ProcessError& e) {
1506 throw TraCIException(e.what());
1507 }
1508}
1509
1510
1511void
1512Vehicle::changeLane(const std::string& vehID, int laneIndex, double duration) {
1513 try {
1514 checkTimeBounds(duration);
1515 } catch (ProcessError&) {
1516 throw TraCIException("Duration parameter exceeds the time value range.");
1517 }
1518 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1519 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1520 if (veh == nullptr) {
1521 WRITE_ERROR("changeLane not applicable for meso");
1522 return;
1523 }
1524
1525 std::vector<std::pair<SUMOTime, int> > laneTimeLine;
1526 laneTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep(), laneIndex));
1527 laneTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep() + TIME2STEPS(duration), laneIndex));
1528 veh->getInfluencer().setLaneTimeLine(laneTimeLine);
1529}
1530
1531void
1532Vehicle::changeLaneRelative(const std::string& vehID, int indexOffset, double duration) {
1533 try {
1534 checkTimeBounds(duration);
1535 } catch (ProcessError&) {
1536 throw TraCIException("Duration parameter exceeds the time value range.");
1537 }
1538 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1539 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1540 if (veh == nullptr) {
1541 WRITE_ERROR("changeLaneRelative not applicable for meso");
1542 return;
1543 }
1544
1545 std::vector<std::pair<SUMOTime, int> > laneTimeLine;
1546 int laneIndex = veh->getLaneIndex() + indexOffset;
1547 if (laneIndex < 0 && !veh->getLaneChangeModel().isOpposite()) {
1548 if (veh->getLaneIndex() == -1) {
1549 WRITE_WARNINGF(TL("Ignoring changeLaneRelative for vehicle '%' that isn't on the road"), vehID);
1550 } else {
1551 WRITE_WARNINGF(TL("Ignoring indexOffset % for vehicle '%' on laneIndex %."), indexOffset, vehID, veh->getLaneIndex());
1552 }
1553 } else {
1554 laneTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep(), laneIndex));
1555 laneTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep() + TIME2STEPS(duration), laneIndex));
1556 veh->getInfluencer().setLaneTimeLine(laneTimeLine);
1557 }
1558}
1559
1560
1561void
1562Vehicle::changeSublane(const std::string& vehID, double latDist) {
1563 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1564 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1565 if (veh == nullptr) {
1566 WRITE_ERROR("changeSublane not applicable for meso");
1567 return;
1568 }
1569
1570 veh->getInfluencer().setSublaneChange(latDist);
1571}
1572
1573
1574void
1575Vehicle::add(const std::string& vehID,
1576 const std::string& routeID,
1577 const std::string& typeID,
1578 const std::string& depart,
1579 const std::string& departLane,
1580 const std::string& departPos,
1581 const std::string& departSpeed,
1582 const std::string& arrivalLane,
1583 const std::string& arrivalPos,
1584 const std::string& arrivalSpeed,
1585 const std::string& fromTaz,
1586 const std::string& toTaz,
1587 const std::string& line,
1588 int /*personCapacity*/,
1589 int personNumber) {
1591 if (veh != nullptr) {
1592 throw TraCIException("The vehicle '" + vehID + "' to add already exists.");
1593 }
1594
1595 SUMOVehicleParameter vehicleParams;
1596 vehicleParams.id = vehID;
1597 MSVehicleType* vehicleType = MSNet::getInstance()->getVehicleControl().getVType(typeID);
1598 if (!vehicleType) {
1599 throw TraCIException("Invalid type '" + typeID + "' for vehicle '" + vehID + "'.");
1600 }
1601 if (typeID != "DEFAULT_VEHTYPE") {
1602 vehicleParams.vtypeid = typeID;
1603 vehicleParams.parametersSet |= VEHPARS_VTYPE_SET;
1604 }
1606 WRITE_WARNINGF(TL("Internal routes receive an ID starting with '!' and must not be referenced in other vehicle or flow definitions. Please remove all references to route '%' in case it is internal."), routeID);
1607 }
1608 ConstMSRoutePtr route = MSRoute::dictionary(routeID);
1609 if (!route) {
1610 if (routeID == "") {
1611 // assume, route was intentionally left blank because the caller
1612 // intends to control the vehicle remotely
1613 SUMOVehicleClass vclass = vehicleType->getVehicleClass();
1614 const std::string dummyRouteID = "DUMMY_ROUTE_" + SumoVehicleClassStrings.getString(vclass);
1615 route = MSRoute::dictionary(dummyRouteID);
1616 if (route == nullptr) {
1617 for (MSEdge* e : MSEdge::getAllEdges()) {
1618 if (e->getFunction() == SumoXMLEdgeFunc::NORMAL && (e->getPermissions() & vclass) == vclass) {
1619 std::vector<std::string> edges;
1620 edges.push_back(e->getID());
1621 libsumo::Route::add(dummyRouteID, edges);
1622 break;
1623 }
1624 }
1625 }
1626 route = MSRoute::dictionary(dummyRouteID);
1627 if (!route) {
1628 throw TraCIException("Could not build dummy route for vehicle class: '" + SumoVehicleClassStrings.getString(vehicleType->getVehicleClass()) + "'");
1629 }
1630 } else {
1631 throw TraCIException("Invalid route '" + routeID + "' for vehicle '" + vehID + "'.");
1632 }
1633 }
1634 // check if the route implies a trip
1635 if (route->getEdges().size() == 2) {
1636 const MSEdgeVector& succ = route->getEdges().front()->getSuccessors();
1637 if (std::find(succ.begin(), succ.end(), route->getEdges().back()) == succ.end()) {
1638 vehicleParams.parametersSet |= VEHPARS_FORCE_REROUTE;
1639 }
1640 }
1641 if (fromTaz != "" || toTaz != "") {
1642 vehicleParams.parametersSet |= VEHPARS_FORCE_REROUTE;
1643 }
1644 std::string error;
1645 if (!SUMOVehicleParameter::parseDepart(depart, "vehicle", vehID, vehicleParams.depart, vehicleParams.departProcedure, error)) {
1646 throw TraCIException(error);
1647 }
1648 if (vehicleParams.departProcedure == DepartDefinition::GIVEN && vehicleParams.depart < MSNet::getInstance()->getCurrentTimeStep()) {
1649 vehicleParams.depart = MSNet::getInstance()->getCurrentTimeStep();
1650 WRITE_WARNINGF(TL("Departure time for vehicle '%' is in the past; using current time instead."), vehID);
1651 } else if (vehicleParams.departProcedure == DepartDefinition::NOW) {
1652 vehicleParams.depart = MSNet::getInstance()->getCurrentTimeStep();
1653 }
1654 if (!SUMOVehicleParameter::parseDepartLane(departLane, "vehicle", vehID, vehicleParams.departLane, vehicleParams.departLaneProcedure, error)) {
1655 throw TraCIException(error);
1656 }
1657 if (!SUMOVehicleParameter::parseDepartPos(departPos, "vehicle", vehID, vehicleParams.departPos, vehicleParams.departPosProcedure, error)) {
1658 throw TraCIException(error);
1659 }
1660 if (!SUMOVehicleParameter::parseDepartSpeed(departSpeed, "vehicle", vehID, vehicleParams.departSpeed, vehicleParams.departSpeedProcedure, error)) {
1661 throw TraCIException(error);
1662 }
1663 if (!SUMOVehicleParameter::parseArrivalLane(arrivalLane, "vehicle", vehID, vehicleParams.arrivalLane, vehicleParams.arrivalLaneProcedure, error)) {
1664 throw TraCIException(error);
1665 }
1666 if (!SUMOVehicleParameter::parseArrivalPos(arrivalPos, "vehicle", vehID, vehicleParams.arrivalPos, vehicleParams.arrivalPosProcedure, error)) {
1667 throw TraCIException(error);
1668 }
1669 if (!SUMOVehicleParameter::parseArrivalSpeed(arrivalSpeed, "vehicle", vehID, vehicleParams.arrivalSpeed, vehicleParams.arrivalSpeedProcedure, error)) {
1670 throw TraCIException(error);
1671 }
1672 // mark non-default attributes
1673 if (departLane != "first") {
1674 vehicleParams.parametersSet |= VEHPARS_DEPARTLANE_SET;
1675 }
1676 if (departPos != "base") {
1677 vehicleParams.parametersSet |= VEHPARS_DEPARTPOS_SET;
1678 }
1679 if (departSpeed != "0") {
1680 vehicleParams.parametersSet |= VEHPARS_DEPARTSPEED_SET;
1681 }
1682 if (arrivalLane != "current") {
1683 vehicleParams.parametersSet |= VEHPARS_ARRIVALLANE_SET;
1684 }
1685 if (arrivalPos != "max") {
1686 vehicleParams.parametersSet |= VEHPARS_ARRIVALPOS_SET;
1687 }
1688 if (arrivalSpeed != "current") {
1689 vehicleParams.parametersSet |= VEHPARS_ARRIVALSPEED_SET;
1690 }
1691 if (fromTaz != "") {
1692 vehicleParams.parametersSet |= VEHPARS_FROM_TAZ_SET;
1693 }
1694 if (toTaz != "") {
1695 vehicleParams.parametersSet |= VEHPARS_TO_TAZ_SET;
1696 }
1697 if (line != "") {
1698 vehicleParams.parametersSet |= VEHPARS_LINE_SET;
1699 }
1700 if (personNumber != 0) {
1702 }
1703 // build vehicle
1704 vehicleParams.fromTaz = fromTaz;
1705 vehicleParams.toTaz = toTaz;
1706 vehicleParams.line = line;
1707 //vehicleParams.personCapacity = personCapacity;
1708 vehicleParams.personNumber = personNumber;
1709
1710 SUMOVehicleParameter* params = new SUMOVehicleParameter(vehicleParams);
1711 SUMOVehicle* vehicle = nullptr;
1712 try {
1714 if (fromTaz == "" && !route->getEdges().front()->validateDepartSpeed(*vehicle)) {
1716 throw TraCIException("Departure speed for vehicle '" + vehID + "' is too high for the departure edge '" + route->getEdges().front()->getID() + "'.");
1717 }
1718 std::string msg;
1719 if (vehicle->getRouteValidity(true, true, &msg) != MSBaseVehicle::ROUTE_VALID) {
1721 throw TraCIException("Vehicle '" + vehID + "' has no valid route (" + msg + "). ");
1722 }
1723 MSNet::getInstance()->getVehicleControl().addVehicle(vehicleParams.id, vehicle);
1726 }
1727 } catch (ProcessError& e) {
1728 if (vehicle != nullptr) {
1730 }
1731 throw TraCIException(e.what());
1732 }
1733}
1734
1735
1736void
1737Vehicle::moveToXY(const std::string& vehID, const std::string& edgeID, const int laneIndex,
1738 const double x, const double y, double angle, const int keepRoute, double matchThreshold) {
1739 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1740 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1741 if (veh == nullptr) {
1742 WRITE_WARNING("moveToXY not yet implemented for meso");
1743 return;
1744 }
1745 const bool doKeepRoute = (keepRoute & 1) != 0 && veh->getID() != "VTD_EGO";
1746 const bool mayLeaveNetwork = (keepRoute & 2) != 0;
1747 const bool ignorePermissions = (keepRoute & 4) != 0;
1748 const bool setLateralPos = (MSGlobals::gLateralResolution > 0 || mayLeaveNetwork);
1749 SUMOVehicleClass vClass = ignorePermissions ? SVC_IGNORING : veh->getVClass();
1750 // process
1751 const std::string origID = edgeID + "_" + toString(laneIndex);
1752 // @todo add an interpretation layer for OSM derived origID values (without lane index)
1753 Position pos(x, y);
1754#ifdef DEBUG_MOVEXY
1755 const double origAngle = angle;
1756#endif
1757 // angle must be in [0,360] because it will be compared against those returned by naviDegree()
1758 // angle set to INVALID_DOUBLE_VALUE is ignored in the evaluated and later set to the angle of the matched lane
1759 if (angle != INVALID_DOUBLE_VALUE) {
1760 while (angle >= 360.) {
1761 angle -= 360.;
1762 }
1763 while (angle < 0.) {
1764 angle += 360.;
1765 }
1766 }
1767
1768#ifdef DEBUG_MOVEXY
1769 std::cout << std::endl << SIMTIME << " moveToXY veh=" << veh->getID() << " vehPos=" << veh->getPosition()
1770 << " lane=" << Named::getIDSecure(veh->getLane()) << " lanePos=" << vehicle->getPositionOnLane() << std::endl;
1771 std::cout << " wantedPos=" << pos << " origID=" << origID << " laneIndex=" << laneIndex << " origAngle=" << origAngle << " angle=" << angle << " keepRoute=" << keepRoute << std::endl;
1772#endif
1773
1774 ConstMSEdgeVector edges;
1775 MSLane* lane = nullptr;
1776 double lanePos;
1777 double lanePosLat = 0;
1778 double bestDistance = std::numeric_limits<double>::max();
1779 int routeOffset = 0;
1780 bool found;
1781 double maxRouteDistance = matchThreshold;
1782 /* EGO vehicle is known to have a fixed route. @todo make this into a parameter of the TraCI call */
1783 if (doKeepRoute) {
1784 // case a): vehicle is on its earlier route
1785 // we additionally assume it is moving forward (SUMO-limit);
1786 // note that the route ("edges") is not changed in this case
1787
1789 veh->getRoute().getEdges(), veh->getRoutePosition(),
1790 vClass, setLateralPos,
1791 bestDistance, &lane, lanePos, routeOffset);
1792 // @note silenty ignoring mapping failure
1793 } else {
1794 const double speed = pos.distanceTo2D(veh->getPosition()); // !!!veh->getSpeed();
1795 found = Helper::moveToXYMap(pos, maxRouteDistance, mayLeaveNetwork, origID, angle,
1796 speed, veh->getRoute().getEdges(), veh->getRoutePosition(), veh->getLane(), veh->getPositionOnLane(), veh->isOnRoad(),
1797 vClass, GeomHelper::naviDegree(veh->getAngle()), setLateralPos,
1798 bestDistance, &lane, lanePos, routeOffset, edges);
1799 }
1800 if ((found && bestDistance <= maxRouteDistance) || mayLeaveNetwork) {
1801 // optionally compute lateral offset
1802 pos.setz(veh->getPosition().z());
1803 if (found && setLateralPos) {
1804 const double perpDist = lane->getShape().distance2D(pos, false);
1805 if (perpDist != GeomHelper::INVALID_OFFSET) {
1806 lanePosLat = perpDist;
1807 if (!mayLeaveNetwork) {
1808 lanePosLat = MIN2(lanePosLat, 0.5 * (lane->getWidth() + veh->getVehicleType().getWidth() - MSGlobals::gLateralResolution));
1809 }
1810 // figure out whether the offset is to the left or to the right
1811 PositionVector tmp = lane->getShape();
1812 try {
1813 tmp.move2side(-lanePosLat); // moved to left
1814 } catch (ProcessError&) {
1815 WRITE_WARNINGF(TL("Could not determine position on lane '%' at lateral position %."), lane->getID(), toString(-lanePosLat));
1816 }
1817 //std::cout << " lane=" << lane->getID() << " posLat=" << lanePosLat << " shape=" << lane->getShape() << " tmp=" << tmp << " tmpDist=" << tmp.distance2D(pos) << "\n";
1818 if (tmp.distance2D(pos) > perpDist) {
1819 lanePosLat = -lanePosLat;
1820 }
1821 }
1822 pos.setz(lane->geometryPositionAtOffset(lanePos).z());
1823 }
1824 if (found && !mayLeaveNetwork && MSGlobals::gLateralResolution < 0) {
1825 // mapped position may differ from pos
1826 pos = lane->geometryPositionAtOffset(lanePos, -lanePosLat);
1827 }
1828 assert((found && lane != 0) || (!found && lane == 0));
1829 assert(!std::isnan(lanePos));
1830 if (angle == INVALID_DOUBLE_VALUE) {
1831 if (lane != nullptr) {
1832 angle = GeomHelper::naviDegree(lane->getShape().rotationAtOffset(lanePos));
1833 } else {
1834 // compute angle outside road network from old and new position
1835 angle = GeomHelper::naviDegree(veh->getPosition().angleTo2D(pos));
1836 }
1837 }
1838 // use the best we have
1839#ifdef DEBUG_MOVEXY
1840 std::cout << SIMTIME << " veh=" << vehID + " moveToXYResult lane='" << Named::getIDSecure(lane) << "' lanePos=" << lanePos << " lanePosLat=" << lanePosLat << "\n";
1841#endif
1842 Helper::setRemoteControlled(veh, pos, lane, lanePos, lanePosLat, angle, routeOffset, edges, MSNet::getInstance()->getCurrentTimeStep());
1843 if (!veh->isOnRoad()) {
1845 }
1846 } else {
1847 if (lane == nullptr) {
1848 throw TraCIException("Could not map vehicle '" + vehID + "', no road found within " + toString(maxRouteDistance) + "m.");
1849 } else {
1850 throw TraCIException("Could not map vehicle '" + vehID + "', distance to road is " + toString(bestDistance) + ".");
1851 }
1852 }
1853}
1854
1855void
1856Vehicle::slowDown(const std::string& vehID, double speed, double duration) {
1857 try {
1858 checkTimeBounds(duration);
1859 } catch (ProcessError&) {
1860 throw TraCIException("Duration parameter exceeds the time value range.");
1861 }
1862 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1863 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1864 if (veh == nullptr) {
1865 WRITE_ERROR("slowDown not applicable for meso");
1866 return;
1867 }
1868
1869 std::vector<std::pair<SUMOTime, double> > speedTimeLine;
1870 speedTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep(), veh->getSpeed()));
1871 speedTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep() + TIME2STEPS(duration), speed));
1872 veh->getInfluencer().setSpeedTimeLine(speedTimeLine);
1873}
1874
1875void
1876Vehicle::openGap(const std::string& vehID, double newTimeHeadway, double newSpaceHeadway, double duration, double changeRate, double maxDecel, const std::string& referenceVehID) {
1877 try {
1878 checkTimeBounds(duration);
1879 } catch (ProcessError&) {
1880 throw TraCIException("Duration parameter exceeds the time value range.");
1881 }
1882 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1883 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1884 if (veh == nullptr) {
1885 WRITE_ERROR("openGap not applicable for meso");
1886 return;
1887 }
1888
1889 MSVehicle* refVeh = nullptr;
1890 if (referenceVehID != "") {
1891 refVeh = dynamic_cast<MSVehicle*>(Helper::getVehicle(referenceVehID));
1892 }
1893 const double originalTau = veh->getVehicleType().getCarFollowModel().getHeadwayTime();
1894 if (newTimeHeadway == -1) {
1895 newTimeHeadway = originalTau;
1896 }
1897 if (originalTau > newTimeHeadway) {
1898 WRITE_WARNING("Ignoring openGap(). New time headway must not be smaller than the original.");
1899 return;
1900 }
1901 veh->getInfluencer().activateGapController(originalTau, newTimeHeadway, newSpaceHeadway, duration, changeRate, maxDecel, refVeh);
1902}
1903
1904void
1905Vehicle::deactivateGapControl(const std::string& vehID) {
1906 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1907 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1908 if (veh == nullptr) {
1909 WRITE_ERROR("deactivateGapControl not applicable for meso");
1910 return;
1911 }
1912
1913 if (veh->hasInfluencer()) {
1915 }
1916}
1917
1918void
1919Vehicle::requestToC(const std::string& vehID, double leadTime) {
1920 setParameter(vehID, "device.toc.requestToC", toString(leadTime));
1921}
1922
1923void
1924Vehicle::setSpeed(const std::string& vehID, double speed) {
1925 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1926 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1927 if (veh == nullptr) {
1928 WRITE_WARNING("setSpeed not yet implemented for meso");
1929 return;
1930 }
1931
1932 std::vector<std::pair<SUMOTime, double> > speedTimeLine;
1933 if (speed >= 0) {
1934 speedTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep(), speed));
1935 speedTimeLine.push_back(std::make_pair(SUMOTime_MAX - DELTA_T, speed));
1936 }
1937 veh->getInfluencer().setSpeedTimeLine(speedTimeLine);
1938}
1939
1940void
1941Vehicle::setAcceleration(const std::string& vehID, double acceleration, double duration) {
1942 try {
1943 checkTimeBounds(duration);
1944 } catch (ProcessError&) {
1945 throw TraCIException("Duration parameter exceeds the time value range.");
1946 }
1947 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1948 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1949 if (veh == nullptr) {
1950 WRITE_WARNING("setAcceleration not yet implemented for meso");
1951 return;
1952 }
1953
1954 double targetSpeed = std::max(veh->getSpeed() + acceleration * duration, 0.0);
1955 std::vector<std::pair<SUMOTime, double>> speedTimeLine;
1956 speedTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep(), veh->getSpeed()));
1957 speedTimeLine.push_back(std::make_pair(MSNet::getInstance()->getCurrentTimeStep() + TIME2STEPS(duration), targetSpeed));
1958 veh->getInfluencer().setSpeedTimeLine(speedTimeLine);
1959}
1960
1961void
1962Vehicle::setPreviousSpeed(const std::string& vehID, double prevSpeed, double prevAcceleration) {
1963 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1964 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1965 if (veh == nullptr) {
1966 WRITE_WARNING("setPreviousSpeed not yet implemented for meso");
1967 return;
1968 }
1969 if (prevAcceleration == INVALID_DOUBLE_VALUE) {
1970 prevAcceleration = std::numeric_limits<double>::min();
1971 }
1972 veh->setPreviousSpeed(prevSpeed, prevAcceleration);
1973}
1974
1975void
1976Vehicle::setSpeedMode(const std::string& vehID, int speedMode) {
1977 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1978 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1979 if (veh == nullptr) {
1980 WRITE_WARNING("setSpeedMode not yet implemented for meso");
1981 return;
1982 }
1983
1984 veh->getInfluencer().setSpeedMode(speedMode);
1985}
1986
1987void
1988Vehicle::setLaneChangeMode(const std::string& vehID, int laneChangeMode) {
1989 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
1990 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
1991 if (veh == nullptr) {
1992 WRITE_ERROR("setLaneChangeMode not applicable for meso");
1993 return;
1994 }
1995
1996 veh->getInfluencer().setLaneChangeMode(laneChangeMode);
1997}
1998
1999void
2000Vehicle::setRoutingMode(const std::string& vehID, int routingMode) {
2001 Helper::getVehicle(vehID)->setRoutingMode(routingMode);
2002}
2003
2004void
2005Vehicle::setType(const std::string& vehID, const std::string& typeID) {
2006 MSVehicleType* vehicleType = MSNet::getInstance()->getVehicleControl().getVType(typeID);
2007 if (vehicleType == nullptr) {
2008 throw TraCIException("Vehicle type '" + typeID + "' is not known");
2009 }
2010 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2011 veh->replaceVehicleType(vehicleType);
2012 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
2013 if (microVeh != nullptr && microVeh->isOnRoad()) {
2014 microVeh->updateBestLanes(true);
2015 microVeh->updateLaneBruttoSum();
2016 }
2017}
2018
2019void
2020Vehicle::setRouteID(const std::string& vehID, const std::string& routeID) {
2021 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2023 if (r == nullptr) {
2024 throw TraCIException("The route '" + routeID + "' is not known.");
2025 }
2027 WRITE_WARNINGF(TL("Internal routes receive an ID starting with '!' and must not be referenced in other vehicle or flow definitions. Please remove all references to route '%' in case it is internal."), routeID);
2028 }
2029 std::string msg;
2030 if (!veh->hasValidRoute(msg, r)) {
2031 WRITE_WARNINGF(TL("Invalid route replacement for vehicle '%'. %"), veh->getID(), msg);
2033 throw TraCIException("Route replacement failed for " + veh->getID());
2034 }
2035 }
2036
2037 std::string errorMsg;
2038 if (!veh->replaceRoute(r, "traci:setRouteID", veh->getLane() == nullptr, 0, true, true, &errorMsg)) {
2039 throw TraCIException("Route replacement failed for vehicle '" + veh->getID() + "' (" + errorMsg + ").");
2040 }
2041}
2042
2043void
2044Vehicle::setRoute(const std::string& vehID, const std::string& edgeID) {
2045 setRoute(vehID, std::vector<std::string>({edgeID}));
2046}
2047
2048
2049void
2050Vehicle::setRoute(const std::string& vehID, const std::vector<std::string>& edgeIDs) {
2051 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2052 ConstMSEdgeVector edges;
2053 const bool onInit = veh->getLane() == nullptr;
2054 try {
2055 MSEdge::parseEdgesList(edgeIDs, edges, "<unknown>");
2056 if (edges.size() > 0 && edges.front()->isInternal()) {
2057 if (edges.size() == 1) {
2058 // avoid crashing due to lack of normal edges in route (#5390)
2059 edges.push_back(edges.back()->getLanes()[0]->getNextNormal());
2060 } else {
2061 // avoid internal edge in final route
2062 if (edges.front() == &veh->getLane()->getEdge()) {
2063 edges.erase(edges.begin());
2064 }
2065 }
2066 }
2067 } catch (ProcessError& e) {
2068 throw TraCIException("Invalid edge list for vehicle '" + veh->getID() + "' (" + e.what() + ")");
2069 }
2070 std::string errorMsg;
2071 if (!veh->replaceRouteEdges(edges, -1, 0, "traci:setRoute", onInit, true, true, &errorMsg)) {
2072 throw TraCIException("Route replacement failed for vehicle '" + veh->getID() + "' (" + errorMsg + ").");
2073 }
2074}
2075
2076
2077void
2078Vehicle::setLateralLanePosition(const std::string& vehID, double posLat) {
2079 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
2080 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
2081 if (veh != nullptr) {
2082 veh->setLateralPositionOnLane(posLat);
2083 } else {
2084 WRITE_ERROR("setLateralLanePosition not applicable for meso");
2085 }
2086}
2087
2088
2089void
2090Vehicle::updateBestLanes(const std::string& vehID) {
2091 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
2092 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
2093 if (veh == nullptr) {
2094 WRITE_ERROR("updateBestLanes not applicable for meso");
2095 return;
2096 }
2097 if (veh->isOnRoad()) {
2098 veh->updateBestLanes(true);
2099 }
2100}
2101
2102
2103void
2104Vehicle::setAdaptedTraveltime(const std::string& vehID, const std::string& edgeID,
2105 double time, double begSeconds, double endSeconds) {
2106 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2107 MSEdge* edge = MSEdge::dictionary(edgeID);
2108 if (edge == nullptr) {
2109 throw TraCIException("Edge '" + edgeID + "' is not known.");
2110 }
2111 if (time != INVALID_DOUBLE_VALUE) {
2112 // add time
2113 if (begSeconds == 0 && endSeconds == std::numeric_limits<double>::max()) {
2114 // clean up old values before setting whole range
2115 while (veh->getWeightsStorage().knowsTravelTime(edge)) {
2117 }
2118 }
2119 veh->getWeightsStorage().addTravelTime(edge, begSeconds, endSeconds, time);
2120 } else {
2121 // remove time
2122 while (veh->getWeightsStorage().knowsTravelTime(edge)) {
2124 }
2125 }
2126}
2127
2128
2129void
2130Vehicle::setEffort(const std::string& vehID, const std::string& edgeID,
2131 double effort, double begSeconds, double endSeconds) {
2132 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2133 MSEdge* edge = MSEdge::dictionary(edgeID);
2134 if (edge == nullptr) {
2135 throw TraCIException("Edge '" + edgeID + "' is not known.");
2136 }
2137 if (effort != INVALID_DOUBLE_VALUE) {
2138 // add effort
2139 if (begSeconds == 0 && endSeconds == std::numeric_limits<double>::max()) {
2140 // clean up old values before setting whole range
2141 while (veh->getWeightsStorage().knowsEffort(edge)) {
2142 veh->getWeightsStorage().removeEffort(edge);
2143 }
2144 }
2145 veh->getWeightsStorage().addEffort(edge, begSeconds, endSeconds, effort);
2146 } else {
2147 // remove effort
2148 while (veh->getWeightsStorage().knowsEffort(edge)) {
2149 veh->getWeightsStorage().removeEffort(edge);
2150 }
2151 }
2152}
2153
2154
2155void
2156Vehicle::rerouteTraveltime(const std::string& vehID, const bool currentTravelTimes) {
2157 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2158 const int routingMode = veh->getRoutingMode();
2159 if (currentTravelTimes && routingMode == ROUTING_MODE_DEFAULT) {
2161 }
2162 veh->reroute(MSNet::getInstance()->getCurrentTimeStep(), "traci:rerouteTraveltime",
2163 veh->getRouterTT(), isOnInit(vehID));
2164 if (currentTravelTimes && routingMode == ROUTING_MODE_DEFAULT) {
2165 veh->setRoutingMode(routingMode);
2166 }
2167}
2168
2169
2170void
2171Vehicle::rerouteEffort(const std::string& vehID) {
2172 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2173 veh->reroute(MSNet::getInstance()->getCurrentTimeStep(), "traci:rerouteEffort",
2174 MSNet::getInstance()->getRouterEffort(veh->getRNGIndex()), isOnInit(vehID));
2175}
2176
2177
2178void
2179Vehicle::setSignals(const std::string& vehID, int signals) {
2180 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
2181 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
2182 if (veh == nullptr) {
2183 WRITE_ERROR("setSignals not applicable for meso");
2184 return;
2185 }
2186
2187 // set influencer to make the change persistent
2188 veh->getInfluencer().setSignals(signals);
2189 // set them now so that getSignals returns the correct value
2190 veh->switchOffSignal(0x0fffffff);
2191 if (signals >= 0) {
2192 veh->switchOnSignal(signals);
2193 }
2194}
2195
2196
2197void
2198Vehicle::moveTo(const std::string& vehID, const std::string& laneID, double pos, int reason) {
2199 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
2200 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
2201 if (veh == nullptr) {
2202 WRITE_WARNING("moveTo not yet implemented for meso");
2203 return;
2204 }
2205
2206 MSLane* l = MSLane::dictionary(laneID);
2207 if (l == nullptr) {
2208 throw TraCIException("Unknown lane '" + laneID + "'.");
2209 }
2210 if (veh->getLane() == l) {
2212 return;
2213 }
2214 MSEdge* destinationEdge = &l->getEdge();
2215 const MSEdge* destinationRouteEdge = destinationEdge->getNormalBefore();
2216 if (!veh->isOnRoad() && veh->getParameter().wasSet(VEHPARS_FORCE_REROUTE) && veh->getRoute().getEdges().size() == 2) {
2217 // it's a trip that wasn't routeted yet (likely because the vehicle was added in this step. Find a route now
2218 veh->reroute(MSNet::getInstance()->getCurrentTimeStep(), "traci:moveTo-tripInsertion",
2219 veh->getRouterTT(), true);
2220 }
2221 // find edge in the remaining route
2222 MSRouteIterator it = std::find(veh->getCurrentRouteEdge(), veh->getRoute().end(), destinationRouteEdge);
2223 if (it == veh->getRoute().end()) {
2224 // find edge in the edges that were already passed
2225 it = std::find(veh->getRoute().begin(), veh->getRoute().end(), destinationRouteEdge);
2226 }
2227 if (it == veh->getRoute().end() ||
2228 // internal edge must continue the route
2229 (destinationEdge->isInternal() &&
2230 ((it + 1) == veh->getRoute().end()
2231 || l->getNextNormal() != *(it + 1)))) {
2232 throw TraCIException("Lane '" + laneID + "' is not on the route of vehicle '" + vehID + "'.");
2233 }
2234 Position oldPos = vehicle->getPosition();
2236 if (veh->getLane() != nullptr) {
2237 // correct odometer which gets incremented via onRemovalFromNet->leaveLane
2238 veh->addToOdometer(-veh->getLane()->getLength());
2240 } else {
2241 veh->setTentativeLaneAndPosition(l, pos);
2242 }
2243 const int oldRouteIndex = veh->getRoutePosition();
2244 const int newRouteIndex = (int)(it - veh->getRoute().begin());
2245 if (oldRouteIndex > newRouteIndex) {
2246 // more odometer correction needed
2247 veh->addToOdometer(-l->getLength());
2248 }
2249 veh->resetRoutePosition(newRouteIndex, veh->getParameter().departLaneProcedure);
2250 if (!veh->isOnRoad()) {
2253 }
2254 MSMoveReminder::Notification moveReminderReason;
2255 if (veh->hasDeparted()) {
2256 if (reason == MOVE_TELEPORT) {
2257 moveReminderReason = MSMoveReminder::NOTIFICATION_TELEPORT;
2258 } else if (reason == MOVE_NORMAL) {
2259 moveReminderReason = MSMoveReminder::NOTIFICATION_JUNCTION;
2260 } else if (reason == MOVE_AUTOMATIC) {
2261 Position newPos = l->geometryPositionAtOffset(pos);
2262 const double dist = newPos.distanceTo2D(oldPos);
2263 if (dist < SPEED2DIST(veh->getMaxSpeed())) {
2264 moveReminderReason = MSMoveReminder::NOTIFICATION_JUNCTION;
2265 } else {
2266 moveReminderReason = MSMoveReminder::NOTIFICATION_TELEPORT;
2267 }
2268 } else {
2269 throw TraCIException("Invalid moveTo reason '" + toString(reason) + "' for vehicle '" + vehID + "'.");
2270 }
2271 } else {
2272 moveReminderReason = MSMoveReminder::NOTIFICATION_DEPARTED;
2273 }
2274 l->forceVehicleInsertion(veh, pos, moveReminderReason);
2275}
2276
2277
2278void
2279Vehicle::setActionStepLength(const std::string& vehID, double actionStepLength, bool resetActionOffset) {
2280 if (actionStepLength < 0.0) {
2281 WRITE_ERROR("Invalid action step length (<0). Ignoring command setActionStepLength().");
2282 return;
2283 }
2284 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
2285 MSVehicle* veh = dynamic_cast<MSVehicle*>(vehicle);
2286 if (veh == nullptr) {
2287 WRITE_ERROR("setActionStepLength not applicable for meso");
2288 return;
2289 }
2290
2291 if (actionStepLength == 0.) {
2292 veh->resetActionOffset();
2293 } else {
2294 veh->setActionStepLength(actionStepLength, resetActionOffset);
2295 }
2296}
2297
2298
2299void
2300Vehicle::setBoardingDuration(const std::string& vehID, double boardingDuration) {
2301 try {
2302 checkTimeBounds(boardingDuration);
2303 } catch (ProcessError&) {
2304 throw TraCIException("BoardingDuration parameter exceeds the time value range.");
2305 }
2307}
2308
2309
2310void
2311Vehicle::setImpatience(const std::string& vehID, double impatience) {
2312 MSBaseVehicle* vehicle = Helper::getVehicle(vehID);
2313 const double normalImpatience = vehicle->getImpatience();
2314 vehicle->getBaseInfluencer().setExtraImpatience(impatience - normalImpatience);
2315}
2316
2317
2318void
2319Vehicle::remove(const std::string& vehID, char reason) {
2320 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2322 switch (reason) {
2323 case REMOVE_TELEPORT:
2324 // XXX semantics unclear
2325 // n = MSMoveReminder::NOTIFICATION_TELEPORT;
2327 break;
2328 case REMOVE_PARKING:
2329 // XXX semantics unclear
2330 // n = MSMoveReminder::NOTIFICATION_PARKING;
2332 break;
2333 case REMOVE_ARRIVED:
2335 break;
2336 case REMOVE_VAPORIZED:
2338 break;
2341 break;
2342 default:
2343 throw TraCIException("Unknown removal status.");
2344 }
2345 if (veh->hasDeparted()) {
2346 veh->onRemovalFromNet(n);
2347 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
2348 if (microVeh != nullptr) {
2349 if (veh->getLane() != nullptr) {
2350 microVeh->getMutableLane()->removeVehicle(dynamic_cast<MSVehicle*>(veh), n);
2351 }
2353 }
2355 } else {
2358 }
2359}
2360
2361
2362void
2363Vehicle::setColor(const std::string& vehID, const TraCIColor& col) {
2365 p.color.set((unsigned char)col.r, (unsigned char)col.g, (unsigned char)col.b, (unsigned char)col.a);
2367}
2368
2369
2370void
2371Vehicle::setSpeedFactor(const std::string& vehID, double factor) {
2373}
2374
2375
2376void
2377Vehicle::setLine(const std::string& vehID, const std::string& line) {
2378 Helper::getVehicle(vehID)->getParameter().line = line;
2379}
2380
2381
2382void
2383Vehicle::setVia(const std::string& vehID, const std::vector<std::string>& edgeList) {
2384 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2385 try {
2386 // ensure edges exist
2387 ConstMSEdgeVector edges;
2388 MSEdge::parseEdgesList(edgeList, edges, "<via-edges>");
2389 } catch (ProcessError& e) {
2390 throw TraCIException(e.what());
2391 }
2392 veh->getParameter().via = edgeList;
2393}
2394
2395
2396void
2397Vehicle::setLength(const std::string& vehID, double length) {
2399}
2400
2401
2402void
2403Vehicle::setMaxSpeed(const std::string& vehID, double speed) {
2405}
2406
2407
2408void
2409Vehicle::setVehicleClass(const std::string& vehID, const std::string& clazz) {
2410 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2412 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
2413 if (microVeh != nullptr && microVeh->isOnRoad()) {
2414 microVeh->updateBestLanes(true);
2415 }
2416}
2417
2418
2419void
2420Vehicle::setShapeClass(const std::string& vehID, const std::string& clazz) {
2422}
2423
2424
2425void
2426Vehicle::setEmissionClass(const std::string& vehID, const std::string& clazz) {
2428}
2429
2430
2431void
2432Vehicle::setWidth(const std::string& vehID, double width) {
2434}
2435
2436
2437void
2438Vehicle::setHeight(const std::string& vehID, double height) {
2440}
2441
2442
2443void
2444Vehicle::setMass(const std::string& vehID, double mass) {
2446}
2447
2448
2449void
2450Vehicle::setMinGap(const std::string& vehID, double minGap) {
2451 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2452 veh->getSingularType().setMinGap(minGap);
2453 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
2454 if (microVeh != nullptr && microVeh->isOnRoad()) {
2455 microVeh->updateLaneBruttoSum();
2456 }
2457}
2458
2459
2460void
2461Vehicle::setAccel(const std::string& vehID, double accel) {
2463}
2464
2465
2466void
2467Vehicle::setDecel(const std::string& vehID, double decel) {
2468 VehicleType::setDecel(Helper::getVehicle(vehID)->getSingularType().getID(), decel);
2469}
2470
2471
2472void
2473Vehicle::setEmergencyDecel(const std::string& vehID, double decel) {
2474 VehicleType::setEmergencyDecel(Helper::getVehicle(vehID)->getSingularType().getID(), decel);
2475}
2476
2477
2478void
2479Vehicle::setApparentDecel(const std::string& vehID, double decel) {
2481}
2482
2483
2484void
2485Vehicle::setImperfection(const std::string& vehID, double imperfection) {
2486 Helper::getVehicle(vehID)->getSingularType().setImperfection(imperfection);
2487}
2488
2489
2490void
2491Vehicle::setTau(const std::string& vehID, double tau) {
2493}
2494
2495
2496void
2497Vehicle::setMinGapLat(const std::string& vehID, double minGapLat) {
2498 try {
2499 setParameter(vehID, "laneChangeModel.minGapLat", toString(minGapLat));
2500 } catch (TraCIException&) {
2501 // legacy behavior
2502 Helper::getVehicle(vehID)->getSingularType().setMinGapLat(minGapLat);
2503 }
2504}
2505
2506
2507void
2508Vehicle::setMaxSpeedLat(const std::string& vehID, double speed) {
2510}
2511
2512
2513void
2514Vehicle::setLateralAlignment(const std::string& vehID, const std::string& latAlignment) {
2515 double lao;
2517 if (SUMOVTypeParameter::parseLatAlignment(latAlignment, lao, lad)) {
2519 } else {
2520 throw TraCIException("Unknown value '" + latAlignment + "' when setting latAlignment for vehID '" + vehID + "';\n must be one of (\"right\", \"center\", \"arbitrary\", \"nice\", \"compact\", \"left\" or a float)");
2521 }
2522}
2523
2524
2525void
2526Vehicle::setParameter(const std::string& vehID, const std::string& key, const std::string& value) {
2527 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2528 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
2529 if (StringUtils::startsWith(key, "device.")) {
2530 StringTokenizer tok(key, ".");
2531 if (tok.size() < 3) {
2532 throw TraCIException("Invalid device parameter '" + key + "' for vehicle '" + vehID + "'");
2533 }
2534 try {
2535 veh->setDeviceParameter(tok.get(1), key.substr(tok.get(0).size() + tok.get(1).size() + 2), value);
2536 } catch (InvalidArgument& e) {
2537 throw TraCIException("Vehicle '" + vehID + "' does not support device parameter '" + key + "' (" + e.what() + ").");
2538 }
2539 } else if (StringUtils::startsWith(key, "laneChangeModel.")) {
2540 if (microVeh == nullptr) {
2541 throw TraCIException("Meso Vehicle '" + vehID + "' does not support laneChangeModel parameters.");
2542 }
2543 const std::string attrName = key.substr(16);
2544 if (attrName == toString(SUMO_ATTR_LCA_CONTRIGHT)) {
2545 // special case: not used within lcModel
2546 veh->getSingularType().setLcContRight(value);
2547 } else {
2548 try {
2549 microVeh->getLaneChangeModel().setParameter(attrName, value);
2550 } catch (InvalidArgument& e) {
2551 throw TraCIException("Vehicle '" + vehID + "' does not support laneChangeModel parameter '" + key + "' (" + e.what() + ").");
2552 }
2553 }
2554 } else if (StringUtils::startsWith(key, "carFollowModel.")) {
2555 if (microVeh == nullptr) {
2556 throw TraCIException("Meso Vehicle '" + vehID + "' does not support carFollowModel parameters.");
2557 }
2558 try {
2559 veh->setCarFollowModelParameter(key, value);
2560 } catch (InvalidArgument& e) {
2561 throw TraCIException("Vehicle '" + vehID + "' does not support carFollowModel parameter '" + key + "' (" + e.what() + ").");
2562 }
2563 } else if (StringUtils::startsWith(key, "junctionModel.")) {
2564 try {
2565 // use the whole key (including junctionModel prefix)
2566 veh->setJunctionModelParameter(key, value);
2567 } catch (InvalidArgument& e) {
2568 // error message includes id since it is also used for xml input
2569 throw TraCIException(e.what());
2570 }
2571 } else if (StringUtils::startsWith(key, "has.") && StringUtils::endsWith(key, ".device")) {
2572 StringTokenizer tok(key, ".");
2573 if (tok.size() != 3) {
2574 throw TraCIException("Invalid request for device status change. Expected format is 'has.DEVICENAME.device'");
2575 }
2576 const std::string deviceName = tok.get(1);
2577 bool create;
2578 try {
2579 create = StringUtils::toBool(value);
2580 } catch (BoolFormatException&) {
2581 throw TraCIException("Changing device status requires a 'true' or 'false'");
2582 }
2583 if (!create) {
2584 throw TraCIException("Device removal is not supported for device of type '" + deviceName + "'");
2585 }
2586 try {
2587 veh->createDevice(deviceName);
2588 } catch (InvalidArgument& e) {
2589 throw TraCIException("Cannot create vehicle device (" + std::string(e.what()) + ").");
2590 }
2591 } else {
2592 ((SUMOVehicleParameter&)veh->getParameter()).setParameter(key, value);
2593 }
2594}
2595
2596
2597void
2598Vehicle::highlight(const std::string& vehID, const TraCIColor& col, double size, const int alphaMax, const double duration, const int type) {
2599
2600 // NOTE: Code is duplicated in large parts in POI.cpp
2601 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2602
2603 // Center of the highlight circle
2604 Position center = veh->getPosition();
2605 const double l2 = veh->getLength() * 0.5;
2606 center.sub(cos(veh->getAngle())*l2, sin(veh->getAngle())*l2);
2607 // Size of the highlight circle
2608 if (size <= 0) {
2609 size = veh->getLength() * 0.7;
2610 }
2611 // Make polygon shape
2612 const unsigned int nPoints = 34;
2613 const PositionVector circlePV = GeomHelper::makeRing(size, size + 1., center, nPoints);
2614 TraCIPositionVector circle = Helper::makeTraCIPositionVector(circlePV);
2615
2616#ifdef DEBUG_DYNAMIC_SHAPES
2617 std::cout << SIMTIME << " Vehicle::highlight() for vehicle '" << vehID << "'\n"
2618 << " circle: " << circlePV << std::endl;
2619#endif
2620
2621 // Find a free polygon id
2622 int i = 0;
2623 std::string polyID = veh->getID() + "_hl" + toString(i);
2624 while (Polygon::exists(polyID)) {
2625 polyID = veh->getID() + "_hl" + toString(++i);
2626 }
2627 // Line width
2628 double lw = 0.;
2629 // Layer
2630 double lyr = 0.;
2631 if (MSNet::getInstance()->isGUINet()) {
2632 lyr = GLO_VEHICLE + 0.01;
2633 lyr += (type + 1) / 257.;
2634 }
2635 // Make Polygon
2636 Polygon::addHighlightPolygon(vehID, type, polyID, circle, col, true, "highlight", (int)lyr, lw);
2637
2638 // Animation time line
2639 double maxAttack = 1.0; // maximal fade-in time
2640 std::vector<double> timeSpan;
2641 if (duration > 0.) {
2642 timeSpan = {0, MIN2(maxAttack, duration / 3.), 2.*duration / 3., duration};
2643 }
2644 // Alpha time line
2645 std::vector<double> alphaSpan;
2646 if (alphaMax > 0.) {
2647 alphaSpan = {0., (double) alphaMax, (double)(alphaMax) / 3., 0.};
2648 }
2649 // Attach dynamics
2650 Polygon::addDynamics(polyID, vehID, timeSpan, alphaSpan, false, true);
2651}
2652
2653void
2654Vehicle::dispatchTaxi(const std::string& vehID, const std::vector<std::string>& reservations) {
2655 MSBaseVehicle* veh = Helper::getVehicle(vehID);
2656 MSDevice_Taxi* taxi = static_cast<MSDevice_Taxi*>(veh->getDevice(typeid(MSDevice_Taxi)));
2657 if (!veh->hasDeparted()) {
2658 throw TraCIException("Vehicle '" + vehID + "' has not yet departed");
2659 }
2660 if (taxi == nullptr) {
2661 throw TraCIException("Vehicle '" + vehID + "' is not a taxi");
2662 }
2664 if (dispatcher == nullptr) {
2665 throw TraCIException("Cannot dispatch taxi because no reservations have been made");
2666 }
2667 MSDispatch_TraCI* traciDispatcher = dynamic_cast<MSDispatch_TraCI*>(dispatcher);
2668 if (traciDispatcher == nullptr) {
2669 throw TraCIException("device.taxi.dispatch-algorithm 'traci' has not been loaded");
2670 }
2671 if (reservations.size() == 0) {
2672 throw TraCIException("No reservations have been specified for vehicle '" + vehID + "'");
2673 }
2674 try {
2675 traciDispatcher->interpretDispatch(taxi, reservations);
2676 } catch (InvalidArgument& e) {
2677 throw TraCIException("Could not interpret reservations for vehicle '" + vehID + "' (" + e.what() + ").");
2678 }
2679}
2680
2682
2683
2684void
2685Vehicle::subscribeLeader(const std::string& vehID, double dist, double begin, double end) {
2686 subscribe(vehID, std::vector<int>({ libsumo::VAR_LEADER }), begin, end,
2687 libsumo::TraCIResults({ {libsumo::VAR_LEADER, std::make_shared<libsumo::TraCIDouble>(dist)} }));
2688}
2689
2690
2691void
2692Vehicle::addSubscriptionFilterLanes(const std::vector<int>& lanes, bool noOpposite, double downstreamDist, double upstreamDist) {
2694 if (s != nullptr) {
2695 s->filterLanes = lanes;
2696 }
2697 if (noOpposite) {
2698 addSubscriptionFilterNoOpposite();
2699 }
2700 if (downstreamDist != INVALID_DOUBLE_VALUE) {
2701 addSubscriptionFilterDownstreamDistance(downstreamDist);
2702 }
2703 if (upstreamDist != INVALID_DOUBLE_VALUE) {
2704 addSubscriptionFilterUpstreamDistance(upstreamDist);
2705 }
2706}
2707
2708
2709void
2710Vehicle::addSubscriptionFilterNoOpposite() {
2712}
2713
2714
2715void
2716Vehicle::addSubscriptionFilterDownstreamDistance(double dist) {
2718 if (s != nullptr) {
2719 s->filterDownstreamDist = dist;
2720 }
2721}
2722
2723
2724void
2725Vehicle::addSubscriptionFilterUpstreamDistance(double dist) {
2727 if (s != nullptr) {
2728 s->filterUpstreamDist = dist;
2729 }
2730}
2731
2732
2733void
2734Vehicle::addSubscriptionFilterCFManeuver(double downstreamDist, double upstreamDist) {
2735 addSubscriptionFilterLeadFollow(std::vector<int>({0}));
2736 if (downstreamDist != INVALID_DOUBLE_VALUE) {
2737 addSubscriptionFilterDownstreamDistance(downstreamDist);
2738 }
2739 if (upstreamDist != INVALID_DOUBLE_VALUE) {
2740 addSubscriptionFilterUpstreamDistance(upstreamDist);
2741 }
2742
2743}
2744
2745
2746void
2747Vehicle::addSubscriptionFilterLCManeuver(int direction, bool noOpposite, double downstreamDist, double upstreamDist) {
2748 std::vector<int> lanes;
2749 if (direction == INVALID_INT_VALUE) {
2750 // Using default: both directions
2751 lanes = std::vector<int>({-1, 0, 1});
2752 } else if (direction != -1 && direction != 1) {
2753 WRITE_WARNINGF(TL("Ignoring lane change subscription filter with non-neighboring lane offset direction=%."), direction);
2754 } else {
2755 lanes = std::vector<int>({0, direction});
2756 }
2757 addSubscriptionFilterLeadFollow(lanes);
2758 if (noOpposite) {
2759 addSubscriptionFilterNoOpposite();
2760 }
2761 if (downstreamDist != INVALID_DOUBLE_VALUE) {
2762 addSubscriptionFilterDownstreamDistance(downstreamDist);
2763 }
2764 if (upstreamDist != INVALID_DOUBLE_VALUE) {
2765 addSubscriptionFilterUpstreamDistance(upstreamDist);
2766 }
2767}
2768
2769
2770void
2771Vehicle::addSubscriptionFilterLeadFollow(const std::vector<int>& lanes) {
2773 addSubscriptionFilterLanes(lanes);
2774}
2775
2776
2777void
2778Vehicle::addSubscriptionFilterTurn(double downstreamDist, double foeDistToJunction) {
2780 if (downstreamDist != INVALID_DOUBLE_VALUE) {
2781 addSubscriptionFilterDownstreamDistance(downstreamDist);
2782 }
2783 if (foeDistToJunction != INVALID_DOUBLE_VALUE) {
2784 s->filterFoeDistToJunction = foeDistToJunction;
2785 }
2786}
2787
2788
2789void
2790Vehicle::addSubscriptionFilterVClass(const std::vector<std::string>& vClasses) {
2792 if (s != nullptr) {
2793 s->filterVClasses = parseVehicleClasses(vClasses);
2794 }
2795}
2796
2797
2798void
2799Vehicle::addSubscriptionFilterVType(const std::vector<std::string>& vTypes) {
2801 if (s != nullptr) {
2802 s->filterVTypes.insert(vTypes.begin(), vTypes.end());
2803 }
2804}
2805
2806
2807void
2808Vehicle::addSubscriptionFilterFieldOfVision(double openingAngle) {
2810 if (s != nullptr) {
2811 s->filterFieldOfVisionOpeningAngle = openingAngle;
2812 }
2813}
2814
2815
2816void
2817Vehicle::addSubscriptionFilterLateralDistance(double lateralDist, double downstreamDist, double upstreamDist) {
2819 if (s != nullptr) {
2820 s->filterLateralDist = lateralDist;
2821 }
2822 if (downstreamDist != INVALID_DOUBLE_VALUE) {
2823 addSubscriptionFilterDownstreamDistance(downstreamDist);
2824 }
2825 if (upstreamDist != INVALID_DOUBLE_VALUE) {
2826 addSubscriptionFilterUpstreamDistance(upstreamDist);
2827 }
2828}
2829
2830
2831void
2832Vehicle::storeShape(const std::string& id, PositionVector& shape) {
2833 shape.push_back(Helper::getVehicle(id)->getPosition());
2834}
2835
2836
2837std::shared_ptr<VariableWrapper>
2838Vehicle::makeWrapper() {
2839 return std::make_shared<Helper::SubscriptionWrapper>(handleVariable, mySubscriptionResults, myContextSubscriptionResults);
2840}
2841
2842
2843bool
2844Vehicle::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper, tcpip::Storage* paramData) {
2845 switch (variable) {
2846 case TRACI_ID_LIST:
2847 return wrapper->wrapStringList(objID, variable, getIDList());
2848 case ID_COUNT:
2849 return wrapper->wrapInt(objID, variable, getIDCount());
2850 case VAR_POSITION:
2851 return wrapper->wrapPosition(objID, variable, getPosition(objID));
2852 case VAR_POSITION3D:
2853 return wrapper->wrapPosition(objID, variable, getPosition(objID, true));
2854 case VAR_ANGLE:
2855 return wrapper->wrapDouble(objID, variable, getAngle(objID));
2856 case VAR_SPEED:
2857 return wrapper->wrapDouble(objID, variable, getSpeed(objID));
2858 case VAR_SPEED_LAT:
2859 return wrapper->wrapDouble(objID, variable, getLateralSpeed(objID));
2860 case VAR_ROAD_ID:
2861 return wrapper->wrapString(objID, variable, getRoadID(objID));
2863 return wrapper->wrapDouble(objID, variable, getSpeedWithoutTraCI(objID));
2864 case VAR_SLOPE:
2865 return wrapper->wrapDouble(objID, variable, getSlope(objID));
2866 case VAR_LANE_ID:
2867 return wrapper->wrapString(objID, variable, getLaneID(objID));
2868 case VAR_LANE_INDEX:
2869 return wrapper->wrapInt(objID, variable, getLaneIndex(objID));
2870 case VAR_SEGMENT_ID:
2871 return wrapper->wrapString(objID, variable, getSegmentID(objID));
2872 case VAR_SEGMENT_INDEX:
2873 return wrapper->wrapInt(objID, variable, getSegmentIndex(objID));
2874 case VAR_TYPE:
2875 return wrapper->wrapString(objID, variable, getTypeID(objID));
2876 case VAR_ROUTE_ID:
2877 return wrapper->wrapString(objID, variable, getRouteID(objID));
2878 case VAR_DEPARTURE:
2879 return wrapper->wrapDouble(objID, variable, getDeparture(objID));
2880 case VAR_DEPART_DELAY:
2881 return wrapper->wrapDouble(objID, variable, getDepartDelay(objID));
2882 case VAR_ROUTE_INDEX:
2883 return wrapper->wrapInt(objID, variable, getRouteIndex(objID));
2884 case VAR_COLOR:
2885 return wrapper->wrapColor(objID, variable, getColor(objID));
2886 case VAR_LANEPOSITION:
2887 return wrapper->wrapDouble(objID, variable, getLanePosition(objID));
2889 return wrapper->wrapDouble(objID, variable, getLateralLanePosition(objID));
2890 case VAR_CO2EMISSION:
2891 return wrapper->wrapDouble(objID, variable, getCO2Emission(objID));
2892 case VAR_COEMISSION:
2893 return wrapper->wrapDouble(objID, variable, getCOEmission(objID));
2894 case VAR_HCEMISSION:
2895 return wrapper->wrapDouble(objID, variable, getHCEmission(objID));
2896 case VAR_PMXEMISSION:
2897 return wrapper->wrapDouble(objID, variable, getPMxEmission(objID));
2898 case VAR_NOXEMISSION:
2899 return wrapper->wrapDouble(objID, variable, getNOxEmission(objID));
2901 return wrapper->wrapDouble(objID, variable, getFuelConsumption(objID));
2902 case VAR_NOISEEMISSION:
2903 return wrapper->wrapDouble(objID, variable, getNoiseEmission(objID));
2905 return wrapper->wrapDouble(objID, variable, getElectricityConsumption(objID));
2906 case VAR_PERSON_NUMBER:
2907 return wrapper->wrapInt(objID, variable, getPersonNumber(objID));
2909 return wrapper->wrapInt(objID, variable, getPersonCapacity(objID));
2911 return wrapper->wrapDouble(objID, variable, getBoardingDuration(objID));
2913 return wrapper->wrapStringList(objID, variable, getPersonIDList(objID));
2914 case VAR_WAITING_TIME:
2915 return wrapper->wrapDouble(objID, variable, getWaitingTime(objID));
2917 return wrapper->wrapDouble(objID, variable, getAccumulatedWaitingTime(objID));
2918 case VAR_EDGE_TRAVELTIME: {
2919 StoHelp::readCompound(*paramData);
2920 const double time = StoHelp::readTypedDouble(*paramData);
2921 return wrapper->wrapDouble(objID, variable, getAdaptedTraveltime(objID, time, StoHelp::readTypedString(*paramData)));
2922 }
2923 case VAR_EDGE_EFFORT: {
2924 StoHelp::readCompound(*paramData);
2925 const double time = StoHelp::readTypedDouble(*paramData);
2926 return wrapper->wrapDouble(objID, variable, getEffort(objID, time, StoHelp::readTypedString(*paramData)));
2927 }
2928 case VAR_ROUTE_VALID:
2929 return wrapper->wrapInt(objID, variable, isRouteValid(objID));
2930 case VAR_EDGES:
2931 return wrapper->wrapStringList(objID, variable, getRoute(objID));
2932 case VAR_SIGNALS:
2933 return wrapper->wrapInt(objID, variable, getSignals(objID));
2934 case VAR_BEST_LANES:
2935 return wrapper->wrapBestLanesDataVector(objID, variable, getBestLanes(objID));
2936 case VAR_NEXT_LINKS:
2937 return wrapper->wrapConnectionVector(objID, variable, getNextLinks(objID));
2938 case VAR_STOPSTATE:
2939 return wrapper->wrapInt(objID, variable, getStopState(objID));
2940 case VAR_DISTANCE:
2941 return wrapper->wrapDouble(objID, variable, getDistance(objID));
2943 return wrapper->wrapDouble(objID, variable, getReferenceDistance(objID));
2944 case VAR_ALLOWED_SPEED:
2945 return wrapper->wrapDouble(objID, variable, getAllowedSpeed(objID));
2946 case VAR_SPEED_FACTOR:
2947 return wrapper->wrapDouble(objID, variable, getSpeedFactor(objID));
2948 case VAR_SPEEDSETMODE:
2949 return wrapper->wrapInt(objID, variable, getSpeedMode(objID));
2951 return wrapper->wrapInt(objID, variable, getLaneChangeMode(objID));
2952 case VAR_ROUTING_MODE:
2953 return wrapper->wrapInt(objID, variable, getRoutingMode(objID));
2954 case VAR_LINE:
2955 return wrapper->wrapString(objID, variable, getLine(objID));
2956 case VAR_VIA:
2957 return wrapper->wrapStringList(objID, variable, getVia(objID));
2958 case VAR_ACCELERATION:
2959 return wrapper->wrapDouble(objID, variable, getAcceleration(objID));
2960 case VAR_LASTACTIONTIME:
2961 return wrapper->wrapDouble(objID, variable, getLastActionTime(objID));
2962 case VAR_STOP_DELAY:
2963 return wrapper->wrapDouble(objID, variable, getStopDelay(objID));
2964 case VAR_IMPATIENCE:
2965 return wrapper->wrapDouble(objID, variable, getImpatience(objID));
2967 return wrapper->wrapDouble(objID, variable, getStopArrivalDelay(objID));
2968 case VAR_TIMELOSS:
2969 return wrapper->wrapDouble(objID, variable, getTimeLoss(objID));
2970 case VAR_MINGAP_LAT:
2971 return wrapper->wrapDouble(objID, variable, getMinGapLat(objID));
2972 case VAR_LEADER:
2973 return wrapper->wrapStringDoublePair(objID, variable, getLeader(objID, StoHelp::readTypedDouble(*paramData)));
2974 case VAR_FOLLOWER:
2975 return wrapper->wrapStringDoublePair(objID, variable, getFollower(objID, StoHelp::readTypedDouble(*paramData)));
2976 case VAR_LOADED_LIST:
2977 return wrapper->wrapStringList(objID, variable, getLoadedIDList());
2979 return wrapper->wrapStringList(objID, variable, getTeleportingIDList());
2980 case VAR_FOLLOW_SPEED: {
2981 StoHelp::readCompound(*paramData);
2982 const double speed = StoHelp::readTypedDouble(*paramData);
2983 const double gap = StoHelp::readTypedDouble(*paramData);
2984 const double leaderSpeed = StoHelp::readTypedDouble(*paramData);
2985 const double leaderMaxDecel = StoHelp::readTypedDouble(*paramData);
2986 return wrapper->wrapDouble(objID, variable, getFollowSpeed(objID, speed, gap, leaderSpeed, leaderMaxDecel, StoHelp::readTypedString(*paramData)));
2987 }
2988 case VAR_SECURE_GAP: {
2989 StoHelp::readCompound(*paramData);
2990 const double speed = StoHelp::readTypedDouble(*paramData);
2991 const double leaderSpeed = StoHelp::readTypedDouble(*paramData);
2992 const double leaderMaxDecel = StoHelp::readTypedDouble(*paramData);
2993 return wrapper->wrapDouble(objID, variable, getSecureGap(objID, speed, leaderSpeed, leaderMaxDecel, StoHelp::readTypedString(*paramData)));
2994 }
2995 case VAR_STOP_SPEED: {
2996 StoHelp::readCompound(*paramData);
2997 const double speed = StoHelp::readTypedDouble(*paramData);
2998 return wrapper->wrapDouble(objID, variable, getStopSpeed(objID, speed, StoHelp::readTypedDouble(*paramData)));
2999 }
3000 case VAR_FOES:
3001 return wrapper->wrapJunctionFoeVector(objID, variable, getJunctionFoes(objID, StoHelp::readTypedDouble(*paramData)));
3002 case VAR_NEIGHBORS:
3003 return wrapper->wrapStringDoublePairList(objID, variable, getNeighbors(objID, StoHelp::readTypedByte(*paramData)));
3004 case CMD_CHANGELANE:
3005 return wrapper->wrapIntPair(objID, variable, getLaneChangeState(objID, StoHelp::readTypedInt(*paramData)));
3006 case VAR_STOP_PARAMETER: {
3007 const int count = StoHelp::readCompound(*paramData);
3008 const int nextStopIndex = StoHelp::readTypedInt(*paramData);
3009 const std::string param = StoHelp::readTypedString(*paramData);
3010 const bool customParam = count == 3 && StoHelp::readTypedByte(*paramData) != 0;
3011 return wrapper->wrapString(objID, variable, getStopParameter(objID, nextStopIndex, param, customParam));
3012 }
3013 case VAR_NEXT_TLS:
3014 return wrapper->wrapNextTLSDataVector(objID, variable, getNextTLS(objID));
3015 case VAR_NEXT_STOPS:
3016 return wrapper->wrapNextStopDataVector(objID, variable, getNextStops(objID));
3017 case VAR_NEXT_STOPS2:
3018 return wrapper->wrapNextStopDataVector(objID, variable, getStops(objID, StoHelp::readTypedInt(*paramData)));
3019 case DISTANCE_REQUEST: {
3020 TraCIRoadPosition roadPos;
3021 Position pos;
3022 if (Helper::readDistanceRequest(*paramData, roadPos, pos) == libsumo::POSITION_ROADMAP) {
3023 return wrapper->wrapDouble(objID, variable, getDrivingDistance(objID, roadPos.edgeID, roadPos.pos, roadPos.laneIndex));
3024 }
3025 return wrapper->wrapDouble(objID, variable, getDrivingDistance2D(objID, pos.x(), pos.y()));
3026 }
3027 case VAR_TAXI_FLEET:
3028 return wrapper->wrapStringList(objID, variable, getTaxiFleet(StoHelp::readTypedInt(*paramData)));
3029 case VAR_PARAMETER:
3030 return wrapper->wrapString(objID, variable, getParameter(objID, StoHelp::readTypedString(*paramData)));
3032 return wrapper->wrapStringPair(objID, variable, getParameterWithKey(objID, StoHelp::readTypedString(*paramData)));
3033 default:
3034 return VehicleType::handleVariableWithID(objID, getTypeID(objID), variable, wrapper, paramData);
3035 }
3036}
3037
3038
3039}
3040
3041
3042/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
@ GLO_VEHICLE
a vehicle
std::vector< const MSEdge * > ConstMSEdgeVector
Definition MSEdge.h:74
std::vector< MSEdge * > MSEdgeVector
Definition MSEdge.h:73
std::pair< const MSVehicle *, double > CLeaderDist
ConstMSEdgeVector::const_iterator MSRouteIterator
Definition MSRoute.h:57
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define WRITE_ERROR(msg)
Definition MsgHandler.h:295
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
void checkTimeBounds(const double time)
check the valid SUMOTime range of double input and throw an error if out of bounds
Definition SUMOTime.cpp:173
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
#define STEPS2TIME(x)
Definition SUMOTime.h:58
#define SPEED2DIST(x)
Definition SUMOTime.h:48
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SIMTIME
Definition SUMOTime.h:65
#define TIME2STEPS(x)
Definition SUMOTime.h:60
LatAlignmentDefinition
Possible ways to choose the lateral alignment, i.e., how vehicles align themselves within their lane.
SUMOVehicleClass getVehicleClassID(const std::string &name)
Returns the class id of the abstract class given by its name.
SUMOVehicleShape getVehicleShapeID(const std::string &name)
Returns the class id of the shape class given by its name.
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
std::string getVehicleShapeName(SUMOVehicleShape id)
Returns the class name of the shape class given by its id.
StringBijection< SUMOVehicleClass > SumoVehicleClassStrings(sumoVehicleClassStringInitializer, SVC_CUSTOM2, false)
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_IGNORING
vehicles ignoring classes
const long long int VEHPARS_ARRIVALSPEED_SET
const long long int VEHPARS_PERSON_NUMBER_SET
const long long int VEHPARS_DEPARTSPEED_SET
const int STOP_ARRIVAL_SET
const int STOP_DURATION_SET
const int STOP_POSLAT_SET
const int STOP_EXPECTED_SET
const long long int VEHPARS_FORCE_REROUTE
const int STOP_SPEED_SET
const int STOP_JUMP_UNTIL_SET
const int STOP_UNTIL_SET
const int STOP_LINE_SET
const int STOP_PARKING_SET
const int STOP_TRIP_ID_SET
const long long int VEHPARS_COLOR_SET
std::vector< SUMOVehicleParameter::Stop > StopParVector
const int STOP_PERMITTED_SET
const int STOP_SPLIT_SET
const long long int VEHPARS_TO_TAZ_SET
const long long int VEHPARS_ARRIVALLANE_SET
const long long int VEHPARS_DEPARTLANE_SET
const int STOP_START_SET
const long long int VEHPARS_DEPARTPOS_SET
const int STOP_JOIN_SET
const long long int VEHPARS_ARRIVALPOS_SET
const int STOP_EXTENSION_SET
const long long int VEHPARS_FROM_TAZ_SET
const int STOP_ENDED_SET
const int STOP_TRIGGER_SET
const long long int VEHPARS_VTYPE_SET
const int STOP_JUMP_SET
const int STOP_ONDEMAND_SET
const int STOP_END_SET
const int STOP_STARTED_SET
const int STOP_EXPECTED_CONTAINERS_SET
const long long int VEHPARS_LINE_SET
@ GIVEN
The time is given.
@ NOW
The vehicle is discarded if emission fails (not fully implemented yet)
@ CONTAINER_TRIGGERED
The departure is container triggered.
@ TRIGGERED
The departure is person triggered.
@ LCA_UNKNOWN
The action has not been determined.
@ SUMO_ATTR_STARTPOS
@ SUMO_ATTR_PARKING
@ SUMO_ATTR_EXTENSION
@ SUMO_ATTR_LANE
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_STARTED
@ SUMO_ATTR_CONTAINER_STOP
@ SUMO_ATTR_PARKING_AREA
@ SUMO_ATTR_EDGE
@ SUMO_ATTR_BUS_STOP
@ SUMO_ATTR_TRAIN_STOP
@ SUMO_ATTR_ENDPOS
@ SUMO_ATTR_SPLIT
@ SUMO_ATTR_ACTTYPE
@ SUMO_ATTR_POSITION_LAT
@ SUMO_ATTR_EXPECTED
@ SUMO_ATTR_LINE
@ SUMO_ATTR_CHARGING_STATION
@ SUMO_ATTR_ENDED
@ SUMO_ATTR_ONDEMAND
@ SUMO_ATTR_LCA_CONTRIGHT
@ SUMO_ATTR_INDEX
@ SUMO_ATTR_ARRIVAL
@ SUMO_ATTR_TRIP_ID
@ SUMO_ATTR_PERMITTED
@ SUMO_ATTR_JOIN
@ SUMO_ATTR_JUMP
@ SUMO_ATTR_EXPECTED_CONTAINERS
@ SUMO_ATTR_UNTIL
@ SUMO_ATTR_JUMP_UNTIL
@ SUMO_ATTR_TRIGGERED
@ SUMO_ATTR_DURATION
const double INVALID_DOUBLE
invalid double
Definition StdDefs.h:68
T MIN2(T a, T b)
Definition StdDefs.h:80
T MAX2(T a, T b)
Definition StdDefs.h:86
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition ToString.h:289
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
#define LIBSUMO_SUBSCRIPTION_IMPLEMENTATION(CLASS, DOM)
Definition TraCIDefs.h:77
#define LIBSUMO_GET_PARAMETER_WITH_KEY_IMPLEMENTATION(CLASS)
Definition TraCIDefs.h:124
double getParameter(const int index) const
Returns the nth parameter of this distribution.
static PositionVector makeRing(const double radius1, const double radius2, const Position &center, unsigned int nPoints)
static const double INVALID_OFFSET
a value to signify offsets outside the range of [0, Line.length()]
Definition GeomHelper.h:50
static double naviDegree(const double angle)
A vehicle from the mesoscopic point of view.
Definition MEVehicle.h:42
int getQueIndex() const
Returns the index of the que the vehicle is in.
Definition MEVehicle.h:233
SUMOTime getEventTime() const
Returns the (planned) time at which the vehicle leaves its current segment.
Definition MEVehicle.h:206
virtual double getSafetyFactor() const
return factor for modifying the safety constraints of the car-following model
virtual void setParameter(const std::string &key, const std::string &value)
try to set the given parameter for this laneChangeModel. Throw exception for unsupported key
void setExtraImpatience(double value)
Sets routing behavior.
The base class for microscopic and mesoscopic vehicles.
double getMaxSpeed() const
Returns the maximum speed (the minimum of desired and technical maximum speed)
double getImpatience() const
Returns this vehicles impatience.
void resetRoutePosition(int index, DepartLaneDefinition departLaneProcedure)
reset index of edge within route
bool replaceStop(int nextStopIndex, SUMOVehicleParameter::Stop stop, const std::string &info, bool teleport, std::string &errorMsg)
void setChosenSpeedFactor(const double factor)
Returns the precomputed factor by which the driver wants to be faster than the speed limit.
void setCarFollowModelParameter(const std::string &key, const std::string &value)
set individual carFollow model parameters (not type related)
void setRoutingMode(int value)
Sets routing behavior.
virtual double getStopDelay() const
Returns the estimated public transport stop (departure) delay in seconds.
bool rerouteBetweenStops(int nextStopIndex, const std::string &info, bool teleport, std::string &errorMsg)
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
double getChosenSpeedFactor() const
Returns the precomputed factor by which the driver wants to be faster than the speed limit.
virtual BaseInfluencer & getBaseInfluencer()=0
Returns the velocity/lane influencer.
virtual bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addRouteStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
virtual double getTimeLossSeconds() const
Returns the time loss in seconds.
double getOdometer() const
Returns the distance that was already driven by this vehicle.
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
const MSRouteIterator & getCurrentRouteEdge() const
Returns an iterator pointing to the current edge in this vehicles route.
bool hasValidRoute(std::string &msg, ConstMSRoutePtr route=0) const
Validates the current or given route.
virtual void onRemovalFromNet(const MSMoveReminder::Notification)
Called when the vehicle is removed from the network.
double getLength() const
Returns the vehicle's length.
bool isParking() const
Returns whether the vehicle is parking.
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
double getHarmonoise_NoiseEmissions() const
Returns noise emissions of the current state.
int getPersonNumber() const
Returns the number of persons.
void setJunctionModelParameter(const std::string &key, const std::string &value)
set individual junction model paramete (not type related)
bool hasDeparted() const
Returns whether this vehicle has already departed.
const std::list< MSStop > & getStops() const
SUMOTime getDeparture() const
Returns this vehicle's real departure time.
void setDeviceParameter(const std::string &deviceName, const std::string &key, const std::string &value)
try to set the given parameter from any of the vehicles devices, raise InvalidArgument if no device p...
virtual std::pair< const MSVehicle *const, double > getLeader(double dist=0, bool considerCrossingFoes=true) const
Returns the leader of the vehicle looking for a fixed distance.
bool hasStops() const
Returns whether the vehicle has to stop somewhere.
void addToOdometer(double value)
Manipulate the odometer.
const MSStop & getNextStop() const
std::string getPrefixedParameter(const std::string &key, std::string &error) const
retrieve parameters of devices, models and the vehicle itself
SUMOVehicleClass getVClass() const
Returns the vehicle's access class.
virtual double getStopArrivalDelay() const
Returns the estimated public transport stop arrival delay in seconds.
MSStop & getStop(int nextStopIndex)
virtual std::pair< const MSVehicle *const, double > getFollower(double dist=0) const
Returns the follower of the vehicle looking for a fixed distance.
bool insertStop(int nextStopIndex, SUMOVehicleParameter::Stop stop, const std::string &info, bool teleport, std::string &errorMsg)
std::vector< std::string > getPersonIDList() const
Returns the list of persons.
const MSEdgeWeightsStorage & getWeightsStorage() const
Returns the vehicle's internal edge travel times/efforts container.
virtual bool addTraciStop(SUMOVehicleParameter::Stop stop, std::string &errorMsg)
const MSRoute & getRoute() const
Returns the current route.
int getRoutingMode() const
return routing mode (configures router choice but also handling of transient permission changes)
int getRoutePosition() const
return index of edge within route
const StopParVector & getPastStops() const
double getEmissions() const
Returns emissions of the current state The value is always per 1s, so multiply by step length if nece...
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT() const
virtual bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
bool reroute(SUMOTime t, const std::string &info, SUMOAbstractRouter< MSEdge, SUMOVehicle > &router, const bool onInit=false, const bool withTaz=false, const bool silent=false, const MSEdge *sink=nullptr)
Performs a rerouting using the given router.
int getRNGIndex() const
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
void createDevice(const std::string &deviceName)
create device of the given type
bool isStopped() const
Returns whether the vehicle is at a stop.
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists, nullptr otherwise.
bool abortNextStop(int nextStopIndex=0)
deletes the next stop at the given index if it exists
virtual void replaceVehicleType(const MSVehicleType *type)
Replaces the current vehicle type by the one given.
bool replaceRouteEdges(ConstMSEdgeVector &edges, double cost, double savings, const std::string &info, bool onInit=false, bool check=false, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given edges.
double getEmergencyDecel() const
Get the vehicle type's maximal physically possible deceleration [m/s^2].
Definition MSCFModel.h:277
@ FUTURE
the return value is used for calculating future speeds
Definition MSCFModel.h:83
virtual double getSecureGap(const MSVehicle *const veh, const MSVehicle *const, const double speed, const double leaderSpeed, const double leaderMaxDecel) const
Returns the minimum gap to reserve if the leader is braking at maximum (>=0)
double getApparentDecel() const
Get the vehicle type's apparent deceleration [m/s^2] (the one regarded by its followers.
Definition MSCFModel.h:285
double getMaxAccel() const
Get the vehicle type's maximum acceleration [m/s^2].
Definition MSCFModel.h:261
double brakeGap(const double speed) const
Returns the distance the vehicle needs to halt including driver's reaction time tau (i....
Definition MSCFModel.h:408
virtual double getImperfection() const
Get the driver's imperfection.
Definition MSCFModel.h:331
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
Definition MSCFModel.h:269
virtual double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel, const MSVehicle *const pred=0, const CalcReason usage=CalcReason::CURRENT) const =0
Computes the vehicle's follow speed (no dawdling)
double stopSpeed(const MSVehicle *const veh, const double speed, double gap, const CalcReason usage=CalcReason::CURRENT) const
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling)
Definition MSCFModel.h:173
virtual double getHeadwayTime() const
Get the driver's desired headway [s].
Definition MSCFModel.h:339
A device which collects info on the vehicle trip (mainly on departure and arrival)
static const std::vector< MSDevice_Taxi * > & getFleet()
static MSDispatch * getDispatchAlgorithm()
A dispatch algorithm that services customers in reservation order and always sends the closest availa...
void interpretDispatch(MSDevice_Taxi *taxi, const std::vector< std::string > &reservationsIDs)
trigger taxi dispatch.
An algorithm that performs distpach for a taxi fleet.
Definition MSDispatch.h:114
A road/street connecting two junctions.
Definition MSEdge.h:77
static const MSEdgeVector & getAllEdges()
Returns all edges with a numerical id.
Definition MSEdge.cpp:1114
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
static void parseEdgesList(const std::string &desc, ConstMSEdgeVector &into, const std::string &rid)
Parses the given string assuming it contains a list of edge ids divided by spaces.
Definition MSEdge.cpp:1138
const std::vector< MSLane * > * allowedLanes(const MSEdge &destination, SUMOVehicleClass vclass=SVC_IGNORING, bool ignoreTransientPermissions=false) const
Get the allowed lanes to reach the destination-edge.
Definition MSEdge.cpp:480
double getLength() const
return the length of the edge
Definition MSEdge.h:694
double getDistanceAt(double pos) const
Returns the kilometrage/mileage at the given offset along the edge.
Definition MSEdge.cpp:1692
bool isInternal() const
return whether this edge is an internal edge
Definition MSEdge.h:269
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....
Definition MSEdge.cpp:1075
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the maximum speed the vehicle may use on this edge.
Definition MSEdge.cpp:1198
const MSEdge * getNormalBefore() const
if this edge is an internal edge, return its first normal predecessor, otherwise the edge itself
Definition MSEdge.cpp:965
bool retrieveExistingTravelTime(const MSEdge *const e, const double t, double &value) const
Returns a travel time for an edge and time if stored.
bool knowsTravelTime(const MSEdge *const e) const
Returns the information whether any travel time is known for the given edge.
void addTravelTime(const MSEdge *const e, double begin, double end, double value)
Adds a travel time information for an edge and a time span.
void removeEffort(const MSEdge *const e)
Removes the effort information for an edge.
bool knowsEffort(const MSEdge *const e) const
Returns the information whether any effort is known for the given edge.
void addEffort(const MSEdge *const e, double begin, double end, double value)
Adds an effort information for an edge and a time span.
bool retrieveExistingEffort(const MSEdge *const e, const double t, double &value) const
Returns an effort for an edge and time if stored.
void removeTravelTime(const MSEdge *const e)
Removes the travel time information for an edge.
static bool gCheckRoutes
Definition MSGlobals.h:91
static double gLateralResolution
Definition MSGlobals.h:100
static bool gSemiImplicitEulerUpdate
Definition MSGlobals.h:53
void alreadyDeparted(SUMOVehicle *veh)
stops trying to emit the given vehicle (because it already departed)
void add(SUMOVehicle *veh)
Adds a single vehicle for departure.
virtual const MSJunctionLogic * getLogic() const
Definition MSJunction.h:141
virtual const MSLogicJunction::LinkBits & getResponseFor(int linkIndex) const
Returns the response for the given link.
Representation of a lane in the micro simulation.
Definition MSLane.h:84
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.
Definition MSLane.cpp:2862
virtual MSVehicle * removeVehicle(MSVehicle *remVehicle, MSMoveReminder::Notification notification, bool notify=true)
Definition MSLane.cpp:2844
static std::vector< MSLink * >::const_iterator succLinkSec(const SUMOVehicle &veh, int nRouteSuccs, const MSLane &succLinkSource, const std::vector< MSLane * > &conts)
Definition MSLane.cpp:2707
void forceVehicleInsertion(MSVehicle *veh, double pos, MSMoveReminder::Notification notification, double posLat=0)
Inserts the given vehicle at the given position.
Definition MSLane.cpp:1398
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
Definition MSLane.h:603
const MSEdge * getNextNormal() const
Returns the lane's follower if it is an internal lane, the edge of the lane otherwise.
Definition MSLane.cpp:2471
void addLeaders(const MSVehicle *vehicle, double vehPos, MSLeaderDistanceInfo &result, bool oppositeDirection=false)
get leaders for ego on the given lane
Definition MSLane.cpp:4160
double getLength() const
Returns the lane's length.
Definition MSLane.h:617
bool isLinkEnd(std::vector< MSLink * >::const_iterator &i) const
Definition MSLane.h:866
int getIndex() const
Returns the lane's index.
Definition MSLane.h:653
double getOppositePos(double pos) const
return the corresponding position on the opposite lane
Definition MSLane.cpp:4407
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition MSLane.cpp:2495
bool isInternal() const
Definition MSLane.cpp:2626
virtual const PositionVector & getShape(bool) const
Definition MSLane.h:294
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:775
MSLeaderDistanceInfo getFollowersOnConsecutive(const MSVehicle *ego, double backOffset, bool allSublanes, double searchDist=-1, MinorLinkMode mLinkMode=FOLLOW_ALWAYS) const
return the sublane followers with the largest missing rear gap among all predecessor lanes (within di...
Definition MSLane.cpp:3815
double getWidth() const
Returns the lane's width.
Definition MSLane.h:646
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
Definition MSLane.h:735
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
Definition MSLane.h:561
saves leader/follower vehicles and their distances relative to an ego vehicle
void fixOppositeGaps(bool isFollower)
subtract vehicle length from all gaps if the leader vehicle is driving in the opposite direction
virtual int addLeader(const MSVehicle *veh, double gap, double latOffset=0, int sublane=-1)
int numSublanes() const
bool hasVehicles() const
Notification
Definition of a vehicle state.
@ NOTIFICATION_VAPORIZED_TRACI
The vehicle got removed via TraCI.
@ NOTIFICATION_ARRIVED
The vehicle arrived at its destination (is deleted)
@ NOTIFICATION_TELEPORT_ARRIVED
The vehicle was teleported out of the net.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NOTIFICATION_JUNCTION
The vehicle arrived at a junction.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:187
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
MSInsertionControl & getInsertionControl()
Returns the insertion control.
Definition MSNet.h:445
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:392
const ConstMSEdgeVector & getEdges() const
Definition MSRoute.h:128
MSRouteIterator end() const
Returns the end of the list of edges to pass.
Definition MSRoute.cpp:79
static bool dictionary(const std::string &id, ConstMSRoutePtr route)
Adds a route to the dictionary.
Definition MSRoute.cpp:116
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
Definition MSRoute.cpp:73
double getDistanceBetween(double fromPos, double toPos, const MSLane *fromLane, const MSLane *toLane, int routePosition=0) const
Compute the distance between 2 given edges on this route, optionally including the length of internal...
Definition MSRoute.cpp:318
const MSLane * lane
The lane to stop at (microsim only)
Definition MSStop.h:50
void initPars(const SUMOVehicleParameter::Stop &stopPar)
initialize attributes from the given stop parameters
Definition MSStop.cpp:148
int getStateFlagsOld() const
return flags as used by Vehicle::getStopState
Definition MSStop.cpp:164
bool reached
Information whether the stop has been reached.
Definition MSStop.h:75
MSRouteIterator edge
The edge in the route to stop at.
Definition MSStop.h:48
SUMOTime duration
The stopping duration.
Definition MSStop.h:67
const SUMOVehicleParameter::Stop pars
The stop parameter.
Definition MSStop.h:65
void setLaneChangeMode(int value)
Sets lane changing behavior.
void deactivateGapController()
Deactivates the gap control.
void setSpeedMode(int speedMode)
Sets speed-constraining behaviors.
void setLaneTimeLine(const std::vector< std::pair< SUMOTime, int > > &laneTimeLine)
Sets a new lane timeline.
void setSublaneChange(double latDist)
Sets a new sublane-change request.
void setSignals(int signals)
Definition MSVehicle.h:1595
void setSpeedTimeLine(const std::vector< std::pair< SUMOTime, double > > &speedTimeLine)
Sets a new velocity timeline.
void activateGapController(double originalTau, double newTimeHeadway, double newSpaceHeadway, double duration, double changeRate, double maxDecel, MSVehicle *refVeh=nullptr)
Activates the gap control with the given parameters,.
The class responsible for building and deletion of vehicles.
void removePending()
Removes a vehicle after it has ended.
virtual bool addVehicle(const std::string &id, SUMOVehicle *v)
Tries to insert the vehicle into the internal vehicle container.
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
MSVehicleType * getVType(const std::string &id=DEFAULT_VTYPE_ID, SumoRNG *rng=nullptr, bool readOnly=false)
Returns the named vehicle type or a sample from the named distribution.
std::map< std::string, SUMOVehicle * >::const_iterator constVehIt
Definition of the internal vehicles map iterator.
virtual SUMOVehicle * buildVehicle(SUMOVehicleParameter *defs, ConstMSRoutePtr route, MSVehicleType *type, const bool ignoreStopErrors, const VehicleDefinitionSource source=ROUTEFILE, bool addRouteStops=true)
Builds a vehicle, increases the number of built vehicles.
void scheduleVehicleRemoval(SUMOVehicle *veh, bool checkDuplicate=false)
Removes a vehicle after it has ended.
virtual void deleteVehicle(SUMOVehicle *v, bool discard=false, bool wasKept=false)
Deletes the vehicle.
constVehIt loadedVehBegin() const
Returns the begin of the internal vehicle map.
constVehIt loadedVehEnd() const
Returns the end of the internal vehicle map.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
void updateBestLanes(bool forceRebuild=false, const MSLane *startLane=0)
computes the best lanes to use in order to continue the route
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)
Definition MSVehicle.h:605
SUMOTime getLastActionTime() const
Returns the time of the vehicle's last action point.
Definition MSVehicle.h:541
void setTentativeLaneAndPosition(MSLane *lane, double pos, double posLat=0)
set tentative lane and position during insertion to ensure that all cfmodels work (some of them requi...
void setPreviousSpeed(double prevSpeed, double prevAcceleration)
Sets the influenced previous speed.
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
Definition MSVehicle.h:670
MSAbstractLaneChangeModel & getLaneChangeModel()
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
const std::vector< MSLane * > & getBestLanesContinuation() const
Returns the best sequence of lanes to continue the route starting at myLane.
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
bool resumeFromStopping()
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
Definition MSVehicle.h:398
void resetActionOffset(const SUMOTime timeUntilNextAction=0)
Resets the action offset for the vehicle.
bool rerouteParkingArea(const std::string &parkingAreaID, std::string &errorMsg)
void switchOffSignal(int signal)
Switches the given signal off.
Definition MSVehicle.h:1173
@ VEH_SIGNAL_NONE
Everything is switched off.
Definition MSVehicle.h:1110
const MSLane * getLane() const
Returns the lane the vehicle is on.
Definition MSVehicle.h:581
MSLane * getMutableLane() const
Returns the lane the vehicle is on Non const version indicates that something volatile is going on.
Definition MSVehicle.h:589
Influencer & getInfluencer()
void setActionStepLength(double actionStepLength, bool resetActionOffset=true)
Sets the action steplength of the vehicle.
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
Definition MSVehicle.h:413
double getSpeed() const
Returns the vehicle's current speed.
Definition MSVehicle.h:490
void updateLaneBruttoSum()
Update the lane brutto occupancy after a change in minGap.
const std::vector< LaneQ > & getBestLanes() const
Returns the description of best lanes to use in order to continue the route.
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
Definition MSVehicle.h:969
double getPositionOnLane() const
Get the vehicle's position along the lane.
Definition MSVehicle.h:374
double getAngle() const
Returns the vehicle's direction in radians.
Definition MSVehicle.h:735
bool hasInfluencer() const
whether the vehicle is individually influenced (via TraCI or special parameters)
Definition MSVehicle.h:1702
void setLateralPositionOnLane(double posLat)
Definition MSVehicle.h:417
void switchOnSignal(int signal)
Switches the given signal on.
Definition MSVehicle.h:1165
int getLaneIndex() const
static MSVehicleTransfer * getInstance()
Returns the instance of this object.
void remove(MSVehicle *veh)
Remove a vehicle from this transfer object.
The car-following model and parameter.
void setHeight(const double &height)
Set a new value for this type's height.
void setMaxSpeedLat(const double &maxSpeedLat)
Set a new value for this type's maximum lateral speed.
double getMinGapLat() const
Get the minimum lateral gap that vehicles of this type maintain.
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
void setEmissionClass(SUMOEmissionClass eclass)
Set a new value for this type's emission class.
double getMaxSpeed() const
Get vehicle's (technical) maximum speed [m/s].
int getPersonCapacity() const
Get this vehicle type's person capacity.
const std::string & getID() const
Returns the name of the vehicle type.
void setMinGapLat(const double &minGapLat)
Set a new value for this type's minimum lataral gap.
double getMinGap() const
Get the free space in front of vehicles of this class.
void setApparentDecel(double apparentDecel)
Set a new value for this type's apparent deceleration.
double getHeight() const
Get the height which vehicles of this class shall have when being drawn.
void setMaxSpeed(const double &maxSpeed)
Set a new value for this type's maximum speed.
const Distribution_Parameterized & getSpeedFactor() const
Returns this type's speed factor.
void setBoardingDuration(SUMOTime duration, bool isPerson=true)
Set a new value for this type's boardingDuration.
double getActionStepLengthSecs() const
Returns this type's default action step length in seconds.
void setLength(const double &length)
Set a new value for this type's length.
double getMaxSpeedLat() const
Get vehicle's maximum lateral speed [m/s].
void setVClass(SUMOVehicleClass vclass)
Set a new value for this type's vehicle class.
void setAccel(double accel)
Set a new value for this type's acceleration.
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
void setWidth(const double &width)
Set a new value for this type's width.
void setLcContRight(const std::string &value)
Set lcContRight (which is the only lc-attribute not used within the laneChange model)
void setImperfection(double imperfection)
Set a new value for this type's imperfection.
void setPreferredLateralAlignment(const LatAlignmentDefinition &latAlignment, double latAlignmentOffset=0.0)
Set vehicle's preferred lateral alignment.
void setTau(double tau)
Set a new value for this type's headway.
double getLength() const
Get vehicle's length [m].
void setMass(double mass)
Set a new value for this type's mass.
double getMass() const
Get this vehicle type's mass.
void setMinGap(const double &minGap)
Set a new value for this type's minimum gap.
void setShape(SUMOVehicleShape shape)
Set a new value for this type's shape.
static std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
Definition Named.h:67
const std::string & getID() const
Returns the id.
Definition Named.h:74
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
static std::string getName(const SUMOEmissionClass c)
Checks whether the string describes a known vehicle class.
static SUMOEmissionClass getClassByName(const std::string &eClass, const SUMOVehicleClass vc=SVC_IGNORING)
Checks whether the string describes a known vehicle class.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
Definition Position.h:273
void sub(double dx, double dy)
Subtracts the given position from this one.
Definition Position.h:149
double x() const
Returns the x-position.
Definition Position.h:52
void setz(double z)
set position z
Definition Position.h:77
double z() const
Returns the z-position.
Definition Position.h:62
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
double y() const
Returns the y-position.
Definition Position.h:57
A list of positions.
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
double distance2D(const Position &p, bool perpendicular=false) const
closest 2D-distance to point p (or -1 if perpendicular is true and the point is beyond this vector)
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
void set(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
assigns new values
Definition RGBColor.cpp:98
virtual double getSlope() const =0
Returns the slope of the road at object's position in degrees.
virtual const MSLane * getLane() const =0
Returns the lane the object is currently at.
virtual double getPreviousSpeed() const =0
Returns the object's previous speed.
virtual double getSpeed() const =0
Returns the object's current speed.
virtual Position getPosition(const double offset=0) const =0
Return current position (x/y, cartesian)
virtual double getPositionOnLane() const =0
Get the object's position along the lane.
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 bool parseLatAlignment(const std::string &val, double &lao, LatAlignmentDefinition &lad)
Parses and validates a given latAlignment value.
Representation of a vehicle.
Definition SUMOVehicle.h:63
virtual int getRouteValidity(bool update=true, bool silent=false, std::string *msgReturn=nullptr)=0
computes validity attributes for the current route
virtual bool wasRemoteControlled(SUMOTime lookBack=DELTA_T) const =0
Returns the information whether the vehicle is fully controlled via TraCI.
virtual bool hasDeparted() const =0
Returns whether this vehicle has departed.
virtual bool isOnRoad() const =0
Returns the information whether the vehicle is on a road (is simulated)
virtual bool isParking() const =0
Returns the information whether the vehicle is parked.
virtual double getAngle() const =0
Get the vehicle's angle.
Definition of vehicle stop (position and duration)
int getFlags() const
return flags as per Vehicle::getStops
SUMOTime started
the time at which this stop was reached
std::string edge
The edge to stop at.
ParkingType parking
whether the vehicle is removed from the net while stopping
std::string lane
The lane to stop at.
SUMOTime extension
The maximum time extension for boarding / loading.
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
double posLat
the lateral offset when stopping
bool onDemand
whether the stop may be skipped
std::string chargingStation
(Optional) charging station if one is assigned to the stop
std::vector< std::string > getTriggers() const
write trigger attribute
std::set< std::string > permitted
IDs of persons or containers that may board/load at this stop.
SUMOTime jumpUntil
earlierst jump end if there shall be a jump from this stop to the next route edge
int parametersSet
Information for the output which parameter were set.
SUMOTime jump
transfer time if there shall be a jump from this stop to the next route edge
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)
SUMOTime ended
the time at which this stop was ended
double endPos
The stopping position end.
std::set< std::string > awaitedPersons
IDs of persons the vehicle has to wait for until departing.
std::set< std::string > awaitedContainers
IDs of containers the vehicle has to wait for until departing.
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
SUMOTime arrival
The (expected) time at which the vehicle reaches the stop.
SUMOTime duration
The stopping duration.
Structure representing possible vehicle parameter.
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle's end speed shall be chosen.
double departSpeed
(optional) The initial speed of the vehicle
std::string vtypeid
The vehicle's type id.
std::vector< std::string > via
List of the via-edges the vehicle must visit.
static bool parseArrivalLane(const std::string &val, const std::string &element, const std::string &id, int &lane, ArrivalLaneDefinition &ald, std::string &error)
Validates a given arrivalLane value.
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
long long int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
static bool parseDepartSpeed(const std::string &val, const std::string &element, const std::string &id, double &speed, DepartSpeedDefinition &dsd, std::string &error)
Validates a given departSpeed value.
static bool parseArrivalPos(const std::string &val, const std::string &element, const std::string &id, double &pos, ArrivalPosDefinition &apd, std::string &error)
Validates a given arrivalPos value.
int personNumber
The static number of persons in the vehicle when it departs (not including boarding persons)
static bool parseArrivalSpeed(const std::string &val, const std::string &element, const std::string &id, double &speed, ArrivalSpeedDefinition &asd, std::string &error)
Validates a given arrivalSpeed value.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
double departPos
(optional) The position the vehicle shall depart from
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
RGBColor color
The vehicle's color, TraCI may change this.
double arrivalPos
(optional) The position the vehicle shall arrive on
static bool parseDepartLane(const std::string &val, const std::string &element, const std::string &id, int &lane, DepartLaneDefinition &dld, std::string &error)
Validates a given departLane value.
std::string id
The vehicle's id.
static bool parseDepart(const std::string &val, const std::string &element, const std::string &id, SUMOTime &depart, DepartDefinition &dd, std::string &error, const std::string &attr="departure")
Validates a given depart value.
ArrivalPosDefinition arrivalPosProcedure
Information how the vehicle shall choose the arrival position.
std::string toTaz
The vehicle's destination zone (district)
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
static bool parseDepartPos(const std::string &val, const std::string &element, const std::string &id, double &pos, DepartPosDefinition &dpd, std::string &error)
Validates a given departPos value.
std::string fromTaz
The vehicle's origin zone (district)
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
std::string line
The vehicle's line (mainly for public transport)
static ParkingType parseParkingType(const std::string &value)
parses parking type value
static void parseStopTriggers(const std::vector< std::string > &triggers, bool expectTrigger, Stop &stop)
parses stop trigger values
static bool isInternalRouteID(const std::string &id)
Checks whether the route ID uses the syntax of internal routes.
static StringBijection< LinkState > LinkStates
link states
static int getIndexFromLane(const std::string laneID)
return lane index when given the lane ID
static StringBijection< LinkDirection > LinkDirections
link directions
const std::string & getString(const T key) const
get string
std::set< std::string > getSet()
return set of strings
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
static bool startsWith(const std::string &str, const std::string prefix)
Checks whether a given string starts with the prefix.
static bool endsWith(const std::string &str, const std::string suffix)
Checks whether a given string ends with the suffix.
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
C++ TraCI client API implementation.
static MSEdge * getEdge(const std::string &edgeID)
Definition Helper.cpp:409
static TraCIPosition makeTraCIPosition(const Position &position, const bool includeZ=false)
Definition Helper.cpp:393
static bool moveToXYMap_matchingRoutePosition(const Position &pos, const std::string &origID, const ConstMSEdgeVector &currentRoute, int routeIndex, SUMOVehicleClass vClass, bool setLateralPos, double &bestDistance, MSLane **lane, double &lanePos, int &routeOffset)
Definition Helper.cpp:1757
static TraCIPositionVector makeTraCIPositionVector(const PositionVector &positionVector)
helper functions
Definition Helper.cpp:353
static int readDistanceRequest(tcpip::Storage &data, TraCIRoadPosition &roadPos, Position &pos)
Definition Helper.cpp:1882
static MSBaseVehicle * getVehicle(const std::string &id)
Definition Helper.cpp:494
static TraCIColor makeTraCIColor(const RGBColor &color)
Definition Helper.cpp:376
static TraCINextStopData buildStopData(const SUMOVehicleParameter::Stop &stopPar)
Definition Helper.cpp:660
static void setRemoteControlled(MSVehicle *v, Position xyPos, MSLane *l, double pos, double posLat, double angle, int edgeOffset, ConstMSEdgeVector route, SUMOTime t)
Definition Helper.cpp:1400
static const MSVehicleType & getVehicleType(const std::string &vehicleID)
Definition Helper.cpp:529
static bool moveToXYMap(const Position &pos, double maxRouteDistance, bool mayLeaveNetwork, const std::string &origID, const double angle, double speed, const ConstMSEdgeVector &currentRoute, const int routePosition, const MSLane *currentLane, double currentLanePos, bool onRoad, SUMOVehicleClass vClass, double currentAngle, bool setLateralPos, double &bestDistance, MSLane **lane, double &lanePos, int &routeOffset, ConstMSEdgeVector &edges)
Definition Helper.cpp:1440
static std::pair< MSLane *, double > convertCartesianToRoadMap(const Position &pos, const SUMOVehicleClass vClass)
Definition Helper.cpp:436
static SUMOVehicleParameter::Stop buildStopParameters(const std::string &edgeOrStoppingPlaceID, double pos, int laneIndex, double startPos, int flags, double duration, double until)
Definition Helper.cpp:554
static Subscription * addSubscriptionFilter(SubscriptionFilterType filter)
Definition Helper.cpp:229
static const MSLane * getLaneChecking(const std::string &edgeID, int laneIndex, double pos)
Definition Helper.cpp:419
static int readTypedByte(tcpip::Storage &ret, const std::string &error="")
static int readCompound(tcpip::Storage &ret, int expectedSize=-1, const std::string &error="")
static int readTypedInt(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="")
#define CALL_MESO_FUN(veh, fun, microResult)
#define CALL_MICRO_FUN(veh, fun, mesoResult)
#define DEBUG_COND
TRACI_CONST double INVALID_DOUBLE_VALUE
TRACI_CONST int VAR_LASTACTIONTIME
TRACI_CONST int VAR_EDGES
TRACI_CONST int POSITION_ROADMAP
TRACI_CONST int VAR_NOXEMISSION
TRACI_CONST int VAR_LANECHANGE_MODE
TRACI_CONST int VAR_REFERENCE_DISTANCE
TRACI_CONST int MOVE_AUTOMATIC
TRACI_CONST int LAST_STEP_PERSON_ID_LIST
TRACI_CONST int TRACI_ID_LIST
TRACI_CONST int VAR_IMPATIENCE
TRACI_CONST int VAR_SEGMENT_ID
TRACI_CONST int VAR_TYPE
TRACI_CONST int VAR_DEPARTURE
TRACI_CONST int VAR_ROUTING_MODE
TRACI_CONST int VAR_SECURE_GAP
TRACI_CONST int VAR_WAITING_TIME
TRACI_CONST int VAR_LINE
std::map< std::string, libsumo::SubscriptionResults > ContextSubscriptionResults
Definition TraCIDefs.h:379
TRACI_CONST int VAR_EDGE_TRAVELTIME
TRACI_CONST int VAR_ROAD_ID
TRACI_CONST int MOVE_NORMAL
TRACI_CONST int VAR_TIMELOSS
TRACI_CONST int VAR_SPEED_FACTOR
TRACI_CONST int VAR_FOLLOW_SPEED
TRACI_CONST int VAR_STOP_ARRIVALDELAY
TRACI_CONST int VAR_SPEED_LAT
TRACI_CONST int VAR_ANGLE
TRACI_CONST int VAR_NEXT_TLS
TRACI_CONST int VAR_EDGE_EFFORT
TRACI_CONST int VAR_BEST_LANES
TRACI_CONST int VAR_ALLOWED_SPEED
TRACI_CONST int VAR_LANE_INDEX
TRACI_CONST int VAR_PMXEMISSION
TRACI_CONST int VAR_SPEED_WITHOUT_TRACI
TRACI_CONST int VAR_BOARDING_DURATION
TRACI_CONST int MOVE_TELEPORT
TRACI_CONST int VAR_PERSON_NUMBER
TRACI_CONST int VAR_COEMISSION
TRACI_CONST int VAR_COLOR
TRACI_CONST int VAR_POSITION
TRACI_CONST int VAR_PERSON_CAPACITY
TRACI_CONST int VAR_STOP_PARAMETER
TRACI_CONST int VAR_LEADER
TRACI_CONST int VAR_CO2EMISSION
TRACI_CONST int VAR_TELEPORTING_LIST
TRACI_CONST int REMOVE_TELEPORT
TRACI_CONST int VAR_TAXI_FLEET
TRACI_CONST int VAR_ROUTE_VALID
TRACI_CONST int VAR_SPEEDSETMODE
TRACI_CONST int VAR_FUELCONSUMPTION
std::map< std::string, libsumo::TraCIResults > SubscriptionResults
{object->{variable->value}}
Definition TraCIDefs.h:378
TRACI_CONST int VAR_SLOPE
TRACI_CONST int VAR_HCEMISSION
TRACI_CONST int ID_COUNT
TRACI_CONST int VAR_PARAMETER
TRACI_CONST int VAR_LANEPOSITION
TRACI_CONST int REMOVE_PARKING
TRACI_CONST int VAR_LANE_ID
TRACI_CONST int VAR_STOP_SPEED
TRACI_CONST int VAR_NOISEEMISSION
TRACI_CONST int VAR_POSITION3D
TRACI_CONST int VAR_SPEED
TRACI_CONST int VAR_SIGNALS
TRACI_CONST int VAR_PARAMETER_WITH_KEY
TRACI_CONST int VAR_ACCUMULATED_WAITING_TIME
TRACI_CONST int VAR_MINGAP_LAT
TRACI_CONST int INVALID_INT_VALUE
TRACI_CONST int VAR_NEXT_LINKS
TRACI_CONST int VAR_ROUTE_INDEX
TRACI_CONST int VAR_NEXT_STOPS2
TRACI_CONST int VAR_ACCELERATION
TRACI_CONST int VAR_ROUTE_ID
TRACI_CONST int REMOVE_ARRIVED
TRACI_CONST int DISTANCE_REQUEST
@ SUBS_FILTER_LEAD_FOLLOW
@ SUBS_FILTER_UPSTREAM_DIST
@ SUBS_FILTER_VTYPE
@ SUBS_FILTER_LANES
@ SUBS_FILTER_NOOPPOSITE
@ SUBS_FILTER_DOWNSTREAM_DIST
@ SUBS_FILTER_LATERAL_DIST
@ SUBS_FILTER_TURN
@ SUBS_FILTER_VCLASS
@ SUBS_FILTER_FIELD_OF_VISION
TRACI_CONST int VAR_SEGMENT_INDEX
TRACI_CONST int ROUTING_MODE_DEFAULT
TRACI_CONST int VAR_LANEPOSITION_LAT
TRACI_CONST int CMD_CHANGELANE
TRACI_CONST int VAR_STOP_DELAY
TRACI_CONST int REMOVE_TELEPORT_ARRIVED
TRACI_CONST int VAR_NEIGHBORS
TRACI_CONST int REMOVE_VAPORIZED
TRACI_CONST int VAR_STOPSTATE
TRACI_CONST int VAR_FOLLOWER
TRACI_CONST int VAR_LOADED_LIST
TRACI_CONST int VAR_DEPART_DELAY
std::map< int, std::shared_ptr< libsumo::TraCIResult > > TraCIResults
{variable->value}
Definition TraCIDefs.h:376
TRACI_CONST int VAR_FOES
TRACI_CONST int VAR_DISTANCE
TRACI_CONST int ROUTING_MODE_AGGREGATED_CUSTOM
TRACI_CONST int VAR_ELECTRICITYCONSUMPTION
TRACI_CONST int VAR_VIA
TRACI_CONST int VAR_NEXT_STOPS
@ key
the parser read a key of a value in an object
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
Definition json.hpp:21884
A structure representing the best lanes for continuing the current route starting at 'lane'.
Definition MSVehicle.h:857