Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
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>
28
29// #define DEBUG_INTERACTING
30
31
32// ===========================================================================
33// static members
34// ===========================================================================
36
37
38// ===========================================================================
39// MSPModel_Interacting method definitions
40// ===========================================================================
44
45
46void
52
53
54void
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
69bool
70MSPModel_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
107bool
109 return getPedestrians(lane).size() > 0;
110}
111
112
113bool
117
118
119bool
123
124
126MSPModel_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
174void
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}
184
185
186/****************************************************************************/
std::pair< const MSPerson *, double > PersonDist
Definition MSPModel.h:41
#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:81
Representation of a lane in the micro simulation.
Definition MSLane.h:84
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
Definition MSLane.h:950
double getWidth() const
Returns the lane's width.
Definition MSLane.h:635
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:185
bool hasPedestrianNetwork() const
return whether the network contains walkingareas and crossings
Definition MSNet.h:795
bool hasInternalLinks() const
return whether the network contains internal links
Definition MSNet.h:780
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
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.