View Javadoc
1   package org.opentrafficsim.road.gtu.tactical.lmrs;
2   
3   import java.util.Optional;
4   
5   import org.djunits.value.vdouble.scalar.Speed;
6   import org.opentrafficsim.base.parameters.ParameterException;
7   import org.opentrafficsim.base.parameters.ParameterTypeDouble;
8   import org.opentrafficsim.base.parameters.ParameterTypeSpeed;
9   import org.opentrafficsim.base.parameters.Parameters;
10  import org.opentrafficsim.road.gtu.LaneBasedGtu;
11  import org.opentrafficsim.road.gtu.perception.LanePerception;
12  import org.opentrafficsim.road.gtu.perception.RelativeLane;
13  import org.opentrafficsim.road.gtu.perception.categories.neighbors.NeighborsPerception;
14  import org.opentrafficsim.road.gtu.perception.object.PerceivedGtu;
15  import org.opentrafficsim.road.gtu.tactical.following.DesiredSpeedModel;
16  import org.opentrafficsim.road.gtu.tactical.following.Initialisable;
17  import org.opentrafficsim.road.gtu.tactical.util.lmrs.LmrsParameters;
18  import org.opentrafficsim.road.gtu.tactical.util.lmrs.Tailgating;
19  import org.opentrafficsim.road.network.speed.SpeedLimits;
20  
21  /**
22   * Wrapper of a base-desired speed model. The speed may be increased due to social pressure from the follower.
23   * <p>
24   * Copyright (c) 2013-2026 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
25   * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
26   * </p>
27   * @author Alexander Verbraeck
28   * @author Peter Knoppers
29   * @author Wouter Schakel
30   */
31  public class SocioDesiredSpeed implements DesiredSpeedModel, Initialisable
32  {
33  
34      /** Social pressure applied to the leader. */
35      protected static final ParameterTypeDouble RHO = Tailgating.RHO;
36  
37      /** Socio-speed sensitivity parameter. */
38      protected static final ParameterTypeDouble SOCIO = LmrsParameters.SOCIO;
39  
40      /** Vgain parameter; ego-speed sensitivity. */
41      protected static final ParameterTypeSpeed VGAIN = LmrsParameters.VGAIN;
42  
43      /** GTU. */
44      private LaneBasedGtu gtu;
45  
46      /** Base model for desired speed. */
47      private final DesiredSpeedModel baseModel;
48  
49      /**
50       * Constructor.
51       * @param baseModel base model for desired speed
52       */
53      public SocioDesiredSpeed(final DesiredSpeedModel baseModel)
54      {
55          this.baseModel = baseModel;
56      }
57  
58      @Override
59      public Speed desiredSpeed(final Parameters parameters, final SpeedLimits speedLimits, final Speed maxVehicleSpeed)
60              throws ParameterException
61      {
62          Speed desiredSpeed = this.baseModel.desiredSpeed(parameters, speedLimits, maxVehicleSpeed);
63          if (this.gtu == null)
64          {
65              return desiredSpeed;
66          }
67          LanePerception perception = this.gtu.getTacticalPlanner().getPerception();
68          Optional<NeighborsPerception> neighbors = perception.getPerceptionCategoryOptional(NeighborsPerception.class);
69          if (neighbors.isPresent())
70          {
71              var followers = neighbors.get().getFollowers(RelativeLane.CURRENT);
72              if (!followers.isEmpty())
73              {
74                  double sigma = parameters.getParameter(SOCIO);
75                  Speed vGain = parameters.getParameter(VGAIN);
76                  PerceivedGtu follower = followers.first();
77                  double rhoFollower = follower.getBehavior().socialPressure();
78                  desiredSpeed = Speed.ofSI(desiredSpeed.si + rhoFollower * sigma * vGain.si);
79              }
80          }
81          return desiredSpeed;
82      }
83  
84      @Override
85      public void init(final LaneBasedGtu laneBasedGtu)
86      {
87          this.gtu = laneBasedGtu;
88      }
89  
90  }