Kalmanov filter

Úvod


   Kalmanov filter je nástrojom, ktorý vie odhadnúť premenné v širokom spektre procesov. Matematicky povedané: Kalmanov filter odhaduje (určuje) stavy lineárneho systému. Tento filter pracuje veľmi dobre v praxi a zároveň je atraktívna aj teória, ktorá ho popisuje. Je možné povedať, že zo všetkých možných filtrov je práve Kalmanov ten, ktorý minimalizuje varianciu chyby odhadu. Tieto filtre sú často implementované v tzv. embedded riadiacich systémoch (systémoch vyskladaných z vnorených blokov - preklad do slovenského jazyka nie je jednotný), pretože ak chceme riadiť nejaký proces, musíme vedieť čo najpresnejšie určiť hodnoty premenných v riadiacom procese.




Lineárne systémy


   Ak teda chceme, aby Kalmanov filter odstránil šum zo signálu, proces v ktorom ho chceme použiť (teda meraný proces) musí byť opísateľný lineárnym systémom. Veľa fyzikálnych procesov, napríklad auto pohybujúce sa po ceste, satelit krúžiaci na obežnej dráhe Zeme, hriadeľ poháňaný od elektromotora alebo sínusový signál nosnej rádiovej (teda elektromagnetickej) vlny môžu byť aproximované ako lineárne systémy. Lineárny systém je teda, jednoducho povedané, proces, ktorý vieme opísať nasledovnými dvoma rovnicami:

  • stavová rovnica:

\[ x_{k+1} = Ax_k + Bu_k + w_k \]

  • rovnica výstupu:

\[ y_k = Cx_k + z_k \]

   V uvedených rovniciach $A$, $B$ a $C$ sú matice, $k$ je časový index, $x$ je tzv. stav systému, $u$ je známy vstup do systému a $w$ a $z$ sú šum. Premenná $w$ reprezentuje tzv. procesný šum a $z$ tzv. merací šum. Každá z týchto veličín je (obvykle) vektor a preto obsahuje viac ako jednu zložku. Vektor $x$ obsahuje všetky dostupné informácie o súčasnom stave systému, ale $x$ nemôžeme merať priamo. Namiesto toho meriame $y$, ktoré je funkciou x (teda $y = f(x)$), ale je "zašumená" šumom $z$. Môžeme použiť $y$ ako pomoc na získanie odhadu x, ale nemôžeme nutne vziať informáciu z $y$ ako reprezentujúcu hodnotu, pretože obsahuje aj šum. Meranie je ako politik - vieme použiť informáciu, ktorú reprezentuje do určitej miery, ale nemôžeme mu zaručiť plnú dôveru.
   Napríklad, uvažujme, že chceme modelovať dopravný prostriedok pohybujúci sa priamočiarym pohybom. Potom môžeme povedať, že stav pozostáva z polohy tohoto dopravného prostriedku $p$ a jeho rýchlosti $v$. Vstupná veličina $u$ je nariadená akcelerácia a výstupná veličina $y$ je meraná poloha. Povedzme, že sme schopní meniť akceleráciu a merať polohu každých $T_s$ sekúnd. V takomto prípade hovoria elementárne zákony fyziky o tom, že rýchlosť $v$ bude daná nasledovnou rovnicou:

\[ v_{k+1} = v_k + T_su_k \]

   To znamená, že rýchlosť vzdialená jednu vzorku od teraz (teda $T_s$ sekúnd) bude rovná súčasnej rýchlosti prenásobenej nariadeným zrýchlením a intervalom $T_s$. Predošlá rovnica však nedáva presnú hodnotu pre $T_{k+1}$. Namiesto toho bude rýchlosť ovplyvnená šumom - poryvy vetra, priehlbinami na ceste a inými nepríjemnými skutočnosťami. Šum rýchlosti je náhodnou premennou, ktorá sa mení s časom. Preto realistickejšie zapísaná rovnica vyzerá nasledovne:

\[ v_{k+1} = v_k + T_su_k + \tilde{v}_k \]

kde $\tilde{v}_k$ je šum rýchlosti. Podobnú rovnicu vieme odvodiť pre polohu p:

