1 package org.opentrafficsim.road.gtu.lane.perception.categories.neighbors;
2
3 import org.djunits.value.vdouble.scalar.Length;
4 import org.opentrafficsim.base.parameters.ParameterException;
5 import org.opentrafficsim.core.gtu.GTUException;
6 import org.opentrafficsim.core.gtu.RelativePosition;
7 import org.opentrafficsim.core.network.NetworkException;
8 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
9 import org.opentrafficsim.road.gtu.lane.control.ControlTacticalPlanner;
10 import org.opentrafficsim.road.gtu.lane.perception.DownstreamNeighborsIterable;
11 import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
12 import org.opentrafficsim.road.gtu.lane.perception.LaneRecord;
13 import org.opentrafficsim.road.gtu.lane.perception.LaneStructureRecord;
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.LaneBasedAbstractPerceptionCategory;
17 import org.opentrafficsim.road.gtu.lane.perception.headway.HeadwayGTU;
18
19
20
21
22
23
24
25
26
27
28
29
30 public class AccPerception extends LaneBasedAbstractPerceptionCategory implements LongitudinalControllerPerception
31 {
32
33
34 private static final long serialVersionUID = 20190312L;
35
36
37 private final HeadwayGtuType sensors;
38
39
40
41
42
43 public AccPerception(final LanePerception perception)
44 {
45 this(perception, new DefaultCaccSensors());
46 }
47
48
49
50
51
52
53 public AccPerception(final LanePerception perception, final HeadwayGtuType sensors)
54 {
55 super(perception);
56 this.sensors = sensors;
57 }
58
59
60 @Override
61 public void updateAll() throws GTUException, NetworkException, ParameterException
62 {
63
64 }
65
66
67 @Override
68 public PerceptionCollectable<HeadwayGTU, LaneBasedGTU> getLeaders()
69 {
70 return computeIfAbsent("leaders", () -> computeLeaders());
71 }
72
73
74
75
76
77 private PerceptionCollectable<HeadwayGTU, LaneBasedGTU> computeLeaders()
78 {
79 try
80 {
81 LaneStructureRecord record = getPerception().getLaneStructure().getRootRecord();
82 Length pos = record.getStartDistance().neg();
83 pos = record.getDirection().isPlus() ? pos.plus(getGtu().getFront().getDx())
84 : pos.minus(getGtu().getFront().getDx());
85 boolean ignoreIfUpstream = true;
86 return new DownstreamNeighboursIterableACC(getGtu(), record, Length.max(Length.ZERO, pos),
87 ((ControlTacticalPlanner) getGtu().getTacticalPlanner()).getSettings()
88 .getParameter(LongitudinalControllerPerception.RANGE),
89 getGtu().getFront(), this.sensors, RelativeLane.CURRENT, ignoreIfUpstream);
90 }
91 catch (ParameterException | GTUException exception)
92 {
93 throw new RuntimeException("Unexpected exception while computing gtu alongside.", exception);
94 }
95 }
96
97
98
99
100
101
102
103
104
105
106
107
108
109 private static class DownstreamNeighboursIterableACC extends DownstreamNeighborsIterable
110 {
111
112
113
114
115
116
117
118
119
120
121
122
123 @SuppressWarnings("checkstyle:parameternumber")
124 DownstreamNeighboursIterableACC(final LaneBasedGTU perceivingGtu, final LaneRecord<?> root,
125 final Length initialPosition, final Length maxDistance, final RelativePosition relativePosition,
126 final HeadwayGtuType headwayGtuType, final RelativeLane lane, final boolean ignoreIfUpstream)
127 {
128 super(perceivingGtu, root, initialPosition, maxDistance, relativePosition, headwayGtuType, lane, ignoreIfUpstream);
129 }
130
131
132 @Override
133 protected Entry getNext(final LaneRecord<?> record, final Length position, final Integer counter) throws GTUException
134 {
135 Entry next;
136 do
137 {
138 next = super.getNext(record, position, counter);
139 }
140
141 while (next != null && first() != null);
142 return next;
143 }
144
145 }
146
147 }