Обратная связь по состоянию и размещение полюсов

Управляем не по ошибке выхода, а по всему вектору состояния.

Обратная связь по состоянию формирует воздействие из всего вектора состояния: u = -K·x. Подбирая K, можно разместить полюса замкнутой системы там, где мы хотим.

Идея управления по состоянию

ПИД смотрит только на ошибку выхода. Но если мы знаем весь вектор состояния (например, и позицию, и скорость), можно управлять умнее — учитывать всё сразу. Обратная связь по состоянию задаёт воздействие как u = -K·x, где K — строка коэффициентов усиления по каждому состоянию. Для массы-пружины это u = -(k1·позиция + k2·скорость): первый коэффициент тянет к нулю позицию, второй гасит скорость (демпфирование). По сути это обобщение ПД-регулятора на произвольные системы.

Размещение полюсов

Главная сила метода: подбором K можно поставить полюса замкнутой системы в любые желаемые места (если система управляема). Хотим быстрый отклик без колебаний — выбираем полюса далеко слева на действительной оси и вычисляем K, дающий именно их. Это называется размещение полюсов (pole placement). Вместо «крутить коэффициенты на ощупь» мы прямо задаём желаемую динамику. Расчёт K по заданным полюсам делают формулой Аккермана или численно — мы рассмотрим идею обзорно.

Как работает под капотом: гасим колебания по состоянию

Возьмём массу-пружину без демпфера (она бы колебалась вечно) и стабилизируем её обратной связью по состоянию. Коэффициенты K подобраны так, чтобы система быстро и без раскачки пришла в ноль.

m, kc = 1.0, 4.0
A = [[0.0, 1.0], [-kc/m, 0.0]]    # демпфера нет -> чистые колебания
B = [0.0, 1.0/m]
K = [6.0, 5.0]                    # обратная связь u = -(K0*x + K1*v)
dt = 0.05
x = [1.0, 0.0]                    # стартовое отклонение: позиция=1

print(" t   позиция   скорость   u")
for step in range(0, 61):
    u = -(K[0]*x[0] + K[1]*x[1])
    if step % 6 == 0:
        print(f"{step*dt:4.2f}  {x[0]:7.3f}  {x[1]:8.3f}  {u:7.2f}")
    dx0 = A[0][0]*x[0] + A[0][1]*x[1] + B[0]*u
    dx1 = A[1][0]*x[0] + A[1][1]*x[1] + B[1]*u
    x[0] += dx0*dt; x[1] += dx1*dt
print("система пришла в ноль без вечных колебаний")

Вывод:

 t   позиция   скорость   u
0.00    1.000     0.000    -6.00
0.30    0.736    -1.476     2.96
0.60    0.324    -1.085     3.48
0.90    0.079    -0.477     1.91
1.20   -0.012    -0.116     0.65
1.50   -0.026     0.018     0.06
1.80   -0.017     0.039    -0.09
2.10   -0.006     0.024    -0.08
2.40   -0.001     0.010    -0.04
2.70    0.001     0.002    -0.01
3.00    0.001    -0.001     0.00
система пришла в ноль без вечных колебаний

Без обратной связи эта система колебалась бы бесконечно (нет демпфера). Обратная связь по состоянию u = -K·x создала искусственное демпфирование и притянула систему в ноль. Меняя K, мы напрямую управляем тем, насколько быстро и плавно это произойдёт — это и есть размещение полюсов в действии.

Управляемость

Не любую систему можно стабилизировать обратной связью по состоянию. Свойство управляемости (controllability) говорит, можем ли мы воздействием u дотянуться до всех состояний. Если какое-то состояние «оторвано» от входа, разместить его полюс мы не сможем. Управляемость проверяют по специальной матрице (Калмана) — но идея проста: вход должен влиять, прямо или косвенно, на каждое состояние.

Добавляем интегральное действие

У чистой обратной связи по состоянию u = -Kx есть та же слабость, что у P-регулятора: при постоянном возмущении остаётся статическая ошибка. Лекарство то же — интеграл. К вектору состояния добавляют новое искусственное состояние — интеграл ошибки слежения, и размещают полюса уже расширенной системы. Получается обратная связь по состоянию с интегральным действием, которая и быстра (благодаря размещению полюсов), и точна (благодаря интегралу). Это прямое обобщение ПИД на многомерные системы и стандартный приём в современном проектировании: сначала строим обратную связь по состоянию для нужной динамики, затем достраиваем интегратор для нулевой установившейся ошибки. Так классическая ПИД-интуиция переносится в матричный мир.

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

  • Применять u=-Kx, не зная состояния. Метод требует знать ВЕСЬ вектор состояния; если что-то не измеряется, нужен наблюдатель (следующий раздел).
  • Ставить полюса слишком далеко влево. Очень быстрый отклик требует огромного воздействия — привод насытится.
  • Игнорировать управляемость. Для неуправляемой системы размещение полюсов невозможно в принципе.

Итоги

  • Обратная связь по состоянию: u=-K·x — воздействие из всего вектора состояния.
  • Подбором K размещают полюса замкнутой системы в желаемых местах (pole placement).
  • Метод требует знать всё состояние и управляемости системы.
Проверьте себя
1. Что задаёт закон обратной связи по состоянию?
Au = Kp·e
Bu = -K·x (воздействие из всего вектора состояния)
Cu = Ki·∫e
Du = const
2. Что такое размещение полюсов (pole placement)?
AСлучайный подбор K
BВыбор K так, чтобы полюса замкнутой системы оказались в заданных местах
CИзмерение полюсов датчиком
DУдаление полюсов из системы
3. Что означает управляемость системы?
AНаличие датчика
BВозможность входом u дотянуться до всех состояний
CОтсутствие возмущений
DЛинейность объекта