Line data Source code
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 : /****************************************************************************/
14 : /// @file MSPModel_Interacting.cpp
15 : /// @author Jakob Erdmann
16 : /// @author Michael Behrisch
17 : /// @date Mon, 13 Jan 2014
18 : ///
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 : // ===========================================================================
35 : MSPModel_Interacting::Pedestrians MSPModel_Interacting::noPedestrians;
36 :
37 :
38 : // ===========================================================================
39 : // MSPModel_Interacting method definitions
40 : // ===========================================================================
41 5104 : MSPModel_Interacting::~MSPModel_Interacting() {
42 5104 : clearState();
43 5104 : }
44 :
45 :
46 : void
47 10233 : MSPModel_Interacting::clearState() {
48 : myActiveLanes.clear();
49 10233 : myNumActivePedestrians = 0;
50 10233 : myAmActive = false;
51 10233 : }
52 :
53 :
54 : void
55 1464 : MSPModel_Interacting::remove(MSTransportableStateAdapter* state) {
56 1464 : Pedestrians& pedestrians = myActiveLanes[state->getLane()];
57 1464 : MSPModel_InteractingState* const p = static_cast<MSPModel_InteractingState*>(state);
58 1464 : const auto& it = std::find(pedestrians.begin(), pedestrians.end(), p);
59 1464 : if (it != pedestrians.end()) {
60 1464 : if (p->getNextCrossing() != nullptr) {
61 26 : unregisterCrossingApproach(*p, p->getNextCrossing());
62 : }
63 : pedestrians.erase(it);
64 1464 : myNumActivePedestrians--;
65 : }
66 1464 : }
67 :
68 :
69 : bool
70 4084035 : MSPModel_Interacting::blockedAtDist(const SUMOTrafficObject* ego, const MSLane* lane, double vehSide, double vehWidth,
71 : double oncomingGap, std::vector<const MSPerson*>* collectBlockers) {
72 4153832 : for (const MSPModel_InteractingState* ped : getPedestrians(lane)) {
73 662993 : const double leaderFrontDist = (ped->getDirection() == FORWARD ? vehSide - ped->getEdgePos(0) : ped->getEdgePos(0) - vehSide);
74 662993 : 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 662993 : if (leaderBackDist >= -vehWidth
86 662993 : && (leaderFrontDist < 0
87 : // give right of way to (close) approaching pedestrians unless they are standing
88 288712 : || (leaderFrontDist <= oncomingGap && ped->getWaitingTime() < TIME2STEPS(2.0)))) {
89 593226 : if (MSLink::ignoreFoe(ego, ped->getPerson())) {
90 30 : 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 593196 : if (collectBlockers == nullptr) {
95 : return true;
96 : }
97 0 : collectBlockers->push_back(ped->getPerson());
98 : }
99 : }
100 3490839 : if (collectBlockers == nullptr) {
101 : return false;
102 : }
103 0 : return collectBlockers->size() > 0;
104 : }
105 :
106 :
107 : bool
108 4794395 : MSPModel_Interacting::hasPedestrians(const MSLane* lane) {
109 4794395 : return getPedestrians(lane).size() > 0;
110 : }
111 :
112 :
113 : bool
114 121881 : MSPModel_Interacting::usingInternalLanes() {
115 121881 : return usingInternalLanesStatic();
116 : }
117 :
118 :
119 : bool
120 130320 : MSPModel_Interacting::usingInternalLanesStatic() {
121 130320 : return MSGlobals::gUsingInternalLanes && MSNet::getInstance()->hasInternalLinks() && MSNet::getInstance()->hasPedestrianNetwork();
122 : }
123 :
124 :
125 : PersonDist
126 683320 : 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 3902199 : for (const MSPModel_InteractingState* ped : getPedestrians(lane)) {
129 : // account for distance covered by oncoming pedestrians
130 3218879 : double relX2 = ped->getEdgePos(0) - (ped->getDirection() == FORWARD ? 0 : stopTime * ped->getPerson()->getMaxSpeed());
131 3218879 : double dist = ((relX2 - minPos) * (bidi ? -1 : 1)
132 3218879 : - (ped->getDirection() == FORWARD ? ped->getPerson()->getVehicleType().getLength() : 0));
133 3218879 : const bool aheadOfVehicle = bidi ? ped->getEdgePos(0) < minPos : ped->getEdgePos(0) > minPos;
134 3218879 : if (aheadOfVehicle && dist < result.second) {
135 1381894 : const double center = ped->getLatOffset() + 0.5 * lane->getWidth();
136 1381894 : const double halfWidth = 0.5 * ped->getPerson()->getVehicleType().getWidth();
137 1381894 : 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 683320 : return result;
160 : }
161 :
162 :
163 : MSPModel_Interacting::Pedestrians&
164 11758258 : MSPModel_Interacting::getPedestrians(const MSLane* lane) {
165 : ActiveLanes::iterator it = myActiveLanes.find(lane);
166 11758258 : if (it != myActiveLanes.end()) {
167 : //std::cout << " found lane=" << lane->getID() << " n=" << it->second.size() << "\n";
168 5254753 : return (it->second);
169 : }
170 : return noPedestrians;
171 : }
172 :
173 :
174 : void
175 30770 : MSPModel_Interacting::unregisterCrossingApproach(const MSPModel_InteractingState& ped, const MSLane* crossing) {
176 : // person has entered the crossing
177 30770 : 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 30770 : }
184 :
185 :
186 : /****************************************************************************/
|