Наблюдатели: оценка неизмеримых состояний

Что делать, когда нужное состояние нельзя измерить напрямую.

Наблюдатель (observer) — алгоритм, который оценивает неизмеримые состояния системы по доступным измерениям и модели объекта.

Проблема: не всё можно измерить

Управление по состоянию требует знать весь вектор состояния. Но на практике мы редко можем измерить всё. У дрона стоит датчик угла, но не угловой скорости. У двигателя меряют положение, но не скорость и тем более не нагрузку. Ставить датчик на каждое состояние дорого, тяжело и не всегда возможно. Возникает вопрос: как узнать то, что мы не измеряем? Ответ — построить наблюдатель, который вычисляет скрытые состояния.

Идея наблюдателя

Наблюдатель — это копия модели объекта, работающая параллельно в компьютере. Мы прогоняем ту же динамику x' = A·x + B·u на своей оценке состояния. Но чистая модель быстро разойдётся с реальностью из-за неточностей и возмущений. Поэтому наблюдатель корректирует свою оценку по измерениям: сравнивает предсказанный выход с реальным и подтягивает оценку в сторону измерения. Если предсказали 5, а датчик показал 7 — значит, наша оценка отстаёт, подтянем её вверх. Получается предсказание + коррекция — та же логика, что и в обратной связи, но применённая к оценке состояния.

Предсказание: x_оц’ = A·x_оц + B·u
Коррекция:    x_оц = x_оц + Lobs·(y_изм - C·x_оц)
              где (y_изм - C·x_оц) — невязка между измерением и предсказанием

Как работает под капотом: оцениваем скорость по позиции

Классическая задача: измеряем только позицию массы-пружины, а для управления нужна и скорость. Построим наблюдатель, который восстановит скорость, не имея её датчика.

# Объект: масса-пружина, измеряем только позицию. Наблюдатель оценивает скорость.
m, b, kc, dt = 1.0, 0.5, 4.0, 0.05
# истинное состояние
x_true = [1.0, 0.0]          # старт: позиция 1, скорость 0
# оценка наблюдателя (стартует с НЕВЕРНОЙ скорости)
x_est = [0.0, 0.0]
Lobs = [8.0, 15.0]           # коэффициенты коррекции наблюдателя

print(" t   ист.скор   оц.скор   разница")
for step in range(0, 41):
    u = 0.0
    # --- истинная динамика ---
    a_true = (u - b*x_true[1] - kc*x_true[0])/m
    # --- наблюдатель: предсказание + коррекция по измеренной позиции ---
    y_meas = x_true[0]                       # меряем только позицию
    y_pred = x_est[0]
    resid = y_meas - y_pred                  # невязка
    a_est = (u - b*x_est[1] - kc*x_est[0])/m
    x_est[0] += (x_est[1] + Lobs[0]*resid)*dt
    x_est[1] += (a_est + Lobs[1]*resid)*dt
    # обновляем истинный объект
    x_true[0] += x_true[1]*dt
    x_true[1] += a_true*dt
    if step % 5 == 0:
        print(f"{step*dt:4.2f}  {x_true[1]:8.3f}  {x_est[1]:8.3f}  {x_true[1]-x_est[1]:7.3f}")
print("оценка скорости сошлась к истинной без датчика скорости")

Вывод:

 t   ист.скор   оц.скор   разница
0.00    -0.200     0.750   -0.950
0.25    -1.089     0.523   -1.612
0.50    -1.654    -0.966   -0.688
0.75    -1.785    -1.614   -0.171
1.00    -1.482    -1.469   -0.014
1.25    -0.849    -0.859    0.011
1.50    -0.060    -0.066    0.007
1.75     0.686     0.684    0.002
2.00     1.215     1.214    0.000
оценка скорости сошлась к истинной без датчика скорости

Наблюдатель стартовал с неверной оценкой, но, корректируясь по одной лишь измеренной позиции, восстановил скорость и сошёлся к истинному значению. Это почти магия: мы «видим» величину, которую не измеряли, — благодаря модели и обратной связи по невязке. Коэффициенты Lobs задают скорость сходимости наблюдателя, как K задаёт динамику регулятора.

Наблюдаемость

Зеркально управляемости существует наблюдаемость (observability): можно ли по доступным измерениям восстановить все состояния. Если состояние никак не проявляется в выходе, наблюдатель его не вытащит. Для массы-пружины измерения позиции достаточно, чтобы восстановить и скорость (позиция «содержит» информацию о скорости через динамику). Наблюдаемость — необходимое условие работы любого наблюдателя.

Принцип разделения

Возникает законный вопрос: если мы управляем по оценке состояния от наблюдателя, а не по истинному состоянию, не испортит ли это устойчивость? Замечательный результат теории управления — принцип разделения (separation principle) — отвечает: для линейных систем регулятор и наблюдатель можно проектировать независимо, и при их соединении замкнутая система остаётся устойчивой, а её полюса — это объединение полюсов регулятора и полюсов наблюдателя. Это огромное упрощение: мы отдельно подбираем K для нужной динамики управления и отдельно L для быстрой сходимости оценки, не боясь, что они подерутся. Обычно наблюдатель делают в 2-5 раз быстрее регулятора, чтобы оценка успевала за управлением. Этот принцип — теоретическая основа всей связки «наблюдатель плюс обратная связь по состоянию».

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

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

Итоги

  • Наблюдатель оценивает неизмеримые состояния по модели и доступным измерениям.
  • Он работает по схеме «предсказание моделью + коррекция по невязке измерения».
  • Условие работы — наблюдаемость: состояние должно проявляться в выходе.
Проверьте себя
1. Зачем нужен наблюдатель (observer)?
AЧтобы заменить регулятор
BЧтобы оценить состояния, которые нельзя измерить напрямую
CЧтобы усилить привод
DЧтобы убрать шум уставки
2. По какой схеме работает наблюдатель?
AТолько измерение
BПредсказание моделью + коррекция по невязке (измерение минус предсказание)
CТолько модель без коррекции
DСлучайный подбор
3. Что означает наблюдаемость системы?
AНаличие привода
BВозможность восстановить все состояния по доступным измерениям
CОтсутствие шума
DЛинейность