Autore Topic: Filtrare dati provienienti dai sensori  (Letto 2342 volte)

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Filtrare dati provienienti dai sensori
« il: 24 Gennaio 2014, 16:45:36 CET »
0
Solitamente i dati grezzi che arrivano dai sensori (accelerometro, magnetometro, vettore rotazione, etc) tendono ad essere instabili.

La soluzione è quella di applicare un filtro in tempo reale che dia maggior peso ai dati storici rispetto al singolo dato in arrivo.
Trattandosi di sensori che inviano dati svariate volte al secondo si introduce un piccolo lag che però rende la lettura molto più accurata, basandosi appunto sulla serie e non sul dato singolo.

Tra gli svariati filtri propongo qui un filtro semplicissimo che può sempre tornare utile.

Si definisce un valore non nullo che ci dice quale è il peso del dato corrente, il nostro "filtering factor".
Si definisce anche un altro float che sarà il valore che utilizzeremo nella app.

Codice (Java): [Seleziona]
float m_FilteringFactor = 0.05f;
float m_Value = 0.0f;

Dopodiche assumendo che dal sensore arrivi un valore float chiamato i_Value si applica questa semplicissima formula:

Codice (Java): [Seleziona]
m_Value =  m_Value * (1.0f - m_FilteringFactor) + i_Value * m_FilteringFactor;
Giocando con il valore m_FilteringFactor si può regolare una via di mezzo tra stabilità e lag. Un filtering factor di 1.0f equivale a leggere i dati grezzi così come arrivano, un valore di 0.0f invece lascia m_Value così come è stato impostato inizialmente senza tenere conto dei dati del sensore.