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.opentrafficsim.base.parameters.ParameterException;
8 import org.opentrafficsim.base.parameters.Parameters;
9 import org.opentrafficsim.road.gtu.lane.perception.PerceptionIterable;
10 import org.opentrafficsim.road.gtu.lane.perception.headway.Headway;
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public class IdmPlus extends AbstractIdm
26 {
27
28
29
30
31 public IdmPlus()
32 {
33 super(HEADWAY, DESIRED_SPEED);
34 }
35
36
37
38
39
40
41 public IdmPlus(final DesiredHeadwayModel desiredHeadwayModel, final DesiredSpeedModel desiredSpeedModel)
42 {
43 super(desiredHeadwayModel, desiredSpeedModel);
44 }
45
46 @Override
47 public final String getName()
48 {
49 return "IDM+";
50 }
51
52 @Override
53 public final String getLongName()
54 {
55 return "Intelligent Driver Model+";
56 }
57
58 @Override
59 protected final Acceleration combineInteractionTerm(final Acceleration aFree, final Parameters parameters,
60 final Speed speed, final Speed desiredSpeed, final Length desiredHeadway,
61 final PerceptionIterable<? extends Headway> leaders) throws ParameterException
62 {
63 Acceleration a = parameters.getParameter(A);
64 Headway leader = leaders.first();
65 double sRatio =
66 dynamicDesiredHeadway(parameters, speed, desiredHeadway, leader.getSpeed()).si / leader.getDistance().si;
67 double aInt = a.si * (1 - sRatio * sRatio);
68 return new Acceleration(aInt < aFree.si ? aInt : aFree.si, AccelerationUnit.SI);
69 }
70
71 }