Написать о себе (Например: Программист)
0,0
рейтинг
19 февраля 2013 в 21:25

Разработка → Фильтр Калмана tutorial



В интернете, в том числе и на хабре, можно найти много информации про фильтр Калмана. Но тяжело найти легкоперевариваемый вывод самих формул. Без вывода вся эта наука воспринимается как некое шаманство, формулы выглядят как безликий набор символов, а главное, многие простые утверждения, лежащие на поверхности теории, оказываются за пределами понимания. Целью этой статьи будет рассказать об этом фильтре на как можно более доступном языке.
Фильтр Калмана — это мощнейший инструмент фильтрации данных. Основной его принцип состоит в том, что при фильтрации используется информация о физике самого явления. Скажем, если вы фильтруете данные со спидометра машины, то инерционность машины дает вам право воспринимать слишком быстрые скачки скорости как ошибку измерения. Фильтр Калмана интересен тем, что в каком-то смысле, это самый лучший фильтр. Подробнее обсудим ниже, что конкретно означают слова «самый лучший». В конце статьи я покажу, что во многих случаях формулы можно до такой степени упростить, что от них почти ничего и не останется.

Ликбез


Перед знакомством с фильтром Калмана я предлагаю вспомнить некоторые простые определения и факты из теории вероятностей.

Случайная величина


Когда говорят, что дана случайная величина , то имеют ввиду, что эта величина может принимать случайные значения. Разные значения она принимает с разной вероятностью. Когда вы кидаете, скажем, кость, то выпадет дискретное множество значений: . Когда речь идет, например, о скорости блуждающей частички, то, очевидно, приходится иметь дело с непрерывным множеством значений. «Выпавшие» значения случайной величины мы будем обозначать через но иногда, будем использовать ту же букву, которой обозначаем случайную величину:
В случае с непрерывным множеством значений случайную величину характеризует плотность вероятности , которая нам диктует, что вероятность того, что случайная величина «выпадет» в маленькой окрестности точки длиной равна . Как мы видим из картинки, эта вероятность равна площади заштрихованного прямоугольника под графиком:


Довольно часто в жизни случайные величины распределены по Гауссу, когда плотность вероятности равна .

Мы видим, что функция имеет форму колокола с центром в точке и с характерной шириной порядка .
Раз мы заговорили о Гауссовом распределении, то грешно будет не упомянуть, откуда оно возникло. Также как и числа и прочно обосновались в математике и встречаются в самых неожиданных местах, так и распределение Гаусса пустило глубокие корни в теорию вероятностей. Одно замечательное утверждение, частично объясняющее Гауссово всеприсутствие, состоит в следующем:
Пусть есть случайная величина имеющая произвольное распределение (на самом деле существуют некие ограничения на эту произвольность, но они совершенно не жесткие). Проведем экспериментов и посчитаем сумму «выпавших» значений случайной величины. Сделаем много таких экспериментов. Понятно, что каждый раз мы будем получать разное значение суммы. Иными словами, эта сумма является сама по себе случайной величиной со своим каким-то определенным законом распределения. Оказывается, что при достаточно больших закон распределения этой суммы стремится к распределению Гаусса (к слову, характерная ширина «колокола» растет как ). Более подробно читаем в википедии: центральная предельная теорема. В жизни очень часто встречаются величины, которые складываются из большого количества одинаково распределенных независимых случайных величин, поэтому и распределены по Гауссу.

Среднее значение


Среднее значение случайной величины — это то, что мы получим в пределе, если проведем очень много экспериментов, и посчитаем среднее арифметическое выпавших значений. Среднее значение обозначают по-разному: математики любят обозначать через (математическое ожидание или mean value), а заграничные математики через (expectation). Физики же через или . Мы будем обозначать на заграничный лад: .
Например, для Гауссова распределения , среднее значение равно .

Дисперсия


В случае с распределением Гаусса мы совершенно четко видим, что случайная величина предпочитает выпадать в некоторой окрестности своего среднего значения .

Еще раз полюбоваться распределением Гаусса


Как видно из графика, характерный разброс значений порядка . Как же оценить этот разброс значений для произвольной случайной величины, если мы знаем ее распределение. Можно нарисовать график ее плотности вероятности и оценить характерную ширину на глаз. Но мы предпочитаем идти алгебраическим путем. Можно найти среднюю длину (модуль) отклонения от среднего значения: . Эта величина будет хорошей оценкой характерного разброса значений . Но мы с вами очень хорошо знаем, что использовать модули в формулах — одна головная боль, поэтому эту формулу редко используют для оценок характерного разброса.
Более простой способ (простой в смысле расчетов) — найти . Эту величину называют дисперсией, и часто обозначают как . Корень из дисперсии — хорошая оценка разброса случайной величины. Корень из дисперсии еще называют среднеквадратичным отклонением.
Например, для распределение Гаусса можно посчитать, что определенная выше дисперсия в точности равна , а значит среднеквадратичное отклонение равно , что очень хорошо согласуется с нашей геометрической интуицией.
На самом деле тут скрыто маленькое мошенничество. Дело в том, что в определении распределения Гаусса под экспонентой стоит выражение . Эта двойка в знаменателе стоит именно для того, чтобы среднеквадратичное отклонение равнялось бы коэффициенту . То есть сама формула распределения Гаусса написана в виде, специально заточенном для того, что мы будем считать ее среднеквадратичное отклонение.

