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-2024 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
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 myStep = myPlan->begin();
57 // init devices
59 for (MSStage* const stage : * myPlan) {
60 stage->init(this);
61 }
62}
63
64
67 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
68 if (stage->getVehicle() != nullptr) {
69 stage->getVehicle()->removeTransportable(this);
70 } else if (stage->getOriginStop() != nullptr) {
71 stage->getOriginStop()->removeTransportable(this);
72 }
73 }
74 if (myPlan != nullptr) {
75 for (MSTransportablePlan::const_iterator i = myPlan->begin(); i != myPlan->end(); ++i) {
76 delete *i;
77 }
78 delete myPlan;
79 myPlan = nullptr;
80 }
81 for (MSTransportableDevice* dev : myDevices) {
82 delete dev;
83 }
84 delete myParameter;
87 }
88}
89
92 return getEdge()->getLanes()[0]->getRNG();
93}
94
95int
97 return getEdge()->getLanes()[0]->getRNGIndex();
98}
99
100bool
101MSTransportable::proceed(MSNet* net, SUMOTime time, const bool vehicleArrived) {
102 MSStage* const prior = *myStep;
103 const std::string& error = prior->setArrived(net, this, time, vehicleArrived);
104 // must be done before increasing myStep to avoid invalid state for rendering
105 prior->getEdge()->removeTransportable(this);
106 myStep++;
107 if (error != "") {
108 throw ProcessError(error);
109 }
110 /* We need to check whether an access stage is needed (or maybe even two).
111 The general scheme is: If the prior stage ended at a stop and the next stage
112 starts at an edge which is not the one the stop is at, but the stop has an access to it
113 we need an access stage. The same is true if prior ends at an edge, the next stage
114 is allowed to start at any stop the edge has access to.
115 If we start at a stop or end at a stop no access is needed.
116 */
117 bool accessToStop = false;
119 accessToStop = checkAccess(prior);
120 } else if (prior->getStageType() == MSStageType::WAITING_FOR_DEPART) {
121 for (MSTransportableDevice* const dev : myDevices) {
122 dev->notifyEnter(*this, MSMoveReminder::NOTIFICATION_DEPARTED, nullptr);
123 }
124 }
125 if (!accessToStop && (myStep == myPlan->end()
126 || ((*myStep)->getStageType() != MSStageType::DRIVING
127 && (*myStep)->getStageType() != MSStageType::TRIP))) {
128 MSStoppingPlace* priorStop = prior->getStageType() == MSStageType::TRIP ? prior->getOriginStop() : prior->getDestinationStop();
129 // a trip might resolve to DRIVING so we would have to stay at the stop
130 // if a trip resolves to something else, this step will do stop removal
131 if (priorStop != nullptr) {
132 priorStop->removeTransportable(this);
133 }
134 }
135 if (myStep != myPlan->end()) {
136 if ((*myStep)->getStageType() == MSStageType::WALKING && (prior->getStageType() != MSStageType::ACCESS || prior->getDestination() != (*myStep)->getFromEdge())) {
137 checkAccess(prior, false);
138 }
139 (*myStep)->proceed(net, this, time, prior);
140 return true;
141 } else {
143 return false;
144 }
145}
146
147
148void
149MSTransportable::setID(const std::string& /*newID*/) {
150 throw ProcessError(TL("Changing a transportable ID is not permitted"));
151}
152
157
158void
160 (*myStep)->setDeparted(now);
161}
162
165 for (const MSStage* const stage : *myPlan) {
166 if (stage->getDeparted() >= 0) {
167 return stage->getDeparted();
168 }
169 }
170 return -1;
171}
172
173
174double
176 return (*myStep)->getEdgePos(MSNet::getInstance()->getCurrentTimeStep());
177}
178
179double
181 return getEdgePos() - getVehicleType().getLength();
182}
183
184int
186 return (*myStep)->getDirection();
187}
188
191 return (*myStep)->getPosition(MSNet::getInstance()->getCurrentTimeStep());
192}
193
194double
196 return (*myStep)->getAngle(MSNet::getInstance()->getCurrentTimeStep());
197}
198
199double
201 return STEPS2TIME((*myStep)->getWaitingTime(MSNet::getInstance()->getCurrentTimeStep()));
202}
203
204double
206 return (*myStep)->getSpeed();
207}
208
209
210void
212 SUMOTime departure = myPlan->front()->getDeparted();
213 os.openTag(isPerson() ? "personinfo" : "containerinfo");
215 os.writeAttr(SUMO_ATTR_DEPART, departure >= 0 ? time2string(departure) : "-1");
217 if (isPerson()) {
219 }
220 SUMOTime duration = 0;
221 SUMOTime waitingTime = 0;
222 SUMOTime timeLoss = 0;
223 SUMOTime travelTime = 0;
224 bool durationOK = true;
225 bool waitingTimeOK = true;
226 bool timeLossOK = true;
227 bool travelTimeOK = true;
228 for (MSStage* const i : *myPlan) {
229 SUMOTime t = i->getDuration();
230 if (t != SUMOTime_MAX) {
231 duration += t;
232 } else {
233 durationOK = false;
234 }
235 t = i->getWaitingTime();
236 if (t != SUMOTime_MAX) {
237 waitingTime += t;
238 } else {
239 waitingTimeOK = false;
240 }
241 t = i->getTimeLoss(this);
242 if (t != SUMOTime_MAX) {
243 timeLoss += t;
244 } else {
245 timeLossOK = false;
246 }
247 t = i->getTravelTime();
248 if (t != SUMOTime_MAX) {
249 travelTime += t;
250 } else {
251 travelTimeOK = false;
252 }
253 }
254 os.writeAttr(SUMO_ATTR_DURATION, durationOK ? time2string(duration) : "-1");
255 os.writeAttr(SUMO_ATTR_WAITINGTIME, waitingTimeOK ? time2string(waitingTime) : "-1");
256 os.writeAttr(SUMO_ATTR_TIMELOSS, timeLossOK ? time2string(timeLoss) : "-1");
257 os.writeAttr(SUMO_ATTR_TRAVELTIME, travelTimeOK ? time2string(travelTime) : "-1");
258 for (MSStage* const i : *myPlan) {
259 i->tripInfoOutput(os, this);
260 }
261 os.closeTag();
262}
263
264
265void
266MSTransportable::routeOutput(OutputDevice& os, const bool withRouteLength) const {
267 const std::string typeID = (
271 if (hasArrived()) {
272 os.writeAttr("arrival", time2string(MSNet::getInstance()->getCurrentTimeStep()));
273 }
274 const MSStage* previous = nullptr;
275 for (const MSStage* const stage : *myPlan) {
276 stage->routeOutput(myAmPerson, os, withRouteLength, previous);
277 previous = stage;
278 }
280 os.closeTag();
281 os.lf();
282}
283
284
285void
295
296
299 WRITE_WARNINGF(TL("Teleporting % '%'; waited too long, from edge '%', time=%."),
300 isPerson() ? "person" : "container", getID(), (*myStep)->getEdge()->getID(), time2string(step));
303 (*myStep)->abort(this);
304 if (!proceed(MSNet::getInstance(), step)) {
305 tc.erase(this);
306 }
307 return 0;
308}
309
310
311void
313 // myStep is invalidated upon modifying myPlan
314 const int stepIndex = (int)(myStep - myPlan->begin());
315 if (next < 0) {
316 myPlan->push_back(stage);
317 } else {
318 if (stepIndex + next > (int)myPlan->size()) {
319 throw ProcessError("invalid index '" + toString(next) + "' for inserting new stage into plan of '" + getID() + "'");
320 }
321 myPlan->insert(myPlan->begin() + stepIndex + next, stage);
322 }
323 myStep = myPlan->begin() + stepIndex;
324}
325
326
327void
328MSTransportable::removeStage(int next, bool stayInSim) {
329 assert(myStep + next < myPlan->end());
330 assert(next >= 0);
331 if (next > 0) {
332 // myStep is invalidated upon modifying myPlan
333 int stepIndex = (int)(myStep - myPlan->begin());
334 delete *(myStep + next);
335 myPlan->erase(myStep + next);
336 myStep = myPlan->begin() + stepIndex;
337 } else {
338 if (myStep + 1 == myPlan->end() && stayInSim) {
339 // stay in the simulation until the start of simStep to allow appending new stages (at the correct position)
340 appendStage(new MSStageWaiting(getEdge(), nullptr, 0, 0, getEdgePos(), "last stage removed", false));
341 }
342 (*myStep)->abort(this);
345 } else if (myPlan->front()->getDeparted() < 0) {
346 myPlan->front()->setDeparted(SIMSTEP);
347 }
348 }
349}
350
351
352void
354 for (MSTransportablePlan::const_iterator i = myStep; i != myPlan->end(); ++i) {
355 (*i)->setSpeed(speed);
356 }
358}
359
360
361bool
362MSTransportable::replaceRoute(ConstMSRoutePtr newRoute, const std::string& /* info */, bool /* onInit */, int /* offset */, bool /* addRouteStops */, bool /* removeStops */, std::string* /* msgReturn */) {
363 if (isPerson()) {
364 static_cast<MSPerson*>(this)->replaceWalk(newRoute->getEdges(), getPositionOnLane(), 0, 1);
365 return true;
366 }
367 return false;
368}
369
370
371bool
372MSTransportable::reroute(SUMOTime t, const std::string& /* info */, MSTransportableRouter& router, const bool /* onInit */, const bool /* withTaz */, const bool /* silent */, const MSEdge* /* sink */) {
374 if (trip == nullptr) {
375 // TODO this should be possible after factoring out MSStageTrip::reroute
376 return false;
377 }
378 if (getCurrentStage()->getVehicle() != nullptr) {
379 // TODO rerouting during a ride still needs to be implemented
380 return false;
381 }
382 // find the final stage of the trip
383 int tripEndOffset = -1;
384 for (int i = getNumRemainingStages() - 1; i >= 0; i--) {
385 if (getNextStage(i)->getTrip() == trip) {
386 tripEndOffset = i;
387 break;
388 }
389 }
390 std::vector<MSStage*> stages;
391 MSStageWaiting start(getEdge(), getCurrentStage()->getOriginStop(), -1, t, getEdgePos(), "start", true);
392 if (trip->reroute(t, router, this, &start, getEdge(), getRerouteDestination(), stages) == "") {
393 // check whether the new plan actually differs
394 while (tripEndOffset >= 0 && !stages.empty() && stages.back()->equals(*getNextStage(tripEndOffset))) {
395 delete stages.back();
396 stages.pop_back();
397 tripEndOffset--;
398 }
399 bool abortCurrent = true;
400 // check whether the future route of the current stage is identical to the route
401 if (!stages.empty() && stages.front()->isWalk() && getCurrentStage()->isWalk()) {
402 // TODO this check should be done for rides as well
403 MSStageMoving* s = static_cast<MSStageMoving*>(getCurrentStage());
404 int routeIndex = (int)(s->getRouteStep() - s->getRoute().begin());
405 ConstMSEdgeVector oldEdges = s->getEdges();
406 oldEdges.erase(oldEdges.begin(), oldEdges.begin() + routeIndex);
407 ConstMSEdgeVector newEdges = stages.front()->getEdges();
408 if (newEdges == oldEdges) {
409 delete stages.front();
410 stages.erase(stages.begin());
411 abortCurrent = false;
412 }
413 }
414 if (stages.empty()) {
415 return false;
416 }
417 // remove future stages of the trip
418 for (int i = tripEndOffset; i >= 1; i--) {
419 removeStage(i);
420 }
421 // insert new stages of the rerouting
422 int idx = 1;
423 for (MSStage* stage : stages) {
424 appendStage(stage, idx++);
425 }
426 if (abortCurrent) {
427 removeStage(0);
428 }
429 return true;
430 }
431 return false;
432}
433
434
435void
437 const SUMOVehicleClass oldVClass = myVType->getVehicleClass();
438 if (myVType->isVehicleSpecific()) {
440 }
441 if (isPerson()
442 && type->getVehicleClass() != oldVClass
443 && type->getVehicleClass() != SVC_PEDESTRIAN
445 WRITE_WARNINGF(TL("Person '%' receives type '%' which implicitly uses unsuitable vClass '%'."), getID(), type->getID(), toString(type->getVehicleClass()));
446 }
447 myVType = type;
448}
449
450
453 if (myVType->isVehicleSpecific()) {
454 return *myVType;
455 }
457 replaceVehicleType(type);
458 return *type;
459}
460
461
464 PositionVector centerLine;
465 const Position p = getPosition();
466 const double angle = getAngle();
467 const double length = getVehicleType().getLength();
468 const Position back = p + Position(-cos(angle) * length, -sin(angle) * length);
469 centerLine.push_back(p);
470 centerLine.push_back(back);
471 centerLine.move2side(0.5 * getVehicleType().getWidth());
472 PositionVector result = centerLine;
473 centerLine.move2side(-getVehicleType().getWidth());
474 result.append(centerLine.reverse(), POSITION_EPS);
475 //std::cout << " transp=" << getID() << " p=" << p << " angle=" << GeomHelper::naviDegree(angle) << " back=" << back << " result=" << result << "\n";
476 return result;
477}
478
479
480std::string
481MSTransportable::getStageSummary(int stageIndex) const {
482 assert(stageIndex < (int)myPlan->size());
483 assert(stageIndex >= 0);
484 return (*myPlan)[stageIndex]->getStageSummary(myAmPerson);
485}
486
487
488const std::set<SUMOTrafficObject::NumericalID>
490 std::set<SUMOTrafficObject::NumericalID> result;
491 for (auto step = myStep; step != myPlan->end(); ++step) {
492 for (const MSEdge* const e : (*step)->getEdges()) {
493 result.insert(e->getNumericalID());
494 }
495 }
496 return result;
497}
498
499
500bool
502 return myStep == myPlan->end();
503}
504
505bool
507 return myPlan->size() > 0 && (myPlan->front()->getDeparted() >= 0 || myStep > myPlan->begin());
508}
509
510
511void
513 // check whether the transportable was riding to the orignal stop
514 // @note: parkingArea can currently not be set as myDestinationStop so we
515 // check for stops on the edge instead
516#ifdef DEBUG_PARKING
517 std::cout << SIMTIME << " person=" << getID() << " rerouteParkingArea orig=" << orig->getID() << " replacement=" << replacement->getID() << "\n";
518#endif
520 if (!myAmPerson) {
521 WRITE_WARNING(TL("parkingAreaReroute not supported for containers"));
522 return;
523 }
524 if (getDestination() == &orig->getLane().getEdge()) {
525 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
526 assert(stage != 0);
527 assert(stage->getVehicle() != 0);
528 // adapt plan
529 stage->setDestination(&replacement->getLane().getEdge(), replacement);
530 stage->setArrivalPos((replacement->getBeginLanePosition() + replacement->getEndLanePosition()) / 2);
531#ifdef DEBUG_PARKING
532 std::cout << " set ride destination\n";
533#endif
534 if (myStep + 1 == myPlan->end()) {
535 return;
536 }
537 // if the next step is a walk, adapt the route
538 MSStage* nextStage = *(myStep + 1);
539 if (nextStage->getStageType() == MSStageType::TRIP) {
540 dynamic_cast<MSStageTrip*>(nextStage)->setOrigin(stage->getDestination());
541#ifdef DEBUG_PARKING
542 std::cout << " set subsequent trip origin\n";
543#endif
544 } else if (nextStage->getStageType() == MSStageType::WALKING) {
545#ifdef DEBUG_PARKING
546 std::cout << " replace subsequent walk with a trip\n";
547#endif
548 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
549 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
550 removeStage(1);
551 appendStage(newStage, 1);
552 } else if (nextStage->getStageType() == MSStageType::WAITING) {
553#ifdef DEBUG_PARKING
554 std::cout << " add subsequent walk to reach stop\n";
555 std::cout << " arrivalPos=" << nextStage->getArrivalPos() << "\n";
556#endif
557 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
558 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
559 appendStage(newStage, 1);
560 }
561 // if the plan contains another ride with the same vehicle from the same
562 // parking area, adapt the preceeding walk to end at the replacement
563 for (auto it = myStep + 2; it != myPlan->end(); it++) {
564 MSStage* const futureStage = *it;
565 MSStage* const prevStage = *(it - 1);
566 if (futureStage->getStageType() == MSStageType::DRIVING) {
567 MSStageDriving* const ds = static_cast<MSStageDriving*>(futureStage);
568 // ride origin is set implicitly from the walk destination
569 ds->setOrigin(nullptr);
570 if (ds->getLines() == stage->getLines()
571 && prevStage->getDestination() == &orig->getLane().getEdge()) {
572 if (prevStage->getStageType() == MSStageType::TRIP) {
573 dynamic_cast<MSStageTrip*>(prevStage)->setDestination(stage->getDestination(), replacement);
574#ifdef DEBUG_PARKING
575 std::cout << " replace later trip before ride (" << (it - myPlan->begin()) << ")\n";
576#endif
577 } else if (prevStage->getStageType() == MSStageType::WALKING) {
578#ifdef DEBUG_PARKING
579 std::cout << " replace later walk before ride (" << (it - myPlan->begin()) << ")\n";
580#endif
581 MSStageTrip* newStage = new MSStageTrip(prevStage->getFromEdge(), nullptr, stage->getDestination(),
582 replacement, -1, 0, "", -1, 1, getID(), 0, true, stage->getArrivalPos());
583 int prevStageRelIndex = (int)(it - 1 - myStep);
584 removeStage(prevStageRelIndex);
585 appendStage(newStage, prevStageRelIndex);
586 }
587 break;
588 }
589 }
590 }
591 }
592}
593
594
596MSTransportable::getDevice(const std::type_info& type) const {
597 for (MSTransportableDevice* const dev : myDevices) {
598 if (typeid(*dev) == type) {
599 return dev;
600 }
601 }
602 return nullptr;
603}
604
605
606void
607MSTransportable::setJunctionModelParameter(const std::string& key, const std::string& value) {
610 const_cast<SUMOVehicleParameter&>(getParameter()).setParameter(key, value);
611 // checked in MSLink::ignoreFoe
612 } else {
613 throw InvalidArgument(getObjectType() + " '" + getID() + "' does not support junctionModel parameter '" + key + "'");
614 }
615}
616
617
618double
620 const MSEdge* edge = getEdge();
621 const double ep = getEdgePos();
622 const double gp = edge->getLanes()[0]->interpolateLanePosToGeometryPos(ep);
623 return edge->getLanes()[0]->getShape().slopeDegreeAtOffset(gp);
624}
625
626
628MSTransportable::getWaitingTime(const bool /* accumulated */) const {
629 return (*myStep)->getWaitingTime(MSNet::getInstance()->getCurrentTimeStep());
630}
631
632
633double
635 return MIN2(getVehicleType().getMaxSpeed(), getVehicleType().getDesiredMaxSpeed() * getChosenSpeedFactor());
636}
637
638
643
644
645int
650
651void
653 // this saves lots of departParameters which are only needed for transportables that did not yet depart
654 // the parameters may hold the name of a vTypeDistribution but we are interested in the actual type
655 const SUMOTime desiredDepart = myParameter->depart;
656 if (myPlan->front()->getDeparted() >= 0) {
657 // this is only relevant in the context of delayed departure (max-num-persons)
658 const_cast<SUMOVehicleParameter*>(myParameter)->depart = myPlan->front()->getDeparted();
659 }
661 const_cast<SUMOVehicleParameter*>(myParameter)->depart = desiredDepart;
666 }
667 int stepIdx = (int)(myStep - myPlan->begin());
668 for (auto it = myPlan->begin(); it != myStep; ++it) {
669 const MSStageType st = (*it)->getStageType();
670 if (st == MSStageType::TRIP || st == MSStageType::ACCESS) {
671 stepIdx--;
672 }
673 }
674 std::ostringstream state;
675 state << myParameter->parametersSet << " " << stepIdx;
676 (*myStep)->saveState(state);
677 out.writeAttr(SUMO_ATTR_STATE, state.str());
678 const MSStage* previous = nullptr;
679 for (const MSStage* const stage : *myPlan) {
680 stage->routeOutput(myAmPerson, out, false, previous);
681 previous = stage;
682 }
683 out.closeTag();
684}
685
686
687void
688MSTransportable::loadState(const std::string& state) {
689 std::istringstream iss(state);
690 int step;
691 iss >> myParameter->parametersSet >> step;
692 myPlan->front()->setDeparted(myParameter->depart);
693 myStep = myPlan->begin() + step;
694 (*myStep)->loadState(this, iss);
695}
696
697
698/****************************************************************************/
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:296
#define WRITE_WARNING(msg)
Definition MsgHandler.h:295
#define TL(string)
Definition MsgHandler.h:315
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:69
#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:26
int gPrecisionRandom
Definition StdDefs.cpp:28
T MIN2(T a, T b)
Definition StdDefs.h:76
T MAX2(T a, T b)
Definition StdDefs.h:82
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:137
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:1197
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:764
@ 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:186
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition MSNet.h:471
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition MSNet.cpp:1199
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:320
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:378
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition MSNet.cpp:1190
SUMOVehicle * getVehicle() const
Current vehicle in which the transportable is driving (or nullptr)
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
void setOrigin(const MSEdge *origin)
change origin for parking area rerouting
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:268
virtual double getArrivalPos() const
Definition MSStage.h:94
virtual MSStoppingPlace * getOriginStop() const
returns the origin stop (if any). only needed for MSStageTrip
Definition MSStage.h:90
virtual const std::string setArrived(MSNet *net, MSTransportable *transportable, SUMOTime now, const bool vehicleArrived)
logs end of the step
Definition MSStage.cpp:161
MSStoppingPlace * getDestinationStop() const
returns the destination stop (if any)
Definition MSStage.h:85
MSStageType getStageType() const
Definition MSStage.h:127
void setArrivalPos(double arrivalPos)
Definition MSStage.h:102
void setDestination(const MSEdge *newDestination, MSStoppingPlace *newDestStop)
Definition MSStage.cpp:189
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.
virtual double getChosenSpeedFactor() const
the current speed factor of the transportable (where applicable)
virtual double getEdgePos() const
Return the position on the edge.
bool hasDeparted() const
return whether the transportable has started its plan
int getRNGIndex() const
returns the index of the associated RNG
SUMOVehicleClass getVClass() const
Returns the object's access class.
static NumericalID myCurrentNumericalIndex
SUMOTime getDeparture() const
logs depart time of the current stage
double getBackPositionOnLane(const MSLane *lane) const
Get the object's back position along the given lane.
const MSEdge * getDestination() const
Returns the current destination.
virtual double getAngle() const
return the current angle of the transportable
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)
virtual double getSpeed() const
the current speed of the transportable
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
MSStage * getCurrentStage() const
Return the current stage.
void setDeparted(SUMOTime now)
logs depart time of the current stage
const std::set< NumericalID > getUpcomingEdgeIDs() const
returns the numerical IDs of edges to be used (possibly of future stages)
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)
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.
MSVehicleType * myVType
This transportable's type. (mainly used for drawing related information Note sure if it is really nec...
SUMOTime getWaitingTime(const bool accumulated=false) const
bool isPerson() const
Whether it is a person.
virtual Position getPosition() const
Return the Network coordinate of the transportable.
const SUMOVehicleParameter * myParameter
the plan of the transportable
double getPositionOnLane() const
Get the object's position along the lane.
void saveState(OutputDevice &out)
Saves the current state into the given stream.
bool isContainer() const
Whether it is a container.
const MSVehicleType & getVehicleType() const
Returns the object's "vehicle" type.
virtual ~MSTransportable()
destructor
MSStageType getCurrentStageType() const
the current stage type of the transportable
void rerouteParkingArea(MSStoppingPlace *orig, MSStoppingPlace *replacement)
adapt plan when the vehicle reroutes and now stops at replacement instead of orig
std::string getObjectType()
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
bool hasArrived() const
return whether the person has reached the end of its plan
double getSlope() const
Returns the slope of the road at object's position in degrees.
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.
void appendStage(MSStage *stage, int next=-1)
Appends the given stage to the current plan.
SumoRNG * getRNG() const
returns the associated RNG
virtual int getRoutingMode() const
return routing mode (configures router choice but also handling of transient permission changes)
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
const MSEdge * getEdge() const
Returns the current edge.
const MSEdge * getRerouteDestination() const
Returns the end point for reroutes (usually the last edge of the route)
bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
virtual int getDirection() const
Return the movement directon on the edge.
std::vector< MSStage * > MSTransportablePlan
the structure holding the plan of a transportable
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists or nullptr if not.
void setID(const std::string &newID)
set the id (inherited from Named but forbidden for transportables)
WrappingCommand< MSTransportable > * myAbortCommand
void replaceVehicleType(MSVehicleType *type)
Replaces the current vehicle type by the one given.
SUMOTime getDesiredDepart() const
Returns the desired departure time.
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
double getMaxSpeed() const
Returns the maximum speed (the minimum of desired and physical maximum speed)
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
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