1 package org.opentrafficsim.road.gtu.lane.perception.mental;
2
3 import org.djunits.value.vdouble.scalar.Duration;
4 import org.djunits.value.vdouble.scalar.Speed;
5 import org.djutils.exceptions.Try;
6 import org.opentrafficsim.base.parameters.ParameterException;
7 import org.opentrafficsim.base.parameters.ParameterTypes;
8 import org.opentrafficsim.base.parameters.Parameters;
9 import org.opentrafficsim.core.gtu.perception.EgoPerception;
10 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
11 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
12
13
14
15
16
17
18
19
20
21
22
23
24 public abstract class TaskHeadwayBased extends AbstractTask
25 {
26
27
28
29
30
31 public TaskHeadwayBased(final String id)
32 {
33 super(id);
34 }
35
36
37 private Speed speed;
38
39
40 @Override
41 public double calculateTaskDemand(final LanePerception perception, final LaneBasedGTU gtu, final Parameters parameters)
42 throws ParameterException
43 {
44 double a = gtu.getAcceleration().si;
45 double b = parameters.getParameter(ParameterTypes.B).si;
46 double tMin = parameters.getParameter(ParameterTypes.TMIN).si;
47 double hMin = a < -b ? (1.0 - (a + b) / (8.0 - b)) * tMin : tMin;
48 EgoPerception<?, ?> ego = perception.getPerceptionCategoryOrNull(EgoPerception.class);
49 Try.execute(() -> ego.updateSpeed(), "Could not update perception of ego speed.");
50 this.speed = ego.getSpeed();
51 Duration h = getHeadway(perception, gtu, parameters);
52 if (h == null)
53 {
54 return 0.0;
55 }
56 return h.si <= hMin ? 1.0 : (h.si > 3.0 ? 0.5 : 1.0 - (1.0 - 0.5) * (h.si - hMin) / (3.0 - hMin));
57 }
58
59
60
61
62
63 protected Speed getSpeed()
64 {
65 return this.speed;
66 }
67
68
69
70
71
72
73
74
75
76 protected abstract Duration getHeadway(LanePerception perception, LaneBasedGTU gtu, Parameters parameters)
77 throws ParameterException;
78
79 }