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