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-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/****************************************************************************/
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 myStep = myPlan->begin();
58 // init devices
60 for (MSStage* const stage : * myPlan) {
61 stage->init(this);
62 }
63}
64
65
68 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
69 if (stage->getVehicle() != nullptr) {
70 stage->getVehicle()->removeTransportable(this);
71 } else if (stage->getOriginStop() != nullptr) {
72 stage->getOriginStop()->removeTransportable(this);
73 }
74 }
75 if (myPlan != nullptr) {
76 for (MSTransportablePlan::const_iterator i = myPlan->begin(); i != myPlan->end(); ++i) {
77 delete *i;
78 }
79 delete myPlan;
80 myPlan = nullptr;
81 }
82 for (MSTransportableDevice* dev : myDevices) {
83 delete dev;
84 }
85 delete myParameter;
88 }
89}
90
93 return getEdge()->getLanes()[0]->getRNG();
94}
95
96int
98 const std::vector<MSLane*>& lanes = getEdge()->getLanes();
99 return lanes.empty() ? 0 : lanes[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
177const MSEdge*
179 const MSLane* lane = getLane();
180 return lane == nullptr ? getEdge() : &lane->getEdge();
181}
182
183double
185 return (*myStep)->getEdgePos(MSNet::getInstance()->getCurrentTimeStep());
186}
187
188double
190 return getEdgePos() - getVehicleType().getLength();
191}
192
193int
195 return (*myStep)->getDirection();
196}
197
200 return (*myStep)->getPosition(MSNet::getInstance()->getCurrentTimeStep());
201}
202
203double
205 return (*myStep)->getAngle(MSNet::getInstance()->getCurrentTimeStep());
206}
207
208double
210 return STEPS2TIME((*myStep)->getWaitingTime());
211}
212
213double
215 return (*myStep)->getSpeed();
216}
217
218
219void
221 SUMOTime departure = myPlan->front()->getDeparted();
222 os.openTag(isPerson() ? "personinfo" : "containerinfo");
224 os.writeAttr(SUMO_ATTR_DEPART, departure >= 0 ? time2string(departure) : "-1");
226 if (isPerson()) {
228 }
229 SUMOTime duration = 0;
230 SUMOTime waitingTime = 0;
231 SUMOTime timeLoss = 0;
232 SUMOTime travelTime = 0;
233 bool durationOK = true;
234 bool waitingTimeOK = true;
235 bool timeLossOK = true;
236 bool travelTimeOK = true;
237 for (MSStage* const i : *myPlan) {
238 SUMOTime t = i->getDuration();
239 if (t != SUMOTime_MAX) {
240 duration += t;
241 } else {
242 durationOK = false;
243 }
244 t = i->getTotalWaitingTime();
245 if (t != SUMOTime_MAX) {
246 waitingTime += t;
247 } else {
248 waitingTimeOK = false;
249 }
250 t = i->getTimeLoss(this);
251 if (t != SUMOTime_MAX) {
252 timeLoss += t;
253 } else {
254 timeLossOK = false;
255 }
256 t = i->getTravelTime();
257 if (t != SUMOTime_MAX) {
258 travelTime += t;
259 } else {
260 travelTimeOK = false;
261 }
262 }
263 os.writeAttr(SUMO_ATTR_DURATION, durationOK ? time2string(duration) : "-1");
264 os.writeAttr(SUMO_ATTR_WAITINGTIME, waitingTimeOK ? time2string(waitingTime) : "-1");
265 os.writeAttr(SUMO_ATTR_TIMELOSS, timeLossOK ? time2string(timeLoss) : "-1");
266 os.writeAttr(SUMO_ATTR_TRAVELTIME, travelTimeOK ? time2string(travelTime) : "-1");
267 for (MSStage* const i : *myPlan) {
268 i->tripInfoOutput(os, this);
269 }
270 os.closeTag();
271}
272
273
274void
275MSTransportable::routeOutput(OutputDevice& os, const bool withRouteLength) const {
276 const std::string typeID = (
280 if (hasArrived()) {
281 os.writeAttr("arrival", time2string(MSNet::getInstance()->getCurrentTimeStep()));
282 }
283 const MSStage* previous = nullptr;
284 const bool withTiming = OptionsCont::getOptions().getBool("vehroute-output.exit-times");
285 for (const MSStage* const stage : *myPlan) {
286 stage->routeOutput(myAmPerson, os, withRouteLength, previous, withTiming);
287 previous = stage;
288 }
290 os.closeTag();
291 os.lf();
292}
293
294
295void
305
306
309 WRITE_WARNINGF(TL("Teleporting % '%'; waited too long, from edge '%', time=%."),
310 isPerson() ? "person" : "container", getID(), (*myStep)->getEdge()->getID(), time2string(step));
313 (*myStep)->abort(this);
314 if (!proceed(MSNet::getInstance(), step)) {
315 tc.erase(this);
316 }
317 return 0;
318}
319
320
321void
323 // myStep is invalidated upon modifying myPlan
324 const int stepIndex = (int)(myStep - myPlan->begin());
325 if (next < 0) {
326 myPlan->push_back(stage);
327 } else {
328 if (stepIndex + next > (int)myPlan->size()) {
329 throw ProcessError("invalid index '" + toString(next) + "' for inserting new stage into plan of '" + getID() + "'");
330 }
331 myPlan->insert(myPlan->begin() + stepIndex + next, stage);
332 }
333 myStep = myPlan->begin() + stepIndex;
334}
335
336
337void
338MSTransportable::removeStage(int next, bool stayInSim) {
339 assert(myStep + next < myPlan->end());
340 assert(next >= 0);
341 if (next > 0) {
342 // myStep is invalidated upon modifying myPlan
343 int stepIndex = (int)(myStep - myPlan->begin());
344 delete *(myStep + next);
345 myPlan->erase(myStep + next);
346 myStep = myPlan->begin() + stepIndex;
347 } else {
348 if (myStep + 1 == myPlan->end() && stayInSim) {
349 // stay in the simulation until the start of simStep to allow appending new stages (at the correct position)
350 appendStage(new MSStageWaiting(getEdge(), nullptr, 0, 0, getEdgePos(), "last stage removed", false));
351 } else if (myStep + 1 != myPlan->end()) {
352 (*(myStep + 1))->setOrigin(getEdge(), getEdge() == getFromEdge() ? (*myStep)->getOriginStop() : nullptr, getEdgePos());
353 }
354 (*myStep)->abort(this);
357 } else if (myPlan->front()->getDeparted() < 0) {
358 myPlan->front()->setDeparted(SIMSTEP);
359 }
360 }
361}
362
363
364void
366 for (MSTransportablePlan::const_iterator i = myStep; i != myPlan->end(); ++i) {
367 (*i)->setSpeed(speed);
368 }
370}
371
372
373bool
374MSTransportable::replaceRoute(ConstMSRoutePtr newRoute, const std::string& /* info */, bool /* onInit */, int /* offset */, bool /* addRouteStops */, bool /* removeStops */, std::string* /* msgReturn */) {
375 if (isPerson()) {
376 static_cast<MSPerson*>(this)->replaceWalk(newRoute->getEdges(), getPositionOnLane(), 0, 1);
377 return true;
378 }
379 return false;
380}
381
382
383bool
384MSTransportable::reroute(SUMOTime t, const std::string& /* info */, MSTransportableRouter& router, const bool /* onInit */, const bool /* withTaz */, const bool /* silent */, const MSEdge* /* sink */) {
386 if (trip == nullptr) {
387 // TODO this should be possible after factoring out MSStageTrip::reroute
388 return false;
389 }
390 if (getCurrentStage()->getVehicle() != nullptr) {
391 // TODO rerouting during a ride still needs to be implemented
392 return false;
393 }
394 // find the final stage of the trip
395 int tripEndOffset = -1;
396 for (int i = getNumRemainingStages() - 1; i >= 0; i--) {
397 if (getNextStage(i)->getTrip() == trip) {
398 tripEndOffset = i;
399 break;
400 }
401 }
402 std::vector<MSStage*> stages;
403 MSStageWaiting start(getEdge(), getCurrentStage()->getOriginStop(), -1, t, getEdgePos(), "start", true);
404 if (trip->reroute(t, router, this, &start, getEdge(), getRerouteDestination(), stages) == "") {
405 // check whether the new plan actually differs
406 while (tripEndOffset >= 0 && !stages.empty() && stages.back()->equals(*getNextStage(tripEndOffset))) {
407 delete stages.back();
408 stages.pop_back();
409 tripEndOffset--;
410 }
411 bool abortCurrent = true;
412 // check whether the future route of the current stage is identical to the route
413 if (!stages.empty() && stages.front()->isWalk() && getCurrentStage()->isWalk()) {
414 // TODO this check should be done for rides as well
415 MSStageMoving* s = static_cast<MSStageMoving*>(getCurrentStage());
416 int routeIndex = (int)(s->getRouteStep() - s->getRoute().begin());
417 ConstMSEdgeVector oldEdges = s->getEdges();
418 oldEdges.erase(oldEdges.begin(), oldEdges.begin() + routeIndex);
419 ConstMSEdgeVector newEdges = stages.front()->getEdges();
420 if (newEdges == oldEdges) {
421 delete stages.front();
422 stages.erase(stages.begin());
423 abortCurrent = false;
424 }
425 }
426 if (stages.empty()) {
427 return false;
428 }
429 // remove future stages of the trip
430 for (int i = tripEndOffset; i >= 1; i--) {
431 removeStage(i);
432 }
433 // insert new stages of the rerouting
434 int idx = 1;
435 for (MSStage* stage : stages) {
436 appendStage(stage, idx++);
437 }
438 if (abortCurrent) {
439 removeStage(0);
440 }
441 return true;
442 }
443 return false;
444}
445
446
447void
449 const SUMOVehicleClass oldVClass = myVType->getVehicleClass();
450 if (myVType->isVehicleSpecific()) {
452 }
453 if (isPerson()
454 && type->getVehicleClass() != oldVClass
455 && type->getVehicleClass() != SVC_PEDESTRIAN
457 WRITE_WARNINGF(TL("Person '%' receives type '%' which implicitly uses unsuitable vClass '%'."), getID(), type->getID(), toString(type->getVehicleClass()));
458 }
459 myVType = type;
460}
461
462
465 if (myVType->isVehicleSpecific()) {
466 return *const_cast<MSVehicleType*>(myVType);
467 }
469 replaceVehicleType(type);
470 return *type;
471}
472
473
476 PositionVector centerLine;
477 const Position p = getPosition();
478 const double angle = getAngle();
479 const double length = getVehicleType().getLength();
480 const Position back = p + Position(-cos(angle) * length, -sin(angle) * length);
481 centerLine.push_back(p);
482 centerLine.push_back(back);
483 centerLine.move2side(0.5 * getVehicleType().getWidth());
484 PositionVector result = centerLine;
485 centerLine.move2side(-getVehicleType().getWidth());
486 result.append(centerLine.reverse(), POSITION_EPS);
487 //std::cout << " transp=" << getID() << " p=" << p << " angle=" << GeomHelper::naviDegree(angle) << " back=" << back << " result=" << result << "\n";
488 return result;
489}
490
491
492std::string
493MSTransportable::getStageSummary(int stageIndex) const {
494 assert(stageIndex < (int)myPlan->size());
495 assert(stageIndex >= 0);
496 return (*myPlan)[stageIndex]->getStageSummary(myAmPerson);
497}
498
499
500const std::set<SUMOTrafficObject::NumericalID>
502 std::set<SUMOTrafficObject::NumericalID> result;
503 for (auto step = myStep; step != myPlan->end(); ++step) {
504 for (const MSEdge* const e : (*step)->getEdges()) {
505 if (e != nullptr) {
506 // catch incomplete rides
507 result.insert(e->getNumericalID());
508 }
509 }
510 }
511 return result;
512}
513
514
515bool
517 return myStep == myPlan->end();
518}
519
520bool
522 return myPlan->size() > 0 && (myPlan->front()->getDeparted() >= 0 || myStep > myPlan->begin());
523}
524
525
526void
528 // check whether the transportable was riding to the orignal stop
529 // @note: parkingArea can currently not be set as myDestinationStop so we
530 // check for stops on the edge instead
531#ifdef DEBUG_PARKING
532 std::cout << SIMTIME << " person=" << getID() << " rerouteParkingArea orig=" << orig->getID() << " replacement=" << replacement->getID() << "\n";
533#endif
535 if (!myAmPerson) {
536 WRITE_WARNING(TL("parkingAreaReroute not supported for containers"));
537 return;
538 }
539 if (getDestination() == &orig->getLane().getEdge()) {
540 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
541 assert(stage != 0);
542 assert(stage->getVehicle() != 0);
543 // adapt plan
544 stage->setDestination(&replacement->getLane().getEdge(), replacement);
545 stage->setArrivalPos((replacement->getBeginLanePosition() + replacement->getEndLanePosition()) / 2);
546#ifdef DEBUG_PARKING
547 std::cout << " set ride destination\n";
548#endif
549 if (myStep + 1 == myPlan->end()) {
550 return;
551 }
552 // if the next step is a walk, adapt the route
553 MSStage* nextStage = *(myStep + 1);
554 if (nextStage->getStageType() == MSStageType::TRIP) {
555 dynamic_cast<MSStageTrip*>(nextStage)->setOrigin(stage->getDestination(), stage->getDestinationStop(), stage->getArrivalPos());
556#ifdef DEBUG_PARKING
557 std::cout << " set subsequent trip origin\n";
558#endif
559 } else if (nextStage->getStageType() == MSStageType::WALKING) {
560#ifdef DEBUG_PARKING
561 std::cout << " replace subsequent walk with a trip\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 removeStage(1);
566 appendStage(newStage, 1);
567 } else if (nextStage->getStageType() == MSStageType::WAITING) {
568#ifdef DEBUG_PARKING
569 std::cout << " add subsequent walk to reach stop\n";
570 std::cout << " arrivalPos=" << nextStage->getArrivalPos() << "\n";
571#endif
572 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
573 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
574 appendStage(newStage, 1);
575 }
576 // if the plan contains another ride with the same vehicle from the same
577 // parking area, adapt the preceeding walk to end at the replacement
578 for (auto it = myStep + 2; it != myPlan->end(); it++) {
579 MSStage* const futureStage = *it;
580 MSStage* const prevStage = *(it - 1);
581 if (futureStage->getStageType() == MSStageType::DRIVING) {
582 MSStageDriving* const ds = static_cast<MSStageDriving*>(futureStage);
583 // ride origin is set implicitly from the walk destination
584 ds->setOrigin(nullptr, nullptr, -1);
585 if (ds->getLines() == stage->getLines()
586 && prevStage->getDestination() == &orig->getLane().getEdge()) {
587 if (prevStage->getStageType() == MSStageType::TRIP) {
588 dynamic_cast<MSStageTrip*>(prevStage)->setDestination(stage->getDestination(), replacement);
589#ifdef DEBUG_PARKING
590 std::cout << " replace later trip before ride (" << (it - myPlan->begin()) << ")\n";
591#endif
592 } else if (prevStage->getStageType() == MSStageType::WALKING) {
593#ifdef DEBUG_PARKING
594 std::cout << " replace later walk before ride (" << (it - myPlan->begin()) << ")\n";
595#endif
596 MSStageTrip* newStage = new MSStageTrip(prevStage->getFromEdge(), nullptr, stage->getDestination(),
597 replacement, -1, 0, "", -1, 1, getID(), 0, true, stage->getArrivalPos());
598 int prevStageRelIndex = (int)(it - 1 - myStep);
599 removeStage(prevStageRelIndex);
600 appendStage(newStage, prevStageRelIndex);
601 }
602 break;
603 }
604 }
605 }
606 }
607}
608
609
611MSTransportable::getDevice(const std::type_info& type) const {
612 for (MSTransportableDevice* const dev : myDevices) {
613 if (typeid(*dev) == type) {
614 return dev;
615 }
616 }
617 return nullptr;
618}
619
620
621void
622MSTransportable::setJunctionModelParameter(const std::string& key, const std::string& value) {
625 const_cast<SUMOVehicleParameter&>(getParameter()).setParameter(key, value);
626 // checked in MSLink::ignoreFoe
627 } else {
628 throw InvalidArgument(getObjectType() + " '" + getID() + "' does not support junctionModel parameter '" + key + "'");
629 }
630}
631
632
633double
635 const MSEdge* edge = getEdge();
636 const double ep = getEdgePos();
637 const double gp = edge->getLanes()[0]->interpolateLanePosToGeometryPos(ep);
638 return edge->getLanes()[0]->getShape().slopeDegreeAtOffset(gp);
639}
640
641
643MSTransportable::getWaitingTime(const bool /* accumulated */) const {
644 return (*myStep)->getWaitingTime();
645}
646
647
648double
650 return MIN2(getVehicleType().getMaxSpeed(), getVehicleType().getDesiredMaxSpeed() * getChosenSpeedFactor());
651}
652
653
658
659
660int
665
666
667void
672
673void
675 // this saves lots of departParameters which are only needed for transportables that did not yet depart
676 // the parameters may hold the name of a vTypeDistribution but we are interested in the actual type
677 const SUMOTime desiredDepart = myParameter->depart;
678 if (myPlan->front()->getDeparted() >= 0) {
679 // this is only relevant in the context of delayed departure (max-num-persons)
680 const_cast<SUMOVehicleParameter*>(myParameter)->depart = myPlan->front()->getDeparted();
681 }
683 const_cast<SUMOVehicleParameter*>(myParameter)->depart = desiredDepart;
688 }
689 int stepIdx = (int)(myStep - myPlan->begin());
690 for (auto it = myPlan->begin(); it != myStep; ++it) {
691 const MSStageType st = (*it)->getStageType();
692 if (st == MSStageType::TRIP || st == MSStageType::ACCESS) {
693 stepIdx--;
694 }
695 }
696 const bool isAccess = (*myStep)->getStageType() == MSStageType::ACCESS;
697 std::ostringstream state;
698 state << myParameter->parametersSet << " " << (isAccess ? toString(stepIdx - 0.5, 1) : toString(stepIdx));
699 (*myStep)->saveState(state, this);
700 out.writeAttr(SUMO_ATTR_STATE, state.str());
701 const MSStage* previous = nullptr;
702 for (const MSStage* const stage : *myPlan) {
703 const bool routeLength = stage->getDeparted() >= 0 && stage->getStageType() == MSStageType::DRIVING;
704 const bool withTiming = stage->getDeparted() >= 0;
705 stage->routeOutput(myAmPerson, out, routeLength, previous, withTiming, true);
706 previous = stage;
707 }
708 out.closeTag();
709}
710
711
712void
713MSTransportable::loadState(const std::string& state) {
714 std::istringstream iss(state);
715 double step;
716 iss >> myParameter->parametersSet >> step;
717 myPlan->front()->setDeparted(myParameter->depart);
718 if (step != floor(step)) {
719 // we are in an access stage
720 int priorIndex = (int)(step - 0.5);
721 MSStage* prior = *(myPlan->begin() + priorIndex);
722 myStep = myPlan->begin() + priorIndex + 1;
723 bool waitAtStop = prior->getDestinationStop() != nullptr
724 && &prior->getDestinationStop()->getLane().getEdge() != prior->getDestination();
725 checkAccess(prior, waitAtStop);
726 //std::cout << " step=" << step << " i=" << getCurrentStageIndex() << " stage=" << getStageSummary(true) << "\n";
727 } else {
728 myStep = myPlan->begin() + (int)step;
729 }
730 (*myStep)->loadState(this, iss);
731 for (int i = 1; i < step; i++) {
732 if ((*myPlan)[i]->getStageType() == MSStageType::DRIVING) {
733 dynamic_cast<MSStageDriving*>((*myPlan)[i])->setWaitingSince((*myPlan)[i - 1]->getArrived());
734 }
735 }
736}
737
738
739/****************************************************************************/
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:58
#define SIMSTEP
Definition SUMOTime.h:69
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SIMTIME
Definition SUMOTime.h:70
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:49
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:1262
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:790
@ 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:201
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition MSNet.h:495
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition MSNet.cpp:1320
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:402
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition MSNet.cpp:1311
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:287
virtual double getArrivalPos() const
Definition MSStage.h:97
SUMOTime getDeparted() const
get departure time of stage
Definition MSStage.cpp:129
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:167
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:195
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)
const MSLane * getLane() const override
Returns the current lane (may be nullptr)
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.
virtual void setRoutingMode(int value) override
Sets routing behavior.
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
const MSEdge * getCurrentEdge() const override
Returns the edge (normal or internal) the object is currently at.
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:73
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
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 & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false, const bool escape=false)
writes a named attribute
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.
#define UNUSED_PARAMETER(x)
TRACI_CONST int ROUTING_MODE_DEFAULT