Eclipse SUMO - Simulation of Urban MObility
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-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
19 // A vehicle from the mesoscopic point of view
20 /****************************************************************************/
21 #include <config.h>
22 
23 #include <iostream>
24 #include <cassert>
25 #include <utils/common/StdDefs.h>
34 #include <microsim/MSGlobals.h>
35 #include <microsim/MSEdge.h>
36 #include <microsim/MSLane.h>
37 #include <microsim/MSNet.h>
38 #include <microsim/MSVehicleType.h>
39 #include <microsim/MSLink.h>
40 #include <microsim/MSStop.h>
44 #include "MELoop.h"
45 #include "MEVehicle.h"
46 #include "MESegment.h"
47 
48 
49 // ===========================================================================
50 // method definitions
51 // ===========================================================================
53  MSVehicleType* type, const double speedFactor) :
54  MSBaseVehicle(pars, route, type, speedFactor),
55  mySegment(nullptr),
56  myQueIndex(0),
57  myEventTime(SUMOTime_MIN),
58  myLastEntryTime(SUMOTime_MIN),
59  myBlockTime(SUMOTime_MAX),
60  myInfluencer(nullptr) {
61 }
62 
63 
64 double
65 MEVehicle::getBackPositionOnLane(const MSLane* /* lane */) const {
67 }
68 
69 
70 double
72 // the following interpolation causes problems with arrivals and calibrators
73 // const double fracOnSegment = MIN2(double(1), STEPS2TIME(MSNet::getInstance()->getCurrentTimeStep() - myLastEntryTime) / STEPS2TIME(myEventTime - myLastEntryTime));
74  return mySegment == nullptr ? 0 : (double(mySegment->getIndex()) /* + fracOnSegment */) * mySegment->getLength();
75 }
76 
77 
78 double
80  const MSLane* const lane = getEdge()->getLanes()[0];
82 }
83 
84 
85 double
87  const MSLane* const lane = getEdge()->getLanes()[0];
89 }
90 
91 
93 MEVehicle::getPosition(const double offset) const {
94  const MSLane* const lane = getEdge()->getLanes()[0];
95  return lane->geometryPositionAtOffset(getPositionOnLane() + offset);
96 }
97 
98 
99 double
101  if (getWaitingTime() > 0 || isStopped()) {
102  return 0;
103  } else {
104  return getAverageSpeed();
105  }
106 }
107 
108 
109 double
111  if (mySegment == nullptr || myQueIndex == MESegment::PARKING_QUEUE) {
112  return 0;
113  } else {
115  getEdge()->getLanes()[myQueIndex]->getVehicleMaxSpeed(this));
116  }
117 }
118 
119 
120 double
123  const double v = getSpeed();
124  return MIN2(link->getViaLaneOrLane()->getVehicleMaxSpeed(this),
125  (double)sqrt(2 * link->getLength() * getVehicleType().getCarFollowModel().getMaxAccel() + v * v));
126 }
127 
128 
129 double
130 MEVehicle::getConservativeSpeed(SUMOTime& earliestArrival) const {
131  earliestArrival = MAX2(myEventTime, earliestArrival - DELTA_T); // event times have subsecond resolution
132  return mySegment->getLength() / STEPS2TIME(earliestArrival - myLastEntryTime);
133 }
134 
135 
136 bool
138  // vehicle has just entered a new edge. Position is 0
139  if (myCurrEdge == myRoute->end() - 1 || (myParameter->arrivalEdge >= 0 && getRoutePosition() >= myParameter->arrivalEdge)) { // may happen during teleport
140  return true;
141  }
142  ++myCurrEdge;
143  if ((*myCurrEdge)->isVaporizing()) {
144  return true;
145  }
146  // update via
147  if (myParameter->via.size() > 0 && (*myCurrEdge)->getID() == myParameter->via.front()) {
148  myParameter->via.erase(myParameter->via.begin());
149  }
150  return hasArrived();
151 }
152 
153 
154 bool
156  // mySegment may be 0 due to teleporting or arrival
157  return (myCurrEdge == myRoute->end() - 1 || (myParameter->arrivalEdge >= 0 && getRoutePosition() >= myParameter->arrivalEdge)) && (
158  (mySegment == nullptr)
160  || getPositionOnLane() > myArrivalPos - POSITION_EPS);
161 }
162 
163 
164 bool
166  return getSegment() != nullptr;
167 }
168 
169 
170 bool
172  return false;
173 }
174 
175 
176 void
178  if (link != nullptr) {
179  const double speed = getSpeed();
180  link->setApproaching(this, getEventTime() + (link->getState() == LINKSTATE_ALLWAY_STOP ?
181  (SUMOTime)RandHelper::rand((int)2) : 0), // tie braker
182  speed, speed, true,
183  speed, getWaitingTime(),
184  // @note: dist is not used by meso (getZipperSpeed is never called)
185  getSegment()->getLength(), 0);
186  }
187 }
188 
189 
190 bool
191 MEVehicle::replaceRoute(ConstMSRoutePtr newRoute, const std::string& info, bool onInit, int offset, bool addRouteStops, bool removeStops, std::string* msgReturn) {
192  MSLink* const oldLink = mySegment != nullptr ? mySegment->getLink(this) : nullptr;
193  if (MSBaseVehicle::replaceRoute(newRoute, info, onInit, offset, addRouteStops, removeStops, msgReturn)) {
194  if (mySegment != nullptr) {
195  MSLink* const newLink = mySegment->getLink(this);
196  // update approaching vehicle information
197  if (oldLink != newLink) {
198  if (oldLink != nullptr) {
199  oldLink->removeApproaching(this);
200  }
201  setApproaching(newLink);
202  }
203  }
204  return true;
205  }
206  return false;
207 }
208 
209 
210 SUMOTime
212  const SUMOTime initialTime = time;
213  bool hadStop = false;
214  for (MSStop& stop : myStops) {
215  if (stop.joinTriggered) {
216  WRITE_WARNINGF(TL("Join stops are not available in meso yet (vehicle '%', segment '%')."),
217  getID(), mySegment->getID());
218  continue;
219  }
220  if (stop.edge != myCurrEdge || stop.segment != mySegment) {
221  break;
222  }
223  const SUMOTime cur = time;
224  if (stop.duration > 0) { // it might be a triggered stop with duration -1
225  time += stop.duration;
226  }
227  if (stop.pars.until > time) {
228  // @note: this assumes the stop is reached at time. With the way this is called in MESegment (time == entryTime),
229  // travel time is overestimated of the stop is not at the start of the segment
230  time = stop.pars.until;
231  }
232  if (MSGlobals::gUseStopEnded && stop.pars.ended >= 0) {
233  time = MAX2(cur, stop.pars.ended);
234  }
235  if (!stop.reached) {
236  stop.reached = true;
237  stop.pars.started = myLastEntryTime;
238  stop.endBoarding = stop.pars.extension >= 0 ? time + stop.pars.extension : SUMOTime_MAX;
239  if (MSStopOut::active()) {
240  if (!hadStop) {
242  } else {
243  WRITE_WARNINGF(TL("Vehicle '%' has multiple stops on segment '%', time=% (stop-output will be merged)."),
244  getID(), mySegment->getID(), time2string(time));
245  }
246  }
247  MSDevice_Taxi* taxi = static_cast<MSDevice_Taxi*>(getDevice(typeid(MSDevice_Taxi)));
248  if (taxi != nullptr) {
249  taxi->notifyMove(*this, 0, 0, 0);
250  }
251  }
252  if (stop.triggered || stop.containerTriggered || stop.joinTriggered) {
253  time = MAX2(time, cur + DELTA_T);
254  }
255  hadStop = true;
256  }
257  MSDevice_Tripinfo* tripinfo = static_cast<MSDevice_Tripinfo*>(getDevice(typeid(MSDevice_Tripinfo)));
258  if (tripinfo != nullptr) {
259  tripinfo->updateStopTime(time - initialTime);
260  }
261  return time;
262 }
263 
264 
265 bool
267  if (isStopped()) {
268  const SUMOTime now = SIMSTEP;
269  MSStop& stop = myStops.front();
270  stop.pars.ended = now;
271  for (const auto& rem : myMoveReminders) {
272  rem.first->notifyStopEnded();
273  }
274  if (MSStopOut::active()) {
276  }
277  myPastStops.push_back(stop.pars);
278  if (myAmRegisteredAsWaiting && (stop.triggered || stop.containerTriggered || stop.joinTriggered)) {
280  myAmRegisteredAsWaiting = false;
281  }
282  myStops.pop_front();
283  if (myEventTime > now) {
284  // if this is an aborted stop we need to change the event time of the vehicle
285  if (MSGlobals::gMesoNet->removeLeaderCar(this)) {
286  myEventTime = now + 1;
287  MSGlobals::gMesoNet->addLeaderCar(this, nullptr);
288  }
289  }
290  return true;
291  }
292  return false;
293 }
294 
295 
296 double
298  SUMOTime time = myLastEntryTime;
299  for (const MSStop& stop : myStops) {
300  if (stop.reached) {
301  time += stop.duration;
302  if (stop.pars.until > time) {
303  // @note: this assumes the stop is reached at time. With the way this is called in MESegment (time == entryTime),
304  // travel time is overestimated of the stop is not at the start of the segment
305  time = stop.pars.until;
306  }
307  } else {
308  break;
309  }
310  }
311  return STEPS2TIME(time - myLastEntryTime);
312 }
313 
314 
315 void
317  assert(isStopped());
318  double lastPos = -1;
319  bool hadStop = false;
320  while (!myStops.empty()) {
321  MSStop& stop = myStops.front();
322  if (stop.edge != myCurrEdge || stop.segment != mySegment || stop.pars.endPos <= lastPos) {
323  break;
324  }
325  lastPos = stop.pars.endPos;
326  MSNet* const net = MSNet::getInstance();
327  SUMOTime dummy = -1; // boarding- and loading-time are not considered
328  if (net->hasPersons()) {
329  net->getPersonControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy);
330  }
331  if (net->hasContainers()) {
332  net->getContainerControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy);
333  }
334  if (hadStop && MSStopOut::active()) {
336  }
338  hadStop = true;
339  }
341 }
342 
343 
344 bool
346  if (mySegment == nullptr) {
347  return true;
348  }
349  MSNet* const net = MSNet::getInstance();
350  SUMOTime dummy = -1; // boarding- and loading-time are not considered
351  for (MSStop& stop : myStops) {
352  if (!stop.reached) {
353  break;
354  }
355  if (net->getCurrentTimeStep() > stop.endBoarding) {
356  if (stop.triggered || stop.containerTriggered) {
357  MSDevice_Taxi* taxiDevice = static_cast<MSDevice_Taxi*>(getDevice(typeid(MSDevice_Taxi)));
358  if (taxiDevice != nullptr) {
359  taxiDevice->cancelCurrentCustomers();
360  }
361  stop.triggered = false;
362  stop.containerTriggered = false;
363  }
366  myAmRegisteredAsWaiting = false;
367  }
368  }
369  if (stop.triggered) {
371  // we could not check this on entering the segment because there may be persons who still want to leave
372  WRITE_WARNINGF(TL("Vehicle '%' ignores triggered stop on lane '%' due to capacity constraints."), getID(), stop.lane->getID());
373  stop.triggered = false;
376  myAmRegisteredAsWaiting = false;
377  }
378  } else if (!net->hasPersons() || !net->getPersonControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy)) {
382  }
383  return false;
384  }
385  }
386  if (stop.containerTriggered) {
387  if (getVehicleType().getContainerCapacity() == getContainerNumber()) {
388  // we could not check this on entering the segment because there may be containers who still want to leave
389  WRITE_WARNINGF(TL("Vehicle '%' ignores container triggered stop on lane '%' due to capacity constraints."), getID(), stop.lane->getID());
390  stop.containerTriggered = false;
393  myAmRegisteredAsWaiting = false;
394  }
395  } else if (!net->hasContainers() || !net->getContainerControl().loadAnyWaiting(&mySegment->getEdge(), this, dummy, dummy)) {
399  }
400  return false;
401  }
402  }
403  if (stop.joinTriggered) {
404  // TODO do something useful here
405  return false;
406  }
407  }
408  return mySegment->isOpen(this);
409 }
410 
411 
412 double
414  if (mySegment == nullptr) {
415  return 0;
416  } else {
417  return STEPS2TIME(mySegment->getLinkPenalty(this));
418  }
419 }
420 
421 
422 void
424  for (MoveReminderCont::iterator i = myMoveReminders.begin(); i != myMoveReminders.end(); ++i) {
425  if (i->first == rem) {
427  (mySegment->getIndex() + 1) * mySegment->getLength(),
428  getLastEntryTime(), currentTime, exitTime, false);
429 #ifdef _DEBUG
430  if (myTraceMoveReminders) {
431  traceMoveReminder("notifyMove", i->first, i->second, true);
432  }
433 #endif
434  return;
435  }
436  }
437 }
438 
439 
440 void
441 MEVehicle::updateDetectors(SUMOTime currentTime, const bool isLeave, const MSMoveReminder::Notification reason) {
442  // segments of the same edge have the same reminder so no cleaning up must take place
443  const bool cleanUp = isLeave && (reason != MSMoveReminder::NOTIFICATION_SEGMENT);
444  for (MoveReminderCont::iterator rem = myMoveReminders.begin(); rem != myMoveReminders.end();) {
445  if (currentTime != getLastEntryTime()) {
446  rem->first->updateDetector(*this, mySegment->getIndex() * mySegment->getLength(),
447  (mySegment->getIndex() + 1) * mySegment->getLength(),
448  getLastEntryTime(), currentTime, getEventTime(), cleanUp);
449 #ifdef _DEBUG
450  if (myTraceMoveReminders) {
451  traceMoveReminder("notifyMove", rem->first, rem->second, true);
452  }
453 #endif
454  }
455  if (!isLeave || rem->first->notifyLeave(*this, mySegment->getLength(), reason)) {
456 #ifdef _DEBUG
457  if (isLeave && myTraceMoveReminders) {
458  traceMoveReminder("notifyLeave", rem->first, rem->second, true);
459  }
460 #endif
461  ++rem;
462  } else {
463 #ifdef _DEBUG
464  if (myTraceMoveReminders) {
465  traceMoveReminder("remove", rem->first, rem->second, false);
466  }
467 #endif
468  rem = myMoveReminders.erase(rem);
469  }
470  }
472  myOdometer += getEdge()->getLength();
473  }
474 }
475 
476 
479  if (myInfluencer == nullptr) {
481  }
482  return *myInfluencer;
483 }
484 
485 
488  return myInfluencer;
489 }
490 
491 
492 void
495  MSGlobals::gMesoNet->changeSegment(this, MSNet::getInstance()->getCurrentTimeStep(), nullptr, reason);
496 }
497 
498 double
499 MEVehicle::getRightSideOnEdge(const MSLane* /*lane*/) const {
500  if (mySegment == nullptr || mySegment->getIndex() >= getEdge()->getNumLanes()) {
501  return 0;
502  }
503  const MSLane* lane = getEdge()->getLanes()[mySegment->getIndex()];
504  return lane->getRightSideOnEdge() + lane->getWidth() * 0.5 - 0.5 * getVehicleType().getWidth();
505 
506 }
507 
508 
509 void
511  if (mySegment != nullptr && MESegment::isInvalid(mySegment)) {
512  // segment is vaporization target, do not write this vehicle
513  return;
514  }
516  assert(mySegment == nullptr || *myCurrEdge == &mySegment->getEdge());
517  std::vector<SUMOTime> internals;
518  internals.push_back(myParameter->parametersSet);
519  internals.push_back(myDeparture);
520  internals.push_back((SUMOTime)distance(myRoute->begin(), myCurrEdge));
521  internals.push_back((SUMOTime)myDepartPos * 1000); // store as mm
522  internals.push_back(mySegment == nullptr ? (SUMOTime) - 1 : (SUMOTime)mySegment->getIndex());
523  internals.push_back((SUMOTime)getQueIndex());
524  internals.push_back(myEventTime);
525  internals.push_back(myLastEntryTime);
526  internals.push_back(myBlockTime);
527  out.writeAttr(SUMO_ATTR_STATE, toString(internals));
528  // save past stops
530  stop.write(out, false);
531  // do not write started and ended twice
532  if ((stop.parametersSet & STOP_STARTED_SET) == 0) {
533  out.writeAttr(SUMO_ATTR_STARTED, time2string(stop.started));
534  }
535  if ((stop.parametersSet & STOP_ENDED_SET) == 0) {
536  out.writeAttr(SUMO_ATTR_ENDED, time2string(stop.ended));
537  }
538  out.closeTag();
539  }
540  // save upcoming stops
541  for (const MSStop& stop : myStops) {
542  stop.write(out);
543  }
544  // save parameters
545  myParameter->writeParams(out);
546  for (MSDevice* dev : myDevices) {
547  dev->saveState(out);
548  }
549  out.closeTag();
550 }
551 
552 
553 void
554 MEVehicle::loadState(const SUMOSAXAttributes& attrs, const SUMOTime offset) {
555  if (attrs.hasAttribute(SUMO_ATTR_POSITION)) {
556  throw ProcessError(TL("Error: Invalid vehicles in state (may be a micro state)!"));
557  }
558  int routeOffset;
559  int segIndex;
560  int queIndex;
561  std::istringstream bis(attrs.getString(SUMO_ATTR_STATE));
562  bis >> myParameter->parametersSet;
563  bis >> myDeparture;
564  bis >> routeOffset;
565  bis >> myDepartPos;
566  bis >> segIndex;
567  bis >> queIndex;
568  bis >> myEventTime;
569  bis >> myLastEntryTime;
570  bis >> myBlockTime;
571  myDepartPos /= 1000.; // was stored as mm
572  if (hasDeparted()) {
573  myDeparture -= offset;
574  myEventTime -= offset;
575  myLastEntryTime -= offset;
576  myCurrEdge = myRoute->begin() + routeOffset;
577  if (segIndex >= 0) {
579  while (seg->getIndex() != (int)segIndex) {
580  seg = seg->getNextSegment();
581  assert(seg != 0);
582  }
583  setSegment(seg, queIndex);
584  if (queIndex == MESegment::PARKING_QUEUE) {
585  MSGlobals::gMesoNet->addLeaderCar(this, nullptr);
586  }
587  } else {
588  // on teleport
589  setSegment(nullptr, 0);
590  assert(myEventTime != SUMOTime_MIN);
591  MSGlobals::gMesoNet->addLeaderCar(this, nullptr);
592  }
593  // see MSBaseVehicle constructor
596  }
597  }
598  if (myBlockTime != SUMOTime_MAX) {
599  myBlockTime -= offset;
600  }
601  std::istringstream dis(attrs.getString(SUMO_ATTR_DISTANCE));
602  dis >> myOdometer >> myNumberReroutes;
603 }
604 
605 
606 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
#define WRITE_WARNINGF(...)
Definition: MsgHandler.h:296
#define TL(string)
Definition: MsgHandler.h:315
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition: Route.h:31
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:69
#define STEPS2TIME(x)
Definition: SUMOTime.h:55
#define SIMSTEP
Definition: SUMOTime.h:61
#define SUMOTime_MAX
Definition: SUMOTime.h:34
#define SUMOTime_MIN
Definition: SUMOTime.h:35
const 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_POSITION
@ SUMO_ATTR_STATE
The state of a link.
T MIN2(T a, T b)
Definition: StdDefs.h:76
T MAX2(T a, T b)
Definition: StdDefs.h:82
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
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:79
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
Definition: MELoop.cpp:325
bool removeLeaderCar(MEVehicle *v)
Removes the given car from the leading vehicles.
Definition: MELoop.cpp:236
void addLeaderCar(MEVehicle *veh, MSLink *link)
Adds the given car to the leading vehicles.
Definition: MELoop.cpp:223
A single mesoscopic segment (cell)
Definition: MESegment.h:49
static const int PARKING_QUEUE
Definition: MESegment.h:52
bool isOpen(const MEVehicle *veh) const
Returns whether the vehicle may use the next link.
Definition: MESegment.cpp:471
SUMOTime getLinkPenalty(const MEVehicle *veh) const
Returns the penalty time for passing a link (if using gMesoTLSPenalty > 0 or gMesoMinorPenalty > 0)
Definition: MESegment.cpp:842
MSLink * getLink(const MEVehicle *veh, bool tlsPenalty=false) const
Returns the link the given car will use when passing the next junction.
Definition: MESegment.cpp:442
double getLength() const
Returns the length of the segment in meters.
Definition: MESegment.h:242
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
Definition: MESegment.h:234
const MSEdge & getEdge() const
Returns the edge this segment belongs to.
Definition: MESegment.h:359
int getIndex() const
Returns the running index of the segment in the edge (0 is the most upstream).
Definition: MESegment.h:226
static bool isInvalid(const MESegment *segment)
whether the given segment is 0 or encodes vaporization
Definition: MESegment.h:443
double getConservativeSpeed(SUMOTime &earliestArrival) const
Returns the vehicle's estimated speed taking into account delays.
Definition: MEVehicle.cpp:130
Position getPosition(const double offset=0) const
Return current position (x/y, cartesian)
Definition: MEVehicle.cpp:93
double getAverageSpeed() const
Returns the vehicle's estimated average speed on the segment assuming no further delays.
Definition: MEVehicle.cpp:110
double getAngle() const
Returns the vehicle's direction in degrees.
Definition: MEVehicle.cpp:79
double getBackPositionOnLane(const MSLane *lane) const
Get the vehicle's position relative to the given lane.
Definition: MEVehicle.cpp:65
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.
Definition: MEVehicle.cpp:191
SUMOTime myEventTime
The (planned) time of leaving the segment (cell)
Definition: MEVehicle.h:352
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
Definition: MEVehicle.cpp:493
void updateDetectorForWriting(MSMoveReminder *rem, SUMOTime currentTime, SUMOTime exitTime)
Updates a single vehicle detector if present.
Definition: MEVehicle.cpp:423
MEVehicle(SUMOVehicleParameter *pars, ConstMSRoutePtr route, MSVehicleType *type, const double speedFactor)
Constructor.
Definition: MEVehicle.cpp:52
BaseInfluencer & getBaseInfluencer()
Returns the velocity/lane influencer.
Definition: MEVehicle.cpp:478
double getCurrentStoppingTimeSeconds() const
Returns the delay that is accrued due to option –meso-tls-penalty or –meso-minor-penalty.
Definition: MEVehicle.cpp:297
bool mayProceed()
Returns whether the vehicle is allowed to pass the next junction, checks also for triggered stops.
Definition: MEVehicle.cpp:345
double estimateLeaveSpeed(const MSLink *link) const
Returns the vehicle's estimated speed after driving accross the link.
Definition: MEVehicle.cpp:121
void processStop()
ends the current stop and performs loading/unloading
Definition: MEVehicle.cpp:316
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the duration for which the vehicle was blocked.
Definition: MEVehicle.h:271
bool hasArrived() const
Returns whether this vehicle has already arived (reached the arrivalPosition on its final edge)
Definition: MEVehicle.cpp:155
bool moveRoutePointer()
Update when the vehicle enters a new edge in the move step.
Definition: MEVehicle.cpp:137
int myQueIndex
Index of the que the vehicle is in (important for multiqueue extension)
Definition: MEVehicle.h:349
SUMOTime checkStop(SUMOTime time)
Returns until when to stop at the current segment and sets the information that the stop has been rea...
Definition: MEVehicle.cpp:211
void updateDetectors(SUMOTime currentTime, const bool isLeave, const MSMoveReminder::Notification reason=MSMoveReminder::NOTIFICATION_JUNCTION)
Updates all vehicle detectors.
Definition: MEVehicle.cpp:441
virtual bool isIdling() const
Returns whether the vehicle is trying to re-enter the net.
Definition: MEVehicle.cpp:171
SUMOTime getLastEntryTime() const
Returns the time the vehicle entered the current segment.
Definition: MEVehicle.h:248
double getPositionOnLane() const
Get the vehicle's position along the lane.
Definition: MEVehicle.cpp:71
SUMOTime myLastEntryTime
The time the vehicle entered its current segment.
Definition: MEVehicle.h:355
BaseInfluencer * myInfluencer
An instance of a velocity/lane influencing instance; built in "getInfluencer".
Definition: MEVehicle.h:361
void setApproaching(MSLink *link)
registers vehicle with the given link
Definition: MEVehicle.cpp:177
MESegment * getSegment() const
Returns the current segment the vehicle is on.
Definition: MEVehicle.h:218
void saveState(OutputDevice &out)
Saves the states of a vehicle.
Definition: MEVehicle.cpp:510
MESegment * mySegment
The segment the vehicle is at.
Definition: MEVehicle.h:346
int getQueIndex() const
Returns the index of the que the vehicle is in.
Definition: MEVehicle.h:226
void loadState(const SUMOSAXAttributes &attrs, const SUMOTime offset)
Loads the state of this vehicle from the given description.
Definition: MEVehicle.cpp:554
virtual void setSegment(MESegment *s, int idx=0)
Sets the current segment the vehicle is at together with its que.
Definition: MEVehicle.h:209
double getCurrentLinkPenaltySeconds() const
Returns the delay that is accrued due to option –meso-tls-penalty or –meso-minor-penalty.
Definition: MEVehicle.cpp:413
SUMOTime getEventTime() const
Returns the (planned) time at which the vehicle leaves its current segment.
Definition: MEVehicle.h:200
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
Definition: MEVehicle.cpp:165
bool resumeFromStopping()
Definition: MEVehicle.cpp:266
double getSpeed() const
Returns the vehicle's estimated speed assuming no delays.
Definition: MEVehicle.cpp:100
double getSlope() const
Returns the slope of the road at vehicle's position in degrees.
Definition: MEVehicle.cpp:86
SUMOTime myBlockTime
The time at which the vehicle was blocked on its current segment.
Definition: MEVehicle.h:358
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)
Definition: MEVehicle.cpp:499
The base class for microscopic and mesoscopic vehicles.
Definition: MSBaseVehicle.h:55
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.
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.
bool hasDeparted() const
Returns whether this vehicle has already departed.
ConstMSRoutePtr myRoute
This vehicle's route.
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
SUMOTime myDeparture
The real departure time.
std::vector< SUMOVehicleParameter::Stop > myPastStops
The list of stops that the vehicle has already reached.
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.
virtual bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
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)
Definition: MSDevice_Taxi.h:49
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
Abstract in-vehicle / in-person device.
Definition: MSDevice.h:62
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:662
void removeWaiting(const SUMOVehicle *vehicle) const
Removes a vehicle from the list of waiting vehicles.
Definition: MSEdge.cpp:1382
static MELoop * gMesoNet
mesoscopic simulation infrastructure
Definition: MSGlobals.h:109
static bool gUseStopEnded
whether the simulation should replay previous stop times
Definition: MSGlobals.h:130
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:566
double getRightSideOnEdge() const
Definition: MSLane.h:1186
double interpolateLanePosToGeometryPos(double lanePos) const
Definition: MSLane.h:546
double getWidth() const
Returns the lane's width.
Definition: MSLane.h:627
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
Definition: MSLane.h:552
virtual const PositionVector & getShape(bool) const
Definition: MSLane.h:294
Something on a lane to be noticed about vehicle movement.
Notification
Definition of a vehicle state.
@ 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:182
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition: MSNet.cpp:1182
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:378
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition: MSNet.h:320
bool hasContainers() const
Returns whether containers are simulated.
Definition: MSNet.h:411
bool hasPersons() const
Returns whether persons are simulated.
Definition: MSNet.h:395
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition: MSNet.cpp:1173
Definition: MSStop.h:44
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
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 MSStopOut * getInstance()
Definition: MSStopOut.h:60
static bool active()
Definition: MSStopOut.h:54
void stopStarted(const SUMOVehicle *veh, int numPersons, int numContainers, SUMOTime time)
Definition: MSStopOut.cpp:66
void stopEnded(const SUMOVehicle *veh, const SUMOVehicleParameter::Stop &stop, const std::string &laneOrEdgeID, bool simEnd=false)
Definition: MSStopOut.cpp:102
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.
Definition: MSVehicleType.h:63
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:74
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:254
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
double rotationAtOffset(double pos) const
Returns the rotation at the given length.
double slopeDegreeAtOffset(double pos) const
Returns the slope at the given length.
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
Definition: RandHelper.cpp:94
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.
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.
int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
std::vector< std::string > via
List of the via-edges the vehicle must visit.
bool wasSet(int what) const
Returns whether the given parameter was set.
int arrivalEdge
(optional) The final edge within the route of the vehicle