Обновить

Комментарии 2

Моя проблема с популярными статьями про фильтр Калмана в том, что они развивают какое-то магическое мышление у пользователя, давая ему формулы из ниоткуда и рассказывая о чудесных результатах. Чтобы объяснить суть происходящего, совсем не надо залезать в сложные формулы.

  • Есть линейные фильтры, которые фильтруют сигналы. Чтобы посчитать фильтр, нужно выбрать желаемые частотные характеристики, например, полосу пропускания.

  • Если мы знаем модель процесса, генерирующего наш сигнал, и эта модель линейна, то можно построить фильтр с учётом этой модели, встроить её в фильтр. Такие штуки называются линейными наблюдателями, они же наблюдатели Люенбергера (Luenberger observer). Но опять же, чтобы построить такой наблюдатель, нам надо выбрать какие-то желаемые характеристики. Обычно - быстродействие.

  • Теперь вопрос - а как выбрать быстродействие наилучшим способом? Если бы в системе не было помех, то загнали быстродействие в потолок, на сколько скорость вычислений позволяет - и хорошо. Но при шумах сделать слишком быстрый фильтр значит пропускать больше шумов, хуже фильтрация. Слишком медленно - будет плохо реагировать на изменения, запаздывать.

  • И тут идея - а давайте выберем быстродействие так, чтобы средний квадрат ошибки был минимален! Что, по сути, значит минимальная дисперсия ошибки оценивания, хороший компромис между шумами и отставанием. Ок, получили задачу на оптимизациию: надо найти коэффициенты усиления таки, что итоговая дисперсия минимальна. Решили аналитически эту задачу и получили уравнения коэффициентов фильтра Калмана.

Теперь важное:

  • Eсли ваши матрицы системы и предположения о шумах постоянны, то никаких пошаговых рассчетов для коэффициентов K и матрицы P не нужно. Не надо путать читателя формулами - все эти пошаговые обновления P и K не нужны, они быстро сходятся к постоянным значениям, которые проще и лучше посчитать заранее. То есть, для систем с постоянными параметрами фильтр Калмана это обычный линейный наблюдатель, где быстродействие выбрано для минимизации дисперсии.

  • Если же модель системы или параметры шумов меняются во времени, тогда да, надо на каждом шаге пересчитывать коэффициенты. Но суть этих пересчетов теперь понятна - это всё то же решение задачи оптимизации, но с меняющимися параметрами.

Не могу с этим полностью согласиться. Сводить фильтр Калмана исключительно к наблюдателю Люенбергера, коэффициенты которого константы, значит упускать саму суть алгоритма — работу со статистическими параметрами неопределенности. Наблюдатель Люенбергера — это детерминированная система. Такой наблюдатель математически вырождается в комбинацию обычных рекурсивных IIR-фильтров. Для системы второго порядка это, по сути, буквально эквивалентно расчету двух биквадратных секций с постоянными коэффициентами. Фильтр Калмана фундаментально отличается тем, что он оперирует ковариационными матрицами шумов процесса Q и измерений R. И главное — в реальных задачах эти параметры вовсе не обязаны быть константами даже для линейных стационарных систем. В реальной железке статистика шума часто меняется. Например, дисперсия шума датчика R может вырасти из-за внешних наводок, деградации сигнала или кратковременной потери связи (в этом случае R можно динамически устремить к бесконечности). Набор статичных биквадратных секций (или классический наблюдатель Люенбергера) в такой ситуации просто пропустит этот выброс в оценку, так как его реакция жестко зашита. Рекурсивный же фильтр Калмана за счет пошагового обновления матрицы ковариации ошибки P и коэффициента K адаптируется на лету, автоматически снижая доверие к «испорченным» измерениям. Так что рекурсивный пересчет — это не «магическое мышление» и не запудривание мозгов читателю, а критически важный механизм адаптации к изменяющейся статистике сигналов, который обычными фильтрами с постоянными коэффициентами не реализуется в принципе.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации