1 package org.opentrafficsim.road.gtu.lane.tactical.lmrs;
2
3 import org.djunits.value.vdouble.scalar.Acceleration;
4 import org.djunits.value.vdouble.scalar.Length;
5 import org.djutils.exceptions.Try;
6 import org.opentrafficsim.base.parameters.ParameterException;
7 import org.opentrafficsim.base.parameters.ParameterTypes;
8 import org.opentrafficsim.base.parameters.Parameters;
9 import org.opentrafficsim.core.gtu.perception.EgoPerception;
10 import org.opentrafficsim.core.gtu.plan.operational.OperationalPlanException;
11 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
12 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
13 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable;
14 import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
15 import org.opentrafficsim.road.gtu.lane.perception.categories.InfrastructurePerception;
16 import org.opentrafficsim.road.gtu.lane.perception.categories.IntersectionPerception;
17 import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.NeighborsPerception;
18 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayConflict;
19 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayGTU;
20 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayTrafficLight;
21 import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
22 import org.opentrafficsim.road.gtu.lane.tactical.util.CarFollowingUtil;
23 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.Desire;
24 import org.opentrafficsim.road.gtu.lane.tactical.util.lmrs.VoluntaryIncentive;
25 import org.opentrafficsim.road.network.lane.conflict.Conflict;
26 import org.opentrafficsim.road.network.lane.object.trafficlight.TrafficLight;
27 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
28
29
30
31
32
33
34
35
36
37
38
39
40 public class IncentiveQueue implements VoluntaryIncentive
41 {
42
43
44 @Override
45 public Desire determineDesire(final Parameters parameters, final LanePerception perception,
46 final CarFollowingModel carFollowingModel, final Desire mandatoryDesire, final Desire voluntaryDesire)
47 throws ParameterException, OperationalPlanException
48 {
49 if (!perception.contains(IntersectionPerception.class))
50 {
51 return Desire.ZERO;
52 }
53 EgoPerception<?, ?> ego = perception.getPerceptionCategory(EgoPerception.class);
54 double aCur = Try.assign(() -> perception.getGtu().getCarFollowingAcceleration().si, OperationalPlanException.class,
55 "Could not obtain the car-following acceleration.");
56 if (aCur <= 0.0 && ego.getSpeed().eq0())
57 {
58 return Desire.ZERO;
59 }
60 IntersectionPerception inter = perception.getPerceptionCategoryOrNull(IntersectionPerception.class);
61 PerceptionCollectable<HeadwayConflict, Conflict> conflicts = inter.getConflicts(RelativeLane.CURRENT);
62 PerceptionCollectable<HeadwayTrafficLight, TrafficLight> lights = inter.getTrafficLights(RelativeLane.CURRENT);
63
64 if (conflicts.isEmpty() && lights.isEmpty())
65 {
66 return Desire.ZERO;
67 }
68 Acceleration a = parameters.getParameter(ParameterTypes.A);
69 NeighborsPerception neigbors = perception.getPerceptionCategory(NeighborsPerception.class);
70 InfrastructurePerception infra = perception.getPerceptionCategory(InfrastructurePerception.class);
71
72 SpeedLimitInfo sli = infra.getSpeedLimitProspect(RelativeLane.CURRENT).getSpeedLimitInfo(Length.ZERO);
73
74 double dLeft = 0.0;
75 if (infra.getCrossSection().contains(RelativeLane.LEFT))
76 {
77 PerceptionCollectable<HeadwayGTU, LaneBasedGTU> leaders = neigbors.getLeaders(RelativeLane.LEFT);
78 if (!leaders.isEmpty())
79 {
80 Acceleration acc = CarFollowingUtil.followSingleLeader(carFollowingModel, parameters, ego.getSpeed(), sli,
81 leaders.first());
82 dLeft = (acc.si - aCur) / a.si;
83 }
84 }
85 double dRight = 0.0;
86 if (infra.getCrossSection().contains(RelativeLane.RIGHT))
87 {
88 PerceptionCollectable<HeadwayGTU, LaneBasedGTU> leaders = neigbors.getLeaders(RelativeLane.RIGHT);
89 if (!leaders.isEmpty())
90 {
91 Acceleration acc = CarFollowingUtil.followSingleLeader(carFollowingModel, parameters, ego.getSpeed(), sli,
92 leaders.first());
93 dRight = (acc.si - aCur) / a.si;
94 }
95 }
96 return new Desire(dLeft, dRight);
97 }
98
99
100 @Override
101 public final String toString()
102 {
103 return "IncentiveQueue";
104 }
105
106
107 }