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