Следящие системы и компенсация возмущений

Собираем всё вместе: следящие системы и борьба с возмущениями.

Следящая система заставляет выход повторять меняющуюся уставку, а компенсация возмущений — гасить известные внешние воздействия, не дожидаясь, пока они испортят выход.

От стабилизации к слежению

До сих пор мы в основном держали постоянную уставку. Но многие задачи — это слежение: выход должен повторять движущуюся цель. Рука робота ведёт сварочный шов по кривой, антенна следит за спутником, станок с ЧПУ режет по контуру. Хорошая новость: ПИД и обратная связь по состоянию работают и здесь — просто уставка теперь функция времени. Но появляются нюансы: за быстро меняющейся уставкой система отстаёт (ошибка слежения), и для её уменьшения добавляют упреждение (feedforward) — заранее подают воздействие, рассчитанное по будущей траектории.

Упреждение: не ждать ошибки, а действовать заранее

Обратная связь реагирует на ошибку после её появления. Упреждение действует до: если мы знаем, что уставка вот-вот вырастет, или знаем возмущение, мы заранее добавляем компенсирующее воздействие. Комбинация «упреждение + обратная связь» — мощный приём: упреждение делает грубую, но быструю работу по плану, а обратная связь подчищает остаток и парирует непредвиденное. Это стандарт в робототехнике и приводах.

u = u_feedforward(желаемая траектория) + u_feedback(ошибка)
      // упреждение по плану  +  ПИД по факту

Как работает под капотом: упреждение против чистой обратной связи

Заставим систему следить за линейно растущей уставкой. Чистый П-регулятор будет постоянно отставать; добавим упреждение и посмотрим, как ошибка слежения уменьшится.

def run(use_ff):
    Kp, dt = 4.0, 0.1
    y, v = 0.0, 0.0
    max_err = 0.0
    for step in range(80):
        t = step*dt
        sp = 0.5*t                 # уставка растёт линейно
        sp_rate = 0.5              # известная скорость уставки
        e = sp - y
        u = Kp*e
        if use_ff:
            u += sp_rate*1.0       # упреждение по скорости уставки
        v += (u - 1.0*v)*dt
        y += v*dt
        if t > 3.0:                # после переходного процесса
            max_err = max(max_err, abs(sp - y))
    return max_err

print(f"без упреждения: ошибка слежения = {run(False):.3f}")
print(f"с упреждением : ошибка слежения = {run(True):.3f}")

Вывод:

без упреждения: ошибка слежения = 0.103
с упреждением : ошибка слежения = 0.063

Упреждение заметно уменьшило ошибку слежения: система меньше «гонится» за уставкой с отставанием, потому что заранее знает, куда та движется. Обратная связь при этом осталась — она парирует то, что упреждение не предусмотрело (возмущения, неточность модели). Это и есть инженерный идеал: предвидеть известное, реагировать на неизвестное.

Компенсация возмущений

Если возмущение измеримо (например, мы знаем нагрузку на двигатель или температуру на улице), его можно компенсировать упреждением напрямую, не дожидаясь, пока оно отклонит выход. Это называется feedforward по возмущению. Если возмущение не измеримо, его парирует обратная связь (как мы видели в самом первом разделе) или специальный наблюдатель возмущений, который оценивает неизвестное воздействие по поведению системы и вычитает его.

Внутренняя модель

За способностью точно отслеживать разные сигналы стоит глубокий принцип внутренней модели: чтобы без ошибки отслеживать сигнал определённого типа, регулятор должен «содержать» модель этого сигнала. Интеграл — это модель константы, поэтому ПИ-регулятор идеально держит постоянную уставку. Чтобы без ошибки следить за линейно растущим сигналом (рампой), нужен двойной интеграл. Чтобы идеально отрабатывать синусоидальное возмущение известной частоты (например, вибрацию двигателя), в регулятор встраивают резонатор на этой частоте. Этот принцип объясняет, почему одних типов регуляторов хватает для одних задач и не хватает для других, и даёт системный рецепт: посмотри на тип сигнала, который надо отследить или подавить, и встрой его модель в контур. Это элегантный мост между интуицией и строгой теорией.

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

  • Полагаться только на упреждение. Без обратной связи любая неточность модели накапливается; упреждение всегда дополняют обратной связью.
  • Слишком сильное упреждение. Неверно рассчитанное упреждение само становится источником ошибки.
  • Игнорировать ошибку слежения. За быстрой уставкой система отстаёт даже при нулевой статической ошибке — это отдельная характеристика.

Итоги

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