| 4 | |
| 5 | |
| 6 | class PIDController(object): |
| 7 | def __init__(self, K_P=1.0, K_I=0.0, K_D=0.0, n=20): |
| 8 | self._K_P = K_P |
| 9 | self._K_I = K_I |
| 10 | self._K_D = K_D |
| 11 | |
| 12 | self._window = deque([0 for _ in range(n)], maxlen=n) |
| 13 | self._max = 0.0 |
| 14 | self._min = 0.0 |
| 15 | |
| 16 | def step(self, error): |
| 17 | self._window.append(error) |
| 18 | self._max = max(self._max, abs(error)) |
| 19 | self._min = -abs(self._max) |
| 20 | |
| 21 | if len(self._window) >= 2: |
| 22 | integral = np.mean(self._window) |
| 23 | derivative = (self._window[-1] - self._window[-2]) |
| 24 | else: |
| 25 | integral = 0.0 |
| 26 | derivative = 0.0 |
| 27 | |
| 28 | return self._K_P * error + self._K_I * integral + self._K_D * derivative |