Обратная связь и ПИД-регулятор

Самый распространённый в технике способ заставить систему выйти на нужное значение и держать его.

ПИД-регулятор — закон управления с обратной связью, формирующий воздействие из трёх слагаемых: пропорционального ошибке, интеграла ошибки и её производной.

Робот измеряет текущее значение $y$ (угол, скорость, позицию), сравнивает с уставкой $r$ и вычисляет ошибку $e = r - y$. Управляющее воздействие:

$$ u(t) = K_p \, e(t) + K_i \int_0^t e(\tau)\, d\tau + K_d \frac{de(t)}{dt} $$

ЧленЧто делает
$K_p e$ — пропорциональныйтянет к цели тем сильнее, чем больше ошибка
$K_i \int e$ — интегральныйустраняет остаточную ошибку, накапливая «недотяг»
$K_d \dot e$ — дифференциальныйгасит колебания, реагируя на скорость изменения ошибки

Дискретная форма

В программе интеграл — это сумма, производная — разность за шаг $\Delta t$:

$$ u_k = K_p e_k + K_i \sum_j e_j \, \Delta t + K_d \frac{e_k - e_{k-1}}{\Delta t} $$

Симуляция выхода на уставку

Уставка $r = 1.0$, $K_p = 4$, $K_i = 1$, $K_d = 2$. Простая инерционная система с демпфированием. Смотрим, как выход $y$ приближается к 1.

Kp, Ki, Kd = 4.0, 1.0, 2.0
sp = 1.0
y, v, integ, prev = 0.0, 0.0, 0.0, 1.0
dt = 0.1
for k in range(12):
    e = sp - y
    integ += e * dt
    deriv = (e - prev) / dt
    u = Kp*e + Ki*integ + Kd*deriv
    acc = (u - 1.0*v)   # инерция с демпфированием
    v += acc * dt
    y += v * dt
    prev = e
    print(f"шаг {k:2d}: y = {y:.4f}")

Вывод:

шаг  0: y = 0.0410
шаг  1: y = 0.1100
шаг  2: y = 0.1968
шаг  3: y = 0.2933
шаг  4: y = 0.3935
шаг  5: y = 0.4928
шаг  6: y = 0.5881
шаг  7: y = 0.6772
шаг  8: y = 0.7587
шаг  9: y = 0.8318
шаг 10: y = 0.8964
шаг 11: y = 0.9524

Как работает под капотом

Каждый член отвечает за свой аспект. $K_p$ создаёт «пружину» к цели, но в одиночку оставляет статическую ошибку и может колебаться. $K_i$ «дожимает» остаток: пока ошибка не ноль, интеграл растёт и добавляет воздействие. $K_d$ работает как «амортизатор»: видит, что ошибка быстро уменьшается, и заранее тормозит, гася перерегулирование. Видно, как $y$ плавно идёт к уставке без скачков.

Частые ошибки

  • Integral windup: при долгом насыщении привода интеграл копит огромное значение и потом «выстреливает» — нужно ограничивать интеграл.
  • Слишком большой $K_d$ усиливает шум датчика (производная чувствительна к шуму).
  • Дифференцировать уставку вместе с ошибкой при резком изменении $r$ — даёт «дифференциальный пинок»; часто дифференцируют только $y$.

Итог

  • ПИД формирует воздействие из трёх членов: P (ошибка), I (накопление), D (скорость изменения).
  • P тянет к цели, I убирает остаточную ошибку, D гасит колебания.
  • В коде интеграл — сумма, производная — разность за шаг.
  • Главные грабли: integral windup и чувствительность D к шуму.
Проверьте себя
1. За что отвечает интегральная (I) составляющая ПИД?
AГасит колебания
BУстраняет остаточную (статическую) ошибку, накапливая её
CРеагирует на текущую ошибку
DОграничивает скорость
2. Что такое integral windup?
AПоломка датчика
BЧрезмерное накопление интеграла при насыщении привода, ведущее к перерегулированию
CСлишком быстрая производная
DОтрицательный Kp
3. Какой член ПИД работает как амортизатор, гася перерегулирование?
AПропорциональный (P)
BИнтегральный (I)
CДифференциальный (D)
DНикакой