DefaultSimplePerception.java
package org.opentrafficsim.road.gtu.lane.perception.categories;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import org.djunits.value.vdouble.scalar.Length;
import org.djunits.value.vdouble.scalar.Speed;
import org.opentrafficsim.base.parameters.ParameterException;
import org.opentrafficsim.core.gtu.GTUException;
import org.opentrafficsim.core.network.LateralDirectionality;
import org.opentrafficsim.core.network.NetworkException;
import org.opentrafficsim.road.gtu.lane.perception.headway.Headway;
import org.opentrafficsim.road.gtu.lane.tactical.LanePathInfo;
import org.opentrafficsim.road.network.lane.Lane;
/**
* Default perception category.
* <p>
* Copyright (c) 2013-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
* BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
* <p>
* @version $Revision$, $LastChangedDate$, by $Author$, initial version 14 feb. 2017 <br>
* @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
* @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
* @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
*/
public interface DefaultSimplePerception extends LaneBasedPerceptionCategory
{
/**
* @throws GTUException when the GTU was not initialized yet.
* @throws NetworkException when the speed limit for a GTU type cannot be retrieved from the network.
* @throws ParameterException in case of not being able to retrieve parameter ParameterTypes.LOOKAHEAD
*/
void updateLanePathInfo() throws GTUException, NetworkException, ParameterException;
/**
* Update the forward headway and first object (a GTU) in front.
* @throws GTUException when the GTU was not yet initialized
* @throws ParameterException if parameter is not defined or out of bounds
* @throws NetworkException in case of network exception
*/
void updateForwardHeadwayGTU() throws GTUException, NetworkException, ParameterException;
/**
* Update the forward headway and first object (but not a GTU) in front.
* @throws GTUException when the GTU was not yet initialized
* @throws ParameterException if parameter is not defined or out of bounds
* @throws NetworkException in case of network exception
*/
void updateForwardHeadwayObject() throws GTUException, NetworkException, ParameterException;
/**
* Update the backward headway and first object (e.g., a GTU) behind.
* @throws GTUException when the GTU was not yet initialized
* @throws ParameterException if parameter is not defined or out of bounds
* @throws NetworkException in case of network exception
*/
void updateBackwardHeadway() throws GTUException, ParameterException, NetworkException;
/**
* Update the accessible adjacent lanes.
* @throws GTUException when the GTU was not yet initialized
*/
default void updateAccessibleAdjacentLanes() throws GTUException
{
updateAccessibleAdjacentLanesLeft();
updateAccessibleAdjacentLanesRight();
}
/**
* Update the accessible adjacent lanes on the left.
* @throws GTUException when the GTU was not yet initialized
*/
void updateAccessibleAdjacentLanesLeft() throws GTUException;
/**
* Update the accessible adjacent lanes on the right.
* @throws GTUException when the GTU was not yet initialized
*/
void updateAccessibleAdjacentLanesRight() throws GTUException;
/**
* Update the objects (e.g., GTUs) in parallel, in front and behind on the left neighboring lane, with their headway
* relative to our GTU, and information about the status of the adjacent objects.
* @throws GTUException when the GTU was not yet initialized
* @throws ParameterException if parameter is not defined or out of bounds
* @throws NetworkException in case of network exception
*/
void updateNeighboringHeadwaysLeft() throws GTUException, ParameterException, NetworkException;
/**
* Update the objects (e.g., GTUs) in parallel, in front and behind on the right neighboring lane, with their headway
* relative to our GTU, and information about the status of the adjacent objects.
* @throws GTUException when the GTU was not yet initialized
* @throws ParameterException if parameter is not defined or out of bounds
* @throws NetworkException in case of network exception
*/
void updateNeighboringHeadwaysRight() throws GTUException, ParameterException, NetworkException;
/**
* Update the objects (e.g., GTUs) in parallel, in front and behind for the lane in the given direction, with their headway
* relative to our GTU, and information about the status of the adjacent objects.
* @param lateralDirection LateralDirectionality; the direction to update the parallel headway collection for
* @throws GTUException when the GTU was not yet initialized
* @throws ParameterException if parameter is not defined or out of bounds
* @throws NetworkException in case of network exception
*/
void updateNeighboringHeadways(LateralDirectionality lateralDirection)
throws GTUException, ParameterException, NetworkException;
/**
* Update the parallel objects (e.g., GTUs) on the left, with information about their status and parallel overlap with our
* GTU.
* @throws GTUException when the GTU was not yet initialized
*/
void updateParallelHeadwaysLeft() throws GTUException;
/**
* Update the parallel objects (e.g., GTUs) on the right, with information about their status and parallel overlap with our
* GTU.
* @throws GTUException when the GTU was not yet initialized
*/
void updateParallelHeadwaysRight() throws GTUException;
/**
* Update the parallel objects (e.g., GTUs) for the given direction, with information about their status and parallel
* overlap with our GTU.
* @param lateralDirection LateralDirectionality; the direction to return the neighboring headway collection for
* @throws GTUException when the GTU was not yet initialized
*/
void updateParallelHeadways(LateralDirectionality lateralDirection) throws GTUException;
/**
* Update speedLimit.
* @throws GTUException when the GTU was not yet initialized
* @throws NetworkException in case of network exception
*/
void updateSpeedLimit() throws GTUException, NetworkException;
/**
* Retrieve the last perceived lane path info.
* @return LanePathInfo
*/
LanePathInfo getLanePathInfo();
/**
* @return forwardHeadway, the forward headway and first object (GTU) in front
*/
Headway getForwardHeadwayGTU();
/**
* @return forwardHeadway, the forward headway and first object (not a GTU) in front
*/
Headway getForwardHeadwayObject();
/**
* @return backwardHeadwayGTU, the backward headway and first object (e.g., a GTU) behind
*/
Headway getBackwardHeadway();
/**
* @return accessibleAdjacentLanesLeft, the accessible adjacent lanes on the left
*/
Map<Lane, Set<Lane>> getAccessibleAdjacentLanesLeft();
/**
* @return accessibleAdjacentLanesRight, the accessible adjacent lanes on the right
*/
Map<Lane, Set<Lane>> getAccessibleAdjacentLanesRight();
/**
* @param lateralDirection LateralDirectionality; the direction to return the accessible adjacent lane map for
* @return the accessible adjacent lane map for the given direction
*/
Map<Lane, Set<Lane>> getAccessibleAdjacentLanes(LateralDirectionality lateralDirection);
/**
* @return neighboringHeadwaysLeft, the objects (e.g., GTUs) in parallel, in front and behind on the left neighboring lane,
* with their headway relative to our GTU, and information about the status of the adjacent objects
*/
Collection<Headway> getNeighboringHeadwaysLeft();
/**
* @return neighboringHeadwaysRight, the objects (e.g., GTUs) in parallel, in front and behind on the right neighboring
* lane, with their headway relative to our GTU, and information about the status of the adjacent objects
*/
Collection<Headway> getNeighboringHeadwaysRight();
/**
* @param lateralDirection LateralDirectionality; the direction to return the parallel headway collection for
* @return the the objects (e.g., GTUs) in parallel, in front and behind for the lane in the given direction, with their
* headway relative to our GTU, and information about the status of the adjacent objects
*/
Collection<Headway> getNeighboringHeadways(LateralDirectionality lateralDirection);
/**
* @return parallelHeadwaysLeft, the parallel objects (e.g., GTUs) on the left, with information about their status and
* parallel overlap with our GTU.
*/
Collection<Headway> getParallelHeadwaysLeft();
/**
* @return parallelHeadwaysRight, the parallel objects (e.g., GTUs) on the right, with information about their status and
* parallel overlap with our GTU.
*/
Collection<Headway> getParallelHeadwaysRight();
/**
* @param lateralDirection LateralDirectionality; the direction to return the neighboring headway collection for
* @return the the parallel objects (e.g., GTUs) for the given direction, with information about their status and parallel
* overlap with our GTU.
*/
Collection<Headway> getParallelHeadways(LateralDirectionality lateralDirection);
/**
* @return speedLimit
*/
Speed getSpeedLimit();
/** {@inheritDoc} */
@Override
default void updateAll() throws GTUException, ParameterException, NetworkException
{
updateLanePathInfo();
updateForwardHeadwayGTU();
updateForwardHeadwayObject();
updateBackwardHeadway();
updateAccessibleAdjacentLanesLeft();
updateAccessibleAdjacentLanesRight();
updateNeighboringHeadwaysLeft();
updateNeighboringHeadwaysRight();
updateParallelHeadwaysLeft();
updateParallelHeadwaysRight();
updateSpeedLimit();
}
/**
* Determine whether there is a lane to the left or to the right of this lane, which is accessible from this lane, or null
* if no lane could be found. The method takes the LongitidinalDirectionality of the lane into account. In other words, if
* we drive FORWARD and look for a lane on the LEFT, and there is a lane but the Directionality of that lane is not FORWARD
* or BOTH, null will be returned.<br>
* A lane is called adjacent to another lane if the lateral edges are not more than a delta distance apart. This means that
* a lane that <i>overlaps</i> with another lane is <b>not</b> returned as an adjacent lane. <br>
* The algorithm also looks for RoadMarkerAcross elements between the lanes to determine the lateral permeability for a GTU.
* A RoadMarkerAcross is seen as being between two lanes if its center line is not more than delta distance from the
* relevant lateral edges of the two adjacent lanes. <br>
* When there are multiple lanes that are adjacent, which could e.g. be the case if an overlapping tram lane and a car lane
* are adjacent to the current lane, the widest lane that best matches the GTU accessibility of the provided GTUType is
* returned. <br>
* <b>Note:</b> LEFT is seen as a negative lateral direction, RIGHT as a positive lateral direction. <br>
* FIXME In other places in OTS LEFT is positive (and RIGHT is negative). This should be made more consistent.
* @param currentLane Lane; the lane to look for the best accessible adjacent lane
* @param lateralDirection LateralDirectionality; the direction (LEFT, RIGHT) to look at
* @param longitudinalPosition Length; the position of the GTU along <cite>currentLane</cite>
* @return the lane if it is accessible, or null if there is no lane, it is not accessible, or the driving direction does
* not match.
*/
Lane bestAccessibleAdjacentLane(Lane currentLane, LateralDirectionality lateralDirection, Length longitudinalPosition);
}