1 package org.opentrafficsim.road.gtu.lane.tactical.util.lmrs;
2
3 import org.djunits.unit.AccelerationUnit;
4 import org.djunits.value.vdouble.scalar.Acceleration;
5 import org.djunits.value.vdouble.scalar.Speed;
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.core.network.LateralDirectionality;
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.neighbors.NeighborsPerception;
17 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayGTU;
18 import org.opentrafficsim.road.gtu.lane.tactical.following.CarFollowingModel;
19 import org.opentrafficsim.road.network.speed.SpeedLimitInfo;
20
21
22
23
24
25
26
27
28
29
30
31
32 public interface Cooperation extends LmrsParameters
33 {
34
35
36 Cooperationd/gtu/lane/tactical/util/lmrs/Cooperation.html#Cooperation">Cooperation PASSIVE = new Cooperation()
37 {
38 @Override
39 public Acceleration cooperate(final LanePerception perception, final Parameters params, final SpeedLimitInfo sli,
40 final CarFollowingModel cfm, final LateralDirectionality lat, final Desire ownDesire)
41 throws ParameterException, OperationalPlanException
42 {
43 if ((lat.isLeft() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.LEFT))
44 || (lat.isRight() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.RIGHT)))
45 {
46 return new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
47 }
48 Acceleration b = params.getParameter(ParameterTypes.B);
49 Acceleration a = new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
50 double dCoop = params.getParameter(DCOOP);
51 Speed ownSpeed = perception.getPerceptionCategory(EgoPerception.class).getSpeed();
52 RelativeLanelane/perception/RelativeLane.html#RelativeLane">RelativeLane relativeLane = new RelativeLane(lat, 1);
53 for (HeadwayGTU leader : Synchronization.removeAllUpstreamOfConflicts(Synchronization.removeAllUpstreamOfConflicts(
54 perception.getPerceptionCategory(NeighborsPerception.class).getLeaders(relativeLane), perception,
55 relativeLane), perception, RelativeLane.CURRENT))
56 {
57 Parameters params2 = leader.getParameters();
58 double desire = lat.equals(LateralDirectionality.LEFT) ? params2.getParameter(DRIGHT)
59 : lat.equals(LateralDirectionality.RIGHT) ? params2.getParameter(DLEFT) : 0;
60 if (desire >= dCoop && (leader.getSpeed().gt0() || leader.getDistance().gt0()))
61 {
62 Acceleration aSingle = LmrsUtil.singleAcceleration(leader.getDistance(), ownSpeed, leader.getSpeed(),
63 desire, params, sli, cfm);
64 a = Acceleration.min(a, aSingle);
65 }
66 }
67 return Acceleration.max(a, b.neg());
68 }
69 };
70
71
72 Cooperationane/tactical/util/lmrs/Cooperation.html#Cooperation">Cooperation PASSIVE_MOVING = new Cooperation()
73 {
74 @Override
75 public Acceleration cooperate(final LanePerception perception, final Parameters params, final SpeedLimitInfo sli,
76 final CarFollowingModel cfm, final LateralDirectionality lat, final Desire ownDesire)
77 throws ParameterException, OperationalPlanException
78 {
79 if ((lat.isLeft() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.LEFT))
80 || (lat.isRight() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.RIGHT)))
81 {
82 return new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
83 }
84 Acceleration bCrit = params.getParameter(ParameterTypes.BCRIT);
85 Acceleration b = params.getParameter(ParameterTypes.B);
86 Acceleration a = new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
87 double dCoop = params.getParameter(DCOOP);
88 Speed ownSpeed = perception.getPerceptionCategory(EgoPerception.class).getSpeed();
89 RelativeLanelane/perception/RelativeLane.html#RelativeLane">RelativeLane relativeLane = new RelativeLane(lat, 1);
90 NeighborsPerception neighbours = perception.getPerceptionCategory(NeighborsPerception.class);
91 PerceptionCollectable<HeadwayGTU, LaneBasedGTU> leaders = neighbours.getLeaders(RelativeLane.CURRENT);
92 Speed thresholdSpeed = Speed.instantiateSI(40.0 / 3.6);
93 boolean leaderInCongestion = leaders.isEmpty() ? false : leaders.first().getSpeed().lt(thresholdSpeed);
94 for (HeadwayGTU leader : Synchronization.removeAllUpstreamOfConflicts(
95 Synchronization.removeAllUpstreamOfConflicts(neighbours.getLeaders(relativeLane), perception, relativeLane),
96 perception, RelativeLane.CURRENT))
97 {
98 Parameters params2 = leader.getParameters();
99 double desire = lat.equals(LateralDirectionality.LEFT) ? params2.getParameter(DRIGHT)
100 : lat.equals(LateralDirectionality.RIGHT) ? params2.getParameter(DLEFT) : 0;
101
102
103 if (desire >= dCoop && (leader.getSpeed().gt0() || leader.getDistance().gt0())
104 && (leader.getSpeed().ge(thresholdSpeed) || leaderInCongestion))
105 {
106 Acceleration aSingle = LmrsUtil.singleAcceleration(leader.getDistance(), ownSpeed, leader.getSpeed(),
107 desire, params, sli, cfm);
108 a = Acceleration.min(a, aSingle);
109 }
110 }
111 return Acceleration.max(a, bCrit.neg());
112 }
113 };
114
115
116 Cooperationad/gtu/lane/tactical/util/lmrs/Cooperation.html#Cooperation">Cooperation ACTIVE = new Cooperation()
117 {
118 @Override
119 public Acceleration cooperate(final LanePerception perception, final Parameters params, final SpeedLimitInfo sli,
120 final CarFollowingModel cfm, final LateralDirectionality lat, final Desire ownDesire)
121 throws ParameterException, OperationalPlanException
122 {
123
124 if ((lat.isLeft() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.LEFT))
125 || (lat.isRight() && !perception.getLaneStructure().getExtendedCrossSection().contains(RelativeLane.RIGHT)))
126 {
127 return new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
128 }
129 Acceleration a = new Acceleration(Double.MAX_VALUE, AccelerationUnit.SI);
130 double dCoop = params.getParameter(DCOOP);
131 Speed ownSpeed = perception.getPerceptionCategory(EgoPerception.class).getSpeed();
132 RelativeLanelane/perception/RelativeLane.html#RelativeLane">RelativeLane relativeLane = new RelativeLane(lat, 1);
133 for (HeadwayGTU leader : Synchronization.removeAllUpstreamOfConflicts(Synchronization.removeAllUpstreamOfConflicts(
134 perception.getPerceptionCategory(NeighborsPerception.class).getLeaders(relativeLane), perception,
135 relativeLane), perception, RelativeLane.CURRENT))
136 {
137 Parameters params2 = leader.getParameters();
138 double desire = lat.equals(LateralDirectionality.LEFT) ? params2.getParameter(DRIGHT)
139 : lat.equals(LateralDirectionality.RIGHT) ? params2.getParameter(DLEFT) : 0;
140 if (desire >= dCoop && leader.getDistance().gt0()
141 && leader.getAcceleration().gt(params.getParameter(ParameterTypes.BCRIT).neg()))
142 {
143 Acceleration aSingle = LmrsUtil.singleAcceleration(leader.getDistance(), ownSpeed, leader.getSpeed(),
144 desire, params, sli, cfm);
145 a = Acceleration.min(a, Synchronization.gentleUrgency(aSingle, desire, params));
146 }
147 }
148 return a;
149 }
150 };
151
152
153
154
155
156
157
158
159
160
161
162
163
164 Acceleration cooperate(LanePerception perception, Parameters params, SpeedLimitInfo sli, CarFollowingModel cfm,
165 LateralDirectionality lat, Desire ownDesire) throws ParameterException, OperationalPlanException;
166 }