@ -1,5 +1,6 @@ 
			
		
	
		
		
			
				
					
					#!/usr/bin/env python3 #!/usr/bin/env python3  
			
		
	
		
		
			
				
					
					from  cereal  import  car from  cereal  import  car  
			
		
	
		
		
			
				
					
					from  math  import  fabs  
			
		
	
		
		
			
				
					
					from  selfdrive . config  import  Conversions  as  CV from  selfdrive . config  import  Conversions  as  CV  
			
		
	
		
		
			
				
					
					from  selfdrive . car . gm . values  import  CAR ,  CruiseButtons ,  \from  selfdrive . car . gm . values  import  CAR ,  CruiseButtons ,  \ 
			
		
	
		
		
			
				
					
					                                    AccState ,  CarControllerParams                                      AccState ,  CarControllerParams   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -15,6 +16,21 @@ class CarInterface(CarInterfaceBase): 
			
		
	
		
		
			
				
					
					    params  =  CarControllerParams ( )      params  =  CarControllerParams ( )   
			
		
	
		
		
			
				
					
					    return  params . ACCEL_MIN ,  params . ACCEL_MAX      return  params . ACCEL_MIN ,  params . ACCEL_MAX   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  # Volt determined by iteratively plotting and minimizing error for f(angle, speed) = steer.   
			
		
	
		
		
			
				
					
					  @staticmethod   
			
		
	
		
		
			
				
					
					  def  get_steer_feedforward_volt ( desired_angle ,  v_ego ) :   
			
		
	
		
		
			
				
					
					    # maps [-inf,inf] to [-1,1]: sigmoid(34.4 deg) = sigmoid(1) = 0.5   
			
		
	
		
		
			
				
					
					    # 1 / 0.02904609 = 34.4 deg ~= 36 deg ~= 1/10 circle? Arbitrary?   
			
		
	
		
		
			
				
					
					    desired_angle  * =  0.02904609   
			
		
	
		
		
			
				
					
					    sigmoid  =  desired_angle  /  ( 1  +  fabs ( desired_angle ) )   
			
		
	
		
		
			
				
					
					    return  0.10006696  *  sigmoid  *  ( v_ego  +  3.12485927 )   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  def  get_steer_feedforward_function ( self ) :   
			
		
	
		
		
			
				
					
					    if  self . CP . carFingerprint  in  [ CAR . VOLT ] :   
			
		
	
		
		
			
				
					
					      return  self . get_steer_feedforward_volt   
			
		
	
		
		
			
				
					
					    else :   
			
		
	
		
		
			
				
					
					      return  CarInterfaceBase . get_steer_feedforward_default   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  @staticmethod    @staticmethod   
			
		
	
		
		
			
				
					
					  def  get_params ( candidate ,  fingerprint = gen_empty_fingerprint ( ) ,  car_fw = None ) :    def  get_params ( candidate ,  fingerprint = gen_empty_fingerprint ( ) ,  car_fw = None ) :   
			
		
	
		
		
			
				
					
					    ret  =  CarInterfaceBase . get_std_params ( candidate ,  fingerprint )      ret  =  CarInterfaceBase . get_std_params ( candidate ,  fingerprint )   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -41,9 +57,17 @@ class CarInterface(CarInterfaceBase): 
			
		
	
		
		
			
				
					
					      ret . minEnableSpeed  =  18  *  CV . MPH_TO_MS        ret . minEnableSpeed  =  18  *  CV . MPH_TO_MS   
			
		
	
		
		
			
				
					
					      ret . mass  =  1607.  +  STD_CARGO_KG        ret . mass  =  1607.  +  STD_CARGO_KG   
			
		
	
		
		
			
				
					
					      ret . wheelbase  =  2.69        ret . wheelbase  =  2.69   
			
		
	
		
		
			
				
					
					      ret . steerRatio  =  15.7        ret . steerRatio  =  17.7   # Stock 15.7, LiveParameters   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      tire_stiffness_factor  =  0.469  # Stock Michelin Energy Saver A/S, LiveParameters   
			
		
	
		
		
			
				
					
					      ret . steerRatioRear  =  0.        ret . steerRatioRear  =  0.   
			
		
	
		
		
			
				
					
					      ret . centerToFront  =  ret . wheelbase  *  0.4   # wild guess        ret . centerToFront  =  ret . wheelbase  *  0.45  # Volt Gen 1, TODO corner weigh   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					      ret . lateralTuning . pid . kpBP  =  [ 0. ,  40. ]   
			
		
	
		
		
			
				
					
					      ret . lateralTuning . pid . kpV  =  [ 0. ,  0.17 ]   
			
		
	
		
		
			
				
					
					      ret . lateralTuning . pid . kiBP  =  [ 0. ]   
			
		
	
		
		
			
				
					
					      ret . lateralTuning . pid . kiV  =  [ 0. ]   
			
		
	
		
		
			
				
					
					      ret . lateralTuning . pid . kf  =  1.  # get_steer_feedforward_volt()   
			
		
	
		
		
			
				
					
					      ret . steerActuatorDelay  =  0.2   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    elif  candidate  ==  CAR . MALIBU :      elif  candidate  ==  CAR . MALIBU :   
			
		
	
		
		
			
				
					
					      # supports stop and go, but initial engage must be above 18mph (which include conservatism)        # supports stop and go, but initial engage must be above 18mph (which include conservatism)