Независимые случайные величины


Случайные величины бывают зависимыми и нет. Представьте, что вы бросаете иголку на плоскость и записываете координаты ее обоих концов. Эти две координаты зависимы, они связаны условием, что расстояние между ними всегда равно длине иголки, хотя и являются случайными величинами.
Случайные величины независимы, если результат выпадения первой из них совершенно не зависит от результата выпадения второй из них. Если случайные величины и независимы, то среднее значение их произведения равно произведению их средних значений:



Доказательство
Например, иметь голубые глаза и окончить школу с золотой медалью — независимые случайные величины. Если голубоглазых, скажем а золотых медалистов , то голубоглазых медалистов Этот пример подсказывает нам, что если случайные величины и заданы своими плотностями вероятности и , то независимость этих величин выражается в том, что плотность вероятности (первая величина выпала , а вторая ) находится по формуле:

Из этого сразу же следует, что:

Как вы видите, доказательство проведено для случайных величин, которые имеют непрерывный спектр значений и заданы своей плотностью вероятности. В других случаях идея доказательтсва аналогичная.

Фильтр Калмана


Постановка задачи


Обозначим за величину, которую мы будем измерять, а потом фильтровать. Это может быть координата, скорость, ускорение, влажность, степень вони, температура, давление, и т.д.
Начнем с простого примера, который и приведет нас к формулировке общей задачи. Представьте себе, что у нас есть радиоуправляемая машинка, которая может ехать только вперед и назад. Мы, зная вес машины, форму, покрытие дороги и т.д., расcчитали как контролирующий джойстик влияет на скорость движения .



Тогда координата машины будет изменяться по закону:



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



У нас есть установленный на машинке GPS сенсор, который пытается мерить истинную координату машинки, и, конечно же, не может ее померить точно, а мерит с ошибкой , которая является тоже случайной величиной. В итоге с сенсора мы получаем ошибочные данные:



Задача состоит в том, что, зная неверные показания сенсора , найти хорошее приближение для истинной координаты машины . Это хорошее приближение мы будем обозначать как .
В формулировке же общей задачи, за координату может отвечать все что угодно (температура, влажность...), а член, отвечающий за контроль системы извне мы обозначим за (в примере c машиной ). Уравнения для координаты и показания сенсора будут выглядеть так:

    (1)

Давайте подробно обсудим, что нам известно:

  • — это известная величина, которая контролирует эволюцию системы. Мы ее знаем из построенной нами физической модели.
  • Ошибка модели и ошибка сенсора — случайные величины. И их законы распределения не зависят от времени (от номера итерации ).
  • Средние значения ошибок равны нулю: .
  • Сам закон распределения случайных величин может быть нам и не известен, но известны их дисперсии и . Заметим, что дисперсии не зависят от , потому что законы распределения не зависят от него.
  • Предполагается, что все случайные ошибки независимы друг от друга: какая ошибка будет в момент времени совершенно не зависит от ошибки в другой момент времени .

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

Алгоритм Калмана


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



поэтому, еще не получая значение с сенсора, мы можем предположить, что на шаге система эволюционирует согласно этому закону и сенсор покажет что-то близкое к . К сожалению, пока мы не можем сказать ничего более точного. С другой стороны, на шаге у нас на руках будет неточное показание сенсора .
Идея Калмана состоит в том, что чтобы получить наилучшее приближение к истинной координате , мы должны выбрать золотую середину между показанием неточного сенсора и — нашим предсказанием того, что мы ожидали от него увидеть. Показанию сенсора мы дадим вес а на предсказанное значение останется вес :



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



Используем уравнения (1) (те которые на голубом фоне в рамочке), чтобы переписать выражение для ошибки:



Доказательство


Теперь самое время обсудить, что означает выражение минимизировать ошибку? Ведь ошибка, как мы видим, сама по себе является случайной величиной и каждый раз принимает разные значения. На самом деле не существует однозначного подхода к определению того, что означает, что ошибка минимальна. Точно как и в случае с дисперсией случайной величины, когда мы пытались оценить характерную ширину ее разброса, так и тут мы выберем самый простой для расчетов критерий. Мы будем минимизировать среднее значение от квадрата ошибки:



Распишем последнее выражение:



ключ к доказательству
Из того что все случайные величины, входящие в выражение для , независимы и средние значения ошибок сенсора и модели равны нулю: , следует, что все «перекрестные» члены равны нулю:
.
Плюс к этому, формулы для дисперсий выглядит намного проще: и (так как )


Это выражение принимает минимальное значение, когда (приравниваем производную к нулю)



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

.

Наша задача решена. Мы получили итерационную формулу, для вычисления коэффициента Калмана.

Все формулы в одном месте



Пример


На рекламной картинке в начале статьи отфильтрованы данные с вымышленного GPS сенсора, установленного на вымышленной машине, которая едет равноускоренно c известным вымышленным ускорением .



Еще раз посмотреть на результат фильтрования


Код на матлабе
clear all;
N=100  % number of samples
a=0.1 % acceleration
sigmaPsi=1
sigmaEta=50;
k=1:N
x=k
x(1)=0
z(1)=x(1)+normrnd(0,sigmaEta);
for t=1:(N-1)
  x(t+1)=x(t)+a*t+normrnd(0,sigmaPsi); 
   z(t+1)=x(t+1)+normrnd(0,sigmaEta);
end;
%kalman filter
xOpt(1)=z(1);
eOpt(1)=sigmaEta; % eOpt(t) is a square root of the error dispersion (variance). It's not a random variable. 
for t=1:(N-1)
  eOpt(t+1)=sqrt((sigmaEta^2)*(eOpt(t)^2+sigmaPsi^2)/(sigmaEta^2+eOpt(t)^2+sigmaPsi^2))
  K(t+1)=(eOpt(t+1))^2/sigmaEta^2
 xOpt(t+1)=(xOpt(t)+a*t)*(1-K(t+1))+K(t+1)*z(t+1)
end;
plot(k,xOpt,k,z,k,x)



Анализ


Если проследить, как с шагом итерации изменяется коэффициент Калмана , то можно показать, что он всегда стабилизируется к определенному значению . К примеру, когда среднеквадратичные ошибки сенсора и модели относятся друг к другу как десять к одному, то график коэффициента Калмана в зависимости от шага итерации выглядит так:



В следующем примере мы обсудим как это поможет существенно облегчить нашу жизнь.

Второй пример


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



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



На следующем графике показаны отфильтрованные двумя разными способами данные с вымышленного сенсора. При условии того, что мы ничего не знаем о физике явления. Первый способ — честный, со всеми формулами из теории Калмана. А второй — упрощенный, без формул.



Как мы видим, методы почти ничем не отличаются. Маленькое отличие наблюдается только вначале, когда коэффициент Калмана еще не стабилизировался.

Обсуждение


Как мы увидели, основная идея фильтра Калмана состоит в том, что надо найти коэффициент такой, чтобы отфильтрованное значение



в среднем меньше всего отличалось бы от реального значения координаты . Мы видим, что отфильтрованное значение есть линейная функция от показания сенсора и предыдущего отфильтрованного значения . А предыдущее отфильтрованное значение является, в свою очередь, линейной функцией от показания сенсора и предпредыдущего отфильтрованного значения . И так далее, пока цепь полностью не развернется. То есть отфильтрованное значение зависит от всех предыдущих показаний сенсора линейно:



Поэтому фильтр Калмана называют линейным фильтром.
Можно доказать, что из всех линейных фильтров Калмановский фильтр самый лучший. Самый лучший в том смысле, что средний квадрат ошибки фильтра минимален.

Многомерный случай


Всю теорию фильтра Калмана можно обобщить на многомерный случай. Формулы там выглядят чуть страшнее, но сама идея их вывода такая же, как и в одномерном случае. В этой прекрасной статье вы можете увидеть их: http://habrahabr.ru/post/140274/.
А в этом замечательном видео разобран пример, как их использовать.

Литература


