Pull to refresh

Comments 8

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

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

  • Если мы знаем модель процесса, генерирующего наш сигнал, и эта модель линейна, то можно построить фильтр с учётом этой модели, встроить её в фильтр. Такие штуки называются линейными наблюдателями, они же наблюдатели Люенбергера (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, и далее использовали на бортовой машине,

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

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

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

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

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

Sign up to leave a comment.

Articles