ПИД-регулятор без магии

Управление · 12 мин

ПИД-регулятор вычисляет управляющее воздействие по ошибке e = цель − измерение. Это три слагаемых, у каждого своя роль:

Код

class PID:
    def __init__(self, kp, ki, kd, limit):
        self.kp, self.ki, self.kd, self.limit = kp, ki, kd, limit
        self.integral = 0.0
        self.prev_error = None

    def update(self, error, dt):
        self.integral += error * dt
        # защита от «накрутки» интеграла
        self.integral = max(-self.limit, min(self.limit, self.integral))
        deriv = 0.0 if self.prev_error is None else (error - self.prev_error) / dt
        self.prev_error = error
        out = self.kp * error + self.ki * self.integral + self.kd * deriv
        return max(-self.limit, min(self.limit, out))

Порядок ручной настройки

  1. Обнулите Ki и Kd. Увеличивайте Kp, пока система не начнёт устойчиво колебаться.
  2. Уменьшите Kp примерно вдвое.
  3. Добавляйте Kd, пока перерегулирование не станет приемлемым.
  4. Добавьте немного Ki, чтобы убрать остаточную ошибку. Если появились медленные «раскачки» — Ki слишком велик.

Типичные проблемы

СимптомПричина
Дрожит около целиБольшой Kp или шумная D-составляющая — отфильтруйте производную
Не доезжает до целиНет I-составляющей, мёртвая зона привода
Сильно проскакивает цельМало Kd или накрутка интеграла
Ведёт себя по-разному при разной частоте циклаНе учитывается dt