Eclipse SUMO - Simulation of Urban MObility
MSPModel.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2014-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 /****************************************************************************/
18 // The pedestrian following model (prototype)
19 /****************************************************************************/
20 #pragma once
21 #include <config.h>
22 
23 #include <string>
24 #include <limits>
25 #include <utils/common/SUMOTime.h>
26 #include <utils/common/Command.h>
28 #include <utils/geom/GeomHelper.h>
30 #ifdef HAVE_FOX
32 #endif
33 
34 // ===========================================================================
35 // class declarations
36 // ===========================================================================
37 class MSNet;
38 class MSLane;
39 class MSJunction;
40 
41 typedef std::pair<const MSPerson*, double> PersonDist;
42 
43 // ===========================================================================
44 // class definitions
45 // ===========================================================================
51 class MSPModel {
52 public:
53 
54  virtual ~MSPModel() {};
55 
57  virtual MSTransportableStateAdapter* add(MSTransportable* transportable, MSStageMoving* stage, SUMOTime now) = 0;
58 
60  virtual MSTransportableStateAdapter* loadState(MSTransportable* transportable, MSStageMoving* stage, std::istringstream& state) {
61  UNUSED_PARAMETER(transportable);
62  UNUSED_PARAMETER(stage);
63  UNUSED_PARAMETER(state);
64  return nullptr;
65  }
66 
68  virtual void clearState() = 0;
69 
71  virtual void remove(MSTransportableStateAdapter* state) = 0;
72 
82  virtual bool blockedAtDist(const SUMOTrafficObject* ego, const MSLane* lane, double vehSide, double vehWidth,
83  double oncomingGap, std::vector<const MSPerson*>* collectBlockers) {
84  UNUSED_PARAMETER(ego);
85  UNUSED_PARAMETER(lane);
86  UNUSED_PARAMETER(vehSide);
87  UNUSED_PARAMETER(vehWidth);
88  UNUSED_PARAMETER(oncomingGap);
89  UNUSED_PARAMETER(collectBlockers);
90  return false;
91  }
92 
94  virtual bool hasPedestrians(const MSLane* lane) {
95  UNUSED_PARAMETER(lane);
96  return false;
97  }
98 
108  virtual PersonDist nextBlocking(const MSLane* lane, double minPos, double minRight, double maxLeft, double stopTime = 0, bool bidi = false) {
109  UNUSED_PARAMETER(lane);
110  UNUSED_PARAMETER(minPos);
111  UNUSED_PARAMETER(minRight);
112  UNUSED_PARAMETER(maxLeft);
113  UNUSED_PARAMETER(stopTime);
114  UNUSED_PARAMETER(bidi);
115  return PersonDist(nullptr, -1);
116  }
117 
118  // @brief walking directions
119  static const int FORWARD;
120  static const int BACKWARD;
121  static const int UNDEFINED_DIRECTION;
122 
123  // @brief the safety gap to keep between the car and the pedestrian in all directions
124  static const double SAFETY_GAP;
125 
127  static const double SIDEWALK_OFFSET;
128 
130  static const double UNSPECIFIED_POS_LAT;
131 
133  static const double RANDOM_POS_LAT;
134 
135  /* @brief return the arrival direction if the route may be traversed with the given starting direction.
136  * param[out] passedEdges: the number of edges that were successfully traversed
137  * returns UNDEFINED_DIRECTION if the route cannot be traversed
138  */
139  static int canTraverse(int dir, const ConstMSEdgeVector& route, int& passedEdges);
140 
142  virtual bool usingInternalLanes() = 0;
143 
145  virtual bool usingShortcuts() {
146  return false;
147  }
148 
150  virtual int getActiveNumber() = 0;
151 
152 };
153 
154 
157 public:
159 
161  virtual double getEdgePos(const MSStageMoving& stage, SUMOTime now) const = 0;
162 
164  virtual int getDirection(const MSStageMoving& stage, SUMOTime now) const = 0;
165 
167  virtual Position getPosition(const MSStageMoving& stage, SUMOTime now) const = 0;
168 
170  virtual double getAngle(const MSStageMoving& stage, SUMOTime now) const = 0;
171 
173  virtual SUMOTime getWaitingTime(const MSStageMoving& stage, SUMOTime now) const = 0;
174 
176  virtual double getSpeed(const MSStageMoving& stage) const = 0;
177 
179  virtual const MSEdge* getNextEdge(const MSStageMoving& stage) const = 0;
180 
182  virtual void moveTo(MSPerson* p, MSLane* lane, double lanePos, double lanePosLat, SUMOTime t) {
183  UNUSED_PARAMETER(p);
184  UNUSED_PARAMETER(lane);
185  UNUSED_PARAMETER(lanePos);
186  UNUSED_PARAMETER(lanePosLat);
187  UNUSED_PARAMETER(t);
188  WRITE_WARNING(TL("moveTo is ignored by the current movement model"));
189  }
190 
192  virtual void moveToXY(MSPerson* p, Position pos, MSLane* lane, double lanePos,
193  double lanePosLat, double angle, int routeOffset,
194  const ConstMSEdgeVector& edges, SUMOTime t) {
195  UNUSED_PARAMETER(p);
196  UNUSED_PARAMETER(pos);
197  UNUSED_PARAMETER(lane);
198  UNUSED_PARAMETER(lanePos);
199  UNUSED_PARAMETER(lanePosLat);
200  UNUSED_PARAMETER(angle);
201  UNUSED_PARAMETER(routeOffset);
202  UNUSED_PARAMETER(edges);
203  UNUSED_PARAMETER(t);
204  WRITE_WARNING(TL("moveToXY is ignored by the current movement model"));
205  }
206 
208  virtual bool isJammed() const {
209  return false;
210  }
211 
213  virtual bool isFinished() const {
214  return true;
215  }
216 
218  virtual const MSLane* getLane() const {
219  return nullptr;
220  }
221 
223  virtual double getPathLength() const {
224  return 0;
225  }
226 
229  virtual void saveState(std::ostringstream& out) {
230  UNUSED_PARAMETER(out);
231  }
232 
233 };
long long int SUMOTime
Definition: GUI.h:35
std::vector< const MSEdge * > ConstMSEdgeVector
Definition: MSEdge.h:74
std::pair< const MSPerson *, double > PersonDist
Definition: MSPModel.h:39
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:295
#define TL(string)
Definition: MsgHandler.h:315
#define UNUSED_PARAMETER(x)
Definition: StdDefs.h:30
A road/street connecting two junctions.
Definition: MSEdge.h:77
The base class for an intersection.
Definition: MSJunction.h:58
Representation of a lane in the micro simulation.
Definition: MSLane.h:84
The simulated network and simulation perfomer.
Definition: MSNet.h:89
The pedestrian (and also sometimes container) movement model.
Definition: MSPModel.h:51
static const int BACKWARD
Definition: MSPModel.h:120
static int canTraverse(int dir, const ConstMSEdgeVector &route, int &passedEdges)
Definition: MSPModel.cpp:54
virtual int getActiveNumber()=0
return the number of active objects
virtual void clearState()=0
Resets pedestrians when quick-loading state.
static const int FORWARD
Definition: MSPModel.h:119
virtual bool blockedAtDist(const SUMOTrafficObject *ego, const MSLane *lane, double vehSide, double vehWidth, double oncomingGap, std::vector< const MSPerson * > *collectBlockers)
whether a pedestrian is blocking the crossing of lane for the given vehicle bondaries
Definition: MSPModel.h:82
virtual MSTransportableStateAdapter * loadState(MSTransportable *transportable, MSStageMoving *stage, std::istringstream &state)
load the state of the given transportable
Definition: MSPModel.h:60
virtual PersonDist nextBlocking(const MSLane *lane, double minPos, double minRight, double maxLeft, double stopTime=0, bool bidi=false)
returns the next pedestrian beyond minPos that is laterally between minRight and maxLeft or 0
Definition: MSPModel.h:108
static const double RANDOM_POS_LAT
magic value to encode randomized lateral offset for persons when starting a walk
Definition: MSPModel.h:133
static const double SIDEWALK_OFFSET
the offset for computing person positions when walking on edges without a sidewalk
Definition: MSPModel.h:127
virtual bool usingInternalLanes()=0
whether movements on intersections are modelled
virtual void remove(MSTransportableStateAdapter *state)=0
remove the specified person from the pedestrian simulation
virtual ~MSPModel()
Definition: MSPModel.h:54
virtual MSTransportableStateAdapter * add(MSTransportable *transportable, MSStageMoving *stage, SUMOTime now)=0
register the given person as a pedestrian
static const int UNDEFINED_DIRECTION
Definition: MSPModel.h:121
virtual bool usingShortcuts()
whether travel times and distances can reliably be calculated from the network alone
Definition: MSPModel.h:145
virtual bool hasPedestrians(const MSLane *lane)
whether the given lane has pedestrians on it
Definition: MSPModel.h:94
static const double UNSPECIFIED_POS_LAT
the default lateral offset for persons when starting a walk
Definition: MSPModel.h:130
static const double SAFETY_GAP
Definition: MSPModel.h:124
abstract base class for managing callbacks to retrieve various state information from the model
Definition: MSPModel.h:156
virtual double getSpeed(const MSStageMoving &stage) const =0
return the current speed of the transportable
virtual int getDirection(const MSStageMoving &stage, SUMOTime now) const =0
return the walking direction (FORWARD, BACKWARD)
virtual void moveToXY(MSPerson *p, Position pos, MSLane *lane, double lanePos, double lanePosLat, double angle, int routeOffset, const ConstMSEdgeVector &edges, SUMOTime t)
try to move transportable to the given position
Definition: MSPModel.h:192
virtual Position getPosition(const MSStageMoving &stage, SUMOTime now) const =0
return the network coordinate of the transportable
virtual const MSEdge * getNextEdge(const MSStageMoving &stage) const =0
return the list of internal edges if the transportable is on an intersection
virtual bool isJammed() const
whether the transportable is jammed
Definition: MSPModel.h:208
virtual ~MSTransportableStateAdapter()
Definition: MSPModel.h:158
virtual SUMOTime getWaitingTime(const MSStageMoving &stage, SUMOTime now) const =0
return the time the transportable spent standing
virtual void moveTo(MSPerson *p, MSLane *lane, double lanePos, double lanePosLat, SUMOTime t)
try to move transportable to the given position
Definition: MSPModel.h:182
virtual bool isFinished() const
whether the transportable has finished walking
Definition: MSPModel.h:213
virtual double getEdgePos(const MSStageMoving &stage, SUMOTime now) const =0
return the offset from the start of the current edge measured in its natural direction
virtual const MSLane * getLane() const
the current lane of the transportable
Definition: MSPModel.h:218
virtual double getAngle(const MSStageMoving &stage, SUMOTime now) const =0
return the direction in which the transportable faces in degrees
virtual void saveState(std::ostringstream &out)
Saves the current state into the given stream.
Definition: MSPModel.h:229
virtual double getPathLength() const
return the total length of the current lane (in particular for on a walkingarea)
Definition: MSPModel.h:223
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
Representation of a vehicle, person, or container.