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 myEventIndex(-1),
60 myLastEntryTime(SUMOTime_MIN),
61 myBlockTime(SUMOTime_MAX),
62 myUnqueuedEventTime(SUMOTime_MIN),
63 myWasJammed(false),
64 myInfluencer(nullptr) {
65}
66
67
68double
69MEVehicle::getBackPositionOnLane(const MSLane* /* lane */) const {
71}
72
73
74double
77 // interpolation may cause problems with arrivals and calibrators
78 const auto& mesoPos = getEdge()->getMesoPositions();
79 const auto& posIt = mesoPos.find(this);
80 if (posIt != mesoPos.end()) {
81 return posIt->second.first;
82 }
83 }
84 return mySegment == nullptr ? 0. : (double)mySegment->getIndex() * mySegment->getLength();
85}
86
87
88double
90 const MSLane* const lane = getEdge()->getLanes()[MAX2(0, getQueIndex())];
92}
93
94
95double
101
102
103const MSEdge*
105 return mySegment != nullptr ? &mySegment->getEdge() : getEdge();
106}
107
108
110MEVehicle::getPosition(const double offset) const {
111 const MSLane* const lane = getEdge()->getLanes()[MAX2(0, getQueIndex())];
112 return lane->geometryPositionAtOffset(getPositionOnLane() + offset);
113}
114
115
117MEVehicle::getBoundingBox(double offset) const {
118 double a = getAngle() + M_PI; // angle pointing backwards
119 double l = getLength();
120 Position pos = getPosition();
121 Position backPos = pos + Position(l * cos(a), l * sin(a));
122 PositionVector centerLine;
123 centerLine.push_back(pos);
124 centerLine.push_back(backPos);
125 if (offset != 0) {
126 centerLine.extrapolate2D(offset);
127 }
128 PositionVector result = centerLine;
129 result.move2side(MAX2(0.0, 0.5 * myType->getWidth() + offset));
130 centerLine.move2side(MIN2(0.0, -0.5 * myType->getWidth() - offset));
131 result.append(centerLine.reverse(), POSITION_EPS);
132 return result;
133}
134
135
136double
138 if (getWaitingTime() > 0 || isStopped()) {
139 return 0;
140 } else {
141 return getAverageSpeed();
142 }
143}
144
145
146double
148 // cache for thread safety
149 MESegment* s = mySegment;
150 if (s == nullptr || myQueIndex == MESegment::PARKING_QUEUE) {
151 return 0;
152 } else {
154 getEdge()->getLanes()[myQueIndex]->getVehicleMaxSpeed(this));
155 }
156}
157
158
159double
162 const double v = getSpeed();
163 return MIN2(link->getViaLaneOrLane()->getVehicleMaxSpeed(this),
164 (double)sqrt(2 * link->getLength() * getVehicleType().getCarFollowModel().getMaxAccel() + v * v));
165}
166
167
168double
170 earliestArrival = MAX2(myEventTime, earliestArrival - DELTA_T); // event times have subsecond resolution
171 return mySegment->getLength() / STEPS2TIME(earliestArrival - myLastEntryTime);
172}
173
174
175bool
177 // vehicle has just entered a new edge. Position is 0
178 if (myCurrEdge == myRoute->end() - 1 || (myParameter->arrivalEdge >= 0 && getRoutePosition() >= myParameter->arrivalEdge)) { // may happen during teleport
179 return true;
180 }
181 ++myCurrEdge;
182 if ((*myCurrEdge)->isVaporizing()) {
183 return true;
184 }
185 // update via
186 if (myParameter->via.size() > 0 && (*myCurrEdge)->getID() == myParameter->via.front()) {
187 myParameter->via.erase(myParameter->via.begin());
188 }
189 return hasArrived();
190}
191
192
193bool
195 // mySegment may be 0 due to teleporting or arrival
196 return (myCurrEdge == myRoute->end() - 1 || (myParameter->arrivalEdge >= 0 && getRoutePosition() >= myParameter->arrivalEdge)) && (
197 (mySegment == nullptr)
199 || getPositionOnLane() > myArrivalPos - POSITION_EPS);
200}
201
202
203bool
205 return getSegment() != nullptr;
206}
207
208
209bool
211 return false;
212}
213
214
215void
217 if (link != nullptr) {
218 const double speed = getSpeed();
219 link->setApproaching(this, getEventTime() + (link->getState() == LINKSTATE_ALLWAY_STOP ?
220 (SUMOTime)RandHelper::rand((int)2) : 0), // tie braker
221 speed, link->getViaLaneOrLane()->getVehicleMaxSpeed(this), true,
222 speed, getWaitingTime(),
223 // @note: dist is not used by meso (getZipperSpeed is never called)
224 getSegment()->getLength(), 0);
225 }
226}
227
228
229bool
230MEVehicle::replaceRoute(ConstMSRoutePtr newRoute, const std::string& info, bool onInit, int offset, bool addRouteStops, bool removeStops, std::string* msgReturn) {
231 MSLink* const oldLink = mySegment != nullptr ? mySegment->getLink(this) : nullptr;
232 if (MSBaseVehicle::replaceRoute(newRoute, info, onInit, offset, addRouteStops, removeStops, msgReturn)) {
233 if (mySegment != nullptr) {
234 MSLink* const newLink = mySegment->getLink(this);
235 // update approaching vehicle information
236 if (oldLink != newLink) {
237 if (oldLink != nullptr) {
238 oldLink->removeApproaching(this);
239 }
240 setApproaching(newLink);
241 }
242 }
243 return true;
244 }
245 return false;
246}
247
248
251 const SUMOTime initialTime = time;
252 bool hadStop = false;
253 bool reachedStop = false;
254 for (MSStop& stop : myStops) {
255 if (stop.joinTriggered) {
256 WRITE_WARNINGF(TL("Join stops are not available in meso yet (vehicle '%', segment '%')."),
257 getID(), mySegment->getID());
258 continue;
259 }
260 if (stop.edge != myCurrEdge || stop.segment != mySegment) {
261 break;
262 }
263 const SUMOTime cur = time;
264 if (stop.duration > 0) { // it might be a triggered stop with duration -1
265 if (stop.duration >= SUMOTime_MAX / 2) {
266 // avoid overflow!
267 time = SUMOTime_MAX / 2;
268 } else {
269 time += stop.duration;
270 }
271 }
272 if (stop.pars.until > time) {
273 // @note: this assumes the stop is reached at time. With the way this is called in MESegment (time == entryTime),
274 // travel time is overestimated of the stop is not at the start of the segment
275 time = stop.pars.until;
276 }
277 if (MSGlobals::gUseStopEnded && stop.pars.ended >= 0) {
278 time = MAX2(cur, stop.pars.ended);
279 }
280 if (!stop.reached) {
281 reachedStop = true;
282 stop.reached = true;
283 stop.pars.started = myLastEntryTime;
284 stop.endBoarding = stop.pars.extension >= 0 ? time + stop.pars.extension : SUMOTime_MAX;
285 if (MSStopOut::active()) {
286 if (!hadStop) {
288 } else {
289 WRITE_WARNINGF(TL("Vehicle '%' has multiple stops on segment '%', time=% (stop-output will be merged)."),
290 getID(), mySegment->getID(), time2string(time));
291 }
292 }
293 }
294 if (stop.triggered || stop.containerTriggered || stop.joinTriggered) {
295 time = MAX2(time, cur + DELTA_T);
296 }
297 hadStop = true;
298 }
299 if (reachedStop) {
300 MSDevice_Taxi* taxi = static_cast<MSDevice_Taxi*>(getDevice(typeid(MSDevice_Taxi)));
301 if (taxi != nullptr) {
302 taxi->notifyMove(*this, 0, 0, 0);
303 }
304 }
305 MSDevice_Tripinfo* tripinfo = static_cast<MSDevice_Tripinfo*>(getDevice(typeid(MSDevice_Tripinfo)));
306 if (tripinfo != nullptr) {
307 tripinfo->updateStopTime(time - initialTime);
308 }
309 return time;
310}
311
312
313bool
315 if (isStopped()) {
316 const SUMOTime now = SIMSTEP;
317 MSStop& stop = myStops.front();
318 stop.pars.ended = now;
319 for (const auto& rem : myMoveReminders) {
320 rem.first->notifyStopEnded();
321 }
322 if (MSStopOut::active()) {
323 MSStopOut::getInstance()->stopEnded(this, stop);
324 }
325 myPastStops.push_back(stop.pars);
326 myPastStops.back().routeIndex = (int)(stop.edge - myRoute->begin());
330 }
331 myStops.pop_front();
332 if (myEventTime > now) {
333 // if this is an aborted stop we need to change the event time of the vehicle
334 const bool isLeader = mySegment->getQueue(myQueIndex).back() == this;
335 if (isLeader) {
337 myEventTime = now + 1;
338 MSGlobals::gMesoNet->addLeaderCar(this, nullptr);
339 }
340 }
341 return true;
342 }
343 return false;
344}
345
346
347double
350 for (const MSStop& stop : myStops) {
351 if (stop.reached) {
352 time += stop.duration;
353 if (stop.pars.until > time) {
354 // @note: this assumes the stop is reached at time. With the way this is called in MESegment (time == entryTime),
355 // travel time is overestimated of the stop is not at the start of the segment
356 time = stop.pars.until;
357 }
358 } else {
359 break;
360 }
361 }
362 return STEPS2TIME(time - myLastEntryTime);
363}
364
365
366void
368 assert(isStopped());
369 double lastPos = -1;
370 bool hadStop = false;
371 while (!myStops.empty()) {
372 MSStop& stop = myStops.front();
373 if (stop.edge != myCurrEdge || stop.segment != mySegment || stop.pars.endPos <= lastPos) {
374 break;
375 }
376 lastPos = stop.pars.endPos;
377 MSNet* const net = MSNet::getInstance();
378 SUMOTime dummy = -1; // boarding- and loading-time are not considered
379 if (hadStop && MSStopOut::active()) {
380 stop.reached = true;
382 }
383 if (net->hasPersons()) {
384 net->getPersonControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy);
385 }
386 if (net->hasContainers()) {
387 net->getContainerControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy);
388 }
390 hadStop = true;
391 }
392 if (getWaitingTime() > 0) {
393 // entry back onto the road was blocked for some time
394 MSDevice_Tripinfo* tripinfoDevice = static_cast<MSDevice_Tripinfo*>(getDevice(typeid(MSDevice_Tripinfo)));
395 if (tripinfoDevice != nullptr) {
396 tripinfoDevice->recordMesoParkingTimeLoss(getWaitingTime());
397 }
398 }
400}
401
402
403bool
405 MSNet* const net = MSNet::getInstance();
406 SUMOTime dummy = -1; // boarding- and loading-time are not considered
407 for (MSStop& stop : myStops) {
408 if (!stop.reached) {
409 break;
410 }
411 if (net->getCurrentTimeStep() > stop.endBoarding) {
412 if (stop.triggered || stop.containerTriggered) {
413 MSDevice_Taxi* taxiDevice = static_cast<MSDevice_Taxi*>(getDevice(typeid(MSDevice_Taxi)));
414 if (taxiDevice != nullptr) {
415 taxiDevice->cancelCurrentCustomers();
416 }
417 stop.triggered = false;
418 stop.containerTriggered = false;
419 }
423 }
424 }
425 if (stop.triggered) {
427 // we could not check this on entering the segment because there may be persons who still want to leave
428 WRITE_WARNINGF(TL("Vehicle '%' ignores triggered stop on lane '%' due to capacity constraints."), getID(), stop.lane->getID());
429 stop.triggered = false;
433 }
434 } else if (!net->hasPersons() || !net->getPersonControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy)) {
438 }
439 return false;
440 }
441 }
442 if (stop.containerTriggered) {
443 if (getVehicleType().getContainerCapacity() == getContainerNumber()) {
444 // we could not check this on entering the segment because there may be containers who still want to leave
445 WRITE_WARNINGF(TL("Vehicle '%' ignores container triggered stop on lane '%' due to capacity constraints."), getID(), stop.lane->getID());
446 stop.containerTriggered = false;
450 }
451 } else if (!net->hasContainers() || !net->getContainerControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy)) {
455 }
456 return false;
457 }
458 }
459 if (stop.joinTriggered) {
460 // TODO do something useful here
461 return false;
462 }
463 }
464 return true;
465}
466
467
468bool
470 if (mySegment == nullptr) {
471 return true;
472 }
473 if (!endTriggeredStop()) {
474 return false;
475 }
476 return mySegment->isOpen(this);
477}
478
479
480double
482 if (mySegment == nullptr) {
483 return 0;
484 } else {
485 return STEPS2TIME(mySegment->getLinkPenalty(this));
486 }
487}
488
489
490void
492 for (MoveReminderCont::iterator i = myMoveReminders.begin(); i != myMoveReminders.end(); ++i) {
493 if (i->first == rem) {
496 getLastEntryTime(), currentTime, exitTime, false);
497#ifdef _DEBUG
498 if (myTraceMoveReminders) {
499 traceMoveReminder("notifyMove", i->first, i->second, true);
500 }
501#endif
502 return;
503 }
504 }
505}
506
507
508void
509MEVehicle::updateDetectors(const SUMOTime currentTime, const SUMOTime exitTime, const bool isLeave, const MSMoveReminder::Notification reason) {
510 // segments of the same edge have the same reminder so no cleaning up must take place
511 const bool cleanUp = isLeave && (reason != MSMoveReminder::NOTIFICATION_SEGMENT);
512 for (MoveReminderCont::iterator rem = myMoveReminders.begin(); rem != myMoveReminders.end();) {
514 rem->first->updateDetector(*this, mySegment->getIndex() * mySegment->getLength(),
516 getLastEntryTime(), currentTime, exitTime, cleanUp);
517#ifdef _DEBUG
518 if (myTraceMoveReminders) {
519 traceMoveReminder("notifyMove", rem->first, rem->second, true);
520 }
521#endif
522 }
523 if (!isLeave || rem->first->notifyLeave(*this, mySegment == nullptr ? 0 : mySegment->getLength(), reason)) {
524#ifdef _DEBUG
525 if (isLeave && myTraceMoveReminders) {
526 traceMoveReminder("notifyLeave", rem->first, rem->second, true);
527 }
528#endif
529
530 if (isLeave) {
531 rem->second += getEdge()->getLength();
532#ifdef _DEBUG
533 if (myTraceMoveReminders) {
534 traceMoveReminder("adaptedPos", rem->first, rem->second, true);
535 }
536#endif
537 }
538 ++rem;
539 } else {
540#ifdef _DEBUG
541 if (myTraceMoveReminders) {
542 traceMoveReminder("remove", rem->first, rem->second, false);
543 }
544#endif
545 rem = myMoveReminders.erase(rem);
546 }
547 }
550 }
551}
552
553
556 if (myInfluencer == nullptr) {
558 }
559 return *myInfluencer;
560}
561
562
567
568
569void
574
575
576int
578 return getSegment() != nullptr ? getSegment()->getIndex() : -1;
579}
580
581
582double
583MEVehicle::getRightSideOnEdge(const MSLane* /*lane*/) const {
584 if (mySegment == nullptr || mySegment->getIndex() >= getEdge()->getNumLanes()) {
585 return 0;
586 }
587 const MSLane* lane = getEdge()->getLanes()[mySegment->getIndex()];
588 return lane->getRightSideOnEdge() + lane->getWidth() * 0.5 - 0.5 * getVehicleType().getWidth();
589
590}
591
592
593void
595 if (mySegment != nullptr && MESegment::isInvalid(mySegment)) {
596 // segment is vaporization target, do not write this vehicle
597 return;
598 }
600 assert(mySegment == nullptr || *myCurrEdge == &mySegment->getEdge() || mySegment->getEdge().isInternal());
601 std::vector<SUMOTime> internals;
602 internals.push_back(myParameter->parametersSet);
603 internals.push_back(myDeparture);
604 internals.push_back((SUMOTime)distance(myRoute->begin(), myCurrEdge));
605 internals.push_back((SUMOTime)myDepartPos * 1000); // store as mm
606 internals.push_back(mySegment == nullptr ? (SUMOTime) - 1 : (SUMOTime)mySegment->getIndex());
607 internals.push_back((SUMOTime)getQueIndex());
608 internals.push_back(myEventTime);
609 internals.push_back(myLastEntryTime);
610 internals.push_back(myBlockTime);
611 internals.push_back(isStopped());
612 internals.push_back(myPastStops.size());
613 internals.push_back(myWasJammed);
614 internals.push_back(myEventIndex);
615 internals.push_back(myUnqueuedEventTime);
616 out.writeAttr(SUMO_ATTR_STATE, toString(internals));
617 // save past stops
619 stop.write(out, false);
620 // do not write started and ended twice
621 if ((stop.parametersSet & STOP_STARTED_SET) == 0) {
622 out.writeAttr(SUMO_ATTR_STARTED, time2string(stop.started));
623 }
624 if ((stop.parametersSet & STOP_ENDED_SET) == 0) {
625 out.writeAttr(SUMO_ATTR_ENDED, time2string(stop.ended));
626 }
627 out.closeTag();
628 }
629 // save upcoming stops
630 for (const MSStop& stop : myStops) {
631 stop.write(out);
632 }
633 // save parameters
635 for (MSDevice* dev : myDevices) {
636 dev->saveState(out);
637 }
638 for (const auto& item : myMoveReminders) {
639 item.first->saveReminderState(out, *this);
640 }
641 out.closeTag();
642}
643
644
645void
647 if (attrs.hasAttribute(SUMO_ATTR_POSITION)) {
648 throw ProcessError(TL("Error: Invalid vehicles in state (may be a micro state)!"));
649 }
650 int routeOffset;
651 bool stopped;
652 int pastStops;
653 int segIndex;
654 int queIndex;
655 std::istringstream bis(attrs.getString(SUMO_ATTR_STATE));
657 bis >> myDeparture;
658 bis >> routeOffset;
659 bis >> myDepartPos;
660 bis >> segIndex;
661 bis >> queIndex;
662 bis >> myEventTime;
663 bis >> myLastEntryTime;
664 bis >> myBlockTime;
665 bis >> stopped;
666 bis >> pastStops;
667 bis >> myWasJammed;
668 bis >> myEventIndex;
669 bis >> myUnqueuedEventTime;
670 myDepartPos /= 1000.; // was stored as mm
671
673 bool ok;
674 myArrivalPos = attrs.get<double>(SUMO_ATTR_ARRIVALPOS_RANDOMIZED, getID().c_str(), ok);
675 }
676
677 // load stops
678 myStops.clear();
680
681 if (hasDeparted()) {
682 myDeparture -= offset;
683 myEventTime -= offset;
684 myLastEntryTime -= offset;
685 myCurrEdge = myRoute->begin() + routeOffset;
686 // fix stops
687 while (pastStops > 0) {
688 for (const auto& rem : myMoveReminders) {
689 rem.first->notifyStopEnded();
690 }
691 myPastStops.push_back(myStops.front().pars);
692 myPastStops.back().routeIndex = (int)(myStops.front().edge - myRoute->begin());
693 myStops.pop_front();
694 pastStops--;
695 }
696 if (segIndex >= 0) {
698 while (seg->getIndex() != (int)segIndex) {
699 seg = seg->getNextSegment();
700 if (seg == nullptr) {
701 throw ProcessError(TLF("Unknown segment '%:%' for vehicle '%' in loaded state.", (*myCurrEdge)->getID(), segIndex, getID()));
702 }
703 }
704 setSegment(seg, queIndex);
705 if (queIndex == MESegment::PARKING_QUEUE) {
706 MSGlobals::gMesoNet->addLeaderCar(this, nullptr, true);
707 getCurrentEdge()->getLanes()[0]->addParking(this);
708 }
709 } else {
710 // on teleport
711 setSegment(nullptr, 0);
712 assert(myEventTime != SUMOTime_MIN);
713 MSGlobals::gMesoNet->addLeaderCar(this, nullptr, true);
714 }
715 // see MSBaseVehicle constructor
718 }
719 }
720 if (myBlockTime != SUMOTime_MAX) {
721 myBlockTime -= offset;
722 }
724 myUnqueuedEventTime -= offset;
725 }
726 std::istringstream dis(attrs.getString(SUMO_ATTR_DISTANCE));
728 if (stopped) {
729 myStops.front().startedFromState = true;
730 myStops.front().reached = true;
731 }
732}
733
734
735/****************************************************************************/
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:39
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 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:57
void addLeaderCar(MEVehicle *veh, MSLink *link, const bool fromState=false)
Adds the given car to the leading vehicles.
Definition MELoop.cpp:301
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:114
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
Definition MELoop.cpp:397
void removeLeaderCar(MEVehicle *v)
Removes the given car from the leading vehicles.
Definition MELoop.cpp:318
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:261
const std::vector< MEVehicle * > & getQueue(int index) const
Returns the cars in the queue with the given index for visualization.
Definition MESegment.h:231
const MSEdge & getEdge() const
Returns the edge this segment belongs to.
Definition MESegment.h:381
int getIndex() const
Returns the running index of the segment in the edge (0 is the most upstream).
Definition MESegment.h:245
static bool isInvalid(const MESegment *segment)
whether the given segment is 0 or encodes vaporization
Definition MESegment.h:474
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
Definition MESegment.h:253
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:89
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
Definition MEVehicle.cpp:69
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:413
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.
long long int myEventIndex
The index of the vehicle's event (orders events with the same time)
Definition MEVehicle.h:416
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:319
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:410
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:290
double getPositionOnLane() const
Get the vehicle's position along the lane.
Definition MEVehicle.cpp:75
SUMOTime myLastEntryTime
The time the vehicle entered its current segment.
Definition MEVehicle.h:419
BaseInfluencer * myInfluencer
An instance of a velocity/lane influencing instance; built in "getInfluencer".
Definition MEVehicle.h:431
void setApproaching(MSLink *link)
registers vehicle with the given link
bool endTriggeredStop()
process triggered stops and return true if all stops on the current segment are completed
void saveState(OutputDevice &out)
Saves the states of a vehicle.
MESegment * getSegment() const
Returns the current segment the vehicle is on.
Definition MEVehicle.h:259
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:407
int getQueIndex() const
Returns the index of the que the vehicle is in.
Definition MEVehicle.h:268
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:250
bool myWasJammed
Whether this vehicle was jammed on it's previous normal segment.
Definition MEVehicle.h:428
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:218
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
SUMOTime myUnqueuedEventTime
The expected time of leaving the segment when following the leader at free-flow headway.
Definition MEVehicle.h:425
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:96
SUMOTime myBlockTime
The time at which the vehicle was blocked on its current segment.
Definition MEVehicle.h:422
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:78
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:169
double getLength() const
return the length of the edge
Definition MSEdge.h:695
bool isInternal() const
return whether this edge is an internal edge
Definition MSEdge.h:270
const std::map< const MEVehicle *, std::pair< double, int > > & getMesoPositions() const
Definition MSEdge.cpp:1783
void removeWaiting(const SUMOVehicle *vehicle) const
Removes a vehicle from the list of waiting vehicles.
Definition MSEdge.cpp:1543
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:1229
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:201
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition MSNet.cpp:1326
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:1317
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