@ -23,10 +23,6 @@ class CarController(): 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    self . i_balance  =  0   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    self . d_balance  =  0   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    self . speed_measured  =  0.   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    self . speed_desired  =  0.   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    self . torque_r_filtered  =  0.   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    self . torque_l_filtered  =  0.   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -45,22 +41,18 @@ class CarController(): 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    llk_valid  =  len ( CC . orientationNED )  >  0  and  len ( CC . angularVelocity )  >  0   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    if  CC . enabled  and  llk_valid :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # Steer and accel mixin. Speed should be used as a target? (speed should be in m/s! now it is in RPM)   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # Mix steer into torque_diff   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # self.steerRatio = 0.5   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # 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))   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # ////   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # Read these from the joystick   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # TODO: this isn't acceleration, okay?   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      speed_desired  =  CC . actuators . accel  /  5.   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      speed_diff_desired  =  - CC . actuators . steer   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # Setpoint speed PID   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      kp_speed  =  0.001  /  SPEED_FROM_RPM   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      ki_speed  =  0.001  /  SPEED_FROM_RPM   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      alpha_speed  =  1.0   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      ki_speed  =  0.002  /  SPEED_FROM_RPM   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      speed_measured  =  SPEED_FROM_RPM  *  ( CS . out . wheelSpeeds . fl  +  CS . out . wheelSpeeds . fr )  /  2.   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      speed_error  =  speed_desired  -  speed_measured   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      self . speed_measured  =  SPEED_FROM_RPM  *  ( CS . out . wheelSpeeds . fl  +  CS . out . wheelSpeeds . fr )  /  2.   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      self . speed_desired  =  ( 1.  -  alpha_speed )  *  self . speed_desired   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      speed_error  =  self . speed_desired  -  self . speed_measured   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      self . i_speed  + =  speed_error  *  DT_CTRL   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      self . i_speed  =  np . clip ( self . i_speed ,  - MAX_POS_INTEGRATOR ,  MAX_POS_INTEGRATOR )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      set_point  =  kp_speed  *  speed_error  +  ki_speed  *  self . i_speed   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -77,13 +69,14 @@ class CarController(): 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      torque  =  int ( np . clip ( ( p_balance * kp_balance  +  self . i_balance * ki_balance  +  self . d_balance * kd_balance ) ,  - 1000 ,  1000 ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # yaw recovery PID   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      kp_turn  =  0.1   /  SPEED_FROM_RPM   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      kp_turn  =  0.95   /  SPEED_FROM_RPM   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      ki_turn  =  0.1  /  SPEED_FROM_RPM   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      speed_diff_measured  =  SPEED_FROM_RPM  *  ( CS . out . wheelSpeeds . fl  -  CS . out . wheelSpeeds . fr )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      self . i_speed_diff  + =  speed_diff_measured  *  DT_CTRL   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      speed_diff_error  =  speed_diff_measured  -  speed_diff_desired   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      self . i_speed_diff  + =  speed_diff_error  *  DT_CTRL   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      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 ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      torque_diff  =  int ( np . clip ( kp_turn  *  speed_diff_error   +  ki_turn  *  self . i_speed_diff ,  - 100 ,  100 ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      # Combine 2 PIDs outputs   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					      torque_r  =  torque  +  torque_diff