1 package org.opentrafficsim.road.gtu.lane.tactical.following;
2
3 import java.util.SortedMap;
4
5 import org.djunits.unit.AccelerationUnit;
6 import org.djunits.unit.LengthUnit;
7 import org.djunits.value.vdouble.scalar.Acceleration;
8 import org.djunits.value.vdouble.scalar.Length;
9 import org.djunits.value.vdouble.scalar.Length.Rel;
10 import org.djunits.value.vdouble.scalar.Speed;
11 import org.opentrafficsim.core.gtu.drivercharacteristics.ParameterException;
12 import org.opentrafficsim.core.gtu.drivercharacteristics.ParameterTypeDouble;
13 import org.opentrafficsim.core.gtu.drivercharacteristics.ParameterTypes;
14 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
15
16
17
18
19
20
21 public class IDM extends AbstractCarFollowingModel {
22
23
24 public static final ParameterTypeDouble DELTA = new ParameterTypeDouble("delta",
25 "Acceleration flattening exponent towards desired speed.", 4.0) {
26 public void check(double value) throws ParameterException {
27 ParameterException.failIf(value<=0, "Parameter of type delta may not have a negative or zero value.");
28 }
29 };
30
31
32 public Speed desiredSpeed(LaneBasedGTU gtu, Speed speedLimit, boolean enforcement, Speed maximumVehicleSpeed)
33 throws ParameterException {
34 if (!enforcement) {
35 speedLimit = speedLimit.multiplyBy(gtu.getBehavioralCharacteristics().getParameter(ParameterTypes.FSPEED));
36 }
37 return speedLimit.le(maximumVehicleSpeed) ? speedLimit : maximumVehicleSpeed;
38 }
39
40
41 public Rel desiredHeadway(LaneBasedGTU gtu, Speed speed) throws ParameterException {
42 return gtu.getBehavioralCharacteristics().getLengthParameter(ParameterTypes.S0).plus(
43 speed.multiplyBy(gtu.getBehavioralCharacteristics().getTimeParameter(ParameterTypes.T)));
44 }
45
46
47 public String getName() {
48 return "IDM";
49 }
50
51
52 public String getLongName() {
53 return "Intelligent Driver Model";
54 }
55
56
57 protected Acceleration followingAcceleration(LaneBasedGTU gtu, Speed speed, Speed desiredSpeed, Rel desiredHeadway,
58 SortedMap<Rel, Speed> leaders) throws ParameterException {
59 Acceleration a = gtu.getBehavioralCharacteristics().getAccelerationParameter(ParameterTypes.A);
60 double delta = gtu.getBehavioralCharacteristics().getParameter(DELTA);
61 double sStar = dynamicDesiredHeadway(gtu, speed, desiredHeadway, leaders.get(leaders.firstKey())).si;
62 return new Acceleration(a.si * (1-Math.pow(speed.si/desiredSpeed.si, delta)-
63 (sStar/leaders.firstKey().si)*(sStar/leaders.firstKey().si)), AccelerationUnit.SI);
64 }
65
66
67
68
69
70
71
72
73
74
75 protected Length.Rel dynamicDesiredHeadway(LaneBasedGTU gtu, Speed speed, Rel desiredHeadway, Speed leaderSpeed)
76 throws ParameterException {
77 double sStar = desiredHeadway.si + dynamicHeadwayTerm(gtu, speed, leaderSpeed).si;
78
79
80
81
82
83
84
85 return new Length.Rel(sStar>=0 ? sStar : 0, LengthUnit.SI);
86 }
87
88
89
90
91
92
93
94
95
96 protected Length.Rel dynamicHeadwayTerm(LaneBasedGTU gtu, Speed speed, Speed leaderSpeed) throws ParameterException {
97 Acceleration a = gtu.getBehavioralCharacteristics().getAccelerationParameter(ParameterTypes.A);
98 Acceleration b = gtu.getBehavioralCharacteristics().getAccelerationParameter(ParameterTypes.B);
99 return new Length.Rel(speed.si*(speed.si-leaderSpeed.si) / (2*Math.sqrt(a.si + b.si)), LengthUnit.SI);
100 }
101
102 }