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.djunits.value.vdouble.scalar.Speed;
6 import org.opentrafficsim.base.parameters.ParameterException;
7 import org.opentrafficsim.base.parameters.ParameterTypeAcceleration;
8 import org.opentrafficsim.base.parameters.ParameterTypeSpeed;
9 import org.opentrafficsim.base.parameters.ParameterTypes;
10 import org.opentrafficsim.base.parameters.Parameters;
11 import org.opentrafficsim.core.gtu.GtuException;
12 import org.opentrafficsim.core.gtu.Stateless;
13 import org.opentrafficsim.road.gtu.lane.LaneBasedGtu;
14 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
15 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable;
16 import org.opentrafficsim.road.gtu.lane.perception.RelativeLane;
17 import org.opentrafficsim.road.gtu.lane.perception.categories.TrafficPerception;
18 import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.NeighborsPerception;
19 import org.opentrafficsim.road.gtu.lane.perception.object.PerceivedGtu;
20 import org.opentrafficsim.road.gtu.lane.plan.operational.SimpleOperationalPlan;
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.network.speed.SpeedLimitInfo;
24
25
26
27
28
29
30
31
32
33
34
35 public final class AccelerationNoRightOvertake implements AccelerationIncentive, Stateless<AccelerationNoRightOvertake>
36 {
37
38
39 public static final ParameterTypeSpeed VCONG = ParameterTypes.VCONG;
40
41
42 public static final ParameterTypeAcceleration B0 = ParameterTypes.B0;
43
44
45 public static final AccelerationNoRightOvertake SINGLETON = new AccelerationNoRightOvertake();
46
47 @Override
48 public AccelerationNoRightOvertake get()
49 {
50 return SINGLETON;
51 }
52
53
54
55
56 private AccelerationNoRightOvertake()
57 {
58
59 }
60
61 @Override
62 public void accelerate(final SimpleOperationalPlan simplePlan, final RelativeLane lane, final Length mergeDistance,
63 final LaneBasedGtu gtu, final LanePerception perception, final CarFollowingModel carFollowingModel,
64 final Speed speed, final Parameters params, final SpeedLimitInfo speedLimitInfo)
65 throws ParameterException, GtuException
66 {
67
68 if (lane.isCurrent() && perception.getLaneStructure().exists(RelativeLane.LEFT))
69 {
70 Speed vCong = params.getParameter(VCONG);
71 if (perception.getPerceptionCategory(TrafficPerception.class).getSpeed(RelativeLane.CURRENT).si > vCong.si)
72 {
73 PerceptionCollectable<PerceivedGtu, LaneBasedGtu> leaders =
74 perception.getPerceptionCategory(NeighborsPerception.class).getLeaders(RelativeLane.LEFT);
75 if (!leaders.isEmpty())
76 {
77 PerceivedGtu leader = leaders.first();
78 Speed desiredSpeed = perception.getGtu().getDesiredSpeed();
79 if (desiredSpeed.si > leader.getSpeed().si)
80 {
81 Acceleration b0 = params.getParameter(B0);
82
83 Acceleration a =
84 CarFollowingUtil.followSingleLeader(carFollowingModel, params, speed, speedLimitInfo, leader);
85 simplePlan.minimizeAcceleration(a.si < -b0.si ? b0.neg() : a);
86 }
87 }
88 }
89 }
90 }
91
92 }