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.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.TrafficPerception;
17 import org.opentrafficsim.road.gtu.lane.perception.categories.neighbors.NeighborsPerception;
18 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayGtu;
19 import org.opentrafficsim.road.gtu.lane.plan.operational.SimpleOperationalPlan;
20 import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
21 import org.opentrafficsim.road.gtu.lane.tactical.util.CarFollowingUtil;
22 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
23
24
25
26
27
28
29
30
31
32
33
34 public class AccelerationNoRightOvertake implements AccelerationIncentive
35 {
36
37
38 public static final ParameterTypeSpeed VCONG = ParameterTypes.VCONG;
39
40
41 public static final ParameterTypeAcceleration B0 = ParameterTypes.B0;
42
43 @Override
44 public void accelerate(final SimpleOperationalPlan simplePlan, final RelativeLane lane, final Length mergeDistance,
45 final LaneBasedGtu gtu, final LanePerception perception, final CarFollowingModel carFollowingModel,
46 final Speed speed, final Parameters params, final SpeedLimitInfo speedLimitInfo)
47 throws ParameterException, GtuException
48 {
49
50 if (lane.isCurrent() && perception.getLaneStructure().exists(RelativeLane.LEFT))
51 {
52 Speed vCong = params.getParameter(VCONG);
53 if (perception.getPerceptionCategory(TrafficPerception.class).getSpeed(RelativeLane.CURRENT).si > vCong.si)
54 {
55 PerceptionCollectable<HeadwayGtu, LaneBasedGtu> leaders =
56 perception.getPerceptionCategory(NeighborsPerception.class).getLeaders(RelativeLane.LEFT);
57 if (!leaders.isEmpty())
58 {
59 HeadwayGtu leader = leaders.first();
60 Speed desiredSpeed = perception.getGtu().getDesiredSpeed();
61 if (desiredSpeed.si > leader.getSpeed().si)
62 {
63 Acceleration b0 = params.getParameter(B0);
64
65 Acceleration a =
66 CarFollowingUtil.followSingleLeader(carFollowingModel, params, speed, speedLimitInfo, leader);
67 simplePlan.minimizeAcceleration(a.si < -b0.si ? b0.neg() : a);
68 }
69 }
70 }
71 }
72 }
73
74 }