Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
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// ===========================================================================
34template<class E, class L, class N, class V>
35class PedestrianEdge : public IntermodalEdge<E, L, N, V> {
36public:
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
113private:
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