Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MEVehicle.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/****************************************************************************/
19// A vehicle from the mesoscopic point of view
20/****************************************************************************/
21#include <config.h>
22
23#include <iostream>
24#include <cassert>
35#include <microsim/MSGlobals.h>
36#include <microsim/MSEdge.h>
37#include <microsim/MSLane.h>
38#include <microsim/MSNet.h>
40#include <microsim/MSLink.h>
41#include <microsim/MSStop.h>
45#include "MELoop.h"
46#include "MEVehicle.h"
47#include "MESegment.h"
48
49
50// ===========================================================================
51// method definitions
52// ===========================================================================
54 MSVehicleType* type, const double speedFactor) :
55 MSBaseVehicle(pars, route, type, speedFactor),
56 mySegment(nullptr),
57 myQueIndex(0),
58 myEventTime(SUMOTime_MIN),
59 myLastEntryTime(SUMOTime_MIN),
60 myBlockTime(SUMOTime_MAX),
61 myWasJammed(false),
62 myInfluencer(nullptr) {
63}
64
65
66double
67MEVehicle::getBackPositionOnLane(const MSLane* /* lane */) const {
69}
70
71
72double
75 // interpolation may cause problems with arrivals and calibrators
76 const auto& mesoPos = getEdge()->getMesoPositions();
77 const auto& posIt = mesoPos.find(this);
78 if (posIt != mesoPos.end()) {
79 return posIt->second.first;
80 }
81 }
82 return mySegment == nullptr ? 0. : (double)mySegment->getIndex() * mySegment->getLength();
83}
84
85
86double
88 const MSLane* const lane = getEdge()->getLanes()[MAX2(0, getQueIndex())];
90}
91
92
93double
99
100
101const MSEdge*
103 return mySegment != nullptr ? &mySegment->getEdge() : getEdge();
104}
105
106
108MEVehicle::getPosition(const double offset) const {
109 const MSLane* const lane = getEdge()->getLanes()[MAX2(0, getQueIndex())];
110 return lane->geometryPositionAtOffset(getPositionOnLane() + offset);
111}
112
113
115MEVehicle::getBoundingBox(double offset) const {
116 double a = getAngle() + M_PI; // angle pointing backwards
117 double l = getLength();
118 Position pos = getPosition();
119 Position backPos = pos + Position(l * cos(a), l * sin(a));
120 PositionVector centerLine;
121 centerLine.push_back(pos);
122 centerLine.push_back(backPos);
123 if (offset != 0) {
124 centerLine.extrapolate2D(offset);
125 }
126 PositionVector result = centerLine;
127 result.move2side(MAX2(0.0, 0.5 * myType->getWidth() + offset));
128 centerLine.move2side(MIN2(0.0, -0.5 * myType->getWidth() - offset));
129 result.append(centerLine.reverse(), POSITION_EPS);
130 return result;
131}
132
133
134double
136 if (getWaitingTime() > 0 || isStopped()) {
137 return 0;
138 } else {
139 return getAverageSpeed();
140 }
141}
142
143
144double
146 // cache for thread safety
147 MESegment* s = mySegment;
148 if (s == nullptr || myQueIndex == MESegment::PARKING_QUEUE) {
149 return 0;
150 } else {
152 getEdge()->getLanes()[myQueIndex]->getVehicleMaxSpeed(this));
153 }
154}
155
156
157double
160 const double v = getSpeed();
161 return MIN2(link->getViaLaneOrLane()->getVehicleMaxSpeed(this),
162 (double)sqrt(2 * link->getLength() * getVehicleType().getCarFollowModel().getMaxAccel() + v * v));
163}
164
165
166double
168 earliestArrival = MAX2(myEventTime, earliestArrival - DELTA_T); // event times have subsecond resolution
169 return mySegment->getLength() / STEPS2TIME(earliestArrival - myLastEntryTime);
170}
171
172
173bool
175 // vehicle has just entered a new edge. Position is 0
176 if (myCurrEdge == myRoute->end() - 1 || (myParameter->arrivalEdge >= 0 && getRoutePosition() >= myParameter->arrivalEdge)) { // may happen during teleport
177 return true;
178 }
179 ++myCurrEdge;
180 if ((*myCurrEdge)->isVaporizing()) {
181 return true;
182 }
183 // update via
184 if (myParameter->via.size() > 0 && (*myCurrEdge)->getID() == myParameter->via.front()) {
185 myParameter->via.erase(myParameter->via.begin());
186 }
187 return hasArrived();
188}
189
190
191bool
193 // mySegment may be 0 due to teleporting or arrival
194 return (myCurrEdge == myRoute->end() - 1 || (myParameter->arrivalEdge >= 0 && getRoutePosition() >= myParameter->arrivalEdge)) && (
195 (mySegment == nullptr)
197 || getPositionOnLane() > myArrivalPos - POSITION_EPS);
198}
199
200
201bool
203 return getSegment() != nullptr;
204}
205
206
207bool
209 return false;
210}
211
212
213void
215 if (link != nullptr) {
216 const double speed = getSpeed();
217 link->setApproaching(this, getEventTime() + (link->getState() == LINKSTATE_ALLWAY_STOP ?
218 (SUMOTime)RandHelper::rand((int)2) : 0), // tie braker
219 speed, link->getViaLaneOrLane()->getVehicleMaxSpeed(this), true,
220 speed, getWaitingTime(),
221 // @note: dist is not used by meso (getZipperSpeed is never called)
222 getSegment()->getLength(), 0);
223 }
224}
225
226
227bool
228MEVehicle::replaceRoute(ConstMSRoutePtr newRoute, const std::string& info, bool onInit, int offset, bool addRouteStops, bool removeStops, std::string* msgReturn) {
229 MSLink* const oldLink = mySegment != nullptr ? mySegment->getLink(this) : nullptr;
230 if (MSBaseVehicle::replaceRoute(newRoute, info, onInit, offset, addRouteStops, removeStops, msgReturn)) {
231 if (mySegment != nullptr) {
232 MSLink* const newLink = mySegment->getLink(this);
233 // update approaching vehicle information
234 if (oldLink != newLink) {
235 if (oldLink != nullptr) {
236 oldLink->removeApproaching(this);
237 }
238 setApproaching(newLink);
239 }
240 }
241 return true;
242 }
243 return false;
244}
245
246
249 const SUMOTime initialTime = time;
250 bool hadStop = false;
251 bool reachedStop = false;
252 for (MSStop& stop : myStops) {
253 if (stop.joinTriggered) {
254 WRITE_WARNINGF(TL("Join stops are not available in meso yet (vehicle '%', segment '%')."),
255 getID(), mySegment->getID());
256 continue;
257 }
258 if (stop.edge != myCurrEdge || stop.segment != mySegment) {
259 break;
260 }
261 const SUMOTime cur = time;
262 if (stop.duration > 0) { // it might be a triggered stop with duration -1
263 time += stop.duration;
264 }
265 if (stop.pars.until > time) {
266 // @note: this assumes the stop is reached at time. With the way this is called in MESegment (time == entryTime),
267 // travel time is overestimated of the stop is not at the start of the segment
268 time = stop.pars.until;
269 }
270 if (MSGlobals::gUseStopEnded && stop.pars.ended >= 0) {
271 time = MAX2(cur, stop.pars.ended);
272 }
273 if (!stop.reached) {
274 reachedStop = true;
275 stop.reached = true;
276 stop.pars.started = myLastEntryTime;
277 stop.endBoarding = stop.pars.extension >= 0 ? time + stop.pars.extension : SUMOTime_MAX;
278 if (MSStopOut::active()) {
279 if (!hadStop) {
281 } else {
282 WRITE_WARNINGF(TL("Vehicle '%' has multiple stops on segment '%', time=% (stop-output will be merged)."),
283 getID(), mySegment->getID(), time2string(time));
284 }
285 }
286 }
287 if (stop.triggered || stop.containerTriggered || stop.joinTriggered) {
288 time = MAX2(time, cur + DELTA_T);
289 }
290 hadStop = true;
291 }
292 if (reachedStop) {
293 MSDevice_Taxi* taxi = static_cast<MSDevice_Taxi*>(getDevice(typeid(MSDevice_Taxi)));
294 if (taxi != nullptr) {
295 taxi->notifyMove(*this, 0, 0, 0);
296 }
297 }
298 MSDevice_Tripinfo* tripinfo = static_cast<MSDevice_Tripinfo*>(getDevice(typeid(MSDevice_Tripinfo)));
299 if (tripinfo != nullptr) {
300 tripinfo->updateStopTime(time - initialTime);
301 }
302 return time;
303}
304
305
306bool
308 if (isStopped()) {
309 const SUMOTime now = SIMSTEP;
310 MSStop& stop = myStops.front();
311 stop.pars.ended = now;
312 for (const auto& rem : myMoveReminders) {
313 rem.first->notifyStopEnded();
314 }
315 if (MSStopOut::active()) {
316 MSStopOut::getInstance()->stopEnded(this, stop);
317 }
318 myPastStops.push_back(stop.pars);
319 myPastStops.back().routeIndex = (int)(stop.edge - myRoute->begin());
323 }
324 myStops.pop_front();
325 if (myEventTime > now) {
326 // if this is an aborted stop we need to change the event time of the vehicle
327 const bool isLeader = mySegment->getQueue(myQueIndex).back() == this;
328 if (isLeader) {
330 myEventTime = now + 1;
331 MSGlobals::gMesoNet->addLeaderCar(this, nullptr);
332 }
333 }
334 return true;
335 }
336 return false;
337}
338
339
340double
343 for (const MSStop& stop : myStops) {
344 if (stop.reached) {
345 time += stop.duration;
346 if (stop.pars.until > time) {
347 // @note: this assumes the stop is reached at time. With the way this is called in MESegment (time == entryTime),
348 // travel time is overestimated of the stop is not at the start of the segment
349 time = stop.pars.until;
350 }
351 } else {
352 break;
353 }
354 }
355 return STEPS2TIME(time - myLastEntryTime);
356}
357
358
359void
361 assert(isStopped());
362 double lastPos = -1;
363 bool hadStop = false;
364 while (!myStops.empty()) {
365 MSStop& stop = myStops.front();
366 if (stop.edge != myCurrEdge || stop.segment != mySegment || stop.pars.endPos <= lastPos) {
367 break;
368 }
369 lastPos = stop.pars.endPos;
370 MSNet* const net = MSNet::getInstance();
371 SUMOTime dummy = -1; // boarding- and loading-time are not considered
372 if (hadStop && MSStopOut::active()) {
373 stop.reached = true;
375 }
376 if (net->hasPersons()) {
377 net->getPersonControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy);
378 }
379 if (net->hasContainers()) {
380 net->getContainerControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy);
381 }
383 hadStop = true;
384 }
385 if (getWaitingTime() > 0) {
386 // entry back onto the road was blocked for some time
387 MSDevice_Tripinfo* tripinfoDevice = static_cast<MSDevice_Tripinfo*>(getDevice(typeid(MSDevice_Tripinfo)));
388 if (tripinfoDevice != nullptr) {
389 tripinfoDevice->recordMesoParkingTimeLoss(getWaitingTime());
390 }
391 }
393}
394
395
396bool
398 if (mySegment == nullptr) {
399 return true;
400 }
401 MSNet* const net = MSNet::getInstance();
402 SUMOTime dummy = -1; // boarding- and loading-time are not considered
403 for (MSStop& stop : myStops) {
404 if (!stop.reached) {
405 break;
406 }
407 if (net->getCurrentTimeStep() > stop.endBoarding) {
408 if (stop.triggered || stop.containerTriggered) {
409 MSDevice_Taxi* taxiDevice = static_cast<MSDevice_Taxi*>(getDevice(typeid(MSDevice_Taxi)));
410 if (taxiDevice != nullptr) {
411 taxiDevice->cancelCurrentCustomers();
412 }
413 stop.triggered = false;
414 stop.containerTriggered = false;
415 }
419 }
420 }
421 if (stop.triggered) {
423 // we could not check this on entering the segment because there may be persons who still want to leave
424 WRITE_WARNINGF(TL("Vehicle '%' ignores triggered stop on lane '%' due to capacity constraints."), getID(), stop.lane->getID());
425 stop.triggered = false;
429 }
430 } else if (!net->hasPersons() || !net->getPersonControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy)) {
434 }
435 return false;
436 }
437 }
438 if (stop.containerTriggered) {
439 if (getVehicleType().getContainerCapacity() == getContainerNumber()) {
440 // we could not check this on entering the segment because there may be containers who still want to leave
441 WRITE_WARNINGF(TL("Vehicle '%' ignores container triggered stop on lane '%' due to capacity constraints."), getID(), stop.lane->getID());
442 stop.containerTriggered = false;
446 }
447 } else if (!net->hasContainers() || !net->getContainerControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy)) {
451 }
452 return false;
453 }
454 }
455 if (stop.joinTriggered) {
456 // TODO do something useful here
457 return false;
458 }
459 }
460 return mySegment->isOpen(this);
461}
462
463
464double
466 if (mySegment == nullptr) {
467 return 0;
468 } else {
469 return STEPS2TIME(mySegment->getLinkPenalty(this));
470 }
471}
472
473
474void
476 for (MoveReminderCont::iterator i = myMoveReminders.begin(); i != myMoveReminders.end(); ++i) {
477 if (i->first == rem) {
480 getLastEntryTime(), currentTime, exitTime, false);
481#ifdef _DEBUG
482 if (myTraceMoveReminders) {
483 traceMoveReminder("notifyMove", i->first, i->second, true);
484 }
485#endif
486 return;
487 }
488 }
489}
490
491
492void
493MEVehicle::updateDetectors(const SUMOTime currentTime, const SUMOTime exitTime, const bool isLeave, const MSMoveReminder::Notification reason) {
494 // segments of the same edge have the same reminder so no cleaning up must take place
495 const bool cleanUp = isLeave && (reason != MSMoveReminder::NOTIFICATION_SEGMENT);
496 for (MoveReminderCont::iterator rem = myMoveReminders.begin(); rem != myMoveReminders.end();) {
498 rem->first->updateDetector(*this, mySegment->getIndex() * mySegment->getLength(),
500 getLastEntryTime(), currentTime, exitTime, cleanUp);
501#ifdef _DEBUG
502 if (myTraceMoveReminders) {
503 traceMoveReminder("notifyMove", rem->first, rem->second, true);
504 }
505#endif
506 }
507 if (!isLeave || rem->first->notifyLeave(*this, mySegment == nullptr ? 0 : mySegment->getLength(), reason)) {
508#ifdef _DEBUG
509 if (isLeave && myTraceMoveReminders) {
510 traceMoveReminder("notifyLeave", rem->first, rem->second, true);
511 }
512#endif
513
514 if (isLeave) {
515 rem->second += getEdge()->getLength();
516#ifdef _DEBUG
517 if (myTraceMoveReminders) {
518 traceMoveReminder("adaptedPos", rem->first, rem->second, true);
519 }
520#endif
521 }
522 ++rem;
523 } else {
524#ifdef _DEBUG
525 if (myTraceMoveReminders) {
526 traceMoveReminder("remove", rem->first, rem->second, false);
527 }
528#endif
529 rem = myMoveReminders.erase(rem);
530 }
531 }
534 }
535}
536
537
540 if (myInfluencer == nullptr) {
542 }
543 return *myInfluencer;
544}
545
546
551
552
553void
558
559
560int
562 return getSegment() != nullptr ? getSegment()->getIndex() : -1;
563}
564
565
566double
567MEVehicle::getRightSideOnEdge(const MSLane* /*lane*/) const {
568 if (mySegment == nullptr || mySegment->getIndex() >= getEdge()->getNumLanes()) {
569 return 0;
570 }
571 const MSLane* lane = getEdge()->getLanes()[mySegment->getIndex()];
572 return lane->getRightSideOnEdge() + lane->getWidth() * 0.5 - 0.5 * getVehicleType().getWidth();
573
574}
575
576
577void
579 if (mySegment != nullptr && MESegment::isInvalid(mySegment)) {
580 // segment is vaporization target, do not write this vehicle
581 return;
582 }
584 assert(mySegment == nullptr || *myCurrEdge == &mySegment->getEdge() || mySegment->getEdge().isInternal());
585 std::vector<SUMOTime> internals;
586 internals.push_back(myParameter->parametersSet);
587 internals.push_back(myDeparture);
588 internals.push_back((SUMOTime)distance(myRoute->begin(), myCurrEdge));
589 internals.push_back((SUMOTime)myDepartPos * 1000); // store as mm
590 internals.push_back(mySegment == nullptr ? (SUMOTime) - 1 : (SUMOTime)mySegment->getIndex());
591 internals.push_back((SUMOTime)getQueIndex());
592 internals.push_back(myEventTime);
593 internals.push_back(myLastEntryTime);
594 internals.push_back(myBlockTime);
595 internals.push_back(isStopped());
596 internals.push_back(myPastStops.size());
597 out.writeAttr(SUMO_ATTR_STATE, toString(internals));
598 // save past stops
600 stop.write(out, false);
601 // do not write started and ended twice
602 if ((stop.parametersSet & STOP_STARTED_SET) == 0) {
603 out.writeAttr(SUMO_ATTR_STARTED, time2string(stop.started));
604 }
605 if ((stop.parametersSet & STOP_ENDED_SET) == 0) {
606 out.writeAttr(SUMO_ATTR_ENDED, time2string(stop.ended));
607 }
608 out.closeTag();
609 }
610 // save upcoming stops
611 for (const MSStop& stop : myStops) {
612 stop.write(out);
613 }
614 // save parameters
616 for (MSDevice* dev : myDevices) {
617 dev->saveState(out);
618 }
619 for (const auto& item : myMoveReminders) {
620 item.first->saveReminderState(out, *this);
621 }
622 out.closeTag();
623}
624
625
626void
628 if (attrs.hasAttribute(SUMO_ATTR_POSITION)) {
629 throw ProcessError(TL("Error: Invalid vehicles in state (may be a micro state)!"));
630 }
631 int routeOffset;
632 bool stopped;
633 int pastStops;
634 int segIndex;
635 int queIndex;
636 std::istringstream bis(attrs.getString(SUMO_ATTR_STATE));
638 bis >> myDeparture;
639 bis >> routeOffset;
640 bis >> myDepartPos;
641 bis >> segIndex;
642 bis >> queIndex;
643 bis >> myEventTime;
644 bis >> myLastEntryTime;
645 bis >> myBlockTime;
646 bis >> stopped;
647 bis >> pastStops;
648 myDepartPos /= 1000.; // was stored as mm
649
651 bool ok;
652 myArrivalPos = attrs.get<double>(SUMO_ATTR_ARRIVALPOS_RANDOMIZED, getID().c_str(), ok);
653 }
654
655 // load stops
656 myStops.clear();
658
659 if (hasDeparted()) {
660 myDeparture -= offset;
661 myEventTime -= offset;
662 myLastEntryTime -= offset;
663 myCurrEdge = myRoute->begin() + routeOffset;
664 // fix stops
665 while (pastStops > 0) {
666 for (const auto& rem : myMoveReminders) {
667 rem.first->notifyStopEnded();
668 }
669 myPastStops.push_back(myStops.front().pars);
670 myPastStops.back().routeIndex = (int)(myStops.front().edge - myRoute->begin());
671 myStops.pop_front();
672 pastStops--;
673 }
674 if (segIndex >= 0) {
676 while (seg->getIndex() != (int)segIndex) {
677 seg = seg->getNextSegment();
678 if (seg == nullptr) {
679 throw ProcessError(TLF("Unknown segment '%:%' for vehicle '%' in loaded state.", (*myCurrEdge)->getID(), segIndex, getID()));
680 }
681 }
682 setSegment(seg, queIndex);
683 if (queIndex == MESegment::PARKING_QUEUE) {
684 MSGlobals::gMesoNet->addLeaderCar(this, nullptr);
685 getCurrentEdge()->getLanes()[0]->addParking(this);
686 }
687 } else {
688 // on teleport
689 setSegment(nullptr, 0);
690 assert(myEventTime != SUMOTime_MIN);
691 MSGlobals::gMesoNet->addLeaderCar(this, nullptr);
692 }
693 // see MSBaseVehicle constructor
696 }
697 }
698 if (myBlockTime != SUMOTime_MAX) {
699 myBlockTime -= offset;
700 }
701 std::istringstream dis(attrs.getString(SUMO_ATTR_DISTANCE));
703 if (stopped) {
704 myStops.front().startedFromState = true;
705 myStops.front().reached = true;
706 }
707}
708
709
710/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
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:64
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SUMOTime_MIN
Definition SUMOTime.h:35
const long long int VEHPARS_FORCE_REROUTE
const int STOP_ENDED_SET
const int STOP_STARTED_SET
@ LINKSTATE_ALLWAY_STOP
This is an uncontrolled, all-way stop link.
@ SUMO_ATTR_STARTED
@ SUMO_ATTR_ENDED
@ SUMO_ATTR_DISTANCE
@ SUMO_ATTR_ARRIVALPOS_RANDOMIZED
@ SUMO_ATTR_POSITION
@ SUMO_ATTR_STATE
The state of a link.
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
SUMOTime changeSegment(MEVehicle *veh, SUMOTime leaveTime, MESegment *const toSegment, MSMoveReminder::Notification reason, const bool ignoreLink=false) const
change to the next segment this handles combinations of the following cases: (ending / continuing rou...
Definition MELoop.cpp:88
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
Definition MELoop.cpp:344
void addLeaderCar(MEVehicle *veh, MSLink *link)
Adds the given car to the leading vehicles.
Definition MELoop.cpp:251
void removeLeaderCar(MEVehicle *v)
Removes the given car from the leading vehicles.
Definition MELoop.cpp:265
A single mesoscopic segment (cell)
Definition MESegment.h:50
static const int PARKING_QUEUE
Definition MESegment.h:53
bool isOpen(const MEVehicle *veh) const
Returns whether the vehicle may use the next link.
SUMOTime getLinkPenalty(const MEVehicle *veh) const
Returns the penalty time for passing a link (if using gMesoTLSPenalty > 0 or gMesoMinorPenalty > 0)
MSLink * getLink(const MEVehicle *veh, bool tlsPenalty=false) const
Returns the link the given car will use when passing the next junction.
double getLength() const
Returns the length of the segment in meters.
Definition MESegment.h:254
const std::vector< MEVehicle * > & getQueue(int index) const
Returns the cars in the queue with the given index for visualization.
Definition MESegment.h:224
const MSEdge & getEdge() const
Returns the edge this segment belongs to.
Definition MESegment.h:374
int getIndex() const
Returns the running index of the segment in the edge (0 is the most upstream).
Definition MESegment.h:238
static bool isInvalid(const MESegment *segment)
whether the given segment is 0 or encodes vaporization
Definition MESegment.h:457
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
Definition MESegment.h:246
double getConservativeSpeed(SUMOTime &earliestArrival) const
Returns the vehicle's estimated speed taking into account delays.
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
double getAverageSpeed() const
Returns the vehicle's estimated average speed on the segment assuming no further delays.
double getAngle() const
Returns the vehicle's direction in degrees.
Definition MEVehicle.cpp:87
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
Definition MEVehicle.cpp:67
bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addRouteStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
SUMOTime myEventTime
The (planned) time of leaving the segment (cell)
Definition MEVehicle.h:400
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
void updateDetectorForWriting(MSMoveReminder *rem, SUMOTime currentTime, SUMOTime exitTime)
Updates a single vehicle detector if present.
MEVehicle(SUMOVehicleParameter *pars, ConstMSRoutePtr route, MSVehicleType *type, const double speedFactor)
Constructor.
Definition MEVehicle.cpp:53
BaseInfluencer & getBaseInfluencer()
Returns the velocity/lane influencer.
double getCurrentStoppingTimeSeconds() const
Returns the delay that is accrued due to option –meso-tls-penalty or –meso-minor-penalty.
bool mayProceed()
Returns whether the vehicle is allowed to pass the next junction, checks also for triggered stops.
double estimateLeaveSpeed(const MSLink *link) const
Returns the vehicle's estimated speed after driving across the link.
void processStop()
ends the current stop and performs loading/unloading
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the duration for which the vehicle was blocked.
Definition MEVehicle.h:306
bool hasArrived() const
Returns whether this vehicle has already arrived (reached the arrivalPosition on its final edge)
bool moveRoutePointer()
Update when the vehicle enters a new edge in the move step.
int myQueIndex
Index of the que the vehicle is in (important for multiqueue extension)
Definition MEVehicle.h:397
void updateDetectors(const SUMOTime currentTime, const SUMOTime exitTime, const bool isLeave, const MSMoveReminder::Notification reason=MSMoveReminder::NOTIFICATION_JUNCTION)
Updates all vehicle detectors.
SUMOTime checkStop(SUMOTime time)
Returns until when to stop at the current segment and sets the information that the stop has been rea...
virtual bool isIdling() const
Returns whether the vehicle is trying to re-enter the net.
SUMOTime getLastEntryTime() const
Returns the time the vehicle entered the current segment.
Definition MEVehicle.h:277
double getPositionOnLane() const
Get the vehicle's position along the lane.
Definition MEVehicle.cpp:73
SUMOTime myLastEntryTime
The time the vehicle entered its current segment.
Definition MEVehicle.h:403
BaseInfluencer * myInfluencer
An instance of a velocity/lane influencing instance; built in "getInfluencer".
Definition MEVehicle.h:415
void setApproaching(MSLink *link)
registers vehicle with the given link
void saveState(OutputDevice &out)
Saves the states of a vehicle.
MESegment * getSegment() const
Returns the current segment the vehicle is on.
Definition MEVehicle.h:246
const MSEdge * getCurrentEdge() const
Returns the edge the vehicle is currently at (possibly an internal edge)
MESegment * mySegment
The segment the vehicle is at.
Definition MEVehicle.h:394
int getQueIndex() const
Returns the index of the que the vehicle is in.
Definition MEVehicle.h:255
int getSegmentIndex() const
void loadState(const SUMOSAXAttributes &attrs, const SUMOTime offset)
Loads the state of this vehicle from the given description.
virtual void setSegment(MESegment *s, int idx=0)
Sets the current segment the vehicle is at together with its que.
Definition MEVehicle.h:237
double getCurrentLinkPenaltySeconds() const
Returns the delay that is accrued due to option –meso-tls-penalty or –meso-minor-penalty.
SUMOTime getEventTime() const
Returns the (planned) time at which the vehicle leaves its current segment.
Definition MEVehicle.h:215
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
bool resumeFromStopping()
double getSpeed() const
Returns the vehicle's estimated speed assuming no delays.
PositionVector getBoundingBox(double offset=0) const
get bounding rectangle
double getSlope() const
Returns the slope of the road at vehicle's position in degrees.
Definition MEVehicle.cpp:94
SUMOTime myBlockTime
The time at which the vehicle was blocked on its current segment.
Definition MEVehicle.h:406
double getRightSideOnEdge(const MSLane *) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
The base class for microscopic and mesoscopic vehicles.
std::list< MSStop > myStops
The vehicle's list of stops.
void calculateArrivalParams(bool onInit)
(Re-)Calculates the arrival position and lane from the vehicle parameters
MoveReminderCont myMoveReminders
Currently relevant move reminders.
double myDepartPos
The real depart position.
std::vector< MSVehicleDevice * > myDevices
The devices this vehicle has.
virtual bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addRouteStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
const MSVehicleType * myType
This vehicle's type.
double getLength() const
Returns the vehicle's length.
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
int getPersonNumber() const
Returns the number of persons.
MSRouteIterator myCurrEdge
Iterator to current route-edge.
StopParVector myPastStops
The list of stops that the vehicle has already reached.
bool hasDeparted() const
Returns whether this vehicle has already departed.
ConstMSRoutePtr myRoute
This vehicle's route.
void addStops(const bool ignoreStopErrors, MSRouteIterator *searchStart=nullptr, bool addRouteStops=true)
Adds stops to the built vehicle.
SUMOTime myDeparture
The real departure time.
int getRoutePosition() const
return index of edge within route
bool myAmRegisteredAsWaiting
Whether this vehicle is registered as waiting for a person or container (for deadlock-recognition)
const SUMOVehicleParameter * myParameter
This vehicle's parameter.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
bool isStopped() const
Returns whether the vehicle is at a stop.
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists, nullptr otherwise.
int myNumberReroutes
The number of reroutings.
double myArrivalPos
The position on the destination lane where the vehicle stops.
virtual void saveState(OutputDevice &out)
Saves the (common) state of a vehicle.
double myOdometer
A simple odometer to keep track of the length of the route already driven.
int getContainerNumber() const
Returns the number of containers.
A device which collects info on the vehicle trip (mainly on departure and arrival)
bool notifyMove(SUMOTrafficObject &veh, double oldPos, double newPos, double newSpeed)
Checks for waiting steps when the vehicle moves.
void cancelCurrentCustomers()
remove the persons the taxi is currently waiting for from reservations
A device which collects info on the vehicle trip (mainly on departure and arrival)
void updateStopTime(const SUMOTime time)
update stopping time for meso
void recordMesoParkingTimeLoss(SUMOTime waitingTime)
Abstract in-vehicle / in-person device.
Definition MSDevice.h:62
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
double getLength() const
return the length of the edge
Definition MSEdge.h:694
bool isInternal() const
return whether this edge is an internal edge
Definition MSEdge.h:269
const std::map< const MEVehicle *, std::pair< double, int > > & getMesoPositions() const
Definition MSEdge.cpp:1749
void removeWaiting(const SUMOVehicle *vehicle) const
Removes a vehicle from the list of waiting vehicles.
Definition MSEdge.cpp:1509
static bool gMesoInterpolatePos
Definition MSGlobals.h:112
static bool gCheckRoutes
Definition MSGlobals.h:91
static MELoop * gMesoNet
mesoscopic simulation infrastructure
Definition MSGlobals.h:115
static bool gSlopeCentered
whether to use a simplified slope computation (for compatibility with other simulations)
Definition MSGlobals.h:137
static bool gUseStopEnded
whether the simulation should replay previous stop times
Definition MSGlobals.h:133
Representation of a lane in the micro simulation.
Definition MSLane.h:84
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition MSLane.h:575
double getRightSideOnEdge() const
Definition MSLane.h:1226
double interpolateLanePosToGeometryPos(double lanePos) const
Definition MSLane.h:555
virtual const PositionVector & getShape(bool) const
Definition MSLane.h:294
double getWidth() const
Returns the lane's width.
Definition MSLane.h:661
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
Definition MSLane.h:561
Something on a lane to be noticed about vehicle movement.
Notification
Definition of a vehicle state.
@ NOTIFICATION_VAPORIZED_CALIBRATOR
The vehicle got removed by a calibrator.
@ NOTIFICATION_SEGMENT
The vehicle changes the segment (meso only)
@ NOTIFICATION_JUNCTION
The vehicle arrived at a junction.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
void updateDetector(SUMOTrafficObject &veh, double entryPos, double leavePos, SUMOTime entryTime, SUMOTime currentTime, SUMOTime leaveTime, bool cleanUp)
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:199
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition MSNet.cpp:1312
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
bool hasContainers() const
Returns whether containers are simulated.
Definition MSNet.h:435
bool hasPersons() const
Returns whether persons are simulated.
Definition MSNet.h:419
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:402
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition MSNet.cpp:1303
bool triggered
whether an arriving person lets the vehicle continue
Definition MSStop.h:69
bool containerTriggered
whether an arriving container lets the vehicle continue
Definition MSStop.h:71
bool joinTriggered
whether coupling another vehicle (train) the vehicle continue
Definition MSStop.h:73
const MESegment * segment
The segment to stop at (mesosim only)
Definition MSStop.h:52
bool reached
Information whether the stop has been reached.
Definition MSStop.h:75
MSRouteIterator edge
The edge in the route to stop at.
Definition MSStop.h:48
const SUMOVehicleParameter::Stop pars
The stop parameter.
Definition MSStop.h:65
static bool active()
Definition MSStopOut.h:55
void stopStarted(const SUMOVehicle *veh, int numPersons, int numContainers, SUMOTime time)
Definition MSStopOut.cpp:83
static MSStopOut * getInstance()
Definition MSStopOut.h:61
void stopEnded(const SUMOVehicle *veh, const MSStop &stop, bool simEnd=false)
bool loadAnyWaiting(const MSEdge *edge, SUMOVehicle *vehicle, SUMOTime &timeToLoadNext, SUMOTime &stopDuration, MSTransportable *const force=nullptr)
load any applicable transportables Loads any person / container that is waiting on that edge for the ...
void registerOneWaiting()
increases the count of vehicles waiting for a transport to allow recognition of person / container re...
void unregisterOneWaiting()
decreases the count of vehicles waiting for a transport to allow recognition of person / container re...
The car-following model and parameter.
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
int getPersonCapacity() const
Get this vehicle type's person capacity.
double getLength() const
Get vehicle's length [m].
const std::string & getID() const
Returns the id.
Definition Named.h:73
Static storage of an output device and its base (abstract) implementation.
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 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)
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
double slopeDegreeAtOffset(double pos) const
Returns the slope at the given length.
void extrapolate2D(const double val, const bool onlyFirst=false)
extrapolate position vector in two dimensions (Z is ignored)
PositionVector reverse() const
reverse position vector
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
Definition of vehicle stop (position and duration)
SUMOTime ended
the time at which this stop was ended
double endPos
The stopping position end.
Structure representing possible vehicle parameter.
std::vector< std::string > via
List of the via-edges the vehicle must visit.
long long int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
bool wasSet(long long int what) const
Returns whether the given parameter was set.
int arrivalEdge
(optional) The final edge within the route of the vehicle
#define M_PI
Definition odrSpiral.cpp:45