Il filtro di Kalman: destreggiarsi nell’incertezza

Il filtro di Kalman: destreggiarsi nell’incertezza

Immagina di guardare attraverso un binocolo mentre sei su una barca che si muove: le immagini che vedi possono essere mosse e sfocate. Il filtro di Kalman aiuta a “pulire” queste immagini, rendendole più nitide e chiare.

Si usa in situazioni dove ci sono dati che cambiano nel tempo e sono un po’ incerti o rumorosi.

Per esempio, se hai un robot che deve capire dove si trova in una stanza, il filtro di Kalman può aiutare a combinare tutte le informazioni che riceve (come i segnali GPS, i movimenti, ecc.) e a fare una stima migliore di dove si trova il robot in realtà.

È come se avesse un amico che gli dice: “Secondo me sei qui,” ma il robot non è completamente sicuro perché quell’amico a volte fa degli errori. Allora, usa il filtro di Kalman per essere più sicuro di dove si trova veramente.

Il filtro di Kalman è molto usato in robotica, nell’automazione, nei sistemi di navigazione come il GPS e in molte altre situazioni dove c’è bisogno di capire e prevedere il movimento delle cose in maniera precisa.

Cosa fa il filtro di Kalman

Raccoglie le informazioni: Immagina di avere un robot che raccoglie informazioni sul suo ambiente. Queste informazioni possono venire da sensori, GPS o altre fonti.

Il filtro di Kalman inizia con una stima di base su dove pensa che l’oggetto si trovi

Man mano che il robot si muove e raccoglie più dati, il filtro di Kalman aggiorna la sua stima.

Il filtro sa che non tutte le informazioni sono perfette. A volte i sensori possono sbagliare o dare informazioni un po’ confuse.

Il filtro di Kalman è bravo a capire quanto può fidarsi di ogni pezzo di informazione. Immagina che il filtro di Kalman sia come una persona che ascolta tutti questi discorsi e cerca di capire quale sia la storia più vera.

Ecco come lo fa:

Ascolta tutti: Il filtro considera tutte le informazioni che arrivano dai sensori, proprio come ascoltare tutte le persone in una stanza.

Valuta la fiducia: Alcuni sensori sono più precisi di altri. Il filtro di Kalman sa questo e dà più “fiducia” ai sensori che di solito sono più affidabili. È come dare più attenzione a una persona che di solito dice la verità rispetto a una che a volte sbaglia o esagera.

Combina le informazioni con attenzione: Il filtro mescola tutte queste informazioni, tenendo conto di quanto si può fidare di ciascuna. Se un sensore di solito è molto preciso, il filtro darà più peso a quello che dice.

Se un altro sensore è meno affidabile, il filtro sarà più cauto nel credere a quello che dice.


Aggiorna la sua comprensione: Man mano che arrivano nuove informazioni, il filtro aggiorna quello che pensa, sempre considerando quanto si può fidare di ogni nuovo pezzo di dato.

Dopo aver aggiornato la sua stima, il filtro fa una nuova previsione su dove sarà l’oggetto nel prossimo momento. Questo ciclo di raccolta informazioni, aggiornamento delle stime e previsione continua finché è necessario.

Ecco uno schema molto semplificato che illustra i passi che compie un algoritmo che applica il filtro di Kalman:

Covarianza degli errori

Immagina di avere due amici, Luca e Marta, che cercano di indovinare quanti dolci ci sono in un barattolo. Ogni volta che fanno una stima, possono sbagliare di un po‘. La covarianza degli errori è un modo per capire quanto le loro stime sbagliate siano legate tra loro.

La covarianza è un modo per misurare come due cose cambiano insieme. Nel nostro esempio, vogliamo vedere se quando Luca sbaglia molto, anche Marta sbaglia tanto, o se invece, quando Luca sbaglia, Marta è più precisa.

Nel filtro di Kalman, la covarianza degli errori aiuta a capire quanto ci si può fidare delle stime fatte dal filtro. Se la covarianza è alta, significa che quando una stima è sbagliata, anche l’altra tende a essere sbagliata nello stesso modo. Se è bassa, significa che gli errori non sono tanto collegati, e questo può essere utile per fare stime più precise.

Il filtro di Kalman usa la covarianza degli errori per aggiustare le sue stime. Se vede che gli errori sono spesso collegati in un certo modo, può usare queste informazioni per fare previsioni migliori su dove si trova l’oggetto che sta monitorando.

Tornando all’esempio di Luca e Marta: se sappiamo che quando Luca indovina un numero troppo alto, Marta di solito indovina un numero troppo basso, possiamo usare queste informazioni per fare una stima migliore di quanti dolci ci sono nel barattolo.

Rumore di misurazione e rumore di processo

Nel filtro di Kalman, ci sono due tipi di “rumori” o errori che devono essere considerati: il rumore di misurazione e il rumore di processo. Questi sono come due tipi di disturbi che possono confondere le informazioni che il filtro cerca di capire.

Immagina di avere un termometro che misura la temperatura. A volte, il termometro potrebbe mostrare una temperatura leggermente diversa da quella reale. Questo errore è il rumore di misurazione. È direttamente legato a quanto i sensori o gli strumenti che stai usando sono precisi. Nel filtro di Kalman, questo rumore viene preso in considerazione per capire quanto ci si può fidare delle misurazioni dirette che si ricevono.

D’altro canto, il rumore di processo è un po’ diverso. Supponiamo che stai cercando di prevedere dove sarà un pallone che lanci in aria.

Anche se conosci la forza e la direzione del lancio, ci sono cose come il vento o piccoli cambiamenti nella forza di lancio che possono cambiare dove va il pallone.

Queste incertezze sono il rumore di processo. Nel filtro di Kalman, il rumore di processo riguarda quanto il modello che usi per prevedere il movimento dell’oggetto (come il pallone) è preciso.

Quando il filtro di Kalman fa le sue stime, considera entrambi questi tipi di rumore. Usa le misurazioni (tenendo conto del loro rumore) e le combina con il suo modello del mondo (tenendo conto del rumore di processo) per fare una stima il più possibile precisa di dove si trova l’oggetto o di come si sta muovendo.

Se stai cercando di seguire un amico in una folla usando un binocolo (misurazione) e sai anche che di solito cammina a una certa velocità in una certa direzione (processo), useresti entrambe queste informazioni per trovarlo, anche se a volte il binocolo potrebbe essere un po’ sfuocato (rumore di misurazione) e il tuo amico potrebbe cambiare velocità o direzione inaspettatamente (rumore di processo).

Applicazioni

Il filtro di Kalman è un potente strumento nella teoria del controllo e nell’elaborazione dei segnali, utilizzato per stimare lo stato interno di un sistema dinamico nel tempo, a partire da una serie di misurazioni rumorose e parziali. Le sue applicazioni sono molteplici e variano in diversi campi. Ecco alcuni degli usi principali del filtro di Kalman:

È ampiamente usato in sistemi di navigazione come il GPS per fornire stime precise della posizione, velocità e orientamento di un veicolo. Il filtro di Kalman aiuta a migliorare l’accuratezza delle stime riducendo l’effetto del rumore di misurazione.

Nel campo della robotica, è utilizzato per la fusione di sensori e la localizzazione di robot, permettendo ai robot di comprendere la loro posizione e orientamento nello spazio.

Nel trading algoritmico e nell’analisi finanziaria, viene usato per stimare variabili economiche nascoste o per prevedere i prezzi di mercato, filtrando il “rumore” delle fluttuazioni casuali dei mercati.

Nel controllo industriale, il filtro di Kalman è impiegato per ottimizzare e stabilizzare i processi di controllo, come in sistemi di automazione e produzione.

Viene utilizzato per tracciare e prevedere la traiettoria di veicoli spaziali e aerei, includendo la navigazione inerziale e il tracciamento satellitare.

