Наблюдатели: оценка неизмеримых состояний
Что делать, когда нужное состояние нельзя измерить напрямую.
Наблюдатель (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.
- Игнорировать наблюдаемость. Для ненаблюдаемого состояния наблюдатель бесполезен в принципе.
Итоги
- Наблюдатель оценивает неизмеримые состояния по модели и доступным измерениям.
- Он работает по схеме «предсказание моделью + коррекция по невязке измерения».
- Условие работы — наблюдаемость: состояние должно проявляться в выходе.