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#define DEBUGCOND(PED) ((PED)->getPerson()->isSelected())
32
33// ===========================================================================
34// static members
35// ===========================================================================
37
38
39// ===========================================================================
40// MSPModel_Interacting method definitions
41// ===========================================================================
45
46
47void
53
54
55void
57 Pedestrians& pedestrians = myActiveLanes[state->getLane()];
58 MSPModel_InteractingState* const p = static_cast<MSPModel_InteractingState*>(state);
59 const auto& it = std::find(pedestrians.begin(), pedestrians.end(), p);
60 if (it != pedestrians.end()) {
61 if (p->getNextCrossing() != nullptr) {
63 }
64 pedestrians.erase(it);
66 }
67}
68
69
70bool
71MSPModel_Interacting::blockedAtDist(const SUMOTrafficObject* ego, const MSLane* lane, double vehCenter, double vehWidth,
72 double oncomingGap, std::vector<const MSPerson*>* collectBlockers) {
73 for (const MSPModel_InteractingState* ped : getPedestrians(lane)) {
74 const double leaderFrontDist = (ped->getDirection() == FORWARD ? vehCenter - ped->getEdgePos(0) : ped->getEdgePos(0) - vehCenter) - vehWidth * 0.5;
75 const double leaderBackDist = leaderFrontDist + ped->getPerson()->getVehicleType().getLength();
76#ifdef DEBUG_INTERACTING
77 if DEBUGCOND(ped) {
78 std::cout << SIMTIME << " lane=" << lane->getID() << " dir=" << ped->getDirection() << " pX=" << ped->getEdgePos(0) << " pL=" << ped->getPerson()->getVehicleType().getLength()
79 << " vehCenter=" << vehCenter
80 << " vehWidth=" << vehWidth
81 << " lBD=" << leaderBackDist
82 << " lFD=" << leaderFrontDist
83 << "\n";
84 }
85#endif
86 if (leaderBackDist >= -vehWidth
87 && (leaderFrontDist < 0
88 // give right of way to (close) approaching pedestrians unless they are standing
89 || (leaderFrontDist <= oncomingGap && ped->getWaitingTime() < TIME2STEPS(2.0)))) {
90 if (MSLink::ignoreFoe(ego, ped->getPerson())) {
91 continue;
92 }
93 // found one pedestrian that is not completely past the crossing point
94 //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";
95 if (collectBlockers == nullptr) {
96 return true;
97 }
98 collectBlockers->push_back(ped->getPerson());
99 }
100 }
101 if (collectBlockers == nullptr) {
102 return false;
103 }
104 return collectBlockers->size() > 0;
105}
106
107
108bool
110 return getPedestrians(lane).size() > 0;
111}
112
113
114bool
118
119
120bool
124
125
127MSPModel_Interacting::nextBlocking(const MSLane* lane, double minPos, double minRight, double maxLeft, double stopTime, bool bidi) {
128 PersonDist result((const MSPerson*)nullptr, std::numeric_limits<double>::max());
129 for (const MSPModel_InteractingState* ped : getPedestrians(lane)) {
130 // account for distance covered by oncoming pedestrians
131 double relX2 = ped->getEdgePos(0) - (ped->getDirection() == FORWARD ? 0 : stopTime * ped->getPerson()->getMaxSpeed());
132 double dist = ((relX2 - minPos) * (bidi ? -1 : 1)
133 - (ped->getDirection() == FORWARD ? ped->getPerson()->getVehicleType().getLength() : 0));
134 const bool aheadOfVehicle = bidi ? ped->getEdgePos(0) < minPos : ped->getEdgePos(0) > minPos;
135 if (aheadOfVehicle && dist < result.second) {
136 const double center = ped->getLatOffset() + 0.5 * lane->getWidth();
137 const double halfWidth = 0.5 * ped->getPerson()->getVehicleType().getWidth();
138 const bool overlap = (center + halfWidth > minRight && center - halfWidth < maxLeft);
139#ifdef DEBUG_INTERACTING
140 if DEBUGCOND(ped) {
141 std::cout << " nextBlocking lane=" << lane->getID() << " bidi=" << bidi
142 << " minPos=" << minPos << " minRight=" << minRight << " maxLeft=" << maxLeft
143 << " stopTime=" << stopTime
144 << " ped=" << ped->getID()
145 << " pedX=" << ped->getEdgePos(0)
146 << " relX2=" << relX2
147 << " center=" << center
148 << " pedLeft=" << center + halfWidth
149 << " pedRight=" << center - halfWidth
150 << " overlap=" << overlap
151 << "\n";
152 }
153#endif
154 if (overlap) {
155 result.first = ped->getPerson();
156 result.second = dist;
157 }
158 }
159 }
160 return result;
161}
162
163
166 ActiveLanes::iterator it = myActiveLanes.find(lane);
167 if (it != myActiveLanes.end()) {
168 //std::cout << " found lane=" << lane->getID() << " n=" << it->second.size() << "\n";
169 return (it->second);
170 }
171 return noPedestrians;
172}
173
174
175void
177 // person has entered the crossing
178 crossing->getIncomingLanes()[0].viaLink->removeApproachingPerson(ped.getPerson());
179#ifdef DEBUG_INTERACTING
180 if DEBUGCOND(&ped) {
181 std::cout << SIMTIME << " unregister " << ped.getPerson()->getID() << " at crossing " << crossing->getID() << "\n";
182 }
183#endif
184}
185
186
187/****************************************************************************/
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:186
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
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 blockedAtDist(const SUMOTrafficObject *ego, const MSLane *lane, double vehCenter, double vehWidth, double oncomingGap, std::vector< const MSPerson * > *collectBlockers)
whether a pedestrian is blocking the crossing of lane for the given vehicle bondaries
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.