Eclipse SUMO - Simulation of Urban MObility
PedestrianEdge.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2001-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 /****************************************************************************/
20 // The pedestrian accessible edges for the Intermodal Router
21 /****************************************************************************/
22 #pragma once
23 #include <config.h>
24 
25 #define TL_RED_PENALTY 20
26 
27 //#define IntermodalRouter_DEBUG_EFFORTS
28 
29 
30 // ===========================================================================
31 // class definitions
32 // ===========================================================================
34 template<class E, class L, class N, class V>
35 class PedestrianEdge : public IntermodalEdge<E, L, N, V> {
36 public:
37  PedestrianEdge(int numericalID, const E* edge, const L* lane, bool forward, const double pos = -1.) :
38  IntermodalEdge<E, L, N, V>(edge->getID() + (edge->isWalkingArea() ? "" : (forward ? "_fwd" : "_bwd")) + toString(pos), numericalID, edge, "!ped"),
39  myLane(lane),
40  myForward(forward),
41  myStartPos(pos >= 0 ? pos : (forward ? 0. : edge->getLength())),
42  myIsOpposite(false) {
43  if (!forward && (
44  edge->getFunction() == SumoXMLEdgeFunc::NORMAL
45  || edge->getFunction() == SumoXMLEdgeFunc::INTERNAL)) {
46  const L* sidewalk = getSidewalk<E, L>(edge);
47  if (sidewalk != nullptr && sidewalk->getPermissions() != SVC_PEDESTRIAN) {
48  // some non-pedestrian traffic is allowed
49  myIsOpposite = true;
50  }
51  }
52  }
53 
54  bool includeInRoute(bool allEdges) const {
55  return allEdges || (!this->getEdge()->isCrossing() && !this->getEdge()->isWalkingArea() && !this->getEdge()->isInternal());
56  }
57 
58  bool prohibits(const IntermodalTrip<E, N, V>* const trip) const {
59  if (trip->node == 0) {
60  // network only includes IntermodalEdges
61  return false;
62  } else {
63  // limit routing to the surroundings of the specified node
64  return (this->getEdge()->getFromJunction() != trip->node
65  && this->getEdge()->getToJunction() != trip->node);
66  }
67  }
68 
69  double getPartialLength(const IntermodalTrip<E, N, V>* const trip) const {
70  double length = this->getLength();
71  if (this->getEdge() == trip->from && !myForward && trip->departPos < myStartPos) {
72  length = trip->departPos - (myStartPos - this->getLength());
73  }
74  if (this->getEdge() == trip->to && myForward && trip->arrivalPos < myStartPos + this->getLength()) {
75  length = trip->arrivalPos - myStartPos;
76  }
77  if (this->getEdge() == trip->from && myForward && trip->departPos > myStartPos) {
78  length -= (trip->departPos - myStartPos);
79  }
80  if (this->getEdge() == trip->to && !myForward && trip->arrivalPos > myStartPos - this->getLength()) {
81  length -= (trip->arrivalPos - (myStartPos - this->getLength()));
82  }
83  // ensure that 'normal' edges always have a higher weight than connector edges
84  length = MAX2(length, NUMERICAL_EPS);
85  return length;
86  }
87 
88  double getTravelTime(const IntermodalTrip<E, N, V>* const trip, double time) const {
89  const double length = getPartialLength(trip);
90  double tlsDelay = 0;
91  // @note pedestrian traffic lights should never have LINKSTATE_TL_REDYELLOW
92  if (this->getEdge()->isCrossing() && myLane->getIncomingLinkState() == LINKSTATE_TL_RED) {
93  // red traffic lights occurring later in the route may be green by the time we arrive
94  tlsDelay += MAX2(double(0), TL_RED_PENALTY - (time - STEPS2TIME(trip->departTime)));
95  }
96  if (this->getEdge()->isCrossing()) {
97  tlsDelay += this->getEdge()->getTimePenalty();
98  }
99 #ifdef IntermodalRouter_DEBUG_EFFORTS
100  std::cout << " effort for " << trip->getID() << " at " << time << " edge=" << this->getID() << " effort=" << length / trip->speed + tlsDelay << " l=" << length << " fullLength=" << this->getLength() << " s=" << trip->speed << " tlsDelay=" << tlsDelay << "\n";
101 #endif
102  return length / (trip->speed * (myIsOpposite ? gWeightsWalkOppositeFactor : 1)) + tlsDelay;
103  }
104 
105  double getStartPos() const {
106  return myStartPos;
107  }
108 
109  double getEndPos() const {
110  return myForward ? myStartPos + this->getLength() : myStartPos - this->getLength();
111  }
112 
113 private:
115  const L* myLane;
116 
118  const bool myForward;
119 
121  const double myStartPos;
122 
125 
126 };
#define TL_RED_PENALTY
#define STEPS2TIME(x)
Definition: SUMOTime.h:55
@ SVC_PEDESTRIAN
pedestrian
@ LINKSTATE_TL_RED
The link has red light (must brake)
double gWeightsWalkOppositeFactor
Definition: StdDefs.cpp:33
T MAX2(T a, T b)
Definition: StdDefs.h:82
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
the base edge type that is given to the internal router (SUMOAbstractRouter)
const E * getEdge() const
double getLength() const
required by DijkstraRouter et al for external effort computation
the "vehicle" type that is given to the internal router (SUMOAbstractRouter)
std::string getID() const
const E *const to
const double departPos
const E *const from
const double arrivalPos
const SUMOTime departTime
const double speed
const N *const node
const std::string & getID() const
Returns the id.
Definition: Named.h:74
the pedestrian edge type that is given to the internal router (SUMOAbstractRouter)
PedestrianEdge(int numericalID, const E *edge, const L *lane, bool forward, const double pos=-1.)
double getEndPos() const
const bool myForward
the direction of this edge
const L * myLane
the original edge
double getPartialLength(const IntermodalTrip< E, N, V > *const trip) const
const double myStartPos
the starting position for split edges
bool includeInRoute(bool allEdges) const
double getStartPos() const
double getTravelTime(const IntermodalTrip< E, N, V > *const trip, double time) const
bool myIsOpposite
whether this edge goes against the flow of traffic
bool prohibits(const IntermodalTrip< E, N, V > *const trip) const