Hello. PID controllers are very useful, you can use them for anything.
I have PID implmentations in everything from C to javascript. Here’s my python implementation, which I often use in blender when I need to control an objects speed, velocity, angle, etc.
class PID:
def __init__(self, position, target, Kp=1.0, Ki=1.0, Kd=1.0, integralCap=0):
self.position = position
self.target = target
self.derivative = position - position
self.integral = target - position
self.integralCap = integralCap
self.error = target - position
self.Kp = Kp
self.Ki = Ki
self.Kd = Kd
# Proportional control
def get_p(self):
return self.Kp * self.error
# Integral control
def get_i(self):
return self.Ki * self.integral
# Derivative control
def get_d(self):
return self.Kd * -self.derivative
# Updates integral component
def update_integral(self):
self.integral += self.error
if self.integralCap:
if self.integral > self.integralCap:
self.integral = self.integralCap
elif self.integral < -self.integralCap:
self.integral = -self.integralCap
# Update the controller with a new position
def update(self, position):
self.derivative = position - self.position
self.position = position
self.error = self.target - position
self.update_integral()
# Get the current controll value
def get_response(self, position):
self.update(position)
return self.get_p() + self.get_i() + self.get_d()