Class CarFollowingUtil

java.lang.Object
org.opentrafficsim.road.gtu.lane.tactical.util.CarFollowingUtil

public final class CarFollowingUtil extends Object
Static methods regarding car-following for composition in tactical planners.

Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
BSD-style license. See OpenTrafficSim License.

Author:
Alexander Verbraeck, Wouter Schakel
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
    Simple headway implementation for minimum car-following information.
  • Method Summary

    Modifier and Type
    Method
    Description
    static org.djunits.value.vdouble.scalar.Acceleration
    approachTargetSpeed(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo, org.djunits.value.vdouble.scalar.Length distance, org.djunits.value.vdouble.scalar.Speed targetSpeed)
    Returns an acceleration based on the car-following model in order to adjust the speed to a given value at some location ahead.
    static org.djunits.value.vdouble.scalar.Acceleration
    constantAccelerationStop(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, org.djunits.value.vdouble.scalar.Length distance)
    Return constant acceleration in order to stop in specified distance.
    static org.djunits.value.vdouble.scalar.Acceleration
    followSingleLeader(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo, org.djunits.value.vdouble.scalar.Length distance, org.djunits.value.vdouble.scalar.Speed leaderSpeed)
    Follow a set of headway GTUs.
    static org.djunits.value.vdouble.scalar.Acceleration
    followSingleLeader(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo, HeadwayGtu leader)
    Follow a set of headway GTUs.
    static org.djunits.value.vdouble.scalar.Acceleration
    freeAcceleration(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo)
    Calculate free acceleration.
    static org.djunits.value.vdouble.scalar.Acceleration
    stop(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo, org.djunits.value.vdouble.scalar.Length distance)
    Stop within given distance.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Method Details

    • followSingleLeader

      public static org.djunits.value.vdouble.scalar.Acceleration followSingleLeader(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo, org.djunits.value.vdouble.scalar.Length distance, org.djunits.value.vdouble.scalar.Speed leaderSpeed) throws org.opentrafficsim.base.parameters.ParameterException
      Follow a set of headway GTUs.
      Parameters:
      carFollowingModel - CarFollowingModel; car-following model
      parameters - Parameters; parameters
      speed - Speed; current speed
      speedLimitInfo - SpeedLimitInfo; speed limit info
      distance - Length; distance
      leaderSpeed - Speed; speed of the leader
      Returns:
      acceleration for following the leader
      Throws:
      org.opentrafficsim.base.parameters.ParameterException - if a parameter is not given or out of bounds
    • followSingleLeader

      public static org.djunits.value.vdouble.scalar.Acceleration followSingleLeader(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo, HeadwayGtu leader) throws org.opentrafficsim.base.parameters.ParameterException
      Follow a set of headway GTUs.
      Parameters:
      carFollowingModel - CarFollowingModel; car-following model
      parameters - Parameters; parameters
      speed - Speed; current speed
      speedLimitInfo - SpeedLimitInfo; speed limit info
      leader - HeadwayGtu; leader
      Returns:
      acceleration for following the leader
      Throws:
      org.opentrafficsim.base.parameters.ParameterException - if a parameter is not given or out of bounds
    • stop

      public static org.djunits.value.vdouble.scalar.Acceleration stop(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo, org.djunits.value.vdouble.scalar.Length distance) throws org.opentrafficsim.base.parameters.ParameterException
      Stop within given distance.
      Parameters:
      carFollowingModel - CarFollowingModel; car-following model
      parameters - Parameters; parameters
      speed - Speed; current speed
      speedLimitInfo - SpeedLimitInfo; speed limit info
      distance - Length; distance to stop over
      Returns:
      acceleration to stop over distance
      Throws:
      org.opentrafficsim.base.parameters.ParameterException - if a parameter is not given or out of bounds
    • constantAccelerationStop

      public static org.djunits.value.vdouble.scalar.Acceleration constantAccelerationStop(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, org.djunits.value.vdouble.scalar.Length distance) throws org.opentrafficsim.base.parameters.ParameterException
      Return constant acceleration in order to stop in specified distance. The car-following model is used to determine the stopping distance (i.e. distance remaining at stand still, e.g. 1-3m).
      Parameters:
      carFollowingModel - CarFollowingModel; car-following model
      parameters - Parameters; parameters
      speed - Speed; current speed
      distance - Length; distance to stop over
      Returns:
      constant acceleration in order to stop in specified distance
      Throws:
      org.opentrafficsim.base.parameters.ParameterException - on missing parameter
    • freeAcceleration

      public static org.djunits.value.vdouble.scalar.Acceleration freeAcceleration(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo) throws org.opentrafficsim.base.parameters.ParameterException
      Calculate free acceleration.
      Parameters:
      carFollowingModel - CarFollowingModel; car-following model
      parameters - Parameters; parameters
      speed - Speed; current speed
      speedLimitInfo - SpeedLimitInfo; speed limit info
      Returns:
      acceleration free acceleration
      Throws:
      org.opentrafficsim.base.parameters.ParameterException - if a parameter is not given or out of bounds
    • approachTargetSpeed

      public static org.djunits.value.vdouble.scalar.Acceleration approachTargetSpeed(CarFollowingModel carFollowingModel, org.opentrafficsim.base.parameters.Parameters parameters, org.djunits.value.vdouble.scalar.Speed speed, SpeedLimitInfo speedLimitInfo, org.djunits.value.vdouble.scalar.Length distance, org.djunits.value.vdouble.scalar.Speed targetSpeed) throws org.opentrafficsim.base.parameters.ParameterException
      Returns an acceleration based on the car-following model in order to adjust the speed to a given value at some location ahead. This is done by placing a virtual vehicle somewhere near the location. Both the location and speed of this virtual vehicle are dynamically adjusted to resemble a car-following situation. To explain, first consider the situation where a virtual vehicle is placed at the target speed and such that the equilibrium headway is in line with the location:
       
        ___    location of target speed --)|        ___
       |___|(--------------s--------------) (--h--)|___| ))) vTar
       
      Here, s is the distance to the target speed, and h is the desired headway if the vehicle would drive at the target speed vTar.

      In this way car-following models will first underestimate the required deceleration, as the virtual vehicle is actually stationary and does not move with vTar at all. Because of this underestimation, strong deceleration is required later. This behavior is not in line with the sensitivity parameters of the car-following model.

      To correct for the fact that the virtual vehicle is actually not moving, the speed difference should be larger, i.e. the speed of the virtual vehicle vTar' should be lower. We require:
      • if v = vTar then vTar' = vTar, otherwise there is an incentive to accelerate or decelerate for no good reason
      • if vTar ~ 0 then vTar' ~ 0, as car-following models are suitable for stopping and need no additional incentive to decelerate in such cases
      • if 0 < vTar < v then vTar' < vTar, introducing additional deceleration to compensate for the fact that the virtual vehicle does not move
      These requirements are met by vTar' = vTar * (vTar/v) = vTar^2/v.

      Furthermore, if v < vTar we get vTar' > vTar leading to additional acceleration. Acceleration is then appropriate, and possibly limited by a free term in the car-following model.

      The virtual vehicle is thus placed with speed vTar' at a distance s + h' where h' is the desired headway if the vehicle would drive at speed vTar'. Both vTar' and h' depend on the current speed of the vehicle, so the virtual vehicle in this case actually moves, but not with vTar.

      This approach has been tested with the IDM+ to deliver decelerations in line with the parameters. On a plane with initial speed ranging from 0 to 33.33m/s and a target speed in 300m also ranging from 0 to 33.33m/s, strongest deceleration is equal to the car-following model stopping from 33.33m/s to a stand-still vehicle in 300m (+ stopping distance of 3m). Throughout the plane the maximum deceleration of each scenario is close to this value, unless the initial speed is so low, and the target speed is so high, that such levels of deceleration are never required.

      Parameters:
      carFollowingModel - CarFollowingModel; car-following model to use
      parameters - Parameters; parameters
      speed - Speed; current speed
      speedLimitInfo - SpeedLimitInfo; info regarding the desired speed for car-following
      distance - Length; distance to the location of the target speed
      targetSpeed - Speed; target speed
      Returns:
      acceleration acceleration based on the car-following model in order to adjust the speed
      Throws:
      org.opentrafficsim.base.parameters.ParameterException - if parameter exception occurs
      NullPointerException - if any input is null
      IllegalArgumentException - if the distance or target speed is not at least 0