Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSTransportable.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2025 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/****************************************************************************/
20// The common superclass for modelling transportable objects like persons and containers
21/****************************************************************************/
22#include <config.h>
23
30#include <microsim/MSEdge.h>
31#include <microsim/MSLane.h>
32#include <microsim/MSNet.h>
43
45
46//#define DEBUG_PARKING
47
48// ===========================================================================
49// method definitions
50// ===========================================================================
52 SUMOTrafficObject(pars->id),
53 myParameter(pars), myVType(vtype), myPlan(plan),
54 myAmPerson(isPerson),
55 myNumericalID(myCurrentNumericalIndex++),
56 myRandomSeed(RandHelper::murmur3_32(pars->id, RandHelper::getSeed()))
57{
58 myStep = myPlan->begin();
59 // init devices
61 for (MSStage* const stage : * myPlan) {
62 stage->init(this);
63 }
64}
65
66
69 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
70 if (stage->getVehicle() != nullptr) {
71 stage->getVehicle()->removeTransportable(this);
72 } else if (stage->getOriginStop() != nullptr) {
73 stage->getOriginStop()->removeTransportable(this);
74 }
75 }
76 if (myPlan != nullptr) {
77 for (MSTransportablePlan::const_iterator i = myPlan->begin(); i != myPlan->end(); ++i) {
78 delete *i;
79 }
80 delete myPlan;
81 myPlan = nullptr;
82 }
83 for (MSTransportableDevice* dev : myDevices) {
84 delete dev;
85 }
86 delete myParameter;
89 }
90}
91
94 return getEdge()->getLanes()[0]->getRNG();
95}
96
97int
99 return getEdge()->getLanes()[0]->getRNGIndex();
100}
101
102bool
103MSTransportable::proceed(MSNet* net, SUMOTime time, const bool vehicleArrived) {
104 MSStage* const prior = *myStep;
105 const std::string& error = prior->setArrived(net, this, time, vehicleArrived);
106 // must be done before increasing myStep to avoid invalid state for rendering
107 prior->getEdge()->removeTransportable(this);
108 myStep++;
109 if (error != "") {
110 throw ProcessError(error);
111 }
112 /* We need to check whether an access stage is needed (or maybe even two).
113 The general scheme is: If the prior stage ended at a stop and the next stage
114 starts at an edge which is not the one the stop is at, but the stop has an access to it
115 we need an access stage. The same is true if prior ends at an edge, the next stage
116 is allowed to start at any stop the edge has access to.
117 If we start at a stop or end at a stop no access is needed.
118 */
119 bool accessToStop = false;
121 accessToStop = checkAccess(prior);
122 } else if (prior->getStageType() == MSStageType::WAITING_FOR_DEPART) {
123 for (MSTransportableDevice* const dev : myDevices) {
124 dev->notifyEnter(*this, MSMoveReminder::NOTIFICATION_DEPARTED, nullptr);
125 }
126 }
127 if (!accessToStop && (myStep == myPlan->end()
128 || ((*myStep)->getStageType() != MSStageType::DRIVING
129 && (*myStep)->getStageType() != MSStageType::TRIP))) {
130 MSStoppingPlace* priorStop = prior->getStageType() == MSStageType::TRIP ? prior->getOriginStop() : prior->getDestinationStop();
131 // a trip might resolve to DRIVING so we would have to stay at the stop
132 // if a trip resolves to something else, this step will do stop removal
133 if (priorStop != nullptr) {
134 priorStop->removeTransportable(this);
135 }
136 }
137 if (myStep != myPlan->end()) {
138 if ((*myStep)->getStageType() == MSStageType::WALKING && (prior->getStageType() != MSStageType::ACCESS || prior->getDestination() != (*myStep)->getFromEdge())) {
139 checkAccess(prior, false);
140 } else if ((*myStep)->getStageType() == MSStageType::WAITING && prior->getStageType() == MSStageType::WAITING && prior->getDestination() != (*myStep)->getFromEdge()) {
141 checkAccess(prior, false);
142 }
143 (*myStep)->proceed(net, this, time, prior);
144 return true;
145 } else {
147 return false;
148 }
149}
150
151
152void
153MSTransportable::setID(const std::string& /*newID*/) {
154 throw ProcessError(TL("Changing a transportable ID is not permitted"));
155}
156
161
162void
164 (*myStep)->setDeparted(now);
165}
166
169 for (const MSStage* const stage : *myPlan) {
170 if (stage->getDeparted() >= 0) {
171 return stage->getDeparted();
172 }
173 }
174 return -1;
175}
176
177
178double
180 return (*myStep)->getEdgePos(MSNet::getInstance()->getCurrentTimeStep());
181}
182
183double
185 return getEdgePos() - getVehicleType().getLength();
186}
187
188int
190 return (*myStep)->getDirection();
191}
192
195 return (*myStep)->getPosition(MSNet::getInstance()->getCurrentTimeStep());
196}
197
198double
200 return (*myStep)->getAngle(MSNet::getInstance()->getCurrentTimeStep());
201}
202
203double
205 return STEPS2TIME((*myStep)->getWaitingTime());
206}
207
208double
210 return (*myStep)->getSpeed();
211}
212
213
214void
216 SUMOTime departure = myPlan->front()->getDeparted();
217 os.openTag(isPerson() ? "personinfo" : "containerinfo");
219 os.writeAttr(SUMO_ATTR_DEPART, departure >= 0 ? time2string(departure) : "-1");
221 if (isPerson()) {
223 }
224 SUMOTime duration = 0;
225 SUMOTime waitingTime = 0;
226 SUMOTime timeLoss = 0;
227 SUMOTime travelTime = 0;
228 bool durationOK = true;
229 bool waitingTimeOK = true;
230 bool timeLossOK = true;
231 bool travelTimeOK = true;
232 for (MSStage* const i : *myPlan) {
233 SUMOTime t = i->getDuration();
234 if (t != SUMOTime_MAX) {
235 duration += t;
236 } else {
237 durationOK = false;
238 }
239 t = i->getTotalWaitingTime();
240 if (t != SUMOTime_MAX) {
241 waitingTime += t;
242 } else {
243 waitingTimeOK = false;
244 }
245 t = i->getTimeLoss(this);
246 if (t != SUMOTime_MAX) {
247 timeLoss += t;
248 } else {
249 timeLossOK = false;
250 }
251 t = i->getTravelTime();
252 if (t != SUMOTime_MAX) {
253 travelTime += t;
254 } else {
255 travelTimeOK = false;
256 }
257 }
258 os.writeAttr(SUMO_ATTR_DURATION, durationOK ? time2string(duration) : "-1");
259 os.writeAttr(SUMO_ATTR_WAITINGTIME, waitingTimeOK ? time2string(waitingTime) : "-1");
260 os.writeAttr(SUMO_ATTR_TIMELOSS, timeLossOK ? time2string(timeLoss) : "-1");
261 os.writeAttr(SUMO_ATTR_TRAVELTIME, travelTimeOK ? time2string(travelTime) : "-1");
262 for (MSStage* const i : *myPlan) {
263 i->tripInfoOutput(os, this);
264 }
265 os.closeTag();
266}
267
268
269void
270MSTransportable::routeOutput(OutputDevice& os, const bool withRouteLength) const {
271 const std::string typeID = (
275 if (hasArrived()) {
276 os.writeAttr("arrival", time2string(MSNet::getInstance()->getCurrentTimeStep()));
277 }
278 const MSStage* previous = nullptr;
279 for (const MSStage* const stage : *myPlan) {
280 stage->routeOutput(myAmPerson, os, withRouteLength, previous);
281 previous = stage;
282 }
284 os.closeTag();
285 os.lf();
286}
287
288
289void
299
300
303 WRITE_WARNINGF(TL("Teleporting % '%'; waited too long, from edge '%', time=%."),
304 isPerson() ? "person" : "container", getID(), (*myStep)->getEdge()->getID(), time2string(step));
307 (*myStep)->abort(this);
308 if (!proceed(MSNet::getInstance(), step)) {
309 tc.erase(this);
310 }
311 return 0;
312}
313
314
315void
317 // myStep is invalidated upon modifying myPlan
318 const int stepIndex = (int)(myStep - myPlan->begin());
319 if (next < 0) {
320 myPlan->push_back(stage);
321 } else {
322 if (stepIndex + next > (int)myPlan->size()) {
323 throw ProcessError("invalid index '" + toString(next) + "' for inserting new stage into plan of '" + getID() + "'");
324 }
325 myPlan->insert(myPlan->begin() + stepIndex + next, stage);
326 }
327 myStep = myPlan->begin() + stepIndex;
328}
329
330
331void
332MSTransportable::removeStage(int next, bool stayInSim) {
333 assert(myStep + next < myPlan->end());
334 assert(next >= 0);
335 if (next > 0) {
336 // myStep is invalidated upon modifying myPlan
337 int stepIndex = (int)(myStep - myPlan->begin());
338 delete *(myStep + next);
339 myPlan->erase(myStep + next);
340 myStep = myPlan->begin() + stepIndex;
341 } else {
342 if (myStep + 1 == myPlan->end() && stayInSim) {
343 // stay in the simulation until the start of simStep to allow appending new stages (at the correct position)
344 appendStage(new MSStageWaiting(getEdge(), nullptr, 0, 0, getEdgePos(), "last stage removed", false));
345 } else if (myStep + 1 != myPlan->end()) {
346 (*(myStep + 1))->setOrigin(getEdge(), getEdge() == getFromEdge() ? (*myStep)->getOriginStop() : nullptr, getEdgePos());
347 }
348 (*myStep)->abort(this);
351 } else if (myPlan->front()->getDeparted() < 0) {
352 myPlan->front()->setDeparted(SIMSTEP);
353 }
354 }
355}
356
357
358void
360 for (MSTransportablePlan::const_iterator i = myStep; i != myPlan->end(); ++i) {
361 (*i)->setSpeed(speed);
362 }
364}
365
366
367bool
368MSTransportable::replaceRoute(ConstMSRoutePtr newRoute, const std::string& /* info */, bool /* onInit */, int /* offset */, bool /* addRouteStops */, bool /* removeStops */, std::string* /* msgReturn */) {
369 if (isPerson()) {
370 static_cast<MSPerson*>(this)->replaceWalk(newRoute->getEdges(), getPositionOnLane(), 0, 1);
371 return true;
372 }
373 return false;
374}
375
376
377bool
378MSTransportable::reroute(SUMOTime t, const std::string& /* info */, MSTransportableRouter& router, const bool /* onInit */, const bool /* withTaz */, const bool /* silent */, const MSEdge* /* sink */) {
380 if (trip == nullptr) {
381 // TODO this should be possible after factoring out MSStageTrip::reroute
382 return false;
383 }
384 if (getCurrentStage()->getVehicle() != nullptr) {
385 // TODO rerouting during a ride still needs to be implemented
386 return false;
387 }
388 // find the final stage of the trip
389 int tripEndOffset = -1;
390 for (int i = getNumRemainingStages() - 1; i >= 0; i--) {
391 if (getNextStage(i)->getTrip() == trip) {
392 tripEndOffset = i;
393 break;
394 }
395 }
396 std::vector<MSStage*> stages;
397 MSStageWaiting start(getEdge(), getCurrentStage()->getOriginStop(), -1, t, getEdgePos(), "start", true);
398 if (trip->reroute(t, router, this, &start, getEdge(), getRerouteDestination(), stages) == "") {
399 // check whether the new plan actually differs
400 while (tripEndOffset >= 0 && !stages.empty() && stages.back()->equals(*getNextStage(tripEndOffset))) {
401 delete stages.back();
402 stages.pop_back();
403 tripEndOffset--;
404 }
405 bool abortCurrent = true;
406 // check whether the future route of the current stage is identical to the route
407 if (!stages.empty() && stages.front()->isWalk() && getCurrentStage()->isWalk()) {
408 // TODO this check should be done for rides as well
409 MSStageMoving* s = static_cast<MSStageMoving*>(getCurrentStage());
410 int routeIndex = (int)(s->getRouteStep() - s->getRoute().begin());
411 ConstMSEdgeVector oldEdges = s->getEdges();
412 oldEdges.erase(oldEdges.begin(), oldEdges.begin() + routeIndex);
413 ConstMSEdgeVector newEdges = stages.front()->getEdges();
414 if (newEdges == oldEdges) {
415 delete stages.front();
416 stages.erase(stages.begin());
417 abortCurrent = false;
418 }
419 }
420 if (stages.empty()) {
421 return false;
422 }
423 // remove future stages of the trip
424 for (int i = tripEndOffset; i >= 1; i--) {
425 removeStage(i);
426 }
427 // insert new stages of the rerouting
428 int idx = 1;
429 for (MSStage* stage : stages) {
430 appendStage(stage, idx++);
431 }
432 if (abortCurrent) {
433 removeStage(0);
434 }
435 return true;
436 }
437 return false;
438}
439
440
441void
443 const SUMOVehicleClass oldVClass = myVType->getVehicleClass();
444 if (myVType->isVehicleSpecific()) {
446 }
447 if (isPerson()
448 && type->getVehicleClass() != oldVClass
449 && type->getVehicleClass() != SVC_PEDESTRIAN
451 WRITE_WARNINGF(TL("Person '%' receives type '%' which implicitly uses unsuitable vClass '%'."), getID(), type->getID(), toString(type->getVehicleClass()));
452 }
453 myVType = type;
454}
455
456
459 if (myVType->isVehicleSpecific()) {
460 return *const_cast<MSVehicleType*>(myVType);
461 }
463 replaceVehicleType(type);
464 return *type;
465}
466
467
470 PositionVector centerLine;
471 const Position p = getPosition();
472 const double angle = getAngle();
473 const double length = getVehicleType().getLength();
474 const Position back = p + Position(-cos(angle) * length, -sin(angle) * length);
475 centerLine.push_back(p);
476 centerLine.push_back(back);
477 centerLine.move2side(0.5 * getVehicleType().getWidth());
478 PositionVector result = centerLine;
479 centerLine.move2side(-getVehicleType().getWidth());
480 result.append(centerLine.reverse(), POSITION_EPS);
481 //std::cout << " transp=" << getID() << " p=" << p << " angle=" << GeomHelper::naviDegree(angle) << " back=" << back << " result=" << result << "\n";
482 return result;
483}
484
485
486std::string
487MSTransportable::getStageSummary(int stageIndex) const {
488 assert(stageIndex < (int)myPlan->size());
489 assert(stageIndex >= 0);
490 return (*myPlan)[stageIndex]->getStageSummary(myAmPerson);
491}
492
493
494const std::set<SUMOTrafficObject::NumericalID>
496 std::set<SUMOTrafficObject::NumericalID> result;
497 for (auto step = myStep; step != myPlan->end(); ++step) {
498 for (const MSEdge* const e : (*step)->getEdges()) {
499 result.insert(e->getNumericalID());
500 }
501 }
502 return result;
503}
504
505
506bool
508 return myStep == myPlan->end();
509}
510
511bool
513 return myPlan->size() > 0 && (myPlan->front()->getDeparted() >= 0 || myStep > myPlan->begin());
514}
515
516
517void
519 // check whether the transportable was riding to the orignal stop
520 // @note: parkingArea can currently not be set as myDestinationStop so we
521 // check for stops on the edge instead
522#ifdef DEBUG_PARKING
523 std::cout << SIMTIME << " person=" << getID() << " rerouteParkingArea orig=" << orig->getID() << " replacement=" << replacement->getID() << "\n";
524#endif
526 if (!myAmPerson) {
527 WRITE_WARNING(TL("parkingAreaReroute not supported for containers"));
528 return;
529 }
530 if (getDestination() == &orig->getLane().getEdge()) {
531 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
532 assert(stage != 0);
533 assert(stage->getVehicle() != 0);
534 // adapt plan
535 stage->setDestination(&replacement->getLane().getEdge(), replacement);
536 stage->setArrivalPos((replacement->getBeginLanePosition() + replacement->getEndLanePosition()) / 2);
537#ifdef DEBUG_PARKING
538 std::cout << " set ride destination\n";
539#endif
540 if (myStep + 1 == myPlan->end()) {
541 return;
542 }
543 // if the next step is a walk, adapt the route
544 MSStage* nextStage = *(myStep + 1);
545 if (nextStage->getStageType() == MSStageType::TRIP) {
546 dynamic_cast<MSStageTrip*>(nextStage)->setOrigin(stage->getDestination(), stage->getDestinationStop(), stage->getArrivalPos());
547#ifdef DEBUG_PARKING
548 std::cout << " set subsequent trip origin\n";
549#endif
550 } else if (nextStage->getStageType() == MSStageType::WALKING) {
551#ifdef DEBUG_PARKING
552 std::cout << " replace subsequent walk with a trip\n";
553#endif
554 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
555 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
556 removeStage(1);
557 appendStage(newStage, 1);
558 } else if (nextStage->getStageType() == MSStageType::WAITING) {
559#ifdef DEBUG_PARKING
560 std::cout << " add subsequent walk to reach stop\n";
561 std::cout << " arrivalPos=" << nextStage->getArrivalPos() << "\n";
562#endif
563 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
564 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
565 appendStage(newStage, 1);
566 }
567 // if the plan contains another ride with the same vehicle from the same
568 // parking area, adapt the preceeding walk to end at the replacement
569 for (auto it = myStep + 2; it != myPlan->end(); it++) {
570 MSStage* const futureStage = *it;
571 MSStage* const prevStage = *(it - 1);
572 if (futureStage->getStageType() == MSStageType::DRIVING) {
573 MSStageDriving* const ds = static_cast<MSStageDriving*>(futureStage);
574 // ride origin is set implicitly from the walk destination
575 ds->setOrigin(nullptr, nullptr, -1);
576 if (ds->getLines() == stage->getLines()
577 && prevStage->getDestination() == &orig->getLane().getEdge()) {
578 if (prevStage->getStageType() == MSStageType::TRIP) {
579 dynamic_cast<MSStageTrip*>(prevStage)->setDestination(stage->getDestination(), replacement);
580#ifdef DEBUG_PARKING
581 std::cout << " replace later trip before ride (" << (it - myPlan->begin()) << ")\n";
582#endif
583 } else if (prevStage->getStageType() == MSStageType::WALKING) {
584#ifdef DEBUG_PARKING
585 std::cout << " replace later walk before ride (" << (it - myPlan->begin()) << ")\n";
586#endif
587 MSStageTrip* newStage = new MSStageTrip(prevStage->getFromEdge(), nullptr, stage->getDestination(),
588 replacement, -1, 0, "", -1, 1, getID(), 0, true, stage->getArrivalPos());
589 int prevStageRelIndex = (int)(it - 1 - myStep);
590 removeStage(prevStageRelIndex);
591 appendStage(newStage, prevStageRelIndex);
592 }
593 break;
594 }
595 }
596 }
597 }
598}
599
600
602MSTransportable::getDevice(const std::type_info& type) const {
603 for (MSTransportableDevice* const dev : myDevices) {
604 if (typeid(*dev) == type) {
605 return dev;
606 }
607 }
608 return nullptr;
609}
610
611
612void
613MSTransportable::setJunctionModelParameter(const std::string& key, const std::string& value) {
616 const_cast<SUMOVehicleParameter&>(getParameter()).setParameter(key, value);
617 // checked in MSLink::ignoreFoe
618 } else {
619 throw InvalidArgument(getObjectType() + " '" + getID() + "' does not support junctionModel parameter '" + key + "'");
620 }
621}
622
623
624double
626 const MSEdge* edge = getEdge();
627 const double ep = getEdgePos();
628 const double gp = edge->getLanes()[0]->interpolateLanePosToGeometryPos(ep);
629 return edge->getLanes()[0]->getShape().slopeDegreeAtOffset(gp);
630}
631
632
634MSTransportable::getWaitingTime(const bool /* accumulated */) const {
635 return (*myStep)->getWaitingTime();
636}
637
638
639double
641 return MIN2(getVehicleType().getMaxSpeed(), getVehicleType().getDesiredMaxSpeed() * getChosenSpeedFactor());
642}
643
644
649
650
651int
656
657void
659 // this saves lots of departParameters which are only needed for transportables that did not yet depart
660 // the parameters may hold the name of a vTypeDistribution but we are interested in the actual type
661 const SUMOTime desiredDepart = myParameter->depart;
662 if (myPlan->front()->getDeparted() >= 0) {
663 // this is only relevant in the context of delayed departure (max-num-persons)
664 const_cast<SUMOVehicleParameter*>(myParameter)->depart = myPlan->front()->getDeparted();
665 }
667 const_cast<SUMOVehicleParameter*>(myParameter)->depart = desiredDepart;
672 }
673 int stepIdx = (int)(myStep - myPlan->begin());
674 for (auto it = myPlan->begin(); it != myStep; ++it) {
675 const MSStageType st = (*it)->getStageType();
676 if (st == MSStageType::TRIP || st == MSStageType::ACCESS) {
677 stepIdx--;
678 }
679 }
680 std::ostringstream state;
681 state << myParameter->parametersSet << " " << stepIdx;
682 (*myStep)->saveState(state);
683 out.writeAttr(SUMO_ATTR_STATE, state.str());
684 const MSStage* previous = nullptr;
685 for (const MSStage* const stage : *myPlan) {
686 stage->routeOutput(myAmPerson, out, false, previous);
687 previous = stage;
688 }
689 out.closeTag();
690}
691
692
693void
694MSTransportable::loadState(const std::string& state) {
695 std::istringstream iss(state);
696 int step;
697 iss >> myParameter->parametersSet >> step;
698 myPlan->front()->setDeparted(myParameter->depart);
699 myStep = myPlan->begin() + step;
700 (*myStep)->loadState(this, iss);
701}
702
703
704/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
std::vector< const MSEdge * > ConstMSEdgeVector
Definition MSEdge.h:74
MSStageType
Definition MSStage.h:55
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
#define TL(string)
Definition MsgHandler.h:304
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
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:55
#define SIMSTEP
Definition SUMOTime.h:61
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SIMTIME
Definition SUMOTime.h:62
const long long int VTYPEPARS_VEHICLECLASS_SET
const std::string DEFAULT_PEDTYPE_ID
const std::string DEFAULT_CONTAINERTYPE_ID
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_PEDESTRIAN
pedestrian
const long long int VEHPARS_JUNCTIONMODEL_PARAMS_SET
const long long int VEHPARS_SPEEDFACTOR_SET
@ SUMO_TAG_CONTAINER
@ SUMO_TAG_PERSON
@ SUMO_ATTR_DEPART
@ SUMO_ATTR_WAITINGTIME
@ SUMO_ATTR_JM_IGNORE_IDS
@ SUMO_ATTR_TRAVELTIME
@ SUMO_ATTR_JM_IGNORE_TYPES
@ SUMO_ATTR_TIMELOSS
@ SUMO_ATTR_SPEEDFACTOR
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_ID
@ SUMO_ATTR_DURATION
@ SUMO_ATTR_STATE
The state of a link.
int gPrecision
the precision for floating point outputs
Definition StdDefs.cpp:27
int gPrecisionRandom
Definition StdDefs.cpp:30
T MIN2(T a, T b)
Definition StdDefs.h:80
T MAX2(T a, T b)
Definition StdDefs.h:86
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
Abstract in-vehicle / in-person device.
Definition MSDevice.h:62
static void buildTransportableDevices(MSTransportable &p, std::vector< MSTransportableDevice * > &into)
Build devices for the given person, if needed.
Definition MSDevice.cpp:139
A road/street connecting two junctions.
Definition MSEdge.h:77
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
virtual void removeTransportable(MSTransportable *t) const
Definition MSEdge.cpp:1207
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
Representation of a lane in the micro simulation.
Definition MSLane.h:84
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:769
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
The simulated network and simulation perfomer.
Definition MSNet.h:89
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:187
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition MSNet.h:485
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition MSNet.cpp:1266
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:392
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition MSNet.cpp:1257
SUMOVehicle * getVehicle() const
Current vehicle in which the transportable is driving (or nullptr)
void setOrigin(const MSEdge *origin, MSStoppingPlace *originStop, double departPos)
change origin for parking area rerouting
const std::set< std::string > & getLines() const
MSStoppingPlace * getOriginStop() const
returns the origin stop (if any). only needed for MSStageTrip
double getArrivalPos() const
return default value for undefined arrivalPos
const MSEdge * getDestination() const
returns the destination edge
Definition MSStage.cpp:65
virtual const MSEdge * getFromEdge() const
Definition MSStage.cpp:77
MSStageTrip * getTrip() const
Definition MSStage.h:283
virtual double getArrivalPos() const
Definition MSStage.h:97
virtual MSStoppingPlace * getOriginStop() const
returns the origin stop (if any). only needed for MSStageTrip
Definition MSStage.h:93
virtual const std::string setArrived(MSNet *net, MSTransportable *transportable, SUMOTime now, const bool vehicleArrived)
logs end of the step
Definition MSStage.cpp:160
MSStoppingPlace * getDestinationStop() const
returns the destination stop (if any)
Definition MSStage.h:88
MSStageType getStageType() const
Definition MSStage.h:138
void setArrivalPos(double arrivalPos)
Definition MSStage.h:108
void setDestination(const MSEdge *newDestination, MSStoppingPlace *newDestStop)
Definition MSStage.cpp:188
virtual void routeOutput(const bool isPerson, OutputDevice &os, const bool withRouteLength, const MSStage *const previous) const =0
Called on writing vehroute output.
virtual const MSEdge * getEdge() const
Returns the current edge.
Definition MSStage.cpp:71
ConstMSEdgeVector getEdges() const
the edges of the current stage
const std::vector< const MSEdge * > & getRoute() const
const std::vector< constMSEdge * >::iterator getRouteStep() const
const std::string reroute(const SUMOTime time, MSTransportableRouter &router, MSTransportable *const transportable, MSStage *previous, const MSEdge *origin, const MSEdge *destination, std::vector< MSStage * > &stages)
A lane area vehicles can halt at.
double getBeginLanePosition() const
Returns the begin position of this stop.
double getEndLanePosition() const
Returns the end position of this stop.
void removeTransportable(const MSTransportable *p)
Removes a transportable from this stop.
const MSLane & getLane() const
Returns the lane this stop is located at.
void registerTeleportAbortWait()
register a teleport after aborting a long wait
virtual void erase(MSTransportable *transportable)
removes a single transportable
Abstract in-person device.
const MSEdge * getFromEdge() const
Returns the departure edge.
virtual double getChosenSpeedFactor() const override
the current speed factor of the transportable (where applicable)
bool isContainer() const override
Whether it is a container.
bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true, std::string *msgReturn=nullptr) override
Replaces the current route by the given one.
virtual double getEdgePos() const
Return the position on the edge.
bool hasDeparted() const
return whether the transportable has started its plan
double getPositionOnLane() const override
Get the object's position along the lane.
static NumericalID myCurrentNumericalIndex
double getBackPositionOnLane(const MSLane *lane) const override
Get the object's back position along the given lane.
const std::set< NumericalID > getUpcomingEdgeIDs() const override
returns the numerical IDs of edges to be used (possibly of future stages)
virtual double getSpeed() const override
the current speed of the transportable
void replaceVehicleType(const MSVehicleType *type) override
Replaces the current vehicle type by the one given.
SUMOTime getDeparture() const
logs depart time of the current stage
const MSEdge * getDestination() const
Returns the current destination.
void setAbortWaiting(const SUMOTime timeout)
MSStage * getNextStage(int offset) const
Return the next (or previous) stage denoted by the offset.
void routeOutput(OutputDevice &os, const bool withRouteLength) const
Called on writing vehroute output.
void setJunctionModelParameter(const std::string &key, const std::string &value)
set individual junction model paramete (not type related)
int getNumRemainingStages() const
Return the number of remaining stages (including the current)
PositionVector getBoundingBox() const
return the bounding box of the person
const bool myAmPerson
virtual bool checkAccess(const MSStage *const prior, const bool waitAtStop=true)
SUMOTime abortStage(SUMOTime step)
Abort current stage (used for aborting waiting for a vehicle)
std::string getStageSummary(int stageIndex) const
return textual summary for the given stage
const MSVehicleType * myVType
This transportable's type. (mainly used for drawing related information Note sure if it is really nec...
MSStage * getCurrentStage() const
Return the current stage.
SumoRNG * getRNG() const override
returns the associated RNG
void setDeparted(SUMOTime now)
logs depart time of the current stage
void setSpeed(double speed)
set the speed for all present and future (walking) stages and modify the vType so that stages added l...
virtual bool proceed(MSNet *net, SUMOTime time, const bool vehicleArrived=false)
SUMOVehicleClass getVClass() const override
Returns the object's access class.
double getMaxSpeed() const override
Returns the maximum speed (the minimum of desired and physical maximum speed)
MSTransportablePlan::iterator myStep
the iterator over the route
MSTransportablePlan * myPlan
the plan of the transportable
void removeStage(int next, bool stayInSim=true)
removes the nth next stage
SUMOVehicle * getVehicle() const
The vehicle associated with this transportable.
bool isPerson() const override
Whether it is a person.
virtual Position getPosition() const
Return the Network coordinate of the transportable.
const SUMOVehicleParameter * myParameter
the plan of the transportable
void saveState(OutputDevice &out)
Saves the current state into the given stream.
const MSEdge * getRerouteDestination() const override
Returns the end point for reroutes (usually the last edge of the route)
MSDevice * getDevice(const std::type_info &type) const override
Returns a device of the given type if it exists or nullptr if not.
virtual ~MSTransportable()
destructor
SUMOTime getWaitingTime(const bool accumulated=false) const override
MSStageType getCurrentStageType() const
the current stage type of the transportable
int getRNGIndex() const override
returns the index of the associated RNG
void rerouteParkingArea(MSStoppingPlace *orig, MSStoppingPlace *replacement)
adapt plan when the vehicle reroutes and now stops at replacement instead of orig
std::string getObjectType()
const SUMOVehicleParameter & getParameter() const override
Returns the vehicle's parameter (including departure definition)
void loadState(const std::string &state)
Reconstructs the current state.
std::vector< MSTransportableDevice * > myDevices
The devices this transportable has.
virtual double getWaitingSeconds() const
the time this transportable spent waiting in seconds
MSTransportable(const SUMOVehicleParameter *pars, MSVehicleType *vtype, MSTransportablePlan *plan, const bool isPerson)
constructor
const MSVehicleType & getVehicleType() const override
Returns the object's "vehicle" type.
bool reroute(SUMOTime t, const std::string &info, MSTransportableRouter &router, const bool onInit=false, const bool withTaz=false, const bool silent=false, const MSEdge *sink=nullptr)
void tripInfoOutput(OutputDevice &os) const
Called on writing tripinfo output.
virtual int getRoutingMode() const override
return routing mode (configures router choice but also handling of transient permission changes)
virtual double getAngle() const override
return the current angle of the transportable
void appendStage(MSStage *stage, int next=-1)
Appends the given stage to the current plan.
void setID(const std::string &newID) override
set the id (inherited from Named but forbidden for transportables)
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
const MSEdge * getEdge() const override
Returns the current edge.
virtual int getDirection() const
Return the movement directon on the edge.
double getSlope() const override
Returns the slope of the road at object's position in degrees.
std::vector< MSStage * > MSTransportablePlan
the structure holding the plan of a transportable
WrappingCommand< MSTransportable > * myAbortCommand
bool hasArrived() const override
return whether the person has reached the end of its plan
SUMOTime getDesiredDepart() const
Returns the desired departure time.
void removeVType(const MSVehicleType *vehType)
The car-following model and parameter.
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
const std::string & getID() const
Returns the name of the vehicle type.
void setMaxSpeed(const double &maxSpeed)
Set a new value for this type's maximum speed.
bool isVehicleSpecific() const
Returns whether this type belongs to a single vehicle only (was modified)
double getLength() const
Get vehicle's length [m].
const SUMOVTypeParameter & getParameter() const
MSVehicleType * buildSingularType(const std::string &id) const
Duplicates the microsim vehicle type giving the newly created type the given id, marking it as vehicl...
const std::string & getID() const
Returns the id.
Definition Named.h:74
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
void lf()
writes a line feed if applicable
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void setPrecision(int precision=gPrecision)
Sets the precision or resets it to default.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
A list of positions.
void append(const PositionVector &v, double sameThreshold=2.0)
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
PositionVector reverse() const
reverse position vector
Utility functions for using a global, resetable random number generator.
Definition RandHelper.h:133
Representation of a vehicle, person, or container.
long long int NumericalID
bool wasSet(long long int what) const
Returns whether the given parameter was set.
virtual void removeTransportable(MSTransportable *t)=0
removes a person or container
Structure representing possible vehicle parameter.
long long int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
void write(OutputDevice &dev, const OptionsCont &oc, const SumoXMLTag altTag=SUMO_TAG_VEHICLE, const std::string &typeID="") const
Writes the parameters as a beginning element.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
A wrapper for a Command function.
void deschedule()
Marks this Command as being descheduled.
TRACI_CONST int ROUTING_MODE_DEFAULT