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

Итак, приступим!

Чтобы знать фильтр Калмана, нам нужно добраться до основ. В фильтрах Калмана распределение задается так называемым гауссовым.

А что такое гауссовский?

Гауссиана - это непрерывная функция в пространстве местоположений, а площадь под ним суммируется до 1.

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

Точная формула представляет собой экспоненту квадратичной функции, где мы берем показатель степени выражения. Теперь в приведенном ниже уравнении, если x равно Mu, числитель становится 0, а если x равно 0, то это единица. Оказывается, мы должны нормализовать это значение константой, равной 1 квадратному корню из 2 Пи Сигма-квадратов.

Что такое дисперсия?

Дисперсия - это мера гауссова разброса (т. Е. Разброс площади под кривой). Большие дисперсии соответствуют более коротким гауссианам.
Дисперсия - это еще и показатель достоверности; если вы пытаетесь найти что-то вроде местоположения автомобиля с наибольшей уверенностью, вам понадобится гауссиан, среднее значение которого является местоположением автомобиля и с наименьшей неопределенностью / разбросом.

Как изменить среднее значение?

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

Выполнение цикла измерения, а затем цикла прогнозирования, в соответствии с курсом Udacity по компьютерному зрению, выглядит следующим образом:

  1. Предположим, вы локализуете другой автомобиль и у вас есть предыдущее распространение, которое выглядит следующим образом: это очень широкий гауссиан со средним значением. Это пример, в котором мы были довольно неуверены в местонахождении, но измерения довольно много сказали нам о том, где находится транспортное средство.
  2. Окончательное среднее значение сдвигается между двумя старыми средними значениями, средним из предшествующих значений и средним значением измерения. Это немного дальше на стороне измерения, потому что измерение было более определенным относительно того, где находится автомобиль, чем раньше. Чем более мы уверены, тем больше мы используем среднее значение в направлении определенного ответа.

Как обновить параметр?

  1. Предположим, мы умножаем два гауссиана, как в правиле Байеса, на априорную величину и вероятность измерения. Априор имеет среднее значение Mu и дисперсию квадрата сигмы, а измерение имеет среднее значение Nu и ковариацию r-квадрата.
  2. Тогда новое среднее, Mu простое, является взвешенной суммой старых средних. Mu взвешивается по r-квадрату, Mu взвешивается по сигма-квадрату, нормированному на сумму весовых коэффициентов. Новый член дисперсии будет представлять собой квадратное простое сигма.
  3. Ясно, что априорный гауссиан имеет гораздо более высокую неопределенность, поэтому квадрат сигмы больше, а это означает, что nu имеет гораздо больший вес, чем Mu. Таким образом, среднее значение будет ближе к ню, чем к мю. Интересно, что на термин дисперсии не влияют фактические средства, он просто использует предыдущие дисперсии.

Его реализация в коде выглядит следующим образом:

Как реализовать гауссово движение?

  1. Новое среднее - это ваше старое среднее плюс движение, которое часто называют u. Итак, если вы переместитесь более чем на 10 метров в направлении оси x, это будет 10 метров, и вы знали, что сигма-квадрат - это ваш старый квадрат сигмы плюс дисперсия движения по Гауссу. Это все, что вам нужно знать, это просто дополнение.
  2. Полученный гауссиан на этапе прогнозирования просто складывает эти две вещи: мю плюс u и сигма в квадрате плюс r в квадрате.

Его реализация в коде выглядит следующим образом:

Итак, теперь давайте все вместе. Давайте напишем основную программу, которая берет на себя эти две функции, обновляет и прогнозирует, и передает последовательность измерений и движений. В примере, который я выбрал:
измерения 5., 6., 7., 9. и 10.
движения: 1., 1., 2., 1., 1.

Все это сработало бы очень хорошо, если бы первоначальная оценка была 5, но мы устанавливаем ее на 0 с очень большой погрешностью в 10 000.
Предположим:
неопределенность измерения постоянна 4, а
неопределенность движения постоянна 2.

Когда вы запустите это, ваша первая оценка положения должна в основном стать 5–4,99, и причина в том, что ваша начальная неопределенность настолько велика, что в оценке преобладает первое измерение. Ваша неопределенность уменьшается до 3,99, что немного лучше, чем неопределенность измерения.
Затем вы прогнозируете, что добавляете 1, но неопределенность возрастает до 5,99, что является неопределенностью движения, равной 2. Если вы обновите снова на основе измерения 6, вы получите оценку 5,99, что составляет почти 6. Вы перемещаете 1 опять таки. Вы отмеряете 7. Вы двигаетесь 2. Вы измеряете 9. Вы перемещаетесь 1. Вы измеряете 10, и вы перемещаете последний 1. И получается окончательный результат, прогноз 10,99 для позиции, которая является вашей 10-й позицией, перемещенной на 1, а неопределенность - остаточная неопределенность 4.

Построение гауссовского графика путем перебора диапазона значений x и создания результирующего списка гауссовских значений приведет к:

Хотите проверить это в коде?

ССЫЛКА: