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
23
24
25
26
27
28
29
30
31 public class SocioDesiredSpeed implements DesiredSpeedModel, Initialisable
32 {
33
34
35 protected static final ParameterTypeDouble RHO = Tailgating.RHO;
36
37
38 protected static final ParameterTypeDouble SOCIO = LmrsParameters.SOCIO;
39
40
41 protected static final ParameterTypeSpeed VGAIN = LmrsParameters.VGAIN;
42
43
44 private LaneBasedGtu gtu;
45
46
47 private final DesiredSpeedModel baseModel;
48
49
50
51
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 }