Pull to refresh

Comments 50

Фильтра Калмана много не бывает
Спасибо за ссылки! Теперь прочитаю 3 статьи.
Это самая адекватная и самая понятная статья из всех что есть на Хабре. Спасибо огромное, мне он как раз сейчас нужен.
Завидую! У меня низкий порог вхождения закончился на второй картинке…
Отличный способ подачи материала. Отличнейшая статья.
Тем временем в курсе на Udacity в третьем разделе есть то же самое, только на питоне и с примерами для 1- 2- и 4-мерных состояний
Именно посмотрев этот курс, разобрался что это за фильтр ) Рекомендую к просмотру — отличный курс, добавлю ссылку в статью, как только доберусь до ноута. Спасибо, что напомнили… постил уже почти ночью, забыл про ссылки.
Ссылка протухла, есть ли возможность ее воскресить?
Курс сюда переехал. А собственно главу про фильтр калмана можно найти тут.
А если сравнить со скользящей средней, намного лучше?)
В данном конкретном случае — нет, он вырождается в автокорреляцию. Но вообще это крайне мощная штука, которая подстраивает модель объекта под реальный объект.

Вся фишка фильтра Калмана в том, что он:
— позволяет учитывать зависимости между параметрами (матрица F в предсказании)
— позволяет учитывать внешнее воздействие на систему (матрица B в предсказании)
— автоматически подбирает усиление в зависимости от ошибки прогноза, причём это хорошо работает даже в присутствии шума
— ну и, как уже упоминалось в заключении статьи, можно получать сведения о внутренних параметрах системы, которые, по какой либо причине, невозможно измерить.
udacity.com — Programming a Robotic Car — довольно понятное объяснение объяснение фильтра Калмана и лабораторная работа по программированию его.
В моей статье сделан упор на практику построения ФК. Здесь этого нет. Каков физический смысл матриц слишком «долго и нудно объяснять». А так… да. Все просто! Спасибо автору!
Че-то у меня не взлетело с ходу:

Реагирует только на параметры H (фактически масштабирует входной сигнал) и F (работает как размер окна в running average)
H в единицу ставьте, и поиграйтесь с параметрами Q и R в сторону увеличения. Я правильно понимаю, что измеряемая величина — красный график, а выход фильтра — синий? Тогда видно, что фильтр работает, но измеряется сигнал с намного бОльшим шумом, чем ожидает фильтр.
> и поиграйтесь с параметрами Q и R в сторону увеличения
Важнее не их абсолютные значения, а отношение одного к другому. Q << R => Сильное сглаживание и высокая инерционность. Q ~ R => Сглаживания почти не будет, зато при большой изменчивости полезного сигнала фильтр не будет вносить искажений АЧХ.
хм, интересно, а вот народ на леталках типа квадрокомперов — подключают данные с приемника чтобы управляющие воздействия отслеживать?
А чем вы выводите график на Tk?
Листы отрезков. При обновлении берем, дергаем первый отрезок из списка, вставляем в конец с новыми координатами.
Подтормаживает.
Спасибо, для начинающих очень хорошо изложена суть =)) Ждем новых статей =)
> H — матрица определяющая отношение между измерениями и состоянием системы, пока без объяснений примем эту переменную также равную 1.
Как это матрица равна скаляру? И почему 1, а не «100500»?
Сам себе выкопал яму решив упростить до скаляров, заодно создав путаницу в названиях. В данном случае это матрица состоящая из одного элемента. Равна 1 потому, что измерения накладываются на состояние как есть без преобразования.

У вас более глубокая статья, но нужно знать алгоритм прежде чем применять его. Возможно сказывается слабое математического образования, но сходу я не разобрался, что же там написано…
Про вычисление ковариаций напишите?
Очень полезная статья! Надеюсь найти в следующей пример замешивания информации с разных источников данных. Напимер: гироскопы + акселерометры + магнитные датчики. Ну и естественно пример расчёта матриц H и Q.
H — матрица измерений. Она строится элементарно по модели датчика.

> пример расчёта матриц H и Q
Имелось в виду R и Q? Если да, то выше зареквестил. С R ничего сложного — просто дисперсии и корреляции между выходными сигналами датчиков. А вот Q нельзя точно измерить — это внутри датчика. Можно знать примерно.
Я же использую Q для оптимизации ФК.
Нигде не встречал какой-то конкретной методики нахождения Q. Это даже не внутри датчика, а внутри процесса.

Видимо это классическая задача поиска, можно попробовать применить логистическую регрессию — то есть проводим серию экспериментов, со знанием реальных значений… и потом зная реальные значения и показания датчика используем градиентный спуск (или что-то более продвинутое) для минимизации ошибки которую дает фильтр.
> Это даже не внутри датчика, а внутри процесса.
А это не одно и то же? Внутри датчика чувствительный элемент (например, массивный элемент со смещенным Ц.М. у акселерометров), который выполнен неидеально. Он участвует в процессе измерения входного воздействия. Инструментальные погрешности, вызывающие неидеальное движение Ч.Э и входят в погрешности динамического процесса.

> Нигде не встречал какой-то конкретной методики нахождения Q.
Для датчиков из среднего и высокого ценового диапазонов производитель по результатам сертификационных и своих внутренних испытаний может иметь приблизительный диапазон значений инструментальных погрешностей. Не каждый производитель и не для каждого прибора их даст (комм. тайна).
UFO just landed and posted this here
Не проще ли сделать дополнительный эталонный резервуар и мерить в нем диэлектрическую проницаемость в данный момент времени?
Программное решение обычно, как и в данном случае, универсальнее и дешевле. К тому же, насколько я знаю, диэелектрическую проницаемость нельзя измерить напрямую — только косвенно, рассчитав на основе других измерений. Ну и, самое интересное — а погрешность измерения ДП вы не учитываете?

Вы прям напомнили анекдот про сферического коня в вакууме (:
Тут можно поспорить. Для аппаратного решения достаточно измерить электрическую емкость эталонного емкости с топливом. В тоже время, для программного решения нужны вычислительные мощности.

Несомненно, в любом случае выходной сигнал будет зашумлен, но ошибка будет обусловлена только погрешностью измерений. Таким образом, как раз мой вариант будет ближе к реальности.
Вряд ли.
Вы учитываете только т.н. коррелирующую составляющую систематической и случайной погрешности датчика. Но есть и некоррелирующая, которая обычно достаточно велика.
А вот фильтр Калмана может отсеять всю случайную составляющую и выделить систематику.
Конечно, при этом важна модель, но для датчика она с хорошей точность довольно проста.
Очень доходчиво и ясно изложено, пишите ещё, таких авторов надо побольше!
Жаль, что Вы не упомянули об основе фильтра Калмана — методе наименьших квадратов.
Мне кажется, это упростило бы понимание и отделило основу от конкретики примера.
К тому же не всегда необходим именно фильтр Калмана.
Для случая обработки «постфактум» достаточно гораздо более простого метода наименьших квадратов.
Думал сначала начать с теории — получилось очень раздуто и запутано, к тому же ещё не до конца понял всего что там происходит, решил не писать про то что сам не до конца понимаю. Будет здорово, если вы раскроете эту тему!
> более простого метода наименьших квадратов
Есть замечательный труд «Браммер К., Зиффлинг Г. Фильтр Калмана-Бьюси. Пер. с нем. – М.: Наука. Главная
редакция физико-математической литературы. 1982.»
В нем написано, почему МНК (вернее Гауссовский Метод Наименьших Квадратов) на практике не может быть использован в виду сильных ограничений на гипотезу о параметрах помех. Это должен быть белый шум с нулевым средним, причем шумы в разных каналах должны иметь нулевую корреляцию. Такого на практике нет.

Если сигнал один, то МНК не нужен (он многомерный, если говорить именно о Гауссовском). А если сигналов несколько, то почти всегда есть и корреляция и, особенно, смещение среднего, да и белым шумом помехи являются очень редко (в Волоконно-Оптических Гироскопах почти белый).

Я могу написать свои мысли на эту тему, если интересно…
С этой книгой я знаком, правда много воды утекло с тех пор :)
МНК мы вполне удачно юзали на испытаниях гироскопов, а вот фильтр Калмана существенно сложнее и выигрыша не дал.
Возражения здесь следующие.
1. Многомерность: она возникает, если обрабатывать сигнал даже с одного датчика, но не в реальном времени, а с меньшей дискретизацией, чем идет съем сигнала. Или вообще постфактум.
2. Смещение среднего:
2.1. Есть небольшая модификация для МНК со смещением среднего.
2.2. Можно пользоваться и обычным МНК, только поправить неверную модель, что сделать для смещения совсем несложно.
3. В небелом шуме есть коррелирующая составляющая, чаще всего в ней можно выделить гармоники.
На самом-то деле гМНК это же частный случай ФК (по сути, хотя хронологически вроде бы наоборот). Есть продолжение гМНК для случая корреляций между каналами — исследовал как раз в сравнении с ФК. Но выигрыш ФК именно в функциональности и гибкости. Можно миксовать показания инерциальных датчиков с GPS, к примеру. А это совершенно разные источники информации как по природе, так и по характерным частотам выдачи информации. Да и инфа от инерциалки есть с большой вероятностью всегда, а GPS очень ненадежный источник. И вот тут ФК и нужен. Через матрицы ковариаций можно временно или перманентно выключать «дескридитированный» канал, давая ему минимальный вес.

> Многомерность: она возникает, если обрабатывать сигнал даже с одного датчика, но не в реальном времени, а с меньшей дискретизацией, чем идет съем сигнала.
Т.е. датчик выдает с частотой 1кГц -> формируем выборку из 10 отсчетов -> из гМНК инфа выходит на частоте 100 Гц. Так? Но с таким же успехом плавающее среднее можно использовать (или полиномом усреднять). Насколько мне известно такой подход приводит к увеличению смещения шума, т.к. осреднение по малой выборке дает не истинное среднее. И гМНК в таком режиме выполняет по сути осреднение. Метод Взвешенных Наименьших Квадратов (с матрицами ковариаций) — это осреднение с весами.
Отличный стиль изложения и интересный материал. Нравится, что есть и теория и практика, только как раз не хватает того, о чем вы и написали :)

Очень хотелось бы увидеть продолжение.
Covariance = (1 — K*H)*F;


Судя по картинкам сверху не F, а P0.
Благодарю! Действительно была опечатка!
Спасибо за статью. Есть пара замечаний.
1) Крайне удивило отсутствие описания модели фильтруемого процесса.
2) «Error covariance» переведено как «ошибка ковариации» (на картинках-схемках), в то время как верно будет «ковариация ошибки».
И ещё небольшое уточнение.
В цикле foreach(var d in fuelData) нужно исключать fuelData[0], т.е. начинать с fuelData[1], так как fuelData[0] использовалось в качестве начального значения. В данном примере это никакой роли не играет, так как F = 1.
Отличная статья для вхождения (нужно знать немного линейной алгебры и что-то слышать про теорию управления).
Чётко, лаконично, просто, с примерами. Спасибо.
Также спасибо всем за ссылки.
Sign up to leave a comment.

Articles