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.object.PerceivedObject;
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
37 public AbstractCarFollowingModel(final DesiredHeadwayModel desiredHeadwayModel, final DesiredSpeedModel desiredSpeedModel)
38 {
39 this.desiredHeadwayModel = desiredHeadwayModel;
40 this.desiredSpeedModel = desiredSpeedModel;
41 }
42
43 @Override
44 public final Length desiredHeadway(final Parameters parameters, final Speed speed) throws ParameterException
45 {
46 Throw.whenNull(parameters, "Parameters may not be null.");
47 Throw.whenNull(speed, "Speed may not be null.");
48 return this.desiredHeadwayModel.desiredHeadway(parameters, speed);
49 }
50
51 @Override
52 public final Speed desiredSpeed(final Parameters parameters, final SpeedLimitInfo speedInfo) throws ParameterException
53 {
54 Throw.whenNull(parameters, "Parameters may not be null.");
55 Throw.whenNull(speedInfo, "Speed limit info may not be null.");
56 return this.desiredSpeedModel.desiredSpeed(parameters, speedInfo);
57 }
58
59 @Override
60 public final Acceleration followingAcceleration(final Parameters parameters, final Speed speed,
61 final SpeedLimitInfo speedLimitInfo, final PerceptionIterable<? extends PerceivedObject> leaders)
62 throws ParameterException
63 {
64 Throw.whenNull(parameters, "Parameters may not be null.");
65 Throw.whenNull(speed, "Speed may not be null.");
66 Throw.whenNull(speedLimitInfo, "Speed limit info may not be null.");
67 Throw.whenNull(leaders, "Leaders may not be null.");
68
69 if (!leaders.isEmpty() && leaders.first().getDistance().si <= 0)
70 {
71 return new Acceleration(Double.NEGATIVE_INFINITY, AccelerationUnit.SI);
72 }
73
74 Acceleration acc = followingAcceleration(parameters, speed, desiredSpeed(parameters, speedLimitInfo),
75 desiredHeadway(parameters, speed), leaders);
76 return acc;
77 }
78
79
80
81
82
83
84
85
86
87
88
89 protected abstract Acceleration followingAcceleration(Parameters parameters, Speed speed, Speed desiredSpeed,
90 Length desiredHeadway, PerceptionIterable<? extends PerceivedObject> leaders) throws ParameterException;
91
92 @SuppressWarnings("checkstyle:designforextension")
93 @Override
94 public String toString()
95 {
96 return getLongName();
97 }
98
99 @Override
100 public final void init(final LaneBasedGtu gtu)
101 {
102 if (this.desiredHeadwayModel instanceof Initialisable initialisable)
103 {
104 initialisable.init(gtu);
105 }
106 if (this.desiredSpeedModel instanceof Initialisable initialisable)
107 {
108 initialisable.init(gtu);
109 }
110 }
111
112 }