1 package org.opentrafficsim.road.gtu.lane.perception.headway; 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.core.perception.PerceivedObject; 7 8 /** 9 * Interface for a reference to information about a (lane based) GTU and a headway. The Headway can store information about GTUs 10 * or objects ahead of the reference GTU, behind the reference GTU, or (partially) parallel to the reference GTU. In addition to 11 * the (perceived) headway, several other pieces of information can be stored, such as (perceived) speed, (perceived) 12 * acceleration, (perceived) turn indicators, and (perceived) braking lights. <br> 13 * Special care must be taken in curves when perceiving headway of a GTU or object on an adjacent lane.The question is whether 14 * we perceive the parallel or ahead/behind based on a line perpendicular to the front/back of the GTU (rectangular), or 15 * perpendicular to the center line of the lane (wedge-shaped in case of a curve). The difficulty of a wedge-shaped situation is 16 * that reciprocity might be violated: in case of a clothoid, for instance, it is not sure that the point on the center line 17 * when projected from lane 1 to lane 2 is the same as the projection from lane 2 to lane 1. The same holds for shapes with 18 * sharp bends. Therefore, algorithms implementing headway should only project the <i>reference point</i> of the reference GTU 19 * on the center line of the adjacent lane, and then calculate the forward position and backward position on the adjacent lane 20 * based on the reference point. Still, our human perception of what is parallel and what not, is not reflected by fractional 21 * positions. See examples in 22 * <a href= "http://simulation.tudelft.nl:8085/browse/OTS-113">http://simulation.tudelft.nl:8085/browse/OTS-113</a>. 23 * <p> 24 * Copyright (c) 2013-2017 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br> 25 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 26 * <p> 27 * @version $Revision: 1368 $, $LastChangedDate: 2015-09-02 00:20:20 +0200 (Wed, 02 Sep 2015) $, by $Author: averbraeck $, 28 * initial version 11 feb. 2015 <br> 29 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 30 * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a> 31 */ 32 public interface Headway extends PerceivedObject, Comparable<Headway> 33 { 34 /** the object types that can be distinguished for headway. */ 35 enum ObjectType 36 { 37 /** the observed object for headway is a GTU. */ 38 GTU, 39 40 /** the observed object for headway is a traffic light. */ 41 TRAFFICLIGHT, 42 43 /** the observed object for headway is a generic object. */ 44 OBJECT, 45 46 /** there is no observed object, just a distance. */ 47 DISTANCEONLY, 48 49 /** intersection conflict. */ 50 CONFLICT, 51 52 /** stop line. */ 53 STOPLINE, 54 55 /** bus stop. */ 56 BUSSTOP; 57 58 /** @return whether this object is a GTU or not. */ 59 public boolean isGtu() 60 { 61 return this.equals(GTU); 62 } 63 64 /** @return whether this object is a GTU or not. */ 65 public boolean isTrafficLight() 66 { 67 return this.equals(TRAFFICLIGHT); 68 } 69 70 /** @return whether this object is an object or not. */ 71 public boolean isObject() 72 { 73 return this.equals(OBJECT); 74 } 75 76 /** @return whether no object was observed and only a distance was stored. */ 77 public boolean isDistanceOnly() 78 { 79 return this.equals(DISTANCEONLY); 80 } 81 82 /** @return whether this object is a conflict or not. */ 83 public boolean isConflict() 84 { 85 return this.equals(CONFLICT); 86 } 87 88 /** @return whether this object is a stop line or not. */ 89 public boolean isStopLine() 90 { 91 return this.equals(STOPLINE); 92 } 93 94 /** @return whether this object is a bus stop or not. */ 95 public boolean isBusStop() 96 { 97 return this.equals(BUSSTOP); 98 } 99 100 } 101 102 /** 103 * @return String; the id of the other object for comparison purposes, cannot be null. 104 */ 105 String getId(); 106 107 /** 108 * @return Length; the length of the other object; can be null if unknown. 109 */ 110 Length getLength(); 111 112 /** 113 * @return Speed; the (perceived) speed of the other object; can be null if unknown. 114 */ 115 Speed getSpeed(); 116 117 /** 118 * Retrieve the strongly typed distance to the other object. 119 * @return Length; the distance to the object, return value null indicates that the other object is parallel to the 120 * reference object 121 */ 122 Length getDistance(); 123 124 /** 125 * @return Length; the (perceived) object Type, can be null if no object type unknown. 126 */ 127 ObjectType getObjectType(); 128 129 /** 130 * @return Acceleration; acceleration the (perceived) acceleration of the other object; can be null if unknown. 131 */ 132 Acceleration getAcceleration(); 133 134 /** 135 * Return the (perceived) front overlap to the other object. This value should be null if there is no overlap. In the figure 136 * for two GTUs below, it is distance c, positive for GTU1, negative for GTU2. 137 * 138 * <pre> 139 * ---------- 140 * | GTU 1 | -----> 141 * ---------- 142 * --------------- 143 * | GTU 2 | -----> 144 * --------------- 145 * | a | b | c | 146 * </pre> 147 * 148 * @return Length; the (perceived) front overlap to the other object or null if there is no overlap. 149 */ 150 Length getOverlapFront(); 151 152 /** 153 * Return the (perceived) rear overlap to the other object. This value should be null if there is no overlap.In the figure 154 * below for two GTUs, it is distance a, positive for GTU1, negative for GTU2. 155 * 156 * <pre> 157 * ---------- 158 * | GTU 1 | -----> 159 * ---------- 160 * --------------- 161 * | GTU 2 | -----> 162 * --------------- 163 * | a | b | c | 164 * </pre> 165 * 166 * @return Length; the (perceived) rear overlap to the other object or null if there is no overlap. 167 */ 168 Length getOverlapRear(); 169 170 /** 171 * Return the (perceived) overlap with the other object. This value should be null if there is no overlap. In the figure 172 * below for two GTUs, it is distance b, positive for GTU1 and GTU2. 173 * 174 * <pre> 175 * ---------- 176 * | GTU 1 | -----> 177 * ---------- 178 * --------------- 179 * | GTU 2 | -----> 180 * --------------- 181 * | a | b | c | 182 * </pre> 183 * 184 * @return Length, the (perceived) overlap with the other object or null if there is no overlap. 185 */ 186 Length getOverlap(); 187 188 /** 189 * @return whether the other object is in front of the reference object. 190 */ 191 boolean isAhead(); 192 193 /** 194 * @return whether the other object is behind the reference object. 195 */ 196 boolean isBehind(); 197 198 /** 199 * @return whether the other object is parallel the reference object. 200 */ 201 boolean isParallel(); 202 203 /** {@inheritDoc} */ 204 @Override 205 default int compareTo(Headway headway) 206 { 207 if (getDistance() == null && headway.getDistance() == null) 208 { 209 return getOverlapFront().compareTo(headway.getOverlapFront()); 210 } 211 else if (getDistance() == null) 212 { 213 return -1; 214 } 215 else if (headway.getDistance() == null) 216 { 217 return 1; 218 } 219 return getDistance().compareTo(headway.getDistance()); 220 } 221 }