1 package org.opentrafficsim.road.gtu.lane.tactical.lmrs;
2
3 import org.djunits.value.vdouble.scalar.Speed;
4 import org.opentrafficsim.base.parameters.ParameterException;
5 import org.opentrafficsim.base.parameters.ParameterTypeDouble;
6 import org.opentrafficsim.base.parameters.ParameterTypeSpeed;
7 import org.opentrafficsim.base.parameters.Parameters;
8 import org.opentrafficsim.road.gtu.lane.LaneBasedGtu;
9 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
10 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable;
11 import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
12 import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.NeighborsPerception;
13 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayGtu;
14 import org.opentrafficsim.road.gtu.lane.tactical.following.DesiredSpeedModel;
15 import org.opentrafficsim.road.gtu.lane.tactical.following.Initialisable;
16 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.LmrsParameters;
17 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Tailgating;
18 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
19
20
21
22
23
24
25
26
27
28
29
30 public class SocioDesiredSpeed implements DesiredSpeedModel, Initialisable
31 {
32
33
34 protected static final ParameterTypeDouble RHO = Tailgating.RHO;
35
36
37 protected static final ParameterTypeDouble SOCIO = LmrsParameters.SOCIO;
38
39
40 protected static final ParameterTypeSpeed VGAIN = LmrsParameters.VGAIN;
41
42
43 private LaneBasedGtu gtu;
44
45
46 private final DesiredSpeedModel baseModel;
47
48
49
50
51
52 public SocioDesiredSpeed(final DesiredSpeedModel baseModel)
53 {
54 this.baseModel = baseModel;
55 }
56
57 @Override
58 public Speed desiredSpeed(final Parameters parameters, final SpeedLimitInfo speedInfo) throws ParameterException
59 {
60 Speed desiredSpeed = this.baseModel.desiredSpeed(parameters, speedInfo);
61 if (this.gtu == null)
62 {
63 return desiredSpeed;
64 }
65 PerceptionCollectable<HeadwayGtu, LaneBasedGtu> followers;
66 LanePerception perception = this.gtu.getTacticalPlanner().getPerception();
67 NeighborsPerception neighbors = perception.getPerceptionCategoryOrNull(NeighborsPerception.class);
68 if (neighbors != null)
69 {
70 followers = neighbors.getFollowers(RelativeLane.CURRENT);
71 if (!followers.isEmpty())
72 {
73 double sigma = parameters.getParameter(SOCIO);
74 Speed vGain = parameters.getParameter(VGAIN);
75 HeadwayGtu follower = followers.first();
76 double rhoFollower = follower.getParameters().getParameter(RHO);
77 desiredSpeed = Speed.instantiateSI(desiredSpeed.si + rhoFollower * sigma * vGain.si);
78 }
79 }
80 return desiredSpeed;
81 }
82
83 @Override
84 public void init(final LaneBasedGtu laneBasedGtu)
85 {
86 this.gtu = laneBasedGtu;
87 }
88
89 }