1 package org.opentrafficsim.road.gtu.lane.tactical.lmrs;
2
3 import org.djunits.unit.DimensionlessUnit;
4 import org.djunits.value.vdouble.scalar.Acceleration;
5 import org.djunits.value.vdouble.scalar.Dimensionless;
6 import org.djunits.value.vdouble.scalar.Speed;
7 import org.djutils.exceptions.Try;
8 import org.opentrafficsim.base.parameters.ParameterException;
9 import org.opentrafficsim.base.parameters.ParameterTypeAcceleration;
10 import org.opentrafficsim.base.parameters.ParameterTypeSpeed;
11 import org.opentrafficsim.base.parameters.ParameterTypes;
12 import org.opentrafficsim.base.parameters.Parameters;
13 import org.opentrafficsim.core.gtu.perception.EgoPerception;
14 import org.opentrafficsim.core.gtu.plan.operational.OperationalPlanException;
15 import org.opentrafficsim.core.network.LateralDirectionality;
16 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
17 import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
18 import org.opentrafficsim.road.gtu.lane.perception.categories.InfrastructurePerception;
19 import org.opentrafficsim.road.gtu.lane.perception.categories.TrafficPerception;
20 import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
21 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Desire;
22 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.LmrsParameters;
23 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.VoluntaryIncentive;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class IncentiveSpeedWithCourtesy implements VoluntaryIncentive
47 {
48
49
50 protected static final ParameterTypeAcceleration A = ParameterTypes.A;
51
52
53 protected static final ParameterTypeSpeed VGAIN = LmrsParameters.VGAIN;
54
55
56 protected static final ParameterTypeSpeed VCONG = ParameterTypes.VCONG;
57
58 @Override
59 public final Desire determineDesire(final Parameters parameters, final LanePerception perception,
60 final CarFollowingModel carFollowingModel, final Desire mandatoryDesire, final Desire voluntaryDesire)
61 throws ParameterException, OperationalPlanException
62 {
63
64
65 InfrastructurePerception infra = perception.getPerceptionCategory(InfrastructurePerception.class);
66 TrafficPerception traffic = perception.getPerceptionCategory(TrafficPerception.class);
67 EgoPerception ego = perception.getPerceptionCategory(EgoPerception.class);
68 double leftDist = infra.getLegalLaneChangePossibility(RelativeLane.CURRENT, LateralDirectionality.LEFT).si;
69 double rightDist = infra.getLegalLaneChangePossibility(RelativeLane.CURRENT, LateralDirectionality.RIGHT).si;
70
71
72 Speed vCur = traffic.getSpeed(RelativeLane.CURRENT);
73 Speed vGain = parameters.getParameter(VGAIN);
74
75
76 Dimensionless aGain;
77
78
79
80
81
82 Acceleration aCur = ego.getAcceleration();
83
84
85
86
87
88 aCur = Try.assign(() -> perception.getGtu().getCarFollowingAcceleration(), "Could not obtain the GTU.");
89 if (aCur.si > 0)
90 {
91 Acceleration a = parameters.getParameter(A);
92 aGain = a.minus(aCur).divide(a);
93 }
94 else
95 {
96 aGain = new Dimensionless(1, DimensionlessUnit.SI);
97 }
98
99
100 double dLeft;
101 if (leftDist > 0.0 && infra.getCrossSection().contains(RelativeLane.LEFT))
102 {
103 Speed vLeft = traffic.getSpeed(RelativeLane.LEFT);
104 dLeft = aGain.si * (vLeft.si - vCur.si) / vGain.si;
105 }
106 else
107 {
108 dLeft = 0.0;
109 }
110
111
112 double dRight;
113 if (rightDist > 0.0 && infra.getCrossSection().contains(RelativeLane.RIGHT))
114 {
115 Speed vRight = traffic.getSpeed(RelativeLane.RIGHT);
116 if (vCur.si >= parameters.getParameter(VCONG).si)
117 {
118 dRight = aGain.si * Math.min(vRight.si - vCur.si, 0) / vGain.si;
119 }
120 else
121 {
122 dRight = aGain.si * (vRight.si - vCur.si) / vGain.si;
123 }
124 }
125 else
126 {
127 dRight = 0.0;
128 }
129
130
131 return new Desire(dLeft, dRight);
132 }
133
134 @Override
135 public final String toString()
136 {
137 return "IncentiveSpeedWithCourtesy";
138 }
139
140 }