Eclipse SUMO - Simulation of Urban MObility
MSPModel_Interacting.cpp
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 /****************************************************************************/
19 // The pedestrian following model (prototype)
20 /****************************************************************************/
21 #include <config.h>
22 
23 #include <microsim/MSGlobals.h>
24 #include <microsim/MSLane.h>
25 #include <microsim/MSLink.h>
26 #include <microsim/MSNet.h>
27 #include "MSPModel_Interacting.h"
28 
29 // #define DEBUG_INTERACTING
30 
31 
32 // ===========================================================================
33 // static members
34 // ===========================================================================
36 
37 
38 // ===========================================================================
39 // MSPModel_Interacting method definitions
40 // ===========================================================================
42  clearState();
43 }
44 
45 
46 void
48  myActiveLanes.clear();
50  myAmActive = false;
51 }
52 
53 
54 void
56  Pedestrians& pedestrians = myActiveLanes[state->getLane()];
57  MSPModel_InteractingState* const p = static_cast<MSPModel_InteractingState*>(state);
58  const auto& it = std::find(pedestrians.begin(), pedestrians.end(), p);
59  if (it != pedestrians.end()) {
60  if (p->getNextCrossing() != nullptr) {
62  }
63  pedestrians.erase(it);
65  }
66 }
67 
68 
69 bool
70 MSPModel_Interacting::blockedAtDist(const SUMOTrafficObject* ego, const MSLane* lane, double vehSide, double vehWidth,
71  double oncomingGap, std::vector<const MSPerson*>* collectBlockers) {
72  for (const MSPModel_InteractingState* ped : getPedestrians(lane)) {
73  const double leaderFrontDist = (ped->getDirection() == FORWARD ? vehSide - ped->getEdgePos(0) : ped->getEdgePos(0) - vehSide);
74  const double leaderBackDist = leaderFrontDist + ped->getPerson()->getVehicleType().getLength();
75 #ifdef DEBUG_INTERACTING
76  if DEBUGCOND(ped) {
77  std::cout << SIMTIME << " lane=" << lane->getID() << " dir=" << ped->getDirection() << " pX=" << ped->getEdgePos(0) << " pL=" << ped.getLength()
78  << " vehSide=" << vehSide
79  << " vehWidth=" << vehWidth
80  << " lBD=" << leaderBackDist
81  << " lFD=" << leaderFrontDist
82  << "\n";
83  }
84 #endif
85  if (leaderBackDist >= -vehWidth
86  && (leaderFrontDist < 0
87  // give right of way to (close) approaching pedestrians unless they are standing
88  || (leaderFrontDist <= oncomingGap && ped->getWaitingTime() < TIME2STEPS(2.0)))) {
89  if (MSLink::ignoreFoe(ego, ped->getPerson())) {
90  continue;
91  }
92  // found one pedestrian that is not completely past the crossing point
93  //std::cout << SIMTIME << " blocking pedestrian foeLane=" << lane->getID() << " ped=" << ped->getPerson()->getID() << " dir=" << ped->getDirection() << " pX=" << ped->getEdgePos(0) << " pL=" << ped.getLength() << " fDTC=" << distToCrossing << " lBD=" << leaderBackDist << "\n";
94  if (collectBlockers == nullptr) {
95  return true;
96  }
97  collectBlockers->push_back(ped->getPerson());
98  }
99  }
100  if (collectBlockers == nullptr) {
101  return false;
102  }
103  return collectBlockers->size() > 0;
104 }
105 
106 
107 bool
109  return getPedestrians(lane).size() > 0;
110 }
111 
112 
113 bool
115  return usingInternalLanesStatic();
116 }
117 
118 
119 bool
122 }
123 
124 
126 MSPModel_Interacting::nextBlocking(const MSLane* lane, double minPos, double minRight, double maxLeft, double stopTime, bool bidi) {
127  PersonDist result((const MSPerson*)nullptr, std::numeric_limits<double>::max());
128  for (const MSPModel_InteractingState* ped : getPedestrians(lane)) {
129  // account for distance covered by oncoming pedestrians
130  double relX2 = ped->getEdgePos(0) - (ped->getDirection() == FORWARD ? 0 : stopTime * ped->getPerson()->getMaxSpeed());
131  double dist = ((relX2 - minPos) * (bidi ? -1 : 1)
132  - (ped->getDirection() == FORWARD ? ped->getPerson()->getVehicleType().getLength() : 0));
133  const bool aheadOfVehicle = bidi ? ped->getEdgePos(0) < minPos : ped->getEdgePos(0) > minPos;
134  if (aheadOfVehicle && dist < result.second) {
135  const double center = ped->getLatOffset() + 0.5 * lane->getWidth();
136  const double halfWidth = 0.5 * ped->getPerson()->getVehicleType().getWidth();
137  const bool overlap = (center + halfWidth > minRight && center - halfWidth < maxLeft);
138 #ifdef DEBUG_INTERACTING
139  if DEBUGCOND(ped) {
140  std::cout << " nextBlocking lane=" << lane->getID() << " bidi=" << bidi
141  << " minPos=" << minPos << " minRight=" << minRight << " maxLeft=" << maxLeft
142  << " stopTime=" << stopTime
143  << " pedY=" << ped->getPosLat()
144  << " pedX=" << ped->getEdgePos(0)
145  << " relX2=" << relX2
146  << " center=" << center
147  << " pedLeft=" << center + halfWidth
148  << " pedRight=" << center - halfWidth
149  << " overlap=" << overlap
150  << "\n";
151  }
152 #endif
153  if (overlap) {
154  result.first = ped->getPerson();
155  result.second = dist;
156  }
157  }
158  }
159  return result;
160 }
161 
162 
165  ActiveLanes::iterator it = myActiveLanes.find(lane);
166  if (it != myActiveLanes.end()) {
167  //std::cout << " found lane=" << lane->getID() << " n=" << it->second.size() << "\n";
168  return (it->second);
169  }
170  return noPedestrians;
171 }
172 
173 
174 void
176  // person has entered the crossing
177  crossing->getIncomingLanes()[0].viaLink->removeApproachingPerson(ped.getPerson());
178 #ifdef DEBUG_INTERACTING
179  if DEBUGCOND(ped) {
180  std::cout << SIMTIME << " unregister " << ped->getPerson()->getID() << " at crossing " << crossing->getID() << "\n";
181  }
182 #endif
183 }
std::pair< const MSPerson *, double > PersonDist
Definition: MSPModel.h:39
#define DEBUGCOND(PED)
#define SIMTIME
Definition: SUMOTime.h:62
#define TIME2STEPS(x)
Definition: SUMOTime.h:57
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
Definition: MSGlobals.h:78
Representation of a lane in the micro simulation.
Definition: MSLane.h:84
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
Definition: MSLane.h:942
double getWidth() const
Returns the lane's width.
Definition: MSLane.h:627
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:183
bool hasPedestrianNetwork() const
return whether the network contains walkingareas and crossings
Definition: MSNet.h:789
bool hasInternalLinks() const
return whether the network contains internal links
Definition: MSNet.h:774
std::vector< MSPModel_InteractingState * > Pedestrians
bool usingInternalLanes()
whether movements on intersections are modelled /
Pedestrians & getPedestrians(const MSLane *lane)
retrieves the pedestrian vector for the given lane (may be empty)
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 nullptr
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
ActiveLanes myActiveLanes
store of all lanes which have pedestrians on them
bool myAmActive
whether an event for pedestrian processing was added
static Pedestrians noPedestrians
empty pedestrian vector
static bool usingInternalLanesStatic()
int myNumActivePedestrians
the total number of active pedestrians
virtual void remove(MSTransportableStateAdapter *state)
remove the specified person from the pedestrian simulation
bool hasPedestrians(const MSLane *lane)
whether the given lane has pedestrians on it
virtual void clearState()
Resets pedestrians when quick-loading state.
static void unregisterCrossingApproach(const MSPModel_InteractingState &ped, const MSLane *crossing)
unregister pedestrian approach with the junction model
Container for pedestrian state and individual position update function.
virtual const MSLane * getNextCrossing() const
placeholder function for the accessing the next crossing
MSPerson * getPerson() const
return the represented person
static const int FORWARD
Definition: MSPModel.h:54
abstract base class for managing callbacks to retrieve various state information from the model
Definition: MSPModel.h:154
virtual const MSLane * getLane() const
the current lane of the transportable
Definition: MSPModel.h:216
const std::string & getID() const
Returns the id.
Definition: Named.h:74
Representation of a vehicle, person, or container.