Skip to content

Instantly share code, notes, and snippets.

@GaryLee
Created May 26, 2016 01:35
Show Gist options
  • Select an option

  • Save GaryLee/a08d0855656c8f924a871c7a4cee2582 to your computer and use it in GitHub Desktop.

Select an option

Save GaryLee/a08d0855656c8f924a871c7a4cee2582 to your computer and use it in GitHub Desktop.
A simple PID(proportional–integral–derivative) controller implementation.
class PidController(object):
def __init__(self, kp=1.0, ki=0.0, kd=0.0, setpoint=0.0, integrator_range=0.0):
self.reset()
self.integrator_range = integrator_range
self.integrator_max = abs(integrator_range)
self.integrator_min = -1 * self.integrator_max;
self.kp = kp
self.ki = ki
self.kd = kd
self.set_setpoint(setpoint)
def set_setpoint(self, value):
self.setpoint = value
self.integrator = 0.0
self.derivator = 0.0
def reset(self):
self.setpoint = 0.0
self.integrator = 0.0
self.derivator = 0.0
def update(self, data):
# Calculate error.
err = self.setpoint - float(data)
p = self.kp * err
# Calculate propotional part.
d = self.kd * (err - self.derivator)
self.derivator = err
# Calculate integral part.
if self.integrator_range == 0.0:
self.integrator = err + self.integrator
else:
self.integrator = min(self.integrator_max, max(self.integrator_min, err + self.integrator))
i = self.integrator * self.ki
# Summerize P.I.D.
return p + i + d
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment