Обратная связь и ПИД-регулятор
Самый распространённый в технике способ заставить систему выйти на нужное значение и держать его.
ПИД-регулятор — закон управления с обратной связью, формирующий воздействие из трёх слагаемых: пропорционального ошибке, интеграла ошибки и её производной.
Робот измеряет текущее значение $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 к шуму.