@ -3,21 +3,25 @@ import numpy as np 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					from  common . realtime  import  DT_CTRL  
					 
					 
					 
					from  common . realtime  import  DT_CTRL  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					from  selfdrive . car . body  import  bodycan  
					 
					 
					 
					from  selfdrive . car . body  import  bodycan  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					from  opendbc . can . packer  import  CANPacker  
					 
					 
					 
					from  opendbc . can . packer  import  CANPacker  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					from  selfdrive . car . body . values  import  SPEED_FROM_RPM  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					MAX_TORQUE  =  500  
					 
					 
					 
					MAX_TORQUE  =  500  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					MAX_TORQUE_RATE  =  50  
					 
					 
					 
					MAX_TORQUE_RATE  =  50  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					MAX_ANGLE_ERROR  =  7  
					 
					 
					 
					MAX_ANGLE_ERROR  =  7  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					MAX_POS_INTEGRATOR  =  0.2  # meters  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					MAX_TURN_INTEGRATOR  =  0.1  # meters  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					class  CarController ( ) :  
					 
					 
					 
					class  CarController ( ) :  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  def  __init__ ( self ,  dbc_name ,  CP ,  VM ) :   
					 
					 
					 
					  def  __init__ ( self ,  dbc_name ,  CP ,  VM ) :   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . packer  =  CANPacker ( dbc_name )   
					 
					 
					 
					    self . packer  =  CANPacker ( dbc_name )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . i_speed  =  0   
					 
					 
					 
					    self . i_speed  =  0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    self . i_speed_diff  =  0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . i_balance  =  0   
					 
					 
					 
					    self . i_balance  =  0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . d_balance  =  0   
					 
					 
					 
					    self . d_balance  =  0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . i_torque  =  0   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . speed_measured  =  0.   
					 
					 
					 
					    self . speed_measured  =  0.   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . speed_desired  =  0.   
					 
					 
					 
					    self . speed_desired  =  0.   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -48,37 +52,38 @@ class CarController(): 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # torque_r = int(np.clip((CC.actuators.accel*1000) - (CC.actuators.steer*1000) * self.steerRatio, -1000, 1000))   
					 
					 
					 
					    # torque_r = int(np.clip((CC.actuators.accel*1000) - (CC.actuators.steer*1000) * self.steerRatio, -1000, 1000))   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # torque_l = int(np.clip((CC.actuators.accel*1000) + (CC.actuators.steer*1000) * self.steerRatio, -1000, 1000))   
					 
					 
					 
					    # torque_l = int(np.clip((CC.actuators.accel*1000) + (CC.actuators.steer*1000) * self.steerRatio, -1000, 1000))   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # ////   
					 
					 
					 
					    # ////   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # Setpoint speed PID   
					 
					 
					 
					    # Setpoint speed PID   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    kp_speed  =  0.001   
					 
					 
					 
					    kp_speed  =  0.001  /  SPEED_FROM_RPM    
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    ki_speed  =  0.0000 1   
					 
					 
					 
					    ki_speed  =  0.001  /  SPEED_FROM_RPM    
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    alpha_speed  =  1.0   
					 
					 
					 
					    alpha_speed  =  1.0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . speed_measured  =  ( CS . out . wheelSpeeds . fl  +  CS . out . wheelSpeeds . fr )  /  2.   
					 
					 
					 
					    self . speed_measured  =  SPEED_FROM_RPM  *  ( CS . out . wheelSpeeds . fl  +  CS . out . wheelSpeeds . fr )  /  2.   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    self . speed_desired  =  ( 1.  -  alpha_speed )  *  self . speed_desired   
					 
					 
					 
					    self . speed_desired  =  ( 1.  -  alpha_speed )  *  self . speed_desired   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    p_ speed  =  ( self . speed_desired  -  self . speed_measured )   
					 
					 
					 
					    speed_error   =  self . speed_desired  -  self . speed_measured   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . i_speed  + =  ki_speed  *  p_speed   
					 
					 
					 
					    self . i_speed  + =  speed_error  *  DT_CTRL   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . i_speed  =  np . clip ( self . i_speed ,  - 0.1 ,  0.1 )   
					 
					 
					 
					    self . i_speed  =  np . clip ( self . i_speed ,  - MAX_POS_INTEGRATOR ,  MAX_POS_INTEGRATOR )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    set_point  =  p_speed  *  kp_speed  +   self . i_speed   
					 
					 
					 
					    set_point  =  k p_speed  *  speed_error  +  ki_speed  *   self . i_speed   
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # Balancing PID   
					 
					 
					 
					    # Balancing PID   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    kp_balance  =  1300   
					 
					 
					 
					    kp_balance  =  1300   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ki_balance  =  0   
					 
					 
					 
					    ki_balance  =  0   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    kd_balance  =  280   
					 
					 
					 
					    kd_balance  =  280   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    alpha_d_balance  =  1.0   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # Clip angle error, this is enough to get up from stands   
					 
					 
					 
					    # Clip angle error, this is enough to get up from stands   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    p_balance  =  np . clip ( ( - CC . orientationNED [ 1 ] )  -  set_point ,  np . radians ( - MAX_ANGLE_ERROR ) ,  np . radians ( MAX_ANGLE_ERROR ) )   
					 
					 
					 
					    p_balance  =  np . clip ( ( - CC . orientationNED [ 1 ] )  -  set_point ,  np . radians ( - MAX_ANGLE_ERROR ) ,  np . radians ( MAX_ANGLE_ERROR ) )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . i_balance  + =  CS . out . wheelSpeeds . fl  +  CS . out . wheelSpeeds . fr   
					 
					 
					 
					    self . i_balance  + =  CS . out . wheelSpeeds . fl  +  CS . out . wheelSpeeds . fr   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . d_balance  =    np . clip ( ( ( 1.  -  alpha_d_balance )  *  self . d_balance  +  alpha_d_balance  *  - CC . angularVelocity [ 1 ] ) ,  - 1. ,  1. )   
					 
					 
					 
					    self . d_balance  =  np . clip ( - CC . angularVelocity [ 1 ] ,  - 1. ,  1. )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    torque  =  int ( np . clip ( ( p_balance * kp_balance  +  self . i_balance * ki_balance  +  self . d_balance * kd_balance ) ,  - 1000 ,  1000 ) )   
					 
					 
					 
					    torque  =  int ( np . clip ( ( p_balance * kp_balance  +  self . i_balance * ki_balance  +  self . d_balance * kd_balance ) ,  - 1000 ,  1000 ) )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # Positional  recovery PID   
					 
					 
					 
					    # yaw  recovery PID   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    kp_torque  =  0.95    
					 
					 
					 
					    kp_turn  =  0.1  /  SPEED_FROM_RPM    
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    ki_torque   =  0.1   
					 
					 
					 
					    ki_turn   =  0.1  /  SPEED_FROM_RPM    
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    p_torque  =  ( CS . out . wheelSpeeds . fl  -  CS . out . wheelSpeeds . fr )   
					 
					 
					 
					    speed_diff_measured  =  SPEED_FROM_RPM  *  ( CS . out . wheelSpeeds . fl  -  CS . out . wheelSpeeds . fr )   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    self . i_torque  + =  ( CS . out . wheelSpeeds . fl  -  CS . out . wheelSpeeds . fr )   
					 
					 
					 
					    self . i_speed_diff  + =  speed_diff_measured  *  DT_CTRL   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    torque_diff  =  int ( np . clip ( p_torque * kp_torque  +  self . i_torque * ki_torque ,  - 100 ,  100 ) )   
					 
					 
					 
					    self . i_speed_diff  =  np . clip ( self . i_speed_diff ,  - MAX_TURN_INTEGRATOR ,  MAX_TURN_INTEGRATOR )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    torque_diff  =  int ( np . clip ( kp_turn  *  speed_diff_measured  +  ki_turn  *  self . i_speed_diff ,  - 100 ,  100 ) )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    # Combine 2 PIDs outputs   
					 
					 
					 
					    # Combine 2 PIDs outputs   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    torque_r  =  torque  +  torque_diff   
					 
					 
					 
					    torque_r  =  torque  +  torque_diff