View Javadoc
1   package org.opentrafficsim.road.gtu.lane.perception.headway;
2   
3   import java.util.SortedSet;
4   import java.util.TreeSet;
5   
6   import org.djunits.value.vdouble.scalar.Length;
7   import org.djunits.value.vdouble.scalar.Speed;
8   import org.opentrafficsim.core.Throw;
9   import org.opentrafficsim.core.gtu.GTUException;
10  
11  /**
12   * <p>
13   * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
14   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
15   * <p>
16   * @version $Revision$, $LastChangedDate$, by $Author$, initial version Jun 2, 2016 <br>
17   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
18   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
19   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
20   */
21  public class HeadwayConflict extends AbstractHeadway
22  {
23  
24      /** */
25      private static final long serialVersionUID = 20160602L;
26  
27      /** Conflict type. */
28      private final ConflictType conflictType;
29  
30      /** Conflict rule. */
31      private final ConflictRule conflictRule;
32  
33      /** Length of the conflict in the conflicting directions. */
34      private final Length conflictingLength;
35  
36      /**
37       * Set of conflicting GTU's <i>completely</i> upstream of the <i>start</i> of the conflict ordered close to far from the
38       * start of the conflict. Distance and overlap info concerns the conflict.
39       */
40      private final SortedSet<AbstractHeadwayGTU> upstreamConflictingGTUs;
41  
42      /**
43       * Set of conflicting GTU's (partially) downstream of the <i>start</i> of the conflict ordered close to far from the start
44       * of conflict. Distance and overlap info concerns the conflict.
45       */
46      private final SortedSet<AbstractHeadwayGTU> downstreamConflictingGTUs;
47  
48      /** Visibility on the conflicting lane within which conflicting vehicles are visible. */
49      private final Length conflictingVisibility;
50  
51      /** Speed limit on the conflicting lane. */
52      private final Speed conflictingSpeedLimit;
53  
54      /** Stop line on the own lane. */
55      private final HeadwayStopLine stopLine;
56  
57      /** Stop line on the conflicting lane. */
58      private final HeadwayStopLine conflictingStopLine;
59  
60      /**
61       * Constructor.
62       * @param conflictType conflict type
63       * @param conflictRule conflict rule
64       * @param id id
65       * @param distance distance
66       * @param length length of the conflict
67       * @param conflictingLength length of the conflict on the conflicting lane
68       * @param upstreamConflictingGTUs conflicting GTU's upstream of the <i>start</i> of the conflict
69       * @param downstreamConflictingGTUs conflicting GTU's downstream of the <i>start</i> of the conflict
70       * @param conflictingVisibility visibility on the conflicting lane within which conflicting vehicles are visible
71       * @param conflictingSpeedLimit speed limit on the conflicting lane
72       * @param stopLine stop line on the own lane
73       * @param conflictingStopLine stop line on the conflicting lane
74       * @throws GTUException when id is null, or parameters are inconsistent
75       */
76      @SuppressWarnings("checkstyle:parameternumber")
77      public HeadwayConflict(final ConflictType conflictType, final ConflictRule conflictRule, final String id,
78          final Length distance, final Length length, final Length conflictingLength,
79          final SortedSet<AbstractHeadwayGTU> upstreamConflictingGTUs,
80          final SortedSet<AbstractHeadwayGTU> downstreamConflictingGTUs, final Length conflictingVisibility,
81          final Speed conflictingSpeedLimit, final HeadwayStopLine stopLine, final HeadwayStopLine conflictingStopLine)
82          throws GTUException
83      {
84          super(ObjectType.CONFLICT, id, distance, length);
85          Throw.whenNull(conflictType, "Conflict type may not be null.");
86          Throw.whenNull(conflictRule, "Conflict rule may not be null.");
87          Throw.whenNull(id, "Conflict id may not be null.");
88          Throw.whenNull(distance, "Conflict distance may not be null.");
89          Throw.whenNull(conflictingLength, "Conflict length may not be null.");
90          Throw.whenNull(upstreamConflictingGTUs, "Upstreaem conflicting GTU's may not be null.");
91          Throw.whenNull(downstreamConflictingGTUs, "Downstream conflicting GTU's may not be null.");
92          Throw.whenNull(conflictingVisibility, "Conflict visibility may not be null.");
93          Throw.whenNull(conflictingSpeedLimit, "Conflict speed limit may not be null.");
94          this.conflictType = conflictType;
95          this.conflictRule = conflictRule;
96          this.conflictingLength = conflictingLength;
97          this.upstreamConflictingGTUs = upstreamConflictingGTUs;
98          this.downstreamConflictingGTUs = downstreamConflictingGTUs;
99          this.conflictingVisibility = conflictingVisibility;
100         this.conflictingSpeedLimit = conflictingSpeedLimit;
101         this.stopLine = stopLine;
102         this.conflictingStopLine = conflictingStopLine;
103     }
104 
105     /**
106      * Constructor without stop lines.
107      * @param conflictType conflict type
108      * @param conflictRule conflict rule
109      * @param id id
110      * @param distance distance
111      * @param length length of the conflict
112      * @param conflictingLength length of the conflict on the conflicting lane
113      * @param upstreamConflictingGTUs conflicting GTU's upstream of the <i>start</i> of the conflict
114      * @param downstreamConflictingGTUs conflicting GTU's downstream of the <i>start</i> of the conflict
115      * @param conflictingVisibility visibility on the conflicting lane within which conflicting vehicles are visible
116      * @param conflictingSpeedLimit speed limit on the conflicting lane
117      * @throws GTUException when id is null, or parameters are inconsistent
118      */
119     @SuppressWarnings("checkstyle:parameternumber")
120     public HeadwayConflict(final ConflictType conflictType, final ConflictRule conflictRule, final String id,
121         final Length distance, final Length length, final Length conflictingLength,
122         final SortedSet<AbstractHeadwayGTU> upstreamConflictingGTUs,
123         final SortedSet<AbstractHeadwayGTU> downstreamConflictingGTUs, final Length conflictingVisibility,
124         final Speed conflictingSpeedLimit) throws GTUException
125     {
126         this(conflictType, conflictRule, id, distance, length, conflictingLength, upstreamConflictingGTUs,
127             downstreamConflictingGTUs, conflictingVisibility, conflictingSpeedLimit, null, null);
128     }
129 
130     /**
131      * Returns the conflict type.
132      * @return conflict type
133      */
134     public final ConflictType getConflictType()
135     {
136         return this.conflictType;
137     }
138 
139     /**
140      * Returns whether this is a crossing conflict.
141      * @return whether this is a crossing conflict
142      */
143     public final boolean isCrossing()
144     {
145         return this.conflictType == ConflictType.CROSSING;
146     }
147 
148     /**
149      * Returns whether this is a merge conflict.
150      * @return whether this is a merge conflict
151      */
152     public final boolean isMerge()
153     {
154         return this.conflictType == ConflictType.MERGE;
155     }
156     
157     /**
158      * Returns whether this is a split conflict.
159      * @return whether this is a split conflict
160      */
161     public final boolean isSplit()
162     {
163         return this.conflictType == ConflictType.SPLIT;
164     }
165 
166     /**
167      * Returns the conflict rule.
168      * @return conflict rule
169      */
170     public final ConflictRule getConflictRule()
171     {
172         return this.conflictRule;
173     }
174 
175     /**
176      * Returns whether this is a priority conflict.
177      * @return whether this is a priority conflict
178      */
179     public final boolean isPriority()
180     {
181         return this.conflictRule == ConflictRule.PRIORITY;
182     }
183 
184     /**
185      * Returns whether this is a give-way conflict.
186      * @return whether this is a give-way conflict
187      */
188     public final boolean isGiveWay()
189     {
190         return this.conflictRule == ConflictRule.GIVE_WAY;
191     }
192 
193     /**
194      * Returns whether this is a stop conflict.
195      * @return whether this is a stop conflict
196      */
197     public final boolean isStop()
198     {
199         return this.conflictRule == ConflictRule.STOP;
200     }
201 
202     /**
203      * Returns whether this is a all-stop conflict.
204      * @return whether this is a all-stop conflict
205      */
206     public final boolean isAllStop()
207     {
208         return this.conflictRule == ConflictRule.ALL_STOP;
209     }
210 
211     /**
212      * Returns the length of the conflict on the conflicting lane.
213      * @return length of the conflict on the conflicting lane
214      */
215     public final Length getConflictingLength()
216     {
217         return this.conflictingLength;
218     }
219 
220     /**
221      * Returns a set of conflicting GTU's upstream of the <i>start</i> of the conflict ordered close to far from the conflict.
222      * @return set of conflicting GTU's upstream of the <i>start</i> of the conflict ordered close to far from the conflict
223      */
224     public final SortedSet<AbstractHeadwayGTU> getUpstreamConflictingGTUs()
225     {
226         return new TreeSet<>(this.upstreamConflictingGTUs);
227     }
228 
229     /**
230      * Returns a set of conflicting GTU's downstream of the <i>start</i> of the conflict ordered close to far from the conflict.
231      * Distance is given relative to the <i>end</i> of the conflict, or null for conflicting vehicles on the conflict. In the
232      * latter case the overlap is used.
233      * @return set of conflicting GTU's downstream of the <i>start</i> of the conflict ordered close to far from the conflict
234      */
235     public final SortedSet<AbstractHeadwayGTU> getDownstreamConflictingGTUs()
236     {
237         return new TreeSet<>(this.downstreamConflictingGTUs);
238     }
239 
240     /**
241      * Returns the visibility on the conflicting lane within which conflicting vehicles are visible. All upstream conflicting
242      * GTUs have a distance smaller than the visibility. Depending on a limited visibility, a certain (lower) speed may be
243      * required while approaching the conflict.
244      * @return visibility on the conflicting lane within which conflicting vehicles are visible
245      */
246     public final Length getConflictingVisibility()
247     {
248         return this.conflictingVisibility;
249     }
250 
251     /**
252      * Returns the speed limit on the conflicting lane.
253      * @return speed limit on the conflicting lane
254      */
255     public final Speed getConflictingSpeedLimit()
256     {
257         return this.conflictingSpeedLimit;
258     }
259 
260     /**
261      * Returns the stop line.
262      * @return stop line
263      */
264     public final HeadwayStopLine getStopLine()
265     {
266         return this.stopLine;
267     }
268 
269     /**
270      * Returns the stop line on the conflicting lane.
271      * @return stop line
272      */
273     public final HeadwayStopLine getConflictingStopLine()
274     {
275         return this.conflictingStopLine;
276     }
277 
278     /** {@inheritDoc} */
279     public final String toString()
280     {
281         return String.format("Headway %s to object %s of type %s", getDistance(), getId(), getObjectType());
282     }
283 
284     /**
285      * Type of conflict.
286      * <p>
287      * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
288      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
289      * <p>
290      * @version $Revision$, $LastChangedDate$, by $Author$, initial version Jun 2, 2016 <br>
291      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
292      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
293      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
294      */
295     public enum ConflictType
296     {
297         /** Crossing conflict. */
298         CROSSING,
299 
300         /** Merge conflict. */
301         MERGE,
302         
303         /** Split conflict. */
304         SPLIT;
305     }
306 
307     /**
308      * Rule of conflict.
309      * <p>
310      * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
311      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
312      * <p>
313      * @version $Revision$, $LastChangedDate$, by $Author$, initial version Jun 2, 2016 <br>
314      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
315      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
316      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
317      */
318     public enum ConflictRule
319     {
320         /** Have priority. */
321         PRIORITY,
322 
323         /** Give priority. */
324         GIVE_WAY,
325 
326         /** Stop and give priority. */
327         STOP,
328 
329         /** All-way stop. */
330         ALL_STOP;
331     }
332 
333 }