1+ import importlib
12import math
23
4+ from common .filter_simple import FirstOrderFilter
5+ from common .realtime import DT_CTRL
36from selfdrive .controls .lib .pid import LatPIDController
47from selfdrive .controls .lib .drive_helpers import get_steer_max
58from cereal import log
@@ -11,7 +14,12 @@ def __init__(self, CP):
1114 (CP .lateralTuning .pid .kiBP , CP .lateralTuning .pid .kiV ),
1215 (CP .lateralTuning .pid .kdBP , CP .lateralTuning .pid .kdV ),
1316 k_f = CP .lateralTuning .pid .kf , pos_limit = 1.0 , sat_limit = CP .steerLimitTimer )
14- self .new_kf_tuned = CP .lateralTuning .pid .newKfTuned
17+ self .new_kf_tuned = True # CP.lateralTuning.pid.newKfTuned
18+ self .kf_filter = FirstOrderFilter (CP .lateralTuning .pid .kf , 10 , DT_CTRL )
19+
20+ self .CarControllerParams = importlib .import_module ('selfdrive.car.{}.values' .format (CP .carName )).CarControllerParams
21+ assert self .CarControllerParams , 'Missing CarControllerParams!'
22+ assert self .CarControllerParams .STEER_MAX != 0 , 'Can\' t be 0'
1523
1624 def reset (self ):
1725 self .pid .reset ()
@@ -28,6 +36,13 @@ def update(self, active, CS, CP, VM, params, desired_curvature, desired_curvatur
2836 output_steer = 0.0
2937 pid_log .active = False
3038 self .pid .reset ()
39+
40+ if abs (CS .steeringRateDeg ) < 20 and 5 < abs (CS .steeringAngleDeg ) < 90 and CS .vEgo > 5 :
41+ torque = CS .steeringTorqueEps / self .CarControllerParams .STEER_MAX
42+ predicted_kf = torque / (CS .steeringAngleDeg * CS .vEgo ** 2 )
43+ self .pid .k_f = self .kf_filter .update (predicted_kf )
44+
45+ print ('PREDICTED KF: {}' .format (self .kf_filter .x ))
3146 else :
3247 steers_max = get_steer_max (CP , CS .vEgo )
3348 self .pid .pos_limit = steers_max
0 commit comments