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

Чтобы максимально точно управлять любой динамической системой, нужны две вещи одновременно. Первая — её математическое описание: закон, по которому система меняется во времени. Вторая — мониторинг её состояния: измерения, которые говорят, где система оказалась на самом деле в данный момент времени. Проблема в том, что ни модели, ни измерениям нельзя верить абсолютно.

Модель всегда врёт — хоть немного. Она не знает всех особенностей конкретного объекта: трения, люфтов, износа, случайных толчков извне. Она предсказывает идеальную систему, а управляем мы настоящей. Измерения врут тоже. Датчик подвержен помехам, дрожит, ошибается.

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

Начнём с общего описания линейной динамической системы:

dxdt\displaystyle \frac{dx}{dt} =Acx\displaystyle = A_c\, x +Bcu\displaystyle + B_c\, u
(1)

где AcA_c — матрица системы, xx — вектор состояния, BcB_c — матрица входа, а uu — управляющее воздействие (вход системы).

Запишем систему (1) в дискретном виде: разобьём время на шаги ii =0,1,2,= 0, 1, 2, \dots с интервалом hh и приблизим производную методом Эйлера — отношением приращений за шаг

dxdt\displaystyle \frac{dx}{dt} xi+1xih\displaystyle \approx \frac{x_{i+1} - x_i}{h} =Acxi\displaystyle = A_c\, x_i +Bcui\displaystyle + B_c\, u_i

выразив отсюда xi+1x_{i+1}, получаем рекуррентную формулу — состояние на следующем шаге через состояние на текущем

xi+1\displaystyle x_{i+1} =(I+Ach)xi\displaystyle = (I + A_c h)\, x_i +(Bch)ui\displaystyle + (B_c h)\, u_i

то есть непрерывные матрицы сворачиваются в дискретную матрицу перехода AA и дискретную матрицу управления BB

A\displaystyle A =I\displaystyle = I +Ach,B\displaystyle + A_c h, \qquad B =Bch\displaystyle = B_c h
(2)

и формула принимает окончательный вид

xi+1\displaystyle x_{i+1} =Axi\displaystyle = A\, x_i +Bui\displaystyle + B\, u_i
(3)

здесь uiu_i — управляющее воздействие на шаге ii.

Реальная система не следует уравнению (3). Добавим к нему случайный вектор wiw_i — то, что модель не описывает

xi+1\displaystyle x_{i+1} =Axi\displaystyle = A\, x_i +Bui\displaystyle + B\, u_i +wi\displaystyle + w_i
(4)

шум процесса wiw_i считаем случайным с нулевым средним; меру его разброса — ковариационную матрицу QQ, матрицу погрешности модели — определим ниже, при выводе прогноза ковариации.

Один цикл фильтра — это два такта: прогноз по модели и коррекция по измерению. Сначала прогноз. По формуле (3) сдвигаем предыдущую оценку x^i1\hat{x}_{i-1} на шаг вперёд и получаем априорную оценку x^i\hat{x}_i^{-} (значок «минус» — «до учёта измерения»)

x^i\displaystyle \hat{x}_i^{-} =Ax^i1\displaystyle = A\, \hat{x}_{i-1} +Bui1\displaystyle + B\, u_{i-1}
(5)

вместе с оценкой прогнозируем и её недостоверность. Введём ошибку оценивания — разницу между истинным состоянием и оценкой, — а мерой недостоверности будет её ковариационная матрица PP (по диагонали — дисперсии ошибок по каждой компоненте состояния)

ei\displaystyle e_i =xi\displaystyle = x_i x^i,Pi\displaystyle - \hat{x}_i, \qquad P_i =E ⁣[eieiT]\displaystyle = \mathbb{E}\!\left[\, e_i\, e_i^{\mathsf{T}} \,\right]

здесь E[]\mathbb{E}[\,\cdot\,] — оператор усреднения (математическое ожидание): он берёт случайную величину и возвращает её среднее по всем возможным реализациям. Одиночная ошибка eie_i случайна и непредсказуема, но усреднение матрицы eieiTe_i e_i^{\mathsf{T}} по ансамблю сглаживает случайность и оставляет устойчивую характеристику разброса — ковариацию.

Посмотрим, во что превращается эта ошибка за шаг прогноза. Истинное состояние идёт по уравнению (4) со сдвигом индекса, xix_i =Axi1= A x_{i-1} +Bui1+ B u_{i-1} +wi1+ w_{i-1}, а наша оценка — по формуле (5); вычтем вторую из первой. Одинаковые члены Bui1B u_{i-1} сокращаются, и остаётся

ei\displaystyle e_i^{-} =xi\displaystyle = x_i x^i\displaystyle - \hat{x}_i^{-} =A(xi1x^i1)\displaystyle = A\,(x_{i-1} - \hat{x}_{i-1}) +wi1\displaystyle + w_{i-1} =Aei1\displaystyle = A\, e_{i-1} +wi1\displaystyle + w_{i-1}

