View Javadoc
1   package org.opentrafficsim.road.gtu.lane.tactical.following;
2   
3   import org.djunits.value.vdouble.scalar.Acceleration;
4   import org.djunits.value.vdouble.scalar.Length;
5   import org.djunits.value.vdouble.scalar.Speed;
6   import org.opentrafficsim.base.parameters.ParameterException;
7   import org.opentrafficsim.base.parameters.Parameters;
8   import org.opentrafficsim.road.gtu.lane.perception.PerceptionIterable;
9   import org.opentrafficsim.road.gtu.lane.perception.object.PerceivedObject;
10  
11  /**
12   * Implementation of the IDM. See <a
13   * href=https://en.wikipedia.org/wiki/Intelligent_driver_model>https://en.wikipedia.org/wiki/Intelligent_driver_model</a>
14   * <p>
15   * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
16   * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
17   * </p>
18   * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
19   */
20  public class Idm extends AbstractIdm
21  {
22  
23      /**
24       * Default constructor using default models for desired headway and desired speed.
25       */
26      public Idm()
27      {
28          super(HEADWAY, DESIRED_SPEED);
29      }
30  
31      /**
32       * Constructor with modular models for desired headway and desired speed.
33       * @param desiredHeadwayModel desired headway model
34       * @param desiredSpeedModel desired speed model
35       */
36      public Idm(final DesiredHeadwayModel desiredHeadwayModel, final DesiredSpeedModel desiredSpeedModel)
37      {
38          super(desiredHeadwayModel, desiredSpeedModel);
39      }
40  
41      @Override
42      public final String getName()
43      {
44          return "IDM";
45      }
46  
47      @Override
48      public final String getLongName()
49      {
50          return "Intelligent Driver Model";
51      }
52  
53      @Override
54      protected final Acceleration combineInteractionTerm(final Acceleration aFree, final Parameters parameters,
55              final Speed speed, final Speed desiredSpeed, final Length desiredHeadway,
56              final PerceptionIterable<? extends PerceivedObject> leaders) throws ParameterException
57      {
58          Acceleration a = parameters.getParameter(A);
59          PerceivedObject leader = leaders.first();
60          double sRatio =
61                  dynamicDesiredHeadway(parameters, speed, desiredHeadway, leader.getSpeed()).si / leader.getDistance().si;
62          double aInt = -a.si * sRatio * sRatio;
63          return Acceleration.ofSI(aFree.si + aInt);
64      }
65  
66  }