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 public class IncentiveQueue implements VoluntaryIncentive
40 {
41
42 @Override
43 public Desire determineDesire(final Parameters parameters, final LanePerception perception,
44 final CarFollowingModel carFollowingModel, final Desire mandatoryDesire, final Desire voluntaryDesire)
45 throws ParameterException, OperationalPlanException
46 {
47 if (!perception.contains(IntersectionPerception.class))
48 {
49 return Desire.ZERO;
50 }
51 EgoPerception<?, ?> ego = perception.getPerceptionCategory(EgoPerception.class);
52 double aCur = Try.assign(() -> perception.getGtu().getCarFollowingAcceleration().si, OperationalPlanException.class,
53 "Could not obtain the car-following acceleration.");
54 if (aCur <= 0.0 && ego.getSpeed().eq0())
55 {
56 return Desire.ZERO;
57 }
58 IntersectionPerception inter = perception.getPerceptionCategoryOrNull(IntersectionPerception.class);
59 PerceptionCollectable<HeadwayConflict, Conflict> conflicts = inter.getConflicts(RelativeLane.CURRENT);
60 PerceptionCollectable<HeadwayTrafficLight, TrafficLight> lights = inter.getTrafficLights(RelativeLane.CURRENT);
61
62 if (conflicts.isEmpty() && lights.isEmpty())
63 {
64 return Desire.ZERO;
65 }
66 Acceleration a = parameters.getParameter(ParameterTypes.A);
67 NeighborsPerception neigbors = perception.getPerceptionCategory(NeighborsPerception.class);
68 InfrastructurePerception infra = perception.getPerceptionCategory(InfrastructurePerception.class);
69
70 SpeedLimitInfo sli = infra.getSpeedLimitProspect(RelativeLane.CURRENT).getSpeedLimitInfo(Length.ZERO);
71
72 double dLeft = 0.0;
73 if (infra.getCrossSection().contains(RelativeLane.LEFT))
74 {
75 PerceptionCollectable<HeadwayGtu, LaneBasedGtu> leaders = neigbors.getLeaders(RelativeLane.LEFT);
76 if (!leaders.isEmpty())
77 {
78 Acceleration acc = CarFollowingUtil.followSingleLeader(carFollowingModel, parameters, ego.getSpeed(), sli,
79 leaders.first());
80 dLeft = (acc.si - aCur) / a.si;
81 }
82 }
83 double dRight = 0.0;
84 if (infra.getCrossSection().contains(RelativeLane.RIGHT))
85 {
86 PerceptionCollectable<HeadwayGtu, LaneBasedGtu> leaders = neigbors.getLeaders(RelativeLane.RIGHT);
87 if (!leaders.isEmpty())
88 {
89 Acceleration acc = CarFollowingUtil.followSingleLeader(carFollowingModel, parameters, ego.getSpeed(), sli,
90 leaders.first());
91 dRight = (acc.si - aCur) / a.si;
92 }
93 }
94 return new Desire(dLeft, dRight);
95 }
96
97 @Override
98 public final String toString()
99 {
100 return "IncentiveQueue";
101 }
102
103 }