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
59 @Override
60 public final Desire determineDesire(final Parameters parameters, final LanePerception perception,
61 final CarFollowingModel carFollowingModel, final Desire mandatoryDesire, final Desire voluntaryDesire)
62 throws ParameterException, OperationalPlanException
63 {
64
65
66 InfrastructurePerception infra = perception.getPerceptionCategory(InfrastructurePerception.class);
67 TrafficPerception traffic = perception.getPerceptionCategory(TrafficPerception.class);
68 EgoPerception ego = perception.getPerceptionCategory(EgoPerception.class);
69 double leftDist = infra.getLegalLaneChangePossibility(RelativeLane.CURRENT, LateralDirectionality.LEFT).si;
70 double rightDist = infra.getLegalLaneChangePossibility(RelativeLane.CURRENT, LateralDirectionality.RIGHT).si;
71
72
73 Speed vCur = traffic.getSpeed(RelativeLane.CURRENT);
74 Speed vGain = parameters.getParameter(VGAIN);
75
76
77 Dimensionless aGain;
78
79
80
81
82
83 Acceleration aCur = ego.getAcceleration();
84
85
86
87
88
89 aCur = Try.assign(() -> perception.getGtu().getCarFollowingAcceleration(), "Could not obtain the GTU.");
90 if (aCur.si > 0)
91 {
92 Acceleration a = parameters.getParameter(A);
93 aGain = a.minus(aCur).divide(a);
94 }
95 else
96 {
97 aGain = new Dimensionless(1, DimensionlessUnit.SI);
98 }
99
100
101 double dLeft;
102 if (leftDist > 0.0 && infra.getCrossSection().contains(RelativeLane.LEFT))
103 {
104 Speed vLeft = traffic.getSpeed(RelativeLane.LEFT);
105 dLeft = aGain.si * (vLeft.si - vCur.si) / vGain.si;
106 }
107 else
108 {
109 dLeft = 0.0;
110 }
111
112
113 double dRight;
114 if (rightDist > 0.0 && infra.getCrossSection().contains(RelativeLane.RIGHT))
115 {
116 Speed vRight = traffic.getSpeed(RelativeLane.RIGHT);
117 if (vCur.si >= parameters.getParameter(VCONG).si)
118 {
119 dRight = aGain.si * Math.min(vRight.si - vCur.si, 0) / vGain.si;
120 }
121 else
122 {
123 dRight = aGain.si * (vRight.si - vCur.si) / vGain.si;
124 }
125 }
126 else
127 {
128 dRight = 0.0;
129 }
130
131
132 return new Desire(dLeft, dRight);
133 }
134
135
136 @Override
137 public final String toString()
138 {
139 return "IncentiveSpeedWithCourtesy";
140 }
141
142 }