Pull to refresh

Comments 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 для неподвижного наблюдателя. Сравнивал с методом наименьших квадратов. Особенно интеоесный был случай, когда в вектор состояния наблюдателя кроме собственно координат (и часов) добавлялась оценка тропосферной задержки (из модели Хопфилда, кажется). Тогда автоматом из оценок клординат вычитались систематические тропосферные ошибки.

Sign up to leave a comment.

Articles