@ -7,21 +7,17 @@ from selfdrive.modeld.constants import T_IDXS
LongCtrlState = car . CarControl . Actuators . LongControlState
LongCtrlState = car . CarControl . Actuators . LongControlState
STOPPING_TARGET_SPEED_OFFSET = 0.01
# As per ISO 15622:2018 for all speeds
# As per ISO 15622:2018 for all speeds
ACCEL_MIN_ISO = - 3.5 # m/s^2
ACCEL_MIN_ISO = - 3.5 # m/s^2
ACCEL_MAX_ISO = 2.0 # m/s^2
ACCEL_MAX_ISO = 2.0 # m/s^2
def long_control_state_trans ( CP , active , long_control_state , v_ego , v_target_future , v_pid ,
def long_control_state_trans ( CP , active , long_control_state , v_ego , v_target_future ,
output_accel , brake_pressed , cruise_standstill , min_speed_can ) :
output_accel , brake_pressed , cruise_standstill ) :
""" Update longitudinal control state machine """
""" Update longitudinal control state machine """
stopping_target_speed = min_speed_can + STOPPING_TARGET_SPEED_OFFSET
stopping_condition = ( v_ego < 2.0 and cruise_standstill ) or \
stopping_condition = ( v_ego < 2.0 and cruise_standstill ) or \
( v_ego < CP . vEgoStopping and
( v_ego < CP . vEgoStopping and
( ( v_pid < stopping_target_speed and v_target_future < stopping_target_speed ) or
( v_target_future < CP . vEgoStopping or brake_pressed ) )
brake_pressed ) )
starting_condition = v_target_future > CP . vEgoStarting and not cruise_standstill
starting_condition = v_target_future > CP . vEgoStarting and not cruise_standstill
@ -91,8 +87,8 @@ class LongControl():
# Update state machine
# Update state machine
output_accel = self . last_output_accel
output_accel = self . last_output_accel
self . long_control_state = long_control_state_trans ( CP , active , self . long_control_state , CS . vEgo ,
self . long_control_state = long_control_state_trans ( CP , active , self . long_control_state , CS . vEgo ,
v_target_future , self . v_pid , output_accel ,
v_target_future , output_accel ,
CS . brakePressed , CS . cruiseState . standstill , CP . minSpeedCan )
CS . brakePressed , CS . cruiseState . standstill )
if self . long_control_state == LongCtrlState . off or CS . gasPressed :
if self . long_control_state == LongCtrlState . off or CS . gasPressed :
self . reset ( CS . vEgo )
self . reset ( CS . vEgo )
@ -119,7 +115,6 @@ class LongControl():
if not CS . standstill or output_accel > CP . stopAccel :
if not CS . standstill or output_accel > CP . stopAccel :
output_accel - = CP . stoppingDecelRate * DT_CTRL
output_accel - = CP . stoppingDecelRate * DT_CTRL
output_accel = clip ( output_accel , accel_limits [ 0 ] , accel_limits [ 1 ] )
output_accel = clip ( output_accel , accel_limits [ 0 ] , accel_limits [ 1 ] )
self . reset ( CS . vEgo )
self . reset ( CS . vEgo )
# Intention is to move again, release brake fast before handing control to PID
# Intention is to move again, release brake fast before handing control to PID