Behaviors
These stands one level above the actions. They provide a higher level decision that the actions then implement in order to propagate the simulation forward.
A behavior model can be interpreted as a control law. Given the current scene, representing all the vehicles present in the environment, a behavior model returns an action to execute.
Interface
We provide an interface to interact with behavior model or implement your own. To implement your own driver model you can create a type that inherits from the abstract type DriverModel. Then you can implement the following methods:
AutomotiveDrivingModels.DriverModel — TypeDriverModel{DriveAction}A DriverModel represents a specific driving behavior. It specifies the action taken by the agent at a given scene. The ation will be of type DriveAction. It can be interpreted as a distribution, the likelihood of taking a certain action in a given scene. The DriverModel type is an abstract type! Custom driver models should inherit from it.
AutomotiveDrivingModels.action_type — Methodaction_type(::DriverModel{A}) where {A}returns the type of the actions that are sampled from the model
AutomotiveDrivingModels.set_desired_speed! — Functionset_desired_speed!(model::DriverModel, v_des::Float64)Sets a desired speed. This method is relevant for models like IDM where the vehicle tracks a nominal speed.
reset_hidden_state!(model::DriverModel)Resets the hidden states of the model.
AutomotiveDrivingModels.observe! — Functionobserve!(model::DriverModel, scene, roadway, egoid)Observes the scene and updates the model states accordingly.
Base.rand — Methodrand(model::DriverModel)
rand(rng::AbstractRNG, model::DriverModel)Samples an action from the model.
observe! and rand are usually the most important methods to implement. observe! sets the model state in a given situation and rand allows to sample an action from the model.
Available Behaviors
AutomotiveDrivingModels.IntelligentDriverModel — TypeIntelligentDriverModel <: LaneFollowingDriverThe Intelligent Driver Model. A rule based driving model that is governed by parameter settings. The output is an longitudinal acceleration.
Here, we have extended IDM to the errorable IDM. If a standard deviation parameter is specified, then the output is a longitudinal acceleration sampled from a normal distribution around the non-errorable IDM output.
Fields
a::Float64 = NaNthe predicted acceleration i.e. the output of the modelσ::Float64 = NaNallows errorable IDM, optional stdev on top of the model, set to zero or NaN for deterministic behaviork_spd::Float64 = 1.0proportional constant for speed tracking when in freeflow [s⁻¹]δ::Float64 = 4.0acceleration exponentT::Float64 = 1.5desired time headway [s]v_des::Float64 = 29.0desired speed [m/s]s_min::Float64 = 5.0minimum acceptable gap [m]a_max::Float64 = 3.0maximum acceleration ability [m/s²]d_cmf::Float64 = 2.0comfortable deceleration m/s²d_max::Float64 = 9.0maximum deceleration m/s²
AutomotiveDrivingModels.Tim2DDriver — TypeTim2DDriverDriver that combines longitudinal driver and lateral driver into one model.
Constructors
Tim2DDriver(timestep::Float64;mlon::LaneFollowingDriver=IntelligentDriverModel(), mlat::LateralDriverModel=ProportionalLaneTracker(), mlane::LaneChangeModel=TimLaneChanger(timestep))Fields
mlon::LaneFollowingDriver = IntelligentDriverModel()Longitudinal driving modelmlat::LateralDriverModel = ProportionalLaneTracker()Lateral driving modelmlane::LaneChangeModel =TimLaneChangerLane change model
AutomotiveDrivingModels.PrincetonDriver — TypePrincetonDriver <: LaneFollowingDriverA lane following driver model that controls longitudinal speed by following a front car.
Fields
a::Float64σ::Float64 = NaNoptional stdev on top of the model, set to zero or NaN for deterministic behaviork::Float64 = 1.0proportional constant for speed tracking [s⁻¹]v_des::Float64 = 29.0desired speed [m/s]
AutomotiveDrivingModels.SidewalkPedestrianModel — TypeSidewalkPedestrianModelWalks along the sidewalk until approaching the crosswalk. Waits for the cars to pass, then crosses.
Fields
timestep::Float64phase::Int = APPROACHINGttc_threshold::Float64 = clamp(rand(Normal(4.0, 2.5)), 1.0, Inf)crosswalk::Lane = Lane()sw_origin::Lane = Lane()sw_dest::Lane = Lane()a::PedestrianLatLonAccel = PedestrianLatLonAccel(0.0, 0.0, sw_origin)makes you turn, left/rightσ::Float64 = NaNoptional stdev on top of the model, set to zero or NaN for deterministicv_des_approach::Float64 = clamp(rand(Normal(1.28, 0.18)), 0.0, Inf)Based on Feliciani et al. resultsv_des_appraise::Float64 = clamp(rand(Normal(0.94, 0.21)), 0.0, Inf)v_des_cross::Float64 = clamp(rand(Normal(1.35, 0.18)), 0.0, Inf)ped_accel::Float64 = 0.30ped_decel::Float64 = -0.50
AutomotiveDrivingModels.StaticDriver — TypeStaticDriver{A,P<:ContinuousMultivariateDistribution} <: DriverModel{A}A driver model where actions are always sampled by the same distribution specified by the field distribution.
Fields
distribution::P
Lane change helper functions
These are not standalone driver models but are used by the driver models to do lane changing and lateral control.
AutomotiveDrivingModels.MOBIL — TypeMOBILSee Treiber & Kesting, 'Modeling Lane-Changing Decisions with MOBIL'
Constructor
MOBIL(timestep::Float64;mlon::LaneFollowingDriver=IntelligentDriverModel(),safe_decel::Float64=2.0, politeness::Float64=0.35,advantage_threshold::Float64=0.1)Fields
dir::Intmlon::LaneFollowingDriver=IntelligentDriverModel()safe_decel::Float64=2.0politeness::Float64=0.35advantage_threshold::Float64=0.1
AutomotiveDrivingModels.TimLaneChanger — TypeTimLaneChangerA simple lane change behavior that changes lanes whenever the lead car is going slower than our desired speed. Lane changes are made when there is an available lane, fore/rear gaps exceed our thresholds, we are faster than a rear vehicle in the target lane, and any lead vehicle in the target lane is faster than we can currently go.
Has not been published anywhere, so first use in a paper would have to describe this. See MOBIL if you want a lane changer you can cite.
Constructors
TimLaneChanger(timestep::Float64;v_des::Float64=29.0,rec::SceneRecord=SceneRecord(2,timestep),threshold_fore::Float64 = 50.0,threshold_lane_change_gap_fore::Float64 = 10.0, threshold_lane_change_gap_rear::Float64 = 10.0,dir::Int=DIR_MIDDLE)Fields
dir::Int = DIR_MIDDLEthe desired lane to go to eg: left,middle (i.e. stay in same lane) or rightrec::SceneRecordTODOv_des::Float64 = 29.0desired velocitythreshold_fore::Float64 = 50.0Distance from lead vehiclethreshold_lane_change_gap_fore::Float64 = 10.0Space in frontthreshold_lane_change_gap_rear::Float64 = 10.0Space rear
AutomotiveDrivingModels.ProportionalLaneTracker — TypeProportionalLaneTrackerA controller that executes the lane change decision made by the lane change models
Constructors
ProportionalLaneTracker(;σ::Float64 = NaN,kp::Float64 = 3.0,kd::Float64 = 2.0)Fields
a::Float64 = NaNpredicted accelerationσ::Float64 = NaNoptional stdev on top of the model, set to zero or NaN for deterministic behaviorkp::Float64 = 3.0proportional constant for lane trackingkd::Float64 = 2.0derivative constant for lane tracking
Longitudinal helper functions
These are not standalone driver models but are used to do longitudinal control by the driver models.
AutomotiveDrivingModels.ProportionalSpeedTracker — TypeProportionalSpeedTracker <: LaneFollowingDriverLongitudinal proportional speed control.
Fields
a::Float64 = NaNpredicted accelerationσ::Float64 = NaNoptional stdev on top of the model, set to zero or NaN for deterministic behaviork::Float64 = 1.0proportional constant for speed tracking [s⁻¹]v_des::Float64 = 29.0desired speed [m/s]