1 package org.opentrafficsim.road.gtu.lane.perception;
2
3 import org.djunits.value.vdouble.scalar.Length;
4 import org.djunits.value.vdouble.scalar.Time;
5 import org.opentrafficsim.core.gtu.behavioralcharacteristics.ParameterException;
6 import org.opentrafficsim.core.gtu.behavioralcharacteristics.ParameterTypes;
7 import org.opentrafficsim.core.gtu.perception.AbstractPerception;
8 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
9
10 /**
11 * The perception module of a GTU based on lanes. It is responsible for perceiving (sensing) the environment of the GTU, which
12 * includes the locations of other GTUs. Perception is done at a certain time, and the perceived information might have a
13 * limited validity. In that sense, Perception is stateful. Information can be requested as often as needed, but will only be
14 * recalculated when asked explicitly. This abstract class provides the building blocks for lane-based perception. <br>
15 * Perception for lane-based GTUs involves information about GTUs in front of the owner GTU on the same lane (the 'leader' GTU),
16 * parallel vehicles (important if we want to change lanes), distance to other vehicles on parallel lanes, as well in front as
17 * to the back (important if we want to change lanes), and information about obstacles, traffic lights, speed signs, and ending
18 * lanes.
19 * <p>
20 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
21 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
22 * </p>
23 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $,
24 * initial version Nov 15, 2015 <br>
25 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
26 * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
27 * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
28 */
29 public abstract class AbstractLanePerception extends AbstractPerception implements LanePerception
30 {
31
32 /** */
33 private static final long serialVersionUID = 20151128L;
34
35 /** Lane structure to perform the perception with. */
36 private LaneStructure laneStructure = null;
37
38 /** Most recent update time of lane structure. */
39 private Time updateTime = null;
40
41 /**
42 * Create a new LanePerception module. Because the constructor is often called inside the constructor of a GTU, this
43 * constructor does not ask for the pointer to the GTU, as it is often impossible to provide at the time of construction.
44 * Use the setter of the GTU instead.
45 * @param gtu GTU
46 */
47 public AbstractLanePerception(final LaneBasedGTU gtu)
48 {
49 super(gtu);
50 }
51
52 /** {@inheritDoc} */
53 @Override
54 public final LaneBasedGTU getGtu()
55 {
56 return (LaneBasedGTU) super.getGtu();
57 }
58
59 /** {@inheritDoc} */
60 @Override
61 public final LaneStructure getLaneStructure() throws ParameterException
62 {
63 if (this.laneStructure == null || this.updateTime.lt(getGtu().getSimulator().getSimulatorTime().getTime()))
64 {
65 // downstream structure length
66 Length down = getGtu().getBehavioralCharacteristics().getParameter(ParameterTypes.PERCEPTION);
67 // upstream structure length
68 Length up = getGtu().getBehavioralCharacteristics().getParameter(ParameterTypes.LOOKBACK);
69 // structure length downstream of split on link not on route
70 Length downSplit = getGtu().getBehavioralCharacteristics().getParameter(ParameterTypes.LOOKAHEAD);
71 // structure length upstream of merge on link not on route
72 Length upMerge = Length.max(up, downSplit);
73 if (this.laneStructure != null)
74 {
75 // TODO update lane structure
76
77 }
78 else
79 {
80 // TODO create lane structure
81
82 }
83 // TODO possibly optimize by using a 'singleton' lane structure source
84 this.updateTime = getGtu().getSimulator().getSimulatorTime().getTime();
85 }
86 return this.laneStructure;
87 }
88
89 }