@ -2,10 +2,11 @@ import math
import numpy as np
from cereal import log
from common . realtime import DT_CTRL
from common . filter_simple import FirstOrderFilter
from common . numpy_fast import clip , interp
from selfdrive . car . toyota . values import CarControllerParams
from common . realtime import DT_CTRL
from selfdrive . car import apply_toyota_steer_torque_limits
from selfdrive . car . toyota . values import CarControllerParams
from selfdrive . controls . lib . drive_helpers import get_steer_max
@ -43,6 +44,7 @@ class LatControlINDI():
self . sat_count_rate = 1.0 * DT_CTRL
self . sat_limit = CP . steerLimitTimer
self . steer_filter = FirstOrderFilter ( 0. , self . RC , DT_CTRL )
self . reset ( )
@ -63,9 +65,9 @@ class LatControlINDI():
return interp ( self . speed , self . _inner_loop_gain [ 0 ] , self . _inner_loop_gain [ 1 ] )
def reset ( self ) :
self . delayed_output = 0.
self . steer_filter . x = 0.
self . output_steer = 0.
self . sat_count = 0.0
self . sat_count = 0.
self . speed = 0.
def _check_saturation ( self , control , check_saturation , limit ) :
@ -96,14 +98,14 @@ class LatControlINDI():
if CS . vEgo < 0.3 or not active :
indi_log . active = False
self . output_steer = 0.0
self . delayed_output = 0.0
self . steer_filter . x = 0.0
else :
rate_des = VM . get_steer_from_curvature ( - curvature_rate , CS . vEgo )
# Expected actuator value
alpha = 1. - DT_CTRL / ( self . RC + DT_CTRL )
self . delayed_output = self . delayed_output * alpha + self . output_steer * ( 1. - alpha )
self . steer_filter . update_alpha ( self . RC )
self . steer_filter . update ( self . output_steer )
# Compute acceleration error
rate_sp = self . outer_loop_gain * ( steers_des - self . x [ 0 ] ) + rate_des
@ -121,12 +123,12 @@ class LatControlINDI():
# Enforce rate limit
if self . enforce_rate_limit :
steer_max = float ( CarControllerParams . STEER_MAX )
new_output_steer_cmd = steer_max * ( self . delayed_output + delta_u )
new_output_steer_cmd = steer_max * ( self . steer_filter . x + delta_u )
prev_output_steer_cmd = steer_max * self . output_steer
new_output_steer_cmd = apply_toyota_steer_torque_limits ( new_output_steer_cmd , prev_output_steer_cmd , prev_output_steer_cmd , CarControllerParams )
self . output_steer = new_output_steer_cmd / steer_max
else :
self . output_steer = self . delayed_output + delta_u
self . output_steer = self . steer_filter . x + delta_u
steers_max = get_steer_max ( CP , CS . vEgo )
self . output_steer = clip ( self . output_steer , - steers_max , steers_max )
@ -135,7 +137,7 @@ class LatControlINDI():
indi_log . rateSetPoint = float ( rate_sp )
indi_log . accelSetPoint = float ( accel_sp )
indi_log . accelError = float ( accel_error )
indi_log . delayedOutput = float ( self . delayed_output )
indi_log . delayedOutput = float ( self . steer_filter . x )
indi_log . delta = float ( delta_u )
indi_log . output = float ( self . output_steer )