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 }
138 if (myStep != myPlan->end()) {
139 if ((*myStep)->getStageType() == MSStageType::WALKING && (prior->getStageType() != MSStageType::ACCESS || prior->getDestination() != (*myStep)->getFromEdge())) {
140 checkAccess(prior, false);
141 } else if ((*myStep)->getStageType() == MSStageType::WAITING && prior->getStageType() == MSStageType::WAITING && prior->getDestination() != (*myStep)->getFromEdge()) {
142 checkAccess(prior, false);
143 }
144 if ((*myStep)->proceed(net, this, time, prior)) {
145 return true;
146 } else {
147 // some problem was encountered
148 tc.addArrived();
149 return false;
150 }
151 } else {
152 tc.addArrived();
153 return false;
154 }
155}
156
157
158void
159MSTransportable::setID(const std::string& /*newID*/) {
160 throw ProcessError(TL("Changing a transportable ID is not permitted"));
161}
162
167
168void
170 (*myStep)->setDeparted(now);
171}
172
175 for (const MSStage* const stage : *myPlan) {
176 if (stage->getDeparted() >= 0) {
177 return stage->getDeparted();
178 }
179 }
180 return -1;
181}
182
183const MSEdge*
185 const MSLane* lane = getLane();
186 return lane == nullptr ? getEdge() : &lane->getEdge();
187}
188
189double
191 return (*myStep)->getEdgePos(MSNet::getInstance()->getCurrentTimeStep());
192}
193
194double
196 return getEdgePos() - getVehicleType().getLength();
197}
198
199int
201 return (*myStep)->getDirection();
202}
203
206 return (*myStep)->getPosition(MSNet::getInstance()->getCurrentTimeStep());
207}
208
209double
211 return (*myStep)->getAngle(MSNet::getInstance()->getCurrentTimeStep());
212}
213
214double
216 return STEPS2TIME((*myStep)->getWaitingTime());
217}
218
219double
221 return (*myStep)->getSpeed();
222}
223
224
225void
227 SUMOTime departure = myPlan->front()->getDeparted();
228 os.openTag(isPerson() ? "personinfo" : "containerinfo");
230 os.writeAttr(SUMO_ATTR_DEPART, departure >= 0 ? time2string(departure) : "-1");
232 if (isPerson()) {
234 }
235 SUMOTime duration = 0;
236 SUMOTime waitingTime = 0;
237 SUMOTime timeLoss = 0;
238 SUMOTime travelTime = 0;
239 bool durationOK = true;
240 bool waitingTimeOK = true;
241 bool timeLossOK = true;
242 bool travelTimeOK = true;
243 for (MSStage* const i : *myPlan) {
244 SUMOTime t = i->getDuration();
245 if (t != SUMOTime_MAX) {
246 duration += t;
247 } else {
248 durationOK = false;
249 }
250 t = i->getTotalWaitingTime();
251 if (t != SUMOTime_MAX) {
252 waitingTime += t;
253 } else {
254 waitingTimeOK = false;
255 }
256 t = i->getTimeLoss(this);
257 if (t != SUMOTime_MAX) {
258 timeLoss += t;
259 } else {
260 timeLossOK = false;
261 }
262 t = i->getTravelTime();
263 if (t != SUMOTime_MAX) {
264 travelTime += t;
265 } else {
266 travelTimeOK = false;
267 }
268 }
269 os.writeAttr(SUMO_ATTR_DURATION, durationOK ? time2string(duration) : "-1");
270 os.writeAttr(SUMO_ATTR_WAITINGTIME, waitingTimeOK ? time2string(waitingTime) : "-1");
271 os.writeAttr(SUMO_ATTR_TIMELOSS, timeLossOK ? time2string(timeLoss) : "-1");
272 os.writeAttr(SUMO_ATTR_TRAVELTIME, travelTimeOK ? time2string(travelTime) : "-1");
273 for (MSStage* const i : *myPlan) {
274 i->tripInfoOutput(os, this);
275 }
276 os.closeTag();
277}
278
279
280void
281MSTransportable::routeOutput(OutputDevice& os, const bool withRouteLength) const {
282 const std::string typeID = (
286 if (hasArrived()) {
287 os.writeAttr("arrival", time2string(MSNet::getInstance()->getCurrentTimeStep()));
288 }
289 const MSStage* previous = nullptr;
290 const bool withTiming = OptionsCont::getOptions().getBool("vehroute-output.exit-times");
291 for (const MSStage* const stage : *myPlan) {
292 stage->routeOutput(myAmPerson, os, withRouteLength, previous, withTiming);
293 previous = stage;
294 }
296 os.closeTag();
297 os.lf();
298}
299
300
301void
311
312
315 WRITE_WARNINGF(TL("Teleporting % '%'; waited too long, from edge '%', time=%."),
316 isPerson() ? "person" : "container", getID(), (*myStep)->getEdge()->getID(), time2string(step));
319 (*myStep)->abort(this);
320 if (!proceed(MSNet::getInstance(), step)) {
321 tc.erase(this);
322 }
323 return 0;
324}
325
326
327void
329 // myStep is invalidated upon modifying myPlan
330 const int stepIndex = (int)(myStep - myPlan->begin());
331 if (next < 0) {
332 myPlan->push_back(stage);
333 } else {
334 if (stepIndex + next > (int)myPlan->size()) {
335 throw ProcessError("invalid index '" + toString(next) + "' for inserting new stage into plan of '" + getID() + "'");
336 }
337 myPlan->insert(myPlan->begin() + stepIndex + next, stage);
338 }
339 myStep = myPlan->begin() + stepIndex;
340}
341
342
343void
344MSTransportable::removeStage(int next, bool stayInSim) {
345 assert(myStep + next < myPlan->end());
346 assert(next >= 0);
347 if (next > 0) {
348 // myStep is invalidated upon modifying myPlan
349 int stepIndex = (int)(myStep - myPlan->begin());
350 delete *(myStep + next);
351 myPlan->erase(myStep + next);
352 myStep = myPlan->begin() + stepIndex;
353 } else {
354 if (myStep + 1 == myPlan->end() && stayInSim) {
355 // stay in the simulation until the start of simStep to allow appending new stages (at the correct position)
356 appendStage(new MSStageWaiting(getEdge(), nullptr, 0, 0, getEdgePos(), "last stage removed", false));
357 } else if (myStep + 1 != myPlan->end()) {
358 (*(myStep + 1))->setOrigin(getEdge(), getEdge() == getFromEdge() ? (*myStep)->getOriginStop() : nullptr, getEdgePos());
359 }
360 (*myStep)->abort(this);
363 } else if (myPlan->front()->getDeparted() < 0) {
364 myPlan->front()->setDeparted(SIMSTEP);
365 }
366 }
367}
368
369
370void
372 for (MSTransportablePlan::const_iterator i = myStep; i != myPlan->end(); ++i) {
373 (*i)->setSpeed(speed);
374 }
376}
377
378
379bool
380MSTransportable::replaceRoute(ConstMSRoutePtr newRoute, const std::string& /* info */, bool /* onInit */, int /* offset */, bool /* addRouteStops */, bool /* removeStops */, std::string* /* msgReturn */) {
381 if (isPerson()) {
382 static_cast<MSPerson*>(this)->replaceWalk(newRoute->getEdges(), getPositionOnLane(), 0, 1);
383 return true;
384 }
385 return false;
386}
387
388
389bool
390MSTransportable::reroute(SUMOTime t, const std::string& /* info */, MSTransportableRouter& router, const bool /* onInit */, const bool /* withTaz */, const bool /* silent */, const MSEdge* /* sink */) {
392 if (trip == nullptr) {
393 // TODO this should be possible after factoring out MSStageTrip::reroute
394 return false;
395 }
396 if (getCurrentStage()->getVehicle() != nullptr) {
397 // TODO rerouting during a ride still needs to be implemented
398 return false;
399 }
400 // find the final stage of the trip
401 int tripEndOffset = -1;
402 for (int i = getNumRemainingStages() - 1; i >= 0; i--) {
403 if (getNextStage(i)->getTrip() == trip) {
404 tripEndOffset = i;
405 break;
406 }
407 }
408 std::vector<MSStage*> stages;
409 MSStageWaiting start(getEdge(), getCurrentStage()->getOriginStop(), -1, t, getEdgePos(), "start", true);
410 if (trip->reroute(t, router, this, &start, getEdge(), getRerouteDestination(), stages) == "") {
411 // check whether the new plan actually differs
412 while (tripEndOffset >= 0 && !stages.empty() && stages.back()->equals(*getNextStage(tripEndOffset))) {
413 delete stages.back();
414 stages.pop_back();
415 tripEndOffset--;
416 }
417 bool abortCurrent = true;
418 // check whether the future route of the current stage is identical to the route
419 if (!stages.empty() && stages.front()->isWalk() && getCurrentStage()->isWalk()) {
420 // TODO this check should be done for rides as well
421 MSStageMoving* s = static_cast<MSStageMoving*>(getCurrentStage());
422 int routeIndex = (int)(s->getRouteStep() - s->getRoute().begin());
423 ConstMSEdgeVector oldEdges = s->getEdges();
424 oldEdges.erase(oldEdges.begin(), oldEdges.begin() + routeIndex);
425 ConstMSEdgeVector newEdges = stages.front()->getEdges();
426 if (newEdges == oldEdges) {
427 delete stages.front();
428 stages.erase(stages.begin());
429 abortCurrent = false;
430 }
431 }
432 if (stages.empty()) {
433 return false;
434 }
435 // remove future stages of the trip
436 for (int i = tripEndOffset; i >= 1; i--) {
437 removeStage(i);
438 }
439 // insert new stages of the rerouting
440 int idx = 1;
441 for (MSStage* stage : stages) {
442 appendStage(stage, idx++);
443 }
444 if (abortCurrent) {
445 removeStage(0);
446 }
447 return true;
448 }
449 return false;
450}
451
452
453void
455 const SUMOVehicleClass oldVClass = myVType->getVehicleClass();
456 if (myVType->isVehicleSpecific()) {
458 }
459 if (isPerson()
460 && type->getVehicleClass() != oldVClass
461 && type->getVehicleClass() != SVC_PEDESTRIAN
463 WRITE_WARNINGF(TL("Person '%' receives type '%' which implicitly uses unsuitable vClass '%'."), getID(), type->getID(), toString(type->getVehicleClass()));
464 }
465 myVType = type;
466}
467
468
471 if (myVType->isVehicleSpecific()) {
472 return *const_cast<MSVehicleType*>(myVType);
473 }
475 replaceVehicleType(type);
476 return *type;
477}
478
479
482 PositionVector centerLine;
483 const Position p = getPosition();
484 const double angle = getAngle();
485 const double length = getVehicleType().getLength();
486 const Position back = p + Position(-cos(angle) * length, -sin(angle) * length);
487 centerLine.push_back(p);
488 centerLine.push_back(back);
489 centerLine.move2side(0.5 * getVehicleType().getWidth());
490 PositionVector result = centerLine;
491 centerLine.move2side(-getVehicleType().getWidth());
492 result.append(centerLine.reverse(), POSITION_EPS);
493 //std::cout << " transp=" << getID() << " p=" << p << " angle=" << GeomHelper::naviDegree(angle) << " back=" << back << " result=" << result << "\n";
494 return result;
495}
496
497
498std::string
499MSTransportable::getStageSummary(int stageIndex) const {
500 assert(stageIndex < (int)myPlan->size());
501 assert(stageIndex >= 0);
502 return (*myPlan)[stageIndex]->getStageSummary(myAmPerson);
503}
504
505
506const std::set<SUMOTrafficObject::NumericalID>
508 std::set<SUMOTrafficObject::NumericalID> result;
509 for (auto step = myStep; step != myPlan->end(); ++step) {
510 for (const MSEdge* const e : (*step)->getEdges()) {
511 if (e != nullptr) {
512 // catch incomplete rides
513 result.insert(e->getNumericalID());
514 }
515 }
516 }
517 return result;
518}
519
520
521bool
523 return myStep == myPlan->end();
524}
525
526bool
528 return myPlan->size() > 0 && (myPlan->front()->getDeparted() >= 0 || myStep > myPlan->begin());
529}
530
531
532void
534 // check whether the transportable was riding to the orignal stop
535 // @note: parkingArea can currently not be set as myDestinationStop so we
536 // check for stops on the edge instead
537#ifdef DEBUG_PARKING
538 std::cout << SIMTIME << " person=" << getID() << " rerouteParkingArea orig=" << orig->getID() << " replacement=" << replacement->getID() << "\n";
539#endif
541 if (!myAmPerson) {
542 WRITE_WARNING(TL("parkingAreaReroute not supported for containers"));
543 return;
544 }
545 if (getDestination() == &orig->getLane().getEdge()) {
546 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
547 assert(stage != 0);
548 assert(stage->getVehicle() != 0);
549 // adapt plan
550 stage->setDestination(&replacement->getLane().getEdge(), replacement);
551 stage->setArrivalPos((replacement->getBeginLanePosition() + replacement->getEndLanePosition()) / 2);
552#ifdef DEBUG_PARKING
553 std::cout << " set ride destination\n";
554#endif
555 if (myStep + 1 == myPlan->end()) {
556 return;
557 }
558 // if the next step is a walk, adapt the route
559 MSStage* nextStage = *(myStep + 1);
560 if (nextStage->getStageType() == MSStageType::TRIP) {
561 dynamic_cast<MSStageTrip*>(nextStage)->setOrigin(stage->getDestination(), stage->getDestinationStop(), stage->getArrivalPos());
562#ifdef DEBUG_PARKING
563 std::cout << " set subsequent trip origin\n";
564#endif
565 } else if (nextStage->getStageType() == MSStageType::WALKING) {
566#ifdef DEBUG_PARKING
567 std::cout << " replace subsequent walk with a trip\n";
568#endif
569 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
570 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
571 removeStage(1);
572 appendStage(newStage, 1);
573 } else if (nextStage->getStageType() == MSStageType::WAITING) {
574#ifdef DEBUG_PARKING
575 std::cout << " add subsequent walk to reach stop\n";
576 std::cout << " arrivalPos=" << nextStage->getArrivalPos() << "\n";
577#endif
578 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
579 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
580 appendStage(newStage, 1);
581 }
582 // if the plan contains another ride with the same vehicle from the same
583 // parking area, adapt the preceeding walk to end at the replacement
584 for (auto it = myStep + 2; it != myPlan->end(); it++) {
585 MSStage* const futureStage = *it;
586 MSStage* const prevStage = *(it - 1);
587 if (futureStage->getStageType() == MSStageType::DRIVING) {
588 MSStageDriving* const ds = static_cast<MSStageDriving*>(futureStage);
589 // ride origin is set implicitly from the walk destination
590 ds->setOrigin(nullptr, nullptr, -1);
591 if (ds->getLines() == stage->getLines()
592 && prevStage->getDestination() == &orig->getLane().getEdge()) {
593 if (prevStage->getStageType() == MSStageType::TRIP) {
594 dynamic_cast<MSStageTrip*>(prevStage)->setDestination(stage->getDestination(), replacement);
595#ifdef DEBUG_PARKING
596 std::cout << " replace later trip before ride (" << (it - myPlan->begin()) << ")\n";
597#endif
598 } else if (prevStage->getStageType() == MSStageType::WALKING) {
599#ifdef DEBUG_PARKING
600 std::cout << " replace later walk before ride (" << (it - myPlan->begin()) << ")\n";
601#endif
602 MSStageTrip* newStage = new MSStageTrip(prevStage->getFromEdge(), nullptr, stage->getDestination(),
603 replacement, -1, 0, "", -1, 1, getID(), 0, true, stage->getArrivalPos());
604 int prevStageRelIndex = (int)(it - 1 - myStep);
605 removeStage(prevStageRelIndex);
606 appendStage(newStage, prevStageRelIndex);
607 }
608 break;
609 }
610 }
611 }
612 }
613}
614
615
617MSTransportable::getDevice(const std::type_info& type) const {
618 for (MSTransportableDevice* const dev : myDevices) {
619 if (typeid(*dev) == type) {
620 return dev;
621 }
622 }
623 return nullptr;
624}
625
626
627void
628MSTransportable::setJunctionModelParameter(const std::string& key, const std::string& value) {
631 const_cast<SUMOVehicleParameter&>(getParameter()).setParameter(key, value);
632 // checked in MSLink::ignoreFoe
633 } else {
634 throw InvalidArgument(getObjectType() + " '" + getID() + "' does not support junctionModel parameter '" + key + "'");
635 }
636}
637
638
639double
641 const MSEdge* edge = getEdge();
642 const double ep = getEdgePos();
643 const double gp = edge->getLanes()[0]->interpolateLanePosToGeometryPos(ep);
644 return edge->getLanes()[0]->getShape().slopeDegreeAtOffset(gp);
645}
646
647
649MSTransportable::getWaitingTime(const bool /* accumulated */) const {
650 return (*myStep)->getWaitingTime();
651}
652
653
654double
656 return MIN2(getVehicleType().getMaxSpeed(), getVehicleType().getDesiredMaxSpeed() * getChosenSpeedFactor());
657}
658
659
664
665
666int
671
672
673void
678
679void
681 // this saves lots of departParameters which are only needed for transportables that did not yet depart
682 // the parameters may hold the name of a vTypeDistribution but we are interested in the actual type
683 const SUMOTime desiredDepart = myParameter->depart;
684 if (myPlan->front()->getDeparted() >= 0) {
685 // this is only relevant in the context of delayed departure (max-num-persons)
686 const_cast<SUMOVehicleParameter*>(myParameter)->depart = myPlan->front()->getDeparted();
687 }
689 const_cast<SUMOVehicleParameter*>(myParameter)->depart = desiredDepart;
694 }
695 int stepIdx = (int)(myStep - myPlan->begin());
696 for (auto it = myPlan->begin(); it != myStep; ++it) {
697 const MSStageType st = (*it)->getStageType();
698 if (st == MSStageType::TRIP || st == MSStageType::ACCESS) {
699 stepIdx--;
700 }
701 }
702 const bool isAccess = (*myStep)->getStageType() == MSStageType::ACCESS;
703 std::ostringstream state;
704 state << myParameter->parametersSet << " " << (isAccess ? toString(stepIdx - 0.5, 1) : toString(stepIdx));
705 (*myStep)->saveState(state, this);
706 out.writeAttr(SUMO_ATTR_STATE, state.str());
707 const MSStage* previous = nullptr;
708 for (const MSStage* const stage : *myPlan) {
709 const bool routeLength = stage->getDeparted() >= 0 && stage->getStageType() == MSStageType::DRIVING;
710 const bool withTiming = stage->getDeparted() >= 0;
711 stage->routeOutput(myAmPerson, out, routeLength, previous, withTiming, true);
712 previous = stage;
713 }
714 out.closeTag();
715}
716
717
718void
719MSTransportable::loadState(const std::string& state) {
720 std::istringstream iss(state);
721 double step;
722 iss >> myParameter->parametersSet >> step;
723 myPlan->front()->setDeparted(myParameter->depart);
724 if (step != floor(step)) {
725 // we are in an access stage
726 int priorIndex = (int)(step - 0.5);
727 MSStage* prior = *(myPlan->begin() + priorIndex);
728 myStep = myPlan->begin() + priorIndex + 1;
729 bool waitAtStop = prior->getDestinationStop() != nullptr
730 && &prior->getDestinationStop()->getLane().getEdge() != prior->getDestination();
731 checkAccess(prior, waitAtStop);
732 //std::cout << " step=" << step << " i=" << getCurrentStageIndex() << " stage=" << getStageSummary(true) << "\n";
733 } else {
734 myStep = myPlan->begin() + (int)step;
735 }
736 (*myStep)->loadState(this, iss);
737 for (int i = 1; i < step; i++) {
738 if ((*myPlan)[i]->getStageType() == MSStageType::DRIVING) {
739 dynamic_cast<MSStageDriving*>((*myPlan)[i])->setWaitingSince((*myPlan)[i - 1]->getArrived());
740 }
741 }
742}
743
744
745/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
std::vector< const MSEdge * > ConstMSEdgeVector
Definition MSEdge.h:75
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:107
#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:57
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:140
A road/street connecting two junctions.
Definition MSEdge.h:78
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:169
virtual void removeTransportable(MSTransportable *t) const
Definition MSEdge.cpp:1281
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:1326
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:1317
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