\[ p_{k+1} = p_k + T_sv_k + \frac{1}{2} T_s^2u_k + \tilde{p}_k \]

kde $\tilde{p}_k$ je šum rýchlosti. Potom môžeme definovať stavový vektor nášho systému, ktorý pozostáva z polohy a rýchlosti:

\[ x_k = \left( \begin{array}{x_vec} {p_k} \\ {v_k} \end{array} \right)\]

   Keď už vieme, že meraná výstupná veličina je úmerná polohe, konečne môžeme zapísať rovnice pre tento lineárny systém nasledovne:

\[ x_{k+1} = \left( \begin{array}{xk_state} 1 & T_s \\ 0 & 1 \end{array} \right)x_k + \left( \begin{array}{uk_state} {T_s^2/2} \\ {T_s} \end{array} \right)u_k + w_k \]
\[ y_{k} = \left( \begin{array}{xk_state} 1 & 0 \end{array} \right)x_k + z_k \]

   $z_k$ je šum v meraní z dôvodu prítomnosti napríklad chýb prístrojov. Ak chceme riadiť dopravný prostriedok so systémom so spätnou väzbou, potrebujeme presný odhad polohy $p$ a rýchlosti $v$. Inými slovami, potrebujeme poznať spôsob akým odhadnúť stav $x$. Toto je moment, kedy do procesu vstupuje Kalmanov filter.




Teória Kalmanovho filtra a algoritmus


   Uvažujme lineárny model systému ako bolo uvedené vyššie. Chceme využiť dostupné merania $y$ na odhad stavu systému $x$. Vieme, ako sa systém správa vzhľadom na stavovú rovnicu a máme merania polohy, takže ako dokážeme určiť najlepší odhad stavu $x$? Chceme, aby prostriedok, ktorý zabezpečuje presný odhad správneho stavu, tento stav určoval presne aj keď nemáme k dispozícii možnosť priamo ho merať. Aké kritériá by mal náš "odhadovač" spĺňať? Sú dve významné potreby.
   Najprv potrebujeme priemernú hodnotu odhadu správneho stavu. To znamená, že nechceme, aby náš odhad bol posunutý nahor alebo nadol. Matematicky povedané: očakávaná hodnota odhadu by mala byť rovná očakávanej hodnote stavu. Druhá potreba je, aby sa odhad stavu líšil od skutočnosti (teda správnej hodnoty) čo najmenej.
   To znamená, že chceme nielen to, aby bol priemer odhadu rovný priemeru správnej hodnoty, ale aj prostriedok odhadu, ktorého výsledkom je čo najmenšia variácia odhadu tohto stavu (teda chceme odhadovať správne a s čo najmenšou možnou chybou). Matematicky povedané: chceme nájsť taký prostriedok pre odhad, ktorý má čo najmenšiu varianciu chyby.
   Tak sa dostávame k tomu, že Kalmanov filter spĺňa obe tieto kritériá. Ale! Riešenie Kalmanovým filtrom nie je možné aplikovať kým nesplníme určité predpoklady o šume, ktorý náš systém ovplyvňuje. Je treba pripomenúť si, že v rovniciach (modelu systému) v úvode vystupujú dve premenné - $w$ je šum v procese a $z$ je šum v meraní. Môžeme konštatovať, že priemerná hodnota $w$ je rovná nule a priemerná hodnota $z$ je tiež rovná nule (ide o náhodné javy). Tiež potom môžeme ďalej skonštatovať, že neexisutje korelácia medzi $w$ a $z$ - teda v akomkoľvek čase $k$, $w_k$ a $z_k$ sú nezávislé náhodné premenné. Potom kovariančné matice šumu $S_w$ a $S_z$ vieme zadefinovať ako:
Kovariancia šumu v procese:

\[ S_w = (w_kw_k^{T}) \]

Kovariancia šumu v meraní:

\[ S_z = (z_kz_k^{T}) \]

kde $w^{T}$ a $z^{T}$ označujú transpozíciu náhodných vektorov šumov a $E( . )$ znamená očakávanú hodnotu. Teraz sme konečne v pozícii, kedy sa pozrieme na rovnice Kalmanovho filtra. Existuje veľa alternatívnych, ale ekvivalentných spôsobov ako vyjadriť rovnice Kalmanovho filtra. Uvedieme jednu z formulácií:

\[ K_k = AP_kC^T(CP_kC^T + S_z)^{-1} \]
\[ \hat{x}_{k+1} = (A\hat{x}_{k} + Bu_k) + K_k(y_{k+1} - C\hat{x}_{k}) \]
\[ P_{k+1} = AP_kA^T + S_w + AP_kC^TS_z^{-1}CP_kA^T \]

Tak, to je Kalmanov filter. Pozostáva z troch rovníc, z ktorých každá zahŕňa maticové operácie. V uvedených rovniciach exponent $^{-1}$ znamená inverziu matice a exponent $^{T}$ transpozíciu matice. Matica $K$ je tzv. Kalmanov zisk (zosilnenie) a matica P je nazývaná kovariancia chyby odhadu.
   Rovnica odhadu stavu (\hat{x}_{k}) je celkom intuitívna. Prvý výraz použíitý pre odvodenie odhadu stavu v čase $k + 1$ je vlastne len A-krát odhad stavu v čase $k$ plus B-krát známy vstup v čase $k$. Toto by bol odhad stavu ak by sme nemali merania. Inými slovami, odhad stavu by sa v čase šíril rovnako ako stavový vektor v modeli systému. Druhý výraz v rovnici je tzv. korekcia a reprezentuje veľkosť korekcie, akou treba korigovať šírený odhad stavu na základe meraní.
   Rozborom rovnice pre K zistíme, že ak je šum z merania veľký, $S_z$ bude veľké, takže $K$ bude malé a nebudeme dávať veľkú váhu meraniu $y$, keď budeme počítať ďalšie. Na druhej strane však ak je šum v meraní malý, $S_z$ bude malé a $K$ veľké, čo znamená, že meraniu priradíme veľkú váhu pri výpočte ďalšieho.




Navigácia prostriedku


   Uvažujme teraz problematiku navigácie prostriedku, ktorú sme už spomenuli vyššie. Prostriedok sa pohybuje po trase. Poloha je meraná s chybou 10 m (štandardná odchýlka). Nariadená akcelerácia je vlastne konštanta 1 m/s2. Šum v akcelerácii je 0,2 m/2 (štandardná odchýlka). Poloha je meraná 10-krát za sekundu ($T_s = 0,1 s$). Ako najlepšie vieme odhadnúť polohu pohybujúceho sa prostriedku? Z hľadiska veľkej hodnoty šumu v meraní je odhad polohy nepresný ak berieme do úvahy len meranie. Určite by to mohlo ísť aj lepšie... Vzorkovanie $T_s = 0,1s$. Teda lineárny model pre náš systém môžeme odvodiť od modelu, ktorý bol prezentovaný vyššie potom môžeme zapísať:

\[ x_{k+1} = \left( \begin{array}{xk_state} 1 & 0,1 \\ 0 & 1 \end{array} \right)x_k + \left( \begin{array}{uk_state} {0,005} \\ {0,1} \end{array} \right)u_k + w_k \]
\[ y_{k} = \left( \begin{array}{xk_state} 1 & 0 \end{array} \right)x_k + z_k \]

   Pretože štandardná odchýlka šumu z merania je 10 m, matica $S_z$ je rovná 100. Teraz musíme odvodiť maticu $S_w$. Nakoľko poloha je úmerná súčinu 0,005 a akcelerácie a šum v akcelerácii je 0,2 m/s2, variancia šumu polohy je:

\[ (0,005)^2 * (0,2)^2 = 10^{-6}\]

Podobne, keďže rýchlosť je úmerná súčinu vzorkovacieho intervalu a akcelerácie, variancia šumu rýchlosti je:

\[ (0,1)^2 * (0,2)^2 = 4*10^{-4}\]

Teda kovariancia šumu polohy a šumu rýchlosti je rovná súčinu štandardnej odchýlky polohy a štandardnej odchýlky rýchlosti:

\[ (0,005*0,2) * (0,1*0,2) = 2*10^{-5}\]

