1 package org.opentrafficsim.road.gtu.lane.tactical.following;
2
3 import org.djunits.unit.AccelerationUnit;
4 import org.djunits.value.vdouble.scalar.Acceleration;
5 import org.djunits.value.vdouble.scalar.Length;
6 import org.djunits.value.vdouble.scalar.Speed;
7 import org.djutils.exceptions.Throw;
8 import org.opentrafficsim.base.parameters.ParameterException;
9 import org.opentrafficsim.base.parameters.Parameters;
10 import org.opentrafficsim.road.gtu.lane.LaneBasedGtu;
11 import org.opentrafficsim.road.gtu.lane.perception.PerceptionIterable;
12 import org.opentrafficsim.road.gtu.lane.perception.headway.Headway;
13 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
14
15
16
17
18
19
20
21
22
23 public abstract class AbstractCarFollowingModel implements CarFollowingModel
24 {
25
26
27 private DesiredHeadwayModel desiredHeadwayModel;
28
29
30 private DesiredSpeedModel desiredSpeedModel;
31
32
33
34
35
36 public AbstractCarFollowingModel(final DesiredHeadwayModel desiredHeadwayModel, final DesiredSpeedModel desiredSpeedModel)
37 {
38 this.desiredHeadwayModel = desiredHeadwayModel;
39 this.desiredSpeedModel = desiredSpeedModel;
40 }
41
42 @Override
43 public final Length desiredHeadway(final Parameters parameters, final Speed speed) throws ParameterException
44 {
45 Throw.whenNull(parameters, "Parameters may not be null.");
46 Throw.whenNull(speed, "Speed may not be null.");
47 return this.desiredHeadwayModel.desiredHeadway(parameters, speed);
48 }
49
50 @Override
51 public final Speed desiredSpeed(final Parameters parameters, final SpeedLimitInfo speedInfo) throws ParameterException
52 {
53 Throw.whenNull(parameters, "Parameters may not be null.");
54 Throw.whenNull(speedInfo, "Speed limit info may not be null.");
55 return this.desiredSpeedModel.desiredSpeed(parameters, speedInfo);
56 }
57
58 @Override
59 public final Acceleration followingAcceleration(final Parameters parameters, final Speed speed,
60 final SpeedLimitInfo speedLimitInfo, final PerceptionIterable<? extends Headway> leaders) throws ParameterException
61 {
62 Throw.whenNull(parameters, "Parameters may not be null.");
63 Throw.whenNull(speed, "Speed may not be null.");
64 Throw.whenNull(speedLimitInfo, "Speed limit info may not be null.");
65 Throw.whenNull(leaders, "Leaders may not be null.");
66
67 if (!leaders.isEmpty() && leaders.first().getDistance().si <= 0)
68 {
69 return new Acceleration(Double.NEGATIVE_INFINITY, AccelerationUnit.SI);
70 }
71
72 Acceleration acc = followingAcceleration(parameters, speed, desiredSpeed(parameters, speedLimitInfo),
73 desiredHeadway(parameters, speed), leaders);
74 return acc;
75 }
76
77
78
79
80
81
82
83
84
85
86
87 protected abstract Acceleration followingAcceleration(Parameters parameters, Speed speed, Speed desiredSpeed,
88 Length desiredHeadway, PerceptionIterable<? extends Headway> leaders) throws ParameterException;
89
90 @SuppressWarnings("checkstyle:designforextension")
91 @Override
92 public String toString()
93 {
94 return getLongName();
95 }
96
97 @Override
98 public final void init(final LaneBasedGtu gtu)
99 {
100 if (this.desiredHeadwayModel instanceof Initialisable)
101 {
102 ((Initialisable) this.desiredHeadwayModel).init(gtu);
103 }
104 if (this.desiredSpeedModel instanceof Initialisable)
105 {
106 ((Initialisable) this.desiredSpeedModel).init(gtu);
107 }
108 }
109
110 }