то есть априорная ошибка — это ошибка на предыдущем шаге ei1e_{i-1}, пропущенная через динамику AA, плюс свежая погрешность модели wi1w_{i-1}. Возьмём ковариацию обеих частей. Прошлая ошибка и новый шум независимы, поэтому перекрёстные члены E[ei1wi1T]\mathbb{E}[e_{i-1} w_{i-1}^{\mathsf{T}}] обнуляются, а два оставшихся — это Pi1P_{i-1} и QQ по их определениям

Pi\displaystyle P_i^{-} =E ⁣[ei(ei)T]\displaystyle = \mathbb{E}\!\left[\, e_i^{-} (e_i^{-})^{\mathsf{T}} \,\right] =AE[ei1ei1T]AT\displaystyle = A\, \mathbb{E}[\, e_{i-1} e_{i-1}^{\mathsf{T}} \,]\, A^{\mathsf{T}} +E[wi1wi1T]\displaystyle + \mathbb{E}[\, w_{i-1} w_{i-1}^{\mathsf{T}} \,]

подставив E[ei1ei1T]\mathbb{E}[e_{i-1} e_{i-1}^{\mathsf{T}}] =Pi1= P_{i-1} и E[wi1wi1T]\mathbb{E}[w_{i-1} w_{i-1}^{\mathsf{T}}] =Q= Q, получаем формулу прогноза ковариации: старая неопределённость проносится через AA, к ней добавляется погрешность модели QQ

Pi\displaystyle P_i^{-} =APi1AT\displaystyle = A\, P_{i-1}\, A^{\mathsf{T}} +Q\displaystyle + Q
(6)

по диагонали QQ стоят дисперсии погрешности по каждой компоненте состояния, вне диагонали — их взаимные ковариации. Большая QQ означает «модели не верю, она грубая»; маленькая — «модель точна». Аналитически вывести QQ из первых принципов почти никогда не удаётся, поэтому её выбирают эмпирически — подбором по поведению фильтра на реальных или смоделированных данных. Это главная настроечная ручка, и обычно QQ берут диагональной, лишь бы не гадать про ковариации.

Пара слов про саму PP: маленькая означает «оценке доверяю», большая — «оценка ненадёжна». Фильтр ведёт её сам — на прогнозе она растёт (формула (6) добавляет QQ), а на шаге коррекции уменьшится, когда измерение принесёт информацию. Стартовое P0P_0 берут заведомо большим: начальное состояние известно плохо, поэтому первым шагам фильтр не доверяет — быстро подтягивается к измерениям и «прогревается».

Обычно мы не наблюдаем весь вектор состояния xx целиком. Наблюдаются лишь некоторые величины — вектор измерений yy, и его размерность меньше размерности состояния. Связь измерения с состоянием задаёт матрица наблюдения HH

yi\displaystyle y_i =Hxi\displaystyle = H\, x_i
(7)

роль HH — согласовать размерности: она отображает nn-мерное состояние xx в mm-мерное измерение yy (число строк mm n\le n), выбирая и линейно комбинируя те компоненты состояния, которые реально измеряются. Это и есть главный смысл наблюдателя: восстанавливать то, что не измеряется.

Датчик не выдаёт HxiH x_i точно — измерение искажено помехой viv_i

yi\displaystyle y_i =Hxi\displaystyle = H\, x_i +vi\displaystyle + v_i
(8)

про шум viv_i удобно предполагать нормальное (гауссово) распределение с нулевым средним — тогда фильтр Калмана оказывается ещё и оптимальной байесовской оценкой. Но это не обязательное условие: при любом другом распределении с конечной дисперсией фильтр остаётся наилучшей линейной оценкой по среднеквадратичному критерию. Разброс помех задаёт ковариационная матрица шума измерений

R\displaystyle R =E ⁣[viviT]\displaystyle = \mathbb{E}\!\left[\, v_i\, v_i^{\mathsf{T}} \,\right]
(9)

строится она из дисперсий датчиков. Если помехи разных датчиков независимы, RR диагональна: на диагонали — квадраты стандартных отклонений (паспортная точность прибора), вне диагонали — нули

R\displaystyle R =(σ12000σ22000σm2)\displaystyle = \begin{pmatrix} \sigma_1^2 & 0 & \cdots & 0 \\ 0 & \sigma_2^2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \sigma_m^2 \end{pmatrix}
(10)

чем точнее датчик, тем меньше его σ2\sigma^2 и тем сильнее фильтр будет доверять этому каналу измерения.

Теперь всё готово, чтобы сформулировать сам фильтр. К шагу ii у нас два независимых источника сведений об искомом состоянии xx. Первый — прогноз модели x^i\hat{x}_i^{-} с ковариацией ошибки PiP_i^{-}: истинное xx лежит где-то вокруг x^i\hat{x}_i^{-} с разбросом PiP_i^{-}. Второй — измерение yiy_i =Hx= H x +v+ v с ковариацией шума RR: оно указывает на xx с точностью RR. Оба неточны — ищем состояние, наиболее правдоподобное сразу для обоих.

