1 package org.opentrafficsim.road.gtu.lane.tactical.util;
2
3 import static org.opentrafficsim.core.gtu.behavioralcharacteristics.AbstractParameterType.Check.POSITIVE;
4
5 import java.util.Set;
6 import java.util.SortedMap;
7 import java.util.TreeMap;
8
9 import org.djunits.unit.AccelerationUnit;
10 import org.djunits.value.vdouble.scalar.Acceleration;
11 import org.djunits.value.vdouble.scalar.Length;
12 import org.djunits.value.vdouble.scalar.Speed;
13 import org.opentrafficsim.core.gtu.behavioralcharacteristics.BehavioralCharacteristics;
14 import org.opentrafficsim.core.gtu.behavioralcharacteristics.ParameterException;
15 import org.opentrafficsim.core.gtu.behavioralcharacteristics.ParameterTypeAcceleration;
16 import org.opentrafficsim.core.gtu.behavioralcharacteristics.ParameterTypes;
17 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayTrafficLight;
18 import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
19 import org.opentrafficsim.road.network.lane.object.trafficlight.TrafficLightColor;
20 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
21
22 import nl.tudelft.simulation.language.Throw;
23
24
25
26
27
28
29
30
31
32
33 public final class TrafficLightUtil
34 {
35
36 public static final ParameterTypeAcceleration B_YELLOW = new ParameterTypeAcceleration("bYellow",
37 "Maximum deceleration for stopping for yellow traffic light.", new Acceleration(3.5, AccelerationUnit.SI), POSITIVE);
38
39
40
41
42 private TrafficLightUtil()
43 {
44
45 }
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 public static Acceleration respondToTrafficLights(final BehavioralCharacteristics behavioralCharacteristics,
66 final Set<HeadwayTrafficLight> headwayTrafficLights, final CarFollowingModel carFollowingModel, final Speed speed,
67 final SpeedLimitInfo speedLimitInfo) throws ParameterException
68 {
69 Throw.whenNull(headwayTrafficLights, "Traffic light set may not be null.");
70 Acceleration a = new Acceleration(Double.POSITIVE_INFINITY, AccelerationUnit.SI);
71 for (HeadwayTrafficLight headwayTrafficLight : headwayTrafficLights)
72 {
73 Acceleration aLight =
74 respondToTrafficLight(behavioralCharacteristics, headwayTrafficLight, carFollowingModel, speed,
75 speedLimitInfo);
76 a = Acceleration.min(a, aLight);
77 }
78 return a;
79 }
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 public static Acceleration respondToTrafficLight(final BehavioralCharacteristics behavioralCharacteristics,
99 final HeadwayTrafficLight headwayTrafficLight, final CarFollowingModel carFollowingModel, final Speed speed,
100 final SpeedLimitInfo speedLimitInfo) throws ParameterException
101 {
102 Throw.whenNull(behavioralCharacteristics, "Behavioral characteristics may not be null.");
103 Throw.whenNull(headwayTrafficLight, "Traffic light may not be null.");
104 Throw.whenNull(carFollowingModel, "Car-following model may not be null.");
105 Throw.whenNull(speed, "Speed may not be null.");
106 Throw.whenNull(speedLimitInfo, "Speed limit info may not be null.");
107 Throw.when(!headwayTrafficLight.isAhead(), IllegalArgumentException.class, "Traffic light must be downstream.");
108 if (headwayTrafficLight.getTrafficLightColor().isRed()
109 || headwayTrafficLight.getTrafficLightColor().isYellow())
110 {
111
112 SortedMap<Length, Speed> leaders = new TreeMap<>();
113 leaders.put(headwayTrafficLight.getDistance(), Speed.ZERO);
114 Acceleration a =
115 carFollowingModel.followingAcceleration(behavioralCharacteristics, speed, speedLimitInfo, leaders);
116
117 Length s0 = behavioralCharacteristics.getParameter(ParameterTypes.S0);
118 if (headwayTrafficLight.getDistance().gt(s0))
119 {
120
121 Acceleration aConstant =
122 new Acceleration(-0.5 * speed.si * speed.si / (headwayTrafficLight.getDistance().si - s0.si),
123 AccelerationUnit.SI);
124 a = Acceleration.max(a, aConstant);
125 }
126
127 if (a.gt(behavioralCharacteristics.getParameter(B_YELLOW).neg()))
128 {
129 return a;
130 }
131 }
132
133 return new Acceleration(Double.POSITIVE_INFINITY, AccelerationUnit.SI);
134 }
135
136 }