SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MSVehicle.h
Go to the documentation of this file.
1 /****************************************************************************/
15 // Representation of a vehicle in the micro simulation
16 /****************************************************************************/
17 // SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
18 // Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
19 /****************************************************************************/
20 //
21 // This file is part of SUMO.
22 // SUMO is free software: you can redistribute it and/or modify
23 // it under the terms of the GNU General Public License as published by
24 // the Free Software Foundation, either version 3 of the License, or
25 // (at your option) any later version.
26 //
27 /****************************************************************************/
28 #ifndef MSVehicle_h
29 #define MSVehicle_h
30 
31 
32 // ===========================================================================
33 // included modules
34 // ===========================================================================
35 #ifdef _MSC_VER
36 #include <windows_config.h>
37 #else
38 #include <config.h>
39 #endif
40 
41 #include <list>
42 #include <deque>
43 #include <map>
44 #include <set>
45 #include <string>
46 #include <vector>
47 #include "MSVehicleType.h"
48 #include "MSBaseVehicle.h"
49 #include "MSLink.h"
50 #include "MSLane.h"
51 
52 
53 // ===========================================================================
54 // class declarations
55 // ===========================================================================
56 class SUMOSAXAttributes;
57 class MSMoveReminder;
58 class MSLaneChanger;
59 class MSVehicleTransfer;
61 class MSBusStop;
62 class MSPerson;
63 class MSDevice;
65 class OutputDevice;
66 class Position;
67 class MSDevice_Person;
68 
69 
70 // ===========================================================================
71 // class definitions
72 // ===========================================================================
77 class MSVehicle : public MSBaseVehicle {
78 public:
79 
81  friend class MSLaneChanger;
82 
86  class State {
88  friend class MSVehicle;
89  friend class MSLaneChanger;
90 
91  public:
94 
96  State(const State& state);
97 
99  State& operator=(const State& state);
100 
102  bool operator!=(const State& state);
103 
105  SUMOReal pos() const;
106 
108  SUMOReal speed() const {
109  return mySpeed;
110  };
111 
112  private:
114  SUMOReal myPos;
115 
118 
119  };
120 
121 
134  };
135 
143  MSVehicle(SUMOVehicleParameter* pars, const MSRoute* route,
144  const MSVehicleType* type, SUMOReal speedFactor);
145 
147  virtual ~MSVehicle();
148 
149 
150 
152 
153 
163 
164 
165 
167 
168 
172  bool hasArrived() const;
173 
182  bool replaceRoute(const MSRoute* route, bool onInit = false);
183 
184 
190  bool willPass(const MSEdge* const edge) const;
191 
192  unsigned int getRoutePosition() const;
193  void resetRoutePosition(unsigned int index);
194 
203 
204 
212  static inline SUMOReal gap(SUMOReal predPos, SUMOReal predLength, SUMOReal pos) {
213  return predPos - predLength - pos;
214  }
215 
216 
217 
219 
220 
238  void workOnMoveReminders(SUMOReal oldPos, SUMOReal newPos, SUMOReal newSpeed);
240 
241 
259  void planMove(const SUMOTime t, const MSVehicle* pred, const SUMOReal lengthsInFront);
260 
261 
274  bool executeMove();
275 
276 
278 
279 
284  return myState.myPos;
285  }
286 
287 
291  SUMOReal getSpeed() const {
292  return myState.mySpeed;
293  }
294 
295 
300  return myAcceleration;
301  }
303 
304 
305 
307 
308 
316  Position getPosition(const SUMOReal offset = 0) const;
317 
318 
322  MSLane* getLane() const {
323  return myLane;
324  }
325 
326 
330  inline bool isOnRoad() const {
331  return myAmOnNet;
332  }
333 
334 
342  return myWaitingTime;
343  }
344 
345 
353  return STEPS2TIME(myWaitingTime);
354  }
355 
356 
360  SUMOReal getAngle() const;
362 
363 
365  static bool overlap(const MSVehicle* veh1, const MSVehicle* veh2) {
366  if (veh1->myState.myPos < veh2->myState.myPos) {
367  return veh2->myState.myPos - veh2->getVehicleType().getLengthWithGap() < veh1->myState.myPos;
368  }
369  return veh1->myState.myPos - veh1->getVehicleType().getLengthWithGap() < veh2->myState.myPos;
370  }
371 
372 
375  bool congested() const {
376  return myState.mySpeed < SUMOReal(60) / SUMOReal(3.6);
377  }
378 
379 
391 
398  bool enterLaneAtMove(MSLane* enteredLane, bool onTeleporting = false);
399 
400 
401 
409  void enterLaneAtInsertion(MSLane* enteredLane, SUMOReal pos, SUMOReal speed,
410  MSMoveReminder::Notification notification);
411 
412 
417  void enterLaneAtLaneChange(MSLane* enteredLane);
418 
419 
421  void leaveLane(const MSMoveReminder::Notification reason);
422 
423 
426 
429 
433  struct LaneQ {
447  std::vector<MSLane*> bestContinuations;
448  };
449 
468  virtual const std::vector<LaneQ>& getBestLanes(bool forceRebuild = false, MSLane* startLane = 0) const;
469 
470 
475  const std::vector<MSLane*>& getBestLanesContinuation() const;
476 
481  const std::vector<MSLane*>& getBestLanesContinuation(const MSLane* const l) const;
482 
484  int getBestLaneOffset() const;
485 
487 
489  bool fixPosition();
490 
491 
500  void replaceVehicleType(MSVehicleType* type);
501 
502 
510  inline const MSCFModel& getCarFollowModel() const {
511  return myType->getCarFollowModel();
512  }
513 
514 
520  return myCFVariables;
521  }
522 
523 
525 
526 
530  struct Stop {
534  const MSLane* lane;
546  bool triggered;
548  bool parking;
550  bool reached;
552  std::set<std::string> awaitedPersons;
553  };
554 
555 
562  bool addStop(const SUMOVehicleParameter::Stop& stopPar, SUMOTime untilOffset = 0);
563 
564 
568  bool hasStops() const {
569  return !myStops.empty();
570  }
571 
575  bool isStopped() const;
576 
580  bool isParking() const;
581 
582 
586  bool isStoppedTriggered() const;
588 
589  bool knowsEdgeTest(MSEdge& edge) const;
590  unsigned int getLaneIndex() const;
591 
601  SUMOReal getDistanceToPosition(SUMOReal destPos, const MSEdge* destEdge);
602 
603 
610  SUMOReal processNextStop(SUMOReal currentVelocity);
611 
612 
614 
615 
620 
621 
626 
627 
632 
633 
638 
639 
644 
645 
650 
651 
657 
658 
659 
661 
662 
666  void addPerson(MSPerson* person);
667 
668 
672  unsigned int getPersonNumber() const;
673 
675  SUMOReal getImpatience() const;
676 
679 
683  enum Signalling {
714  };
715 
716 
722  LC_NEVER = 0, // lcModel shall never trigger changes at this level
723  LC_NOCONFLICT = 1, // lcModel may trigger changes if not in conflict with TraCI request
724  LC_ALWAYS = 2 // lcModel may always trigger changes of this level regardless of requests
725  };
726 
727 
730  LCP_ALWAYS = 0, // change regardless of blockers, adapt own speed and speed of blockers
731  LCP_NOOVERLAP = 1, // change unless overlapping with blockers, adapt own speed and speed of blockers
732  LCP_URGENT = 2, // change if not blocked, adapt own speed and speed of blockers
733  LCP_OPPORTUNISTIC = 3 // change if not blocked
734  };
735 
736 
740  void switchOnSignal(int signal) {
741  mySignals |= signal;
742  }
743 
744 
748  void switchOffSignal(int signal) {
749  mySignals &= ~signal;
750  }
751 
752 
756  int getSignals() const {
757  return mySignals;
758  }
759 
760 
765  bool signalSet(int which) const {
766  return (mySignals & which) != 0;
767  }
769 
770 
771 #ifndef NO_TRACI
772 
780 
791  bool addTraciStop(MSLane* lane, SUMOReal pos, SUMOReal radius, SUMOTime duration, bool parking, bool triggered);
792 
797  Stop& getNextStop();
798 
803  bool resumeFromStopping();
804 
805 
818  class Influencer {
819  public:
821  Influencer();
822 
823 
825  ~Influencer();
826 
827 
831  void setSpeedTimeLine(const std::vector<std::pair<SUMOTime, SUMOReal> >& speedTimeLine);
832 
833 
837  void setLaneTimeLine(const std::vector<std::pair<SUMOTime, unsigned int> >& laneTimeLine);
838 
839 
851  SUMOReal influenceSpeed(SUMOTime currentTime, SUMOReal speed, SUMOReal vSafe, SUMOReal vMin, SUMOReal vMax);
852 
860  int influenceChangeDecision(const SUMOTime currentTime, const MSEdge& currentEdge, const unsigned int currentLaneIndex, int state);
861 
862 
868  SUMOReal changeRequestRemainingSeconds(const SUMOTime currentTime) const;
869 
873  void setConsiderSafeVelocity(bool value);
874 
875 
879  void setConsiderMaxAcceleration(bool value);
880 
881 
885  void setConsiderMaxDeceleration(bool value);
886 
887 
891  void setLaneChangeMode(int value);
892 
893 
898  return myOriginalSpeed;
899  }
900 
901  void setVTDControlled(bool c, MSLane* l, SUMOReal pos, int edgeOffset, const MSEdgeVector& route) {
902  myAmVTDControlled = c;
903  myVTDLane = l;
904  myVTDPos = pos;
905  myVTDEdgeOffset = edgeOffset;
906  myVTDRoute = route;
907  }
908 
909  void postProcessVTD(MSVehicle* v);
910 
911  inline bool isVTDControlled() const {
912  return myAmVTDControlled;
913  }
914 
915  private:
917  std::vector<std::pair<SUMOTime, SUMOReal> > mySpeedTimeLine;
918 
920  std::vector<std::pair<SUMOTime, unsigned int> > myLaneTimeLine;
921 
924 
927 
930 
933 
936 
942 
944 
945 
954 
956 
957  };
958 
959 
966 
967  bool hasInfluencer() const {
968  return myInfluencer != 0;
969  }
970 
972  int influenceChangeDecision(int state);
973 
974 
975 #endif
976 
978 
979 
981  void saveState(OutputDevice& out);
982 
985  void loadState(const SUMOSAXAttributes& attrs, const SUMOTime offset);
987 
988 protected:
989 
990  SUMOReal getSpaceTillLastStanding(const MSLane* l, bool& foundStopped) const;
991 
994 
1010  void adaptLaneEntering2MoveReminder(const MSLane& enteredLane);
1012 
1013 
1014 
1015  void setBlinkerInformation();
1016 
1017 
1020 
1023 
1026 
1028 
1029  mutable const MSEdge* myLastBestLanesEdge;
1031 
1032  mutable std::vector<std::vector<LaneQ> > myBestLanes;
1033  mutable std::vector<LaneQ>::iterator myCurrentLaneInBestLanes;
1034  static std::vector<MSLane*> myEmptyLaneVector;
1035 
1037  std::list<Stop> myStops;
1038 
1041 
1044 
1046  std::vector<MSLane*> myFurtherLanes;
1047 
1050 
1053 
1056 
1058 
1060 
1061 protected:
1075 
1076  DriveProcessItem(MSLink* link, SUMOReal vPass, SUMOReal vWait, bool setRequest,
1077  SUMOTime arrivalTime, SUMOReal arrivalSpeed,
1078  SUMOTime arrivalTimeBraking, SUMOReal arrivalSpeedBraking,
1079  SUMOReal distance,
1080  SUMOReal leaveSpeed = -1.) :
1081  myLink(link), myVLinkPass(vPass), myVLinkWait(vWait), mySetRequest(setRequest),
1082  myArrivalTime(arrivalTime), myArrivalSpeed(arrivalSpeed),
1083  myArrivalTimeBraking(arrivalTimeBraking), myArrivalSpeedBraking(arrivalSpeedBraking),
1084  myDistance(distance),
1085  accelV(leaveSpeed), hadVehicle(false), availableSpace(-1.) {
1086  assert(vWait >= 0);
1087  assert(vPass >= 0);
1088  };
1089 
1092  myLink(0), myVLinkPass(vWait), myVLinkWait(vWait), mySetRequest(false),
1095  myDistance(distance),
1096  accelV(-1), hadVehicle(false), availableSpace(-1.) {
1097  assert(vWait >= 0);
1098  };
1099 
1100 
1101  inline void adaptLeaveSpeed(const SUMOReal v) {
1102  if (accelV < 0) {
1103  accelV = v;
1104  } else {
1105  accelV = MIN2(accelV, v);
1106  }
1107  }
1108  inline SUMOReal getLeaveSpeed() const {
1109  return accelV < 0 ? myVLinkPass : accelV;
1110  }
1111  };
1112 
1113  typedef std::vector< DriveProcessItem > DriveItemVector;
1114 
1117 
1118  void planMoveInternal(const SUMOTime t, const MSVehicle* pred, DriveItemVector& lfLinks) const;
1119  void checkRewindLinkLanes(const SUMOReal lengthsInFront, DriveItemVector& lfLinks) const;
1120 
1122  inline SUMOReal estimateLeaveSpeed(const MSLink* const link, const SUMOReal vLinkPass) const {
1123  // estimate leave speed for passing time computation
1124  // l=linkLength, a=accel, t=continuousTime, v=vLeave
1125  // l=v*t + 0.5*a*t^2, solve for t and multiply with a, then add v
1126  return MIN2(link->getViaLaneOrLane()->getVehicleMaxSpeed(this),
1128  }
1129 
1130  /* @brief estimate speed while accelerating for the given distance
1131  * @param[in] dist The distance during which accelerating takes place
1132  * @param[in] v The initial speed
1133  * @param[in] accel The acceleration
1134  */
1135  inline SUMOReal estimateSpeedAfterDistance(const SUMOReal dist, const SUMOReal v, const SUMOReal accel) const {
1136  // dist=v*t + 0.5*accel*t^2, solve for t and multiply with accel, then add v
1137  return MIN2(getVehicleType().getMaxSpeed(),
1138  (SUMOReal)sqrt(2 * dist * accel + v * v));
1139  }
1140 
1141 
1142  /* @brief estimate speed while accelerating for the given distance
1143  * @param[in] leaderInfo The leading vehicle and the (virtual) distance to it
1144  * @param[in] seen the distance to the end of the current lane
1145  * @param[in] lastLink the lastLink index
1146  * @param[in] lane The current Lane the vehicle is on
1147  * @param[in,out] the safe velocity for driving
1148  * @param[in,out] the safe velocity for arriving at the next link
1149  */
1150  void adaptToLeader(const std::pair<const MSVehicle*, SUMOReal> leaderInfo,
1151  const SUMOReal seen, DriveProcessItem* const lastLink,
1152  const MSLane* const lane, SUMOReal& v, SUMOReal& vLinkPass) const;
1153 
1154 #ifdef HAVE_INTERNAL_LANES
1155 
1156  mutable std::set<std::string> myLinkLeaders;
1157 #endif
1158 
1159 private:
1160  /* @brief The vehicle's knowledge about edge efforts/travel times; @see MSEdgeWeightsStorage
1161  * @note member is initialized on first access */
1163 
1166 
1167 #ifndef NO_TRACI
1168 
1170 #endif
1171 
1172 private:
1174  MSVehicle();
1175 
1177  MSVehicle(const MSVehicle&);
1178 
1180  MSVehicle& operator=(const MSVehicle&);
1181 
1183 
1184 };
1185 
1186 
1187 #endif
1188 
1189 /****************************************************************************/
1190