Будем считать ошибки обоих источников гауссовыми (для шума измерений мы это уже предположили). Тогда каждый источник задаёт плотность вероятности вида exp ⁣(12eTΣ1e)\exp\!\left(-\tfrac12\, e^{\mathsf{T}} \Sigma^{-1} e\right), где ee — его ошибка, а Σ\Sigma — ковариация. Обратная ковариация Σ1\Sigma^{-1} играет роль веса: чем надёжнее источник (меньше разброс), тем сильнее он тянет оценку к себе. Правдоподобие состояния xx — произведение двух таких плотностей

p(x)\displaystyle p(x) exp ⁣(12(xx^i)T(Pi)1(xx^i))exp ⁣(12(yiHx)TR1(yiHx))\displaystyle \propto \exp\!\left(-\tfrac12 (x - \hat{x}_i^{-})^{\mathsf{T}} (P_i^{-})^{-1} (x - \hat{x}_i^{-})\right) \cdot \exp\!\left(-\tfrac12 (y_i - H x)^{\mathsf{T}} R^{-1} (y_i - H x)\right)

наиболее правдоподобное xx максимизирует это произведение. Логарифм превращает произведение в сумму показателей, а максимум p(x)p(x) отвечает минимуму 2lnp(x)-2\ln p(x); отбросив константы, получаем ровно сумму двух квадратичных форм — это и есть наш функционал

J(x)\displaystyle J(x) =(xx^i)T(Pi)1(xx^i)погрешность модели\displaystyle = \underbrace{(x - \hat{x}_i^{-})^{\mathsf{T}} (P_i^{-})^{-1} (x - \hat{x}_i^{-})}_{\text{погрешность модели}} +(yiHx)TR1(yiHx)погрешность измерения\displaystyle + \underbrace{(y_i - H x)^{\mathsf{T}} R^{-1} (y_i - H x)}_{\text{погрешность измерения}}
(11)

оптимальная оценка минимизирует JJ. Возьмём производную по xx и приравняем к нулю

Jx\displaystyle \frac{\partial J}{\partial x} =2(Pi)1(xx^i)\displaystyle = 2\,(P_i^{-})^{-1} (x - \hat{x}_i^{-}) 2HTR1(yiHx)\displaystyle - 2\, H^{\mathsf{T}} R^{-1} (y_i - H x) =0\displaystyle = 0
(12)

раскрыв скобки и собрав xx в левой части, получаем нормальное уравнение

[(Pi)1+HTR1H]x^i\displaystyle \left[\, (P_i^{-})^{-1} + H^{\mathsf{T}} R^{-1} H \,\right] \hat{x}_i =(Pi)1x^i\displaystyle = (P_i^{-})^{-1} \hat{x}_i^{-} +HTR1yi\displaystyle + H^{\mathsf{T}} R^{-1} y_i
(13)

матрица в квадратных скобках — это в точности обратная апостериорная ковариация (Pi)1(P_i)^{-1} (информационная форма: информация прогноза плюс информация измерения). Отсюда сразу видно и правило обновления неопределённости

Pi\displaystyle P_i =[(Pi)1+HTR1H]1\displaystyle = \left[\, (P_i^{-})^{-1} + H^{\mathsf{T}} R^{-1} H \,\right]^{-1}
(14)

Обращать матрицы размера состояния дорого. Применив лемму об обращении матриц, перепишем решение (13)–(14) в вычислительно удобной форме через коэффициент усиления Калмана KiK_i

Ki\displaystyle K_i =PiHT(HPiHT+R)1\displaystyle = P_i^{-} H^{\mathsf{T}} \left(\, H P_i^{-} H^{\mathsf{T}} + R \,\right)^{-1}
(15)

тогда коррекция оценки — это прогноз плюс поправка, пропорциональная невязке (yiHx^i)(y_i - H \hat{x}_i^{-}) — расхождению между тем, что предсказала модель, и тем, что показал датчик

x^i\displaystyle \hat{x}_i =x^i\displaystyle = \hat{x}_i^{-} +Ki(yiHx^i)\displaystyle + K_i \left(\, y_i - H \hat{x}_i^{-} \,\right)
(16)

а ковариация ошибки после коррекции уменьшается

Pi\displaystyle P_i =(IKiH)Pi\displaystyle = (I - K_i H)\, P_i^{-}
(17)

смысл KK — регулятор доверия. Если измерение точное (RR мала), KK велик и оценка тянется к датчику; если прогноз надёжен (PP^{-} мала), KK мал и фильтр держится модели. Тот самый компромисс между бульдогом и носорогом, только вычисленный оптимально.