Обновить

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

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

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

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

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

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

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

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

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

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

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

Причем сам фильтр Калмана никак не адаптируется к шумам. Легко видеть из формул, что рассчет коэффициентов не зависит от измерений. Это вы сами должны построить какую-то внешнюю по отношению к фильтру логику, оценить изменения дисперсии и сообщить фильтру новые оценки Q и R. Сам фильтр Калмана этого не делает.

суть фильтра Калмана та же, что была в 1960, когда алгоритм был предложен в NASA для оценки состояния нелинейной системы (= траектории движения) при последовательном получении новых измерений возможно экономным итерационным способом на бортовом компьютере, в принципе эквивалентен мнк, который бортовые машины того времени просто не могли реализовать, с тех пор используется всеми кому не лень, допускает различные обобщения

Вроде, рекурсивный мнк уже был в 50-ых. Впрочем, я не спец по истории техники, могу не знать.

про это не слышал, а двух словах история фильтра Калмана - в 1959 директор Goddard Space Center NASA где занимались баллистикой поставил задачу подготовки к проекту Apollo, Dr. Kalman предложил удачный алгоритм, который промоделировали на IBM 704, и далее использовали на бортовой машине,

если Вы имеете в виду пошаговые методы поиска в мнк, это другое

Фильтр Калмана можно рассматривать в двух режимах.

В стационарном (steady-state) случае рассматривается линейная стационарная модель с постоянными матрицами A, C, Q, R. Тогда задача сводится к поиску стационарной ковариации ошибки  из дискретного алгебраического уравнения Риккати, после чего стационарное усиление K вычисляется один раз заранее. В этом режиме фильтр Калмана действительно становится обычным линейным наблюдателем с постоянным усилением - наблюдателем Люенбергера, у которого коэффициенты выбраны не эвристически, а из критерия минимума среднеквадратической ошибки.

В рекурсивном случае смысл уже другой. Здесь фильтр Калмана это байесовская рекурсия для линейно-гауссовой модели: на каждом шаге выполняются прогноз и коррекция, а накопленная информация о состоянии хранится не только в оценке, но и в ее неопределенности. Поэтому рекурсивная форма нужна не ради формул, а потому что апостериорное распределение уточняется по мере поступления новых данных. Это нужно при конечном горизонте, нестационарных режимах, переменных Q и R, пропусках измерений и изменении доверия к датчикам.

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

Как мне кажется, вы смешиваете два моих замечания в одно, что искажает их смысл. Давайте разделим.

Замечание первое, об использовании фильтра Калмана. Я утверждаю, что если объект оценивания стационарен, то есть матрицы A, C, Q, R постоянные и мы при использовании наблюдетеля не собираемся их обновлять, то использование рекурентной формулировки фильтра Калмана избыточно. Достаточно один раз посчитать оптимальный гейн и дальше его использовать, это дешевле и надёжнее с вычислительной точки зрения, проще в построении, так как снижается число настраиваемых параметров. Плюс, нет переходного процесса для матрицы P.

Замечание второе, об объяснении фильтра Калмана. Это, как мне кажется, относится к “рекурсивная форма нужна не ради формул”. Некоторые статьи о фильтре Калмана (например, эта) ставят формулы во главу угла, а вопросы, почему эти формулы такие, откуда они берутся, какая задача решается и как – рассматривают крайне скромно, если вообще. В то же время, нагуглить формулы через год после чтения статьи просто, а нагуглить понимание гораздо сложнее. На мой взгляд, важно говорить о том, что делает фильтр Калмана, а не о том, как это выглядит для дискретных линейных моделей. Отсюда мои замечания о формулах до/вместо разговора о сути.

Согласен. С моей стороны это попытка систематизации, а не содержательного анализа. У каждой работы есть свой читатель.

Ещё пара замечаний.

  • Для стационарной системы (постоянные матрицы модели и постоянные параметры шумов) фильтр Калмана эквивалентен стационарному наблюдателю Люенбергера со специально выбранным постоянным коэффициентом усиления. Никакого смысла в рекурсивном рассчете для стационарной модели нет.

  • Если у вас нестационарная модель, то вы можете построить нестационарный наблюдатель Люенбергера. Никто вас не заставляет использовать стационарный наблюдатель для нестационарной системы.

Ммм, фильтр Калмана... делал в студенческие годы на нём алгоритм постобработки измерений в GPS для неподвижного наблюдателя. Сравнивал с методом наименьших квадратов. Особенно интеоесный был случай, когда в вектор состояния наблюдателя кроме собственно координат (и часов) добавлялась оценка тропосферной задержки (из модели Хопфилда, кажется). Тогда автоматом из оценок клординат вычитались систематические тропосферные ошибки.

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

Публикации