Оригинальную статью Калмана можно скачать вот тут: http://www.cs.unc.edu/~welch/kalman/media/pdf/Kalman1960.pdf.
Этот пост можно прочитать и на английском http://david.wf/kalmanfilter
Худавердян Давид @khdavid
карма
164,2
рейтинг 0,0
Написать о себе (Например: Программист)
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (83)

  • +5
    А покажите сравнение с фильтрацией по методу скользящего среднего — сильно ли лучше результаты?
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Насколько я понимаю, данный способ введения коэффициента К — лишь один из многих способов «сообщить» фильтрующему алгоритму тип истинной (без шумов) зависимости. Вопрос в том, насколько лучше данный алгоритм фильтрует шумы по сравнению с аналогами: для показаний известного типа функций — с методом «а-ля» наименьших квадратов применительно к фильтрации; для показаний неизвестного типа функций — с методом скользящего среднего (с весовыми коэффициентами и без).
      • +1
        Если A!=B то любое число C можно выразить как
        KA + (1-K)B

        в нашем случаев A, B и К меняются на каждом шаге, поэтому это исчерпывающий ответ на Ваш вопрос
    • 0
      Если, честно, я не знаю, что это такое. Но если расписать формулу для упрощенного фильтра Калмана (который в последнем графике в статье), то можно получить, что отфильтрованное значение равно



      Это можно назвать, каким-то там средним, наверно.
      • +1
        Ну я про это среднее — есть ли смысл городить огород дополнительными коэффициентами в случае неизвестного вида функции, если можно применить более простые методы фильтрации шумов?
        • +1
          Скользящее среднее для таких задач не подходит. К примеру, если у вас функция растет, то среднее предыдущих значений всегда будет меньше последующего значения, хотя на самом деле каждое следующее значение будет больше предыдущих.
          • 0
            Вообще-то не факт, ибо, во-первых, шумовая составляющая может быть разной (резкие пики вверх, например, «подбросят» отфильтрованную функцию), во-вторых, данный эффект неплохо нивелируется использованием весовых составляющих, а также выбором величины окна при таком сглаживании.
            • +3
              Ну да, я имел ввиду рост линейной функции, конечно. На практике да, в некоторых случаях она может давать нормальные результаты, тем не менее скользящая средняя имеет свойство запаздывать за сигналом, потому что по сути не содержит никакой информации о возможном будущем значении.
            • 0
              Вот кстати, на последней ситуации как раз и показан описанный выше косяк, как я понял. Если б вы на осях цихерки все-таки указали (точное время хотя бы), то можно было бы даже примерно оценить динамическое запаздывание ФК с выбранными настройками. На графике явно видно это. Если бы шум был наложен на синусоиду, то вообще в глаза бросилось бы смещение фильтрованной синусоиды относительно исходной нефильтрованной.
              • 0
                На последнем графике шум как-раз наложен на синусоиду.
                • 0
                  Только показано меньше полупериода. Но даже так видно динамическое запаздывание 5-10 отсчетов. Если бы синусоида была с еще большей частотой, то запаздывание, очень возможно, будет еще больше.
                  • 0
                    На последнем графике нет синусоиды. Фильтр синтезируется для модели процесса первого порядка. То, что представлено на графике — сумма винеровского процесса, линейной функции и шума наблюдений. Заметьте, что истинного процесса там вообще нет.

                    Вариант картинки с истинным процессом представлен на первом графике в статье.

                    Не очень понимаю, о каком запаздывании тут может идти речь. Лучше данного фильтра по указанному критерию в указанных условиях в режиме реального времени Вы всё равно ничего лучше не сделаете.
                    • 0
                      Когда я моделировал второй процесс, я брал синусоиду и налагал на нее шум.
                      Потом, когда фильтруешь процесс и «не знаешь», что это на самом деле синусоида с шумом, пытаешься незаконно воспользоваться фильтром Калмана, в котором зашито, что этот процесс — стационарный.
                      Прав товарищ HomoLuden, который говорит, что будет запаздывание от синусоиды.
                      • 0
                        Тогда действительно будет «запаздывание». Синусоида имеет бесконечное число производных, соответственно такой линейный фильтр для неё придется делать бесконечного порядка. С ней всегда беда.
      • +5
        Скользящее среднее — это просто среднее значение n предыдущих значений. Фильтр Калмана практически идентичен экспоненциальному сглаживанию, там тоже формула — S[t] = alpha*X[t] + (1-alpha)*S[t-1] (сорри, не знаю как формулу вставить).
        • +2
          Да, это и есть тот самый «Второй пример» из поста. Вообще, из собственного опыта мне кажется, что в реальных задачах хватает экспоненциального сглаживания за глаза — нужно только поиграть с коэффициентом alpha. Более того, зашивать в железки честный фильтр Калмана отнюдь не лучший выбор.
          • +6
            Недостаток линейных фильтров — они плохо себя ведут при случайных выбросах. Если GPS вдруг скажет, что машинка находится на Луне, возвращаться на Землю ей придётся долго… Я предпочитаю медианный фильтр, когда это возможно.
        • 0
          Формулы можно вставлять через этот стабильный сервис http://www.codecogs.com/latex/eqneditor.php
  • –15
    Не до конца понимаю, зачем на Хабре 4ая статья по фильтру Калмана. Это при учёте того, что на Википедии тоже неплохо описано.
    • +6
      повторение — мать учения.
    • +14
      Имхо, эта статья — лучшее объяснение. Потому что очень чётко показано — почему так.
    • +4
      В других статьях на хабре нету вывода формул. А на википедии написано очень непонятно, по крайней мере, я ничего там не понял, когда читал в первый раз.
      • +4
        На википедии лежит перевод английской статьи, с сохранением их обозначений и примеров. Переводил я её года три назад. Её нужно существенно переработать, в используемых там обозначениях, терминах и примерах ничего не понятно. Меня останавливает то, что материал попадет под GPL и у меня потом будут проблемы с изданием учебников (в университете работаю).
        • +1
          А почему под GPL, а не под CC-BY-SA? en.wikipedia.org/wiki/Wikipedia:Licensing_update
          • 0
            К сожалению, я нуб в вопросах лицензирования. Есть ли лицензия, опубликовав под которой на википедии материал, я могу потом этот же материал использовать в печатных публикациях (с передачей ряда прав издательству)?
            • +1
              Лицензии википедии никак не ограничивают права автора использовать этот материал как ему угодно, они только разрешают другим людям его использовать при соблюдении определённых условий (и не разрешают отменить действие этой лицензии для тех, кто не нарушает её условий). Так что это вопрос только к издательству.
    • +1
      Как уже не раз говорилось, фильтра Калмана много не бывает.
  • +4
    За одно только объяснение распределения Гаусса готов расцеловать!
  • 0
    Собирал вариометр-пищалку на arduino, и Калмановский фильтр отлично подошел для вычисления скорости изменения высоты по зашумленным показаниям датчика.
  • +8
    Следует отметить, что фильтр Калмана хорош ещё вот чем.

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

    Теперь пару слов о постобработке. Это когда у нас есть куча измерений, все с погешностями датчиков, шумом и пр. Но зато мы обладаем неограниченным временем и вычислительными ресурсами для обработки этих результатов. Ну в самом деле, не всегда удаётся считать обратную матрицу 9 на 9 на борту самолёта с частотой на уровне килогерцев. Так вот. Фильтр Калмана применим и в постобработке. В постобработке мы можем учитывать все результаты измерений, менять начальные условия, тем самым подбирая оптимальные коэффициенты. Следует выделить три режима работы:

    • Сглаживание
    • Сглаживание с запаздыванием
    • Сглаживание в одной точке


    Сглаживание — утрированно говоря делаем следующее. Запускает фильтр от времени 0 до времени T. Затем запускаем фильтр от времени T до времени 0. В статье написано, что коэффициент K сходится к своему «истинному» значению. Так вот. Для времени в районе 0 берём коэффициенты, полученные при обратном прогоне, а для конечных моментов времени берём коэффициенты, полученные при прямом прогоне.

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

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

    Ну и напоследок, в инетернете по применению постобработки фильтра Калмана очень мало информации. Вот по сглаживанию в одной точке на русском языке так вообще один источник — переведённая книга годов 70-х. Если интересно — могу вспомнить кто автор и что за издание.
    • +4
      Браммер К. и Зиффлинг Г. Фильтр Калмана-Бьюси 1982 г.
      PDF найти несложно при желании. Фундаментальный труд, где корректно и достаточно просто описаны основы ФК и как этот метод выводится из Гауссовско-Марковского Метода Наименьших Квадратов.
      • +1
        Спасибо за ссылку — не знал этой книги. А книгу, которую я упомянул, это Дж. Медич «Статистически оптимальные линейные оценки и управление», изд. «Энергия», 1973
      • +2
        А что делает налоговая инспекция Саратова в этом URL?
        • 0
          Я не понял механизм. Как такое произошло?
          • +2
            Это результат творчества живого поиска Google.

            Если присмотреться к URL, то там видно две части — до # и после #. Налоговая инспекция находится в части до решетки, следовательно это оригинальный запрос, который был введен, например, в строке адреса браузера. Искомый же запрос находится после символа #, следовательно он был добавлен туда веб-интерфейсом гугла после ввода запроса в строку поиска в результатах поиска. Таким образом в адресную строку попало два запроса, которые и выполнились, отобразив результат последнего запроса.
            • 0
              во наворотили…
              • 0
                Это нужно для воспроизводимости результатов живого поиска. По этому то, что изменялось на странице JavaScript'ом отражается в якоре (после #), в результате получается ссылка как бы на результат работы скриптов страницы, которую можно копировать, сохранять, передавать другим и повторно к ней возвращаться.

                Жизненно необходимая кстати вещь для AJAX-сайтов.
                • 0
                  Я видел очень удачные варианты, когда при смене содержимого страницы AJAX-ом или просто JS, в браузере меняется основная часть URL без перезагрузки страницы. Например, так сделано в TiddlyWiki

                  Так что по-прежнему не понимаю необходимости сохранять первичный запрос в URL…
                  • +1
                    Это называется History API, но поддерживается не во всех браузерах, вот видимо Google и использует менее красивую, но единую и кроссбраузерную реализацию.
          • 0
            Все просто… Искал сначала налоговую. Потом в строке поиска на странице ввел новый запрос и не обратил внимание, что в строке адреса остался прежний УРЛ
      • +1
        Ужас! Хорошо хоть с «Вышивкой крестом» не пропалился :)
        Вот правильная ссылка
        • 0
          «черные шланги» саратов
    • 0
      Фильтр Калмана хорош ещё и тем, что в нём встроены вычисление и учёт ненаблюдаемых параметров (скорость машинки, если она непостоянна и неизвестна).
  • 0
    Спасибо, всплакнул
    Я экзамен по этому фильтру (системотехника) в универе в конце 90x сдал раз на 11 только (совпали в пространстве моя лень и вредность препода). Зато, когда потом на госах мне по другой дисциплине (радиоавтоматика) выпал опять этот фильтр, тут уж я расцвел во всей красе.
  • +2
    Аккуратная приятная статья. Небольшие замечания.

    1) Оптимальность вашего решения достигается только в случае, если \ksi и \eta являются нормальными случайными величинами. Иначе — это оптимум только среди линейных фильтров.

    Существует много различных фильтров Калмана, но под классическим Калманом сейчас принято понимать систему фильтрации, которая производит расчет вектора математических ожиданий и ковариационную матрицу многомерного нормального апостериорного распределения x_k. А чтобы оно было нормальным — все ингредиенты должны быть тоже нормальными.

    Как я уже сказал, это не означает, что приведенный фильтр не является фильтром Калмана. Просто в этой задаче он квазиоптимален.

    2) То, что описано во второй главе, полноценный фильтр Калмана. Только для модели процесса первого порядка. То есть, если принимать, что на всём k-м интервале x_k остается неизменным, а при смене интервала меняется скачком до x_{k+1}. Нагребать большие ошибки вы начнете, когда эта модель перестанет согласовываться с вашим входным процессом. Например, если установите большую скорость, получите ошибку около VT/2.

    PS А как Вы TeX прикрутили к хабру?
    • 0
      Спасибо большое за отзыв

      1) Фильтр Калмана, даже если ошибки распределены по Гауссу, всегда лучший линейный фильтр. Среди нелинейных есть и лучше.
      Единственное отличие двух случаев (ошибки Гауссовы или нет) состоит в том, что в случае с негауссовской ошибкой, фильтр Калмана лучший в смысле среднеквадратичного приближения. В Гауссовском же случае фильтр лучший в смысле среднего от почти любой хорошей функции. Можно посмотреть, к примеру, на теорему 2 в оригинальной статье Калмана
      • 0
        Точнее ремарка (e) к теореме 2.
      • +1
        Мне кажется у Вас описка —
        «Фильтр Калмана, даже если ошибки распределены по Гауссу, всегда лучший линейный фильтр. Среди нелинейных есть и лучше.»

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

        Остальное прокомментировать не могу, т.к. не знаю, что Вы имеете в виду под среднеквадратическим приближением и про какую хорошую функцию идет речь.
        • +1
          Нет я не описался, я просто плохо выразился.
          Вы не правы. Фильтр Калмана, как в случае с Гауссовскими ошибками, так и в случае в негауссовскими ошибками не есть самый лучший фильтр.
          Если ошибки по Гауссу — фильтр Калмана лучший среди линейных в смысле среднеквадратичных приближений.
          Если ошибки не по Гауссу — фильтр Калмана лучший среди линейных в смысле «любого» приближения. Слово «любой», конечно надо хорошо определить.
          Опять-таки ссылаюсь на теорему 2 из статьи Калмана.
          • +1
            По остальным утверждениям, нужно более строго определять предмет разговора, а вот это опровергнуть можно и при уже введенных терминах:
            «Вы не правы. Фильтр Калмана, как в случае с Гауссовскими ошибками, так и в случае в негауссовскими ошибками не есть самый лучший фильтр.»

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

            Уравнения Стратоновича, в рамках описанной Вами задачи, позволяют рассчитать апостериорную ПВ p(x_k | z_k).

            Не очень понятно, что Вы имеете в виду под «ошибками». Но мне видятся два варианта, в обоих вывод один и тот же.

            1) Если Вы про нормальность ошибок измерений и нормальность формирующего процесса, то АПВ p(x_k | z_k) является строго нормальной. Причем мат.ожидание этого распределения — ваша x_k^{opt}. Нетрудно показать, что в этом случае x_k^{opt} минимизирует средний квадрат e_k.

            2) Если Вы про нормальность e_k при использовании ФК, то \nu и \eta нормальны. А по Вашим условиям задачи их мат. ожидание равны нулю. Возвращаемся к пункту 1.

            Таким образом, в условиях Вашей задачи:
            1) Если \ksi и \eta распределены нормально, то ФК является оптимальным по критерию минимума СКОшибки, как среди линейных фильтров, так и среди нелинейных. В этом случае фильтр Калмана — решение уравнений Стратоновича для вектора математического ожидания и ковариационной матрицы. То есть ФК строго описывает p(x_k | z_k).
            2) Если распределение \ksi и \eta отличны от нормального, то ФК является оптимальным по критерию СКОш только в классе линейных фильтров. Оптимизация в общем случае не гарантирована. В этом случае p(x_k | z_k) не является нормальным распределением, для его описания не достаточно итеративно рассчитывать x_k^{opt} и K_k (которые суть вектор мат. ожиданий и ковариационная матрица).
            • 0
              Спасибо за ответ. К сожалению, не знаю аппарат Статоновича. А что из-него правда следует, что фильтр Калмана лучший среди всех фильтров на свете (если \xi и \eta нормальны)? Можете подсказать, где это лучше прочитать?
              • +2
                Говоря о «лучшем» нужно не забывать упоминать критерий и условия задачи. Вы критерий и условия четко обозначили в статье. Для этого критерия и для этой задачи ФК действительно оказывается лучшим.

                1) Как нетрудно догадаться, разворошил улей Стратонович

                Непосредственно основные труды Стратоновича перечислены на его странице в вики:
                ru.wikipedia.org/wiki/Стратонович

                Я их не читал, но судя по названию, интересует вот эти:
                Kuznetsov P.I, Stratonovich R. L., Tikhonov V.I., Nonlinear Transformation of Stochastic Processes
                Стратонович Р. Л. Условные марковские процессы и их применение к теории оптимального управления

                2) Человек с большой буквы, который всё это применил на практике — Тихонов. Выжимка его работ тут: Статистический анализ и синтез радиотехнических устройств и систем

                3) Второе поколение больших исследователей — Перов Александр Иванович и Харисов Владимир Назарович.

                Книга Харисова (он ученик Тихонова) — выше, совместная с Тихоновым.

                У Перова книжек много на эту тему. В сети можно найти книгу Статистическая теория радиотехнических систем. Но она тяжела для осмысления и понимания. Намного лучше в этом плане его новая книга, предназначенная для студентов: Методы и алгоритмы оптимального приема сигналов в аппаратуре потребителей спутниковых радионавигационных систем

                Я планирую написать на хабре пару статей на эту тему, но всё нет времени.
                • 0
                  Спасибо большое за список литературы.
    • +1
      А формулы прикрутил через онлайн сервис http://www.codecogs.com/latex/eqneditor.php.
      Он сам генерирует картинки для формул. Он стабильный
      • 0
        Сопутствующий вопрос — матлабовские плоты так чудно обработаны в фотошопе? Или кто-то уже написал специальный рендер для fig'ов, выдающий такую красоту?
        • +2
          Графики я делал так. Беру некрасивые матлабовские графики и обвожу вручную их в векторном редакторе inkscape, потом прогоняю получившийся EPS файл через latex, чтобы формулы на графиках имели TEXoвский вид.
          Наверно, существует менее затратные способы.
      • 0
        каждую формулку отдельно?
        • 0
          да, для каждой формулы генерируется своя картинка.
          • 0
            всегда восхищает такая неленивость!
  • +2
    Большое спасибо за статью. Соглашусь с мнением excoder. Это лучшее по фильтру Калмана, что я читал на Хабре. Все аккуратно и по полочкам разобрано. Особенно понятно для человека, последний раз слышавшем о фильтре Калмана в институте. Сразу понимаешь зачем это нужно, как и куда это применить.
    • +1
      Вот бы еще в институтах так преподавали.
  • +1
    степень вони
    улыбнуло
    • +1
      Напомнило. Вчера был опубликован перевод одной статьи про применение UKF (Unscented Kalman filter, фильтр, в котором мат.ожидание и дисперсия пересчитываются с помощью unscented преобразования, что позволяет получить профит в нелинейной задаче), так там UKF перевели как «запах фильтра Калмана».

      www.gisa.ru/93309.html?from_email=Y
      • 0
        Ну как тока его не называют, и «непахнучий», и «чуткий». Но я до сих пор так не слышал как все таки по правильному. Даже на конференции по навигации в Питере, где вроде одни умные дядьки, ну и следовательно переводчики должны быть подкованные. Его там просто перевели «Калмановская фильтрация», ну просто epic fail.
        • 0
          Тут, по-моему, как не переводи — всё равно будет fail. Пока у нас в русском языке не появится четкий термин для unscented-преобразования, лучше писать UKF. Всем понятно, и на смех не поднимут.
      • 0
        Вот прочёл статью. и вот тоже как правильно инерционные датчики или инерциальные, вроде какбе второе?
        • 0
          Русский язык позволяет и так, и так. Технический же термин — инерциальные.

          Удивительно, но журналисты умудрились из этой идеи, которой сто лет в обед, сделать сенсацию. Вот статья на ленте оказывается уже есть:
          lenta.ru/news/2013/02/14/satnav/
        • +2
          ИМХО, инерционные — это когда они сами тормозят с измерением, то есть лагают, а инерциальные — когда торможение меряют
          • 0
            Какое красивое и ёмкое определение))
            • 0
              Но не совсем корректное…
              Инерциальными бывают системы координат или навигационные системы, а датчики «инерционные», т.к. их действие основано на измерении сил или моментов инерции (например, акселерометры). Инерциальными их можно назвать, т.к. они входят в состав инерциальных навигационных систем.
  • +1
    Очень хорошо «разжована». Вот два раза прочесть и всё будет НАКОНЕЦ-То! понятно
  • 0
    А можно еще дальше обобщить — factor graphs, не только kalman filtering, но и много других GM и все в едином фреймворке.
  • –1
    Адский переход от повторного интеграла к произведению интегралов (в доказательстве Exy=ExEy).
  • 0
    Очень доходчиво. Искала информацию после прочтения статьи, где применялся фильтр. Вы прям все по полочкам разложили, спасибо!
  • +1
    фрагмент «Из того что все случайные величины, входящие в выражение для, независимы, следует, что все «перекрестные» члены равны нулю:»
    можно расписать подробнее, а именно:
    Из того, что все случайные величины в выражении независимы, то следует! что их ковариация = 0,
    Ковариация = Е(xy)-E(x)*E(y) = 0, учитывая, что по условию средние значения ошибок случайных величин у нас E(x) = E(y) = 0,
    то E(xy) = 0. и т.д.
    • 0
      Вы абсолютно правы. Спасибо за находку. Как появится время попробую исправить неточность.
    • 0
      Поправил. Еще раз спасибо.
      • 0
        Спасибо,
        важно сохранять последовательность и степень очевидности (чтобы было понятно),
        например
        «Это выражение принимает минимальное значение, когда (приравниваем производную к нулю) » не очевидна, так как производная равно нулю и при максимуме или при минимуме, или вообще даже когда функция — прямая горизонтальная линия :)))

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

        Понравилось в свое время, скрипты к немецким учебникам для ВУЗов, где все понятно было расписано.
        Думаю, что для написания учебной литературы нужно привлекать самих студентов, классифицировать основные вопросы по частоте
        возникновения, и корректировать материал, иначе каждый автор пишет со своей высоты, часто упуская важные детали и примеры.

  • +1
    На счёт центральной предельной теоремы.

    1) Кси ваши — независимые с одинаковой функцией распределения, и все имеют мат. ожидание и дисперсию. Пример когда эта Теорема не работает — у вас есть N случайных величин распределённых по Коши. И накачка N не поможет добиться Распределения по Гаусу.

    2) Так же есть более продвинутая Теорема — Теорема нашего соотечественника — Ляпунова для Теории Вероятности. Которая более продвинутая нежелели чем Центральная Предельная Теорема.

    Буду рад если этот комментарий может пригодиться для прокачки вашей замечательной статьи.
  • 0
    У вас есть раздел про «Независимые случайные величины»

    Независимость в Теории Вероятности по мнению одного из зарубежных математиков в области Теории Вероятности и мат статистики — мутная тема
    “independent random variables were to me (and others, including my teacher Steinhaus) shadowy and not really well-defined objects” — Mark Kac

    Когда я учился в университете в МГТУ. В одной из книг математической серии
    ( «XVI Теория вероятностей» под редакцией Зарубина, Кришенко этот факт так же отмечался)

    С теоретической точки зрения:
    Дело в том, что причинно-следственная независимость вроде как бы влечёт, что P(AB)=P(A)P(B)
    Если P — это статическая вероятность померенная по происхождения события A, B и AB, а не аксиоматическая мера то такой вещей кажется «разумным».

    Но рассмотрение этого факта в другую сторону из того что они независимы причинно-следственные будет ли выполняться P(AB)=P(A)P(B) — не совсем понятно

    С практической точки зрения:
    Очень ловко подменяется понятие «введённой независимости в курсе тер.вера» и «реальной» в головах инженеров.

    Будьте аккуратны!)

    • 0
      Я делюсь с соотечественниками, тем что скорее всего интересно любому инженеру. Проставление минусов меня только уводит от того, что я не буду делиться знаниями со своими соотечественниками… Хватит взрывать свою же нацию изнутри. Пора переключиться от критики к поддержке...(Если вы ещё не поняли в чём секрет успеха США)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.