È impiegato per filtrare il rumore da segnali in vari ambiti, come il trattamento del segnale in telecomunicazioni, l’elaborazione audio e video, e la bioingegneria.

In ambiti scientifici e di ingegneria, il filtro di Kalman viene utilizzato per l’analisi dei dati sperimentali e per il miglioramento delle tecniche di misurazione.

Approfondimenti matematici

Per ulteriori approfondimenti di aspetti matematici e pratici sul filtro di Kalman leggi:

TEORIA DEI SISTEMI E DEL CONTROLLO

Introduzione al filtro di Kalman
F. Previdi – Controlli Automatici – Lez. 6

Complementi sul filtro di Kalman
corso di Stima e identificazione

La covarianza dell’errore, in generale, è una misura statistica che descrive l’estensione e la natura dell’errore nella stima di due o più variabili. In contesti come il filtro di Kalman, la covarianza dell’errore assume un significato specifico relativo alla stima dello stato di un sistema dinamico.

La covarianza, in statistica, è una misura che indica il grado di variazione congiunta di due variabili casuali. Se le variabili tendono a variare insieme (ad esempio, quando una aumenta, anche l’altra tende ad aumentare), la covarianza è positiva. Se una variabile tende ad aumentare mentre l’altra diminuisce, la covarianza è negativa.

Quando si stima lo stato di un sistema (come la posizione e la velocità di un oggetto), ci sono errori associati a queste stime. La covarianza dell’errore descrive come questi errori sono correlati tra loro. Ad esempio, in una stima di posizione e velocità, la covarianza dell’errore potrebbe indicare se un errore nella stima della posizione è correlato a un errore nella stima della velocità.

Nel contesto del filtro di Kalman, la matrice di covarianza dell’errore rappresenta l’incertezza corrente nella stima dello stato del sistema. Ogni elemento sulla diagonale principale di questa matrice indica la varianza dell’errore per una particolare variabile di stato (ad esempio, quanto siamo incerti riguardo alla stima della posizione). Gli elementi fuori dalla diagonale indicano la covarianza, cioè come gli errori in diverse variabili di stato sono correlati tra loro.

Nel filtro di Kalman, questa matrice è dinamicamente aggiornata ad ogni passo. Dopo ogni misurazione e stima, il filtro aggiorna questa matrice per riflettere la nuova comprensione dell’incertezza dello stato del sistema.

In formule matematiche…

Esempio di codice Python che implementa il filtro di Kalman

import numpy as np

# Parametri iniziali
posizione_iniziale = 0
velocita_iniziale = 1
stato_iniziale = np.array([[posizione_iniziale], [velocita_iniziale]])

# Matrice di transizione di stato
A = np.array([[1, 1], [0, 1]])

# Matrice di osservazione
H = np.array([[1, 0]])

# Rumore del processo e della misurazione
rumore_processo = 1e-5
rumore_misurazione = 1e-1
Q = np.array([[1, 0], [0, 1]]) * rumore_processo
R = np.array([[1]]) * rumore_misurazione

# Stima iniziale dell'errore di covarianza
P = np.array([[1, 0], [0, 1]])

# Funzione per l'aggiornamento del filtro di Kalman
def filtro_kalman(z, x, P):
    # Predizione
    x = np.dot(A, x)
    P = np.dot(A, np.dot(P, A.T)) + Q

    # Aggiornamento
    S = np.dot(H, np.dot(P, H.T)) + R
    K = np.dot(P, np.dot(H.T, np.linalg.inv(S)))
    x = x + np.dot(K, (z - np.dot(H, x)))
    P = P - np.dot(K, np.dot(H, P))
    
    return x, P

# Esempio di esecuzione
stato_attuale = stato_iniziale
for _ in range(10):
    misurazione = np.random.normal(posizione_iniziale, np.sqrt(rumore_misurazione))
    stato_attuale, P = filtro_kalman(misurazione, stato_attuale, P)
    print(f"Stima attuale dello stato: {stato_attuale.ravel()}")