1 package org.opentrafficsim.road.gtu.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.LaneBasedGtu;
11 import org.opentrafficsim.road.gtu.perception.PerceptionIterable;
12 import org.opentrafficsim.road.gtu.perception.object.PerceivedObject;
13 import org.opentrafficsim.road.network.speed.SpeedLimits;
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 SpeedLimits speedLimits, final Speed maxVehicleSpeed)
53 throws ParameterException
54 {
55 return this.desiredSpeedModel.desiredSpeed(parameters, speedLimits, maxVehicleSpeed);
56 }
57
58 @Override
59 public final Acceleration followingAcceleration(final Parameters parameters, final Speed speed,
60 final SpeedLimits speedLimits, final Speed maxVehicleSpeed,
61 final PerceptionIterable<? extends PerceivedObject> leaders) throws ParameterException
62 {
63
64 if (!leaders.isEmpty() && leaders.first().getDistance().si <= 0)
65 {
66 return new Acceleration(Double.NEGATIVE_INFINITY, AccelerationUnit.SI);
67 }
68
69 Acceleration acc = followingAcceleration(parameters, speed, desiredSpeed(parameters, speedLimits, maxVehicleSpeed),
70 desiredHeadway(parameters, speed), leaders);
71 return acc;
72 }
73
74
75
76
77
78
79 public DesiredSpeedModel setDesiredSpeedModel(final DesiredSpeedModel model)
80 {
81 DesiredSpeedModel old = this.desiredSpeedModel;
82 this.desiredSpeedModel = model;
83 return old;
84 }
85
86
87
88
89
90
91
92
93
94
95
96 protected abstract Acceleration followingAcceleration(Parameters parameters, Speed speed, Speed desiredSpeed,
97 Length desiredHeadway, PerceptionIterable<? extends PerceivedObject> leaders) throws ParameterException;
98
99 @SuppressWarnings("checkstyle:designforextension")
100 @Override
101 public String toString()
102 {
103 return getLongName();
104 }
105
106 @Override
107 public final void init(final LaneBasedGtu gtu)
108 {
109 if (this.desiredHeadwayModel instanceof Initialisable initialisable)
110 {
111 initialisable.init(gtu);
112 }
113 if (this.desiredSpeedModel instanceof Initialisable initialisable)
114 {
115 initialisable.init(gtu);
116 }
117 }
118
119 }