1 package org.opentrafficsim.road.gtu.lane.tactical.following;
2
3 import java.io.Serializable;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.Set;
7
8 import org.djunits.unit.TimeUnit;
9 import org.djunits.value.vdouble.scalar.Acceleration;
10 import org.djunits.value.vdouble.scalar.Duration;
11 import org.djunits.value.vdouble.scalar.Length;
12 import org.djunits.value.vdouble.scalar.Speed;
13 import org.djunits.value.vdouble.scalar.Time;
14 import org.opentrafficsim.base.parameters.ParameterException;
15 import org.opentrafficsim.base.parameters.Parameters;
16 import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
17 import org.opentrafficsim.road.gtu.lane.perception.PerceptionIterable;
18 import org.opentrafficsim.road.gtu.lane.perception.headway.Headway;
19 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public class SequentialFixedAccelerationModel extends AbstractGTUFollowingModelMobil implements Serializable
34 {
35
36 private static final long serialVersionUID = 20150206L;
37
38
39 private final List<FixedAccelerationModel> steps = new ArrayList<>();
40
41
42 private final OTSSimulatorInterface simulator;
43
44
45 private final Acceleration maximumSafeDeceleration;
46
47
48
49
50
51
52 public SequentialFixedAccelerationModel(final OTSSimulatorInterface simulator,
53 final Acceleration maximumSafeDeceleration)
54 {
55 this.simulator = simulator;
56 this.maximumSafeDeceleration = maximumSafeDeceleration;
57 }
58
59
60
61
62
63
64
65 public SequentialFixedAccelerationModel(final OTSSimulatorInterface simulator,
66 final Acceleration maximumSafeDeceleration, final Set<FixedAccelerationModel> steps)
67 {
68 this(simulator, maximumSafeDeceleration);
69 this.steps.addAll(steps);
70 }
71
72
73
74
75
76
77 public final SequentialFixedAccelerationModel addStep(final FixedAccelerationModel step)
78 {
79 this.steps.add(step);
80 return this;
81 }
82
83
84
85
86
87 public final int size()
88 {
89 return this.steps.size();
90 }
91
92
93
94
95
96
97 public final FixedAccelerationModel get(final int index)
98 {
99 return this.steps.get(index);
100 }
101
102
103
104
105
106
107 public final Time timeAfterCompletionOfStep(final int index)
108 {
109 Time sum = new Time(0, TimeUnit.DEFAULT);
110 for (int i = 0; i <= index; i++)
111 {
112 sum = sum.plus(this.steps.get(i).getDuration());
113 }
114 return sum;
115 }
116
117
118 private static final double MAXIMUMTIMEERROR = 0.001;
119
120
121
122
123
124 private FixedAccelerationModel getAccelerationModel()
125 {
126 Time when = this.simulator.getSimulatorAbsTime();
127 double remainingTime = when.getSI();
128 for (FixedAccelerationModel step : this.steps)
129 {
130 if (remainingTime < -MAXIMUMTIMEERROR)
131 {
132 throw new Error("FixedSequentialAcceleration does not have a result for " + when);
133 }
134 if (remainingTime < MAXIMUMTIMEERROR)
135 {
136 return step;
137 }
138 remainingTime -= step.getDuration().getSI();
139 }
140 throw new Error("FixedSequentialAcceleration does not have a result for " + when);
141 }
142
143
144 @Override
145 public final Acceleration computeAcceleration(final Speed followerSpeed, final Speed followerMaximumSpeed,
146 final Speed leaderSpeed, final Length headway, final Speed speedLimit)
147 {
148 return getAccelerationModel().getAcceleration();
149 }
150
151
152 @Override
153 public final Acceleration computeAcceleration(final Speed followerSpeed, final Speed followerMaximumSpeed,
154 final Speed leaderSpeed, final Length headway, final Speed speedLimit, final Duration stepSize)
155 {
156
157 return getAccelerationModel().getAcceleration();
158 }
159
160
161 @Override
162 public final Acceleration getMaximumSafeDeceleration()
163 {
164 return this.maximumSafeDeceleration;
165 }
166
167
168 @Override
169 public final Duration getStepSize()
170 {
171 return getAccelerationModel().getStepSize();
172 }
173
174
175 @Override
176 public final String getName()
177 {
178 return "FSAM";
179 }
180
181
182 @Override
183 public final String getLongName()
184 {
185 return "Fixed sequential acceleration model";
186 }
187
188
189 @Override
190 public final void setA(final Acceleration a)
191 {
192
193 }
194
195
196 @Override
197 public final void setT(final Duration t)
198 {
199
200 }
201
202
203 @Override
204 public final void setFspeed(final double fSpeed)
205 {
206
207 }
208
209
210
211
212 @Override
213 public final Speed desiredSpeed(final Parameters parameters, final SpeedLimitInfo speedInfo) throws ParameterException
214 {
215 return null;
216 }
217
218
219 @Override
220 public final Length desiredHeadway(final Parameters parameters, final Speed speed) throws ParameterException
221 {
222 return null;
223 }
224
225
226 @Override
227 public final Acceleration followingAcceleration(final Parameters parameters, final Speed speed,
228 final SpeedLimitInfo speedInfo, final PerceptionIterable<? extends Headway> leaders) throws ParameterException
229 {
230 return null;
231 }
232
233
234 @Override
235 public final String toString()
236 {
237 return "SequentialFixedAccelerationModel [steps=" + this.steps + ", maximumSafeDeceleration="
238 + this.maximumSafeDeceleration + "]";
239 }
240
241 }