Všetky tieto výpočty skombinujeme do odvodenia matice $S_w$:

\[ S_{w} = E(xx^T) = \left( \begin{bmatrix}\begin{array}{xk_state} p \\ v \end{array}\end{bmatrix} \begin{bmatrix}\begin{array}{xk_state} p & v \end{array}\end{bmatrix} \right)
= \left( \begin{array}{xk_state} p^2 & pv \\ vp & v^2\end{array}\right) = \left ( \begin{array}{xk_state} 10^{-6} & 2*10^{-5} \\ 2*10^{-5} & 4*10^{-4}\end{array}\right ) \]

   Teraz už len inicializujeme $\hat{x}_{k}$ ako náš najlepší počiatočný odhad polohy a rýchlosti a tiež inicializujeme $P_0$ ako neistotu v našom počiatočnom odhade. Následne vykonáme iteráciu rovnicami Kalmanovho filtra každú $T_s$ a "frčíme" :-).




   Na obr. 2 je znázornená chyba - rozdiel medzi skutočnou polohou a nameranou polohou a rozdiel medzi skutočnou polohou a polohou predpovedanou pomocou Kalmanovho filtra. Chyba merania je štandardne 10 metrov so zriedkavo sa vyskytujúcimi špičkami až do 30 metrov (3 x 4$sigma$). Chyba predpovedanej polohy pomocou Kalmanovho filtra dosahuje hodnotu cca 2 m.




   Na obr.3 môžeme vidieť ďalšiu informáciu, ktorú získavame na výstupe z Kalmanovho filtra. Je to predpovedaná rýchlosť pohybu objektu. Porovnaním predpovedanej rýchlosti pohybu so skutočnou rýchlosťou pohybu dostávame chybu v predpovedanej rýchlosti znázornenú na obr. 4. Pre výpočet výsledkov, ktoré sú znázornené na vyššie uvedených grafoch bol použitý program Matlab. Za predpokladu, že sa používa Matlab pre simuláciu signálov a následný výpočet, stále bude vypočitaný iný výsledok. Je to spôsobené šumom, ktorý je generovaný a má náhodný charakter, ale výsledky sa budú líšiť iba minimálne.




Výpis zdrojového kódu -príkazov:



function kalman(trvanie, T_s)

% funkcia kalman(trvanie, T_s)
%
% simulácia Kalmanovho filtra pre dopravný prostriedok
% Vstupy
% trvanie = dĺžka simulácie v sekundách
% T_s = dĺžka časového intervalu (seconds)

sum_meranie = 10; % šum merania polohy v metroch
sum_akceleracia = 0.2; % šum merania zrýchlenia (meter/sec2)
A = [1 T_s; 0 1]; % matica prechodových procesov- prechodová matica
B = [T_s^2/2; T_s]; % vstupná matica
C = [1 , 0]; % matica nameraných dát
X = [0; 0]; % vektor pôvodného stavu
X_k = X; % odhad pôvodného stavu
S_z = sum_meranie^2; % kovarancia chyby merania
S_w = sum_akceleracia^2 * [T_s^4/4 T_s^3/2; T_s^3/2 T_s^2]; % kovarancia procesného šumu
P_k = S_w; % kovariancia pôvodného odhadu

% inicializácia polí pre ďalšie vykreslenie
poloha = []; % pole so skutočnou polohou
poloha_odhad = []; % pole s odhadovanou polohou
poloha_merana = []; % pole s meranou polohou
rychlost = []; % pole skutočnej rýchlosti
rychlost_odhad = []; % pole s odhadovanou rýchlostou
for t = 0 : T_s : trvanie,

% použitie konštanty u pre zadanie zrýchlenia 1 m/(s^2).
U = 1;

% simulácia lineárneho systému

PROCESNY_SUM = sum_akceleracia * [(T_s^2/2)*randn; T_s*randn];
X = A * X + B * U + PROCESNY_SUM;

% simulácia šumov merania
MERACI_SUM = sum_meranie * randn;
Y = C * X + MERACI_SUM;

% extrapolácia najstaršieho stavu na predpovedanie stavu v danom čase
X_k = A * X_k + B * U;

% z vektora inovácií- zmien
inovacia = Y - C * X_k;

% výpočet kovariancie inovácií
S = C * P_k * C.' + S_z;

% z matice Kalmanových ziskov – zosilnení
K_k = A * P_k * C.' * inv(S);

% aktualizácia predpovedaného stavu.
X_k = X_k + K_k * inovacia;

% výpočet kovariancie chyby predpovedaného stavu
P_k = A * P_k * A.' - A * P_k * C.' * inv(S) * C * P_k * A.' + S_w;

% vytvorenei si pomocných parametrov pre neskoršie vykreslenie
poloha = [poloha; X(1)];
poloha_merana = [poloha_merana; Y];
poloha_odhad = [poloha_odhad; X_k(1)];
rychlost = [rychlost; X(2)];
rychlost_odhad = [rychlost_odhad; X_k(2)];
end

% vykreslenie nasimulovaných výsledkov
close all;
t = 0 : T_s : trvanie;

figure;
plot(t,poloha, t,poloha_merana, t,poloha_odhad);
grid;
xlabel('Čas (s)');
ylabel('Poloha (m)');
title('Obr. 1 - Poloha prostriedku (skutočná, meraná, odhad)')

figure;
plot(t,poloha-poloha_merana, t,poloha-poloha_odhad);
grid;
xlabel('Čas (s)');
ylabel('Chyba polohy (m)');
title('Obr. 2 - Chyba merania polohy a chyba odhadu merania');

figure;
plot(t,rychlost, t,rychlost_odhad);
grid;
xlabel('Čas (s)');
ylabel('Rýchlosť (m/s)');
title('Obr. 3 - Rýchlosť (skutočná a odhadovaná)');

figure;
plot(t,rychlost-rychlost_odhad);
grid;
xlabel('Čas (s)');
ylabel('Chyba rýchlosti (m/s)');
title('Obr. 4 - Chyba odhadu rýchlosti');



Praktické výstupy


   Základné princípy a myšlienky Kalmanovho filtrovania sú jasné, ale riešenie rovníc využíva hlavne maticovú algebru. V ďalšom výpise sú uvedené matematické operácie a úpravy signálov v Kalmanovom filtrovaní, ktoré je možné stiahnuť z http://www.eetimes.com/design/embedded:

// V nasledujúcomvýpise zdrojového kódu sa prepodkladá, že lineárny system ma n stavov, m vstupov a r výstupov
// Z tohto dôvodu si zadefinujeme nasledovné premenné

// A je matica n x n
// B je matica n x m
// C je matica r x n
// xhat je vektor n x 1
// y je vektor r x 1
// u je vector m x 1
// Sz jw matica r x r
// Sw je matica n x n
// P je matica n x n
float AP[n][n]; // matica A*P
float CT[n][r]; // matica CT
float APCT[n][r]; // matica A*P*CT
float CP[r][n]; // matica C*P
float CPCT[r][r]; // matica C*P*CT
float CPCTSz[r][r]; // matica C*P*CT+Sz
float CPCTSzInv[r][r]; // matica (C*P*CT+Sz)-1
float K[n][r]; // zosilnenie Kalmanovho filtra
float Cxhat[r][1]; // vektor C*xhat
float yCxhat[r][1]; // vektor y-C*xhat
float KyCxhat[n][1]; // vektor K*(y-C*xhat)
float Axhat[n][1]; // vektor A*xhat
float Bu[n][1]; // vektor B*u
float AxhatBu[n][1]; // vektor A*xhat+B*u
float AT[n][n]; // matica AT
float APAT[n][n]; // matica A*P*AT
float APATSw[n][n]; // matica A*P*AT+Sw
float CPAT[r][n]; // matica C*P*AT
float SzInv[r][r]; // matica Sz-1
float APCTSzInv[n][r]; // matica A*P*CT*Sz-1
float APCTSzInvCPAT[n][n]; // matica A*P*CT*Sz-1*C*P*AT

// nasledujúce funkcie vypočítavajú maticu K
MatrixMultiply((float*)A, (float*)P, n, n, n, (float*)AP);
MatrixTranspose((float*)C, r, n, (float*)CT);
MatrixMultiply((float*)AP, (float*)CT, n, n, r, (float*)APCT);
MatrixMultiply((float*)C, (float*)P, r, n, n, (float*)CP);
MatrixMultiply((float*)CP, (float*)CT, r, n, r, (float*)CPCT);
MatrixAddition((float*)CPCT, (float*)Sz, r, r, (float*)CPCTSz);
MatrixInversion((float*)CPCTSz, r, (float*)CPCTSzInv);
MatrixMultiply((float*)APCT, (float*)CPCTSzInv, n, r, r, (float*)K);

// nasledujúce funkcie aktualizjú vektor xhat
MatrixMultiply((float*)C, (float*)xhat, r, n, 1, (float*)Cxhat);
MatrixSubtraction((float*)y, (float*)Cxhat, r, 1, (float*)yCxhat);
MatrixMultiply((float*)K, (float*)yCxhat, n, r, 1, (float*)KyCxhat);
MatrixMultiply((float*)A, (float*)xhat, n, n, 1, (float*)Axhat);
MatrixMultiply((float*)B, (float*)u, n, r, 1, (float*)Bu);
MatrixAddition((float*)Axhat, (float*)Bu, n, 1, (float*)AxhatBu);
MatrixAddition((float*)AxhatBu, (float*)KyCxhat, n, 1, (float*)xhat);

// nasledujúce funkcie aktualizjú maticu P
MatrixTranspose((float*)A, n, n, (float*)AT);
MatrixMultiply((float*)AP, (float*)AT, n, n, n, (float*)APAT);
MatrixAddition((float*)APAT, (float*)Sw, n, n, (float*)APATSw);
MatrixTranspose((float*)APCT, n, r, (float*)CPAT);
MatrixInversion((float*)Sz, r, (float*)SzInv);
MatrixMultiply((float*)APCT, (float*)SzInv, n, r, r, (float*)APCTSzInv);
MatrixMultiply((float*)APCTSzInv, (float*)CPAT, n, r, n,
(float*)APCTSzInvCPAT);
MatrixSubtraction((float*)APATSw, (float*)APCTSzInvCPAT, n, n, (float*)P);



Tieto rovnice a matematický opis sú značne rozsiahle a všeobecné, ale ak máme nejaký konkrétny problém, ktorý potrebujeme vyriešiť, tak ich môžeme značne zjednodušiť. Napr. inverznú matica k matici D:

\[ D = \left( \begin{array}{D_normal} d_{11} & d_{12} \\
d_{21} & d_{22} \end{array} \right), D^{-1} = \frac{1}{d_{11}d_{22} - d_{12}d_{22}} \left( \begin{array}{D_inverse} d_{22} & -d_{12} \\
-d_{21} & d_{11} \end{array} \right) \]

    Takže ak potrebujeme vytvoriť inverznú maticu, tak môžeme pre zjednodušenie použiť vyššie uvedený vzorec pre uľahčenie výpočtu.
   Systémy s viac ako tromi stavmi môžu presiahnuť naše výpočtové a softvérové možnosti. Požiadavky na výpočet inverznej matice sú porovnateľné s výpočtom tretej mocniny. To znamená, že ak sa zdvojnásobí počet stavov, tak výpočtové nároky budú 9 krát väčšie (23). To znamená, že ak sa počet stavov v Kalmanovom filtri zdvojnásobí, potrebný výpočtový výkon vzrastie 8-krát. Takto si vieme veľmi rýchlo overiť, že so stredne veľkým Kalmanovým filtrom prekročíme výpočtovými nárokmi naše možnosti. Práve z tohto dôvodu bolo odvodených niekoľko jednoduchších druhov Kalmanovej filtrácie s omnoho nižšími výpočtovými požiadavkami, ale s dostatočnou presnosťou. Konkrétnym príkladom je “steady state Kalman filter”. V tomto type Kalmanovho filtra sú matice $K_k$ a $P_k$ konštanty, a tak jedinou rovnicou, ktorú musíme prepočítavať v reálnom čase je rovnica stavu $x$. Táto rovnica pozostáva len z niekoľkých krokov, v ktorých vykonávame súčin a súčet (teda jednoduché matematické operácie, v súčasnosti pre mikroprocesory jednotaktové).
    V uedených textoch boli popísané Kalmanove filtre použiteľné pre lineárne systémy. V skutočnosti je väčšina systémov v reálnom živote nelineárnych a sú popísané teda nelineárnymi rovnicami, i keď niektoré vieme zjednodušiť a linearizovať. Touto problematikou sa matematici a technici zaoberali už v minulosti a pre daný prípad bol vytvorený rozšírený Kalmanov filter (EKF - z angl. "extended"). EKF je zjednodušene povedané len rozšírený lineárny Kalmanov filter pre teóriu nelineárnych systémov.
   Doteraz sme sa zaoberali situáciou ako odhadnúť stav systému krok po kroku, tak ako získavame namerané dáta. Skúsme sa teraz zamyslieť nad možnosťou, že by sme mali namerané dáta po uskutočnení nejakého deja (napr. pohybu) a chceme zrekonštruovať trajektóriu nášho prostriedku. Odhad polohy by mal byť presnejší ako v predchádzajúcich prípadoch, pretože okrem odhadu polohy v čase $t$ máme k dispozícii namerané dáta do času $t$, ale aj po čase $t$. Kalmanov filter môžeme po úprave použiť aj na vyhladzovanie dát.
   V niektorých aplikáciách sa môžeme stretnúť so situáciou, kde bude kladený väčší dôraz na zmenšenie maximálnej chyby viac ako na zmenšenie štandardnej odchýlky chyby (teda priemernej chyby). Tento problém vieme vyriešiť pomocou $H_\infty$ (H infinity) filtra, ktorý bol vytvorený ako alternatíva ku Kalmanovmu filtru v 80. rokoch 20. storočia. Vo všeobecnosti sú $H_\infty$ filtre menej rozšírené a menej známe ako Kalmanove filtre, ale majú v porovnaní s nimi rôzne výhody.
   Teória KF predpokladá šumové signály: šum v procese $w$ a šum v meraní $z$ ako dva od seba nezávislé signály (nekorelujúce šumy). V praxi sa ale môžeme stretnút aj so situáciou, pri ktorej tieto dva signály budú korelovať - problematika korelovaných šumov. Po úprave Kalmanovho Filtra vieme riešiť aj tento problém, ale musíme poznať kovarianciu $S_w$ a $S_z$. V prípade, že nevieme túto kovarianciu určiť, tak pre predpovedanie stavu použijeme $H_\infty$ filter.
   Problematika Kalmanovho filtra je naozaj veľmi rozsiahla a nie je možné ju detailne popísať a vysvetliť len krátkym textom. Od prvých zverejnení princípov činnosti Kalômanových filtrov v roku 1960 bolo publikovaných niekoľko tisícok strán a desiatky publikácií zaoberajúcich sa touto problematikou.




Pohľad do histórie


   Kalmanov filter navrhol Rudolph Kalman a veľmi podobný algoritmus ako Kalmanov filter vytvoril aj Peter Swerling v roku 1958. Meno nesie po Kalmanovi, lebo on publikoval dosiahnuté výsledky v prestížnejších vedeckých časopisoch a jeho práca bola komplexnejšia. Niekedy označujeme tieto filtre aj pojmom Kalmanov-Bucyho filtre kvôli spolupráci Richarda Bucyho s Kalmanom.
   Základy týchto algoritmov môžeme pripísať aj tak len 18 ročnému Karlovi Gaussovi a jeho metóde najmenších štvorcov, ktorú popísal v roku 1795. Kalmanov filter vznikol z dôvodu potreby riešenia konkrétneho problému a to bolo navádzanie raketoplánu v programe Apollo. Od tejto doby si našli Kalmanove filtre uplatnenie v množstve aplikácií týkajúcich sa navigácie lodí, ponoriek, áut, nukleárnych rakiet, ale aj pri modelovaní demografickej situácie, vo výrobnom priemysle, pri detekcii rádioaktivity pod zemským povrchom, v systémoch využívajúcich fuzzy logiku, ale aj pri trénovaní umelých neurónových sietí.