Фильтр калмана: алгоритм, который видит сквозь шум
Представьте: вы сидите в центре управления полётами, а на экране — самолёт, который летит со скоростью 200 м/с. Радар показывает расстояние до него — 10 километров.
Всё просто? Как бы не так.
Через 5 секунд радар снова посылает сигнал. Но самолёт-то уже улетел дальше! Куда именно? Если вы направите луч наугад — потеряете цель.
Казалось бы, элементарная физика:
Положение_через_5сек = Текущее_положение + Скорость × Время =
= 10 000 + 200 × 5 = 11 000 метров
Но есть две проблемы, которые убивают эту идеальную формулу наповал.
Две главные неприятности реального мира
Первая — шум измерений. Радар никогда не показывает одну и ту же цифру дважды. Если взять десять одинаковых радаров и померить расстояние до одного самолёта одновременно, они дадут десять чуть разных значений. Близких друг к другу, но не идентичных. Это шум измерений — случайная погрешность прибора, которая есть всегда.
Вторая — неточность модели. Мы предположили, что самолёт летит с постоянной скоростью по прямой. Но пилот может слегка менять курс, дует боковой ветер, возникла турбулентность. Наша модель «летит прямо» — это упрощение. Реальный мир сложнее. Это называют шум процесса или возмущением — непредсказуемые факторы, которые модель не учитывает.
И вот ключевой вопрос: как понять, насколько вообще можно доверять тому, что показывает радар?
Именно здесь на сцену выходит гений фильтра Калмана.
Что умеет этот алгоритм?
Фильтр Калмана — это метод оценки состояния системы (или проще — способ понять, где объект находится прямо сейчас), который делает три вещи одновременно:
- Предсказывает будущее положение объекта, используя динамическую модель (математическое описание того, как объект движется со временем)
- Корректирует предсказание на основе реальных данных измерений
- Честно говорит о степени своей уверенности — то есть выдаёт погрешность вместе с оценкой
Причём он делает это оптимально — математически доказано, что никакой другой метод не даст меньшую ошибку при тех же условиях.
Это как если бы ваш друг-прогнозист говорил: «Я думаю, самолёт будет здесь, но я уверен в этом примерно на ±50 метров» вместо просто «он будет там». Ценная информация, правда?
КАК РАБОТАЕТ ФИЛЬТР КАЛМАНА
───────────────────────────
Измеряем Предсказываем Корректируем Лучшая оценка
(радар) по модели по данным с погрешностью
○────────────○────────────────○─────────────────○
↑ ↑
│ │
Используем Учитываем
физическую реальные
модель показания
Неопределённость падает при объединении обоих источников!
Интуиция простыми словами
Давайте переведём математику на человеческий язык.
У вас есть два источника информации о местоположении самолёта:
- Модель говорит: «Он должен быть примерно там-то»
- Радар говорит: «Я вижу его вот здесь»
Если ваша модель очень точная, а радар глючный — вы больше доверяете прогнозу. Если всё наоборот — ориентируетесь на показания прибора. А если оба источника примерно одинаково надёжны — комбинируете их вместе.
Так вот фильтр Калмана автоматически вычисляет эти веса через так называемый коэффициент усиления K (число, которое показывает — верить больше предсказанию модели или данным с датчика). Он постоянно анализирует, какой источник сейчас заслуживает большего доверия.
Это похоже на принятие решений человеком: вы же не слепо верите одному источнику? Вы постоянно сравниваете информацию и ищете консенсус. Примерно тем же занимается фильтр Калмана — только формально и математически.
Где это применяется?
Список мест, где работает фильтр Калмана, просто огромен:
- Навигация космических кораблей Apollo, которые летали к Луне
- Системы слежения за самолетами гражданской авиации
- Автономные автомобили Tesla и другие беспилотники
- Стабилизация квадрокоптеров DJI чтобы они не дёргались от дрожи рук пилота
- Прогнозирование цен акций чтобы отделить тренд от рыночного шума (допплеровский эффект тут ни при чём)
- Даже компьютерная мышь внутри вашего ноутбука! Курсор двигается плавнее вашей руки потому что дрожь пальцев фильтруется тем же принципом
По сути любой случай: есть система которая движется или изменяется во времени; есть датчики которые мерят её состояние; измерения содержат шум; нужна хорошая оценка текущего состояния.
Почему все думают, что это сложно?
Лично меня бесит, когда в учебниках начинают сразу писать матричные уравнения: x_k = F_{k−1} x_{k−1} + B_{k−1} u_{k−1} + w_{k−1}. Голова сломаешь!
А суть простая:
Шаг первый: Делаешь прогноз по физической модели.
Шаг второй: Смотришь данные с датчика и корректируешь прогноз.
Математика под капотом красивая и строгая (фильтр Калмана даже получил Нобелевскую премию в экономике в 1972 году), но концепция элементарная.
На сайте Understanding the Kalman Filter сделали отличную работу: взяли пример с радаром и разобрали по шагам без матриц. Показали конкретные числа и объяснили интуитивно. Рекомендую попробовать повторить расчёт руками хотя бы разок — тогда страх перед формулами пропадает навсегда.
Конечно, реальные приложения требуют учёта многих факторов: нелинейности движения (когда объект летит не по прямой), нескольких датчиков работающих вместе и вычислительных ограничений устройств. Но базовый принцип остаётся неизменным: объединяй предсказание модели с данными наблюдений оптимальным образом.
Фильтр Калмана справляется там где простые методы бессильны — он превращает зашумлённые сигналы в чёткую картину происходящего.
Ссылки
- Understanding the Kalman filter with a simple radar example — интерактивное объяснение работы фильтра Калмана
Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.