Quindi la mia risposta più lunga di seguito presuppone che la tavola subirà un'accelerazione e durante questo periodo devi ancora essere in grado di misurare il tuo beccheggio, rollio e imbardata in breve tempo. Se la scheda sarà ferma per tutte le misurazioni, la risposta di Mahendra Gunawardena funzionerà perfettamente per te. Se questo sta andando in un dispositivo come un segway o un aereo modello o multirotore o qualsiasi cosa si muova, potresti voler continuare a leggere. Questo post spiega come utilizzare tutti e tre i sensori attraverso un metodo chiamato fusione dei sensori. La fusione del sensore consente di ottenere i punti di forza di ciascun sensore e ridurre al minimo gli effetti dei punti deboli di ciascun sensore.
Caratteristiche del sensore e sfondo
In primo luogo capire che un accelerometro misura tutte le forze che vengono applicate ad esso, non solo la forza di gravità. Quindi in un mondo perfetto con l'accelerometro in posizione stazionaria senza vibrazioni, potresti determinare perfettamente quale sia la strada usando una trigonometria di base come mostrato dalla risposta di Mahendra Gunawardena. Tuttavia, poiché un accelerometro raccoglierà tutte le forze, qualsiasi vibrazione provocherà rumore. Va anche notato che se la scheda sta accelerando non si può semplicemente usare la semplice trigonometria poiché la forza indicata dall'accelerometro non è solo la forza di gravità terrestre ma anche la forza che ti sta causando l'accelerazione.
Un magnetometro è più semplice di un accelerometro. Il movimento non causerà problemi con esso, ma cose come il ferro e altri magneti finiranno per influenzare la tua produzione. Se le fonti che causano questa interferenza sono costanti non è difficile da gestire, ma se queste fonti non sono costanti si creeranno tonnellate di rumore che è problematico da rimuovere.
Dei tre sensori, il giroscopio è probabilmente il più affidabile e normalmente è molto bravo a misurare la velocità di rotazione. Non è influenzato da cose come le fonti di ferro e le accelerazioni non hanno praticamente alcun impatto sulla loro capacità di misurare la velocità di rotazione. Fanno un ottimo lavoro nel riportare la velocità a cui il dispositivo sta girando, tuttavia poiché stai cercando un angolo assoluto devi integrare la velocità per ottenere la posizione. In questo modo si aggiungerà l'errore dell'ultima misurazione all'errore delle nuove misurazioni poiché l'integrazione è sostanzialmente una somma di valori su un intervallo, anche se l'errore per una misurazione è solo 0,01 gradi al secondo, in 100 misurazioni, la posizione può essere spento di 1 grado, di 1000 misurazioni, puoi spegnerlo di 10 gradi. Se stai prendendo centinaia di misurazioni al secondo, puoi vedere che questo causa problemi. Questo è comunemente chiamato deriva giroscopica.
Fusione del sensore
Ora il bello di avere tutti questi sensori insieme è che è possibile utilizzare le informazioni dall'accelerometro e dal magnetometro per annullare la deriva del giroscopio. Questo finisce per permetterti di darti la precisione e la velocità del giroscopio senza il fatale difetto della deriva del giroscopio.
Combinando i dati di questi tre sensori si può fare in più di un modo, parlerò dell'uso di un filtro complementare perché è molto più semplice di un filtro kalman e dei filtri kalman consumerà molte più risorse sui sistemi embedded. Spesso un filtro complementare è abbastanza buono, più semplice da implementare (supponendo che non si stia utilizzando una libreria pre-costruita) e che consenta di elaborare i dati più velocemente.
Ora sul processo. I primi passi che devi fare è integrare l'uscita del giroscopio per convertire la velocità angolare in posizione angolare. Molto probabilmente dovrai anche applicare un filtro passa basso sull'accelerometro e sul magnetometro per gestire il rumore in uscita. Un semplice filtro FIR come quello mostrato di seguito funziona qui. Con un po 'di trigonometria puoi trovare il beccheggio e il rollio con l'accelerometro e l'imbardata con il magnetometro.
filteredData = (1-weight)*filteredData + weight*newData
Il peso è solo una costante che può essere regolata in base alla quantità di rumore da affrontare, maggiore è il rumore, minore sarà il valore del peso. Ora è possibile combinare i dati dei sensori con la seguente riga di codice.
fusedData = (1-weight)*gyroData + weight*accelMagData
Va notato che i dati sono un vettore di beccheggio, rollio e imbardata. Puoi anche usare tre variabili per fare questo, invece di array, se vuoi. Per questo calcolo il giroscopio fornisce una posizione in gradi in beccheggio, rollio e imbardata, il magnetometro fornisce un angolo di imbardata mentre l'accelerometro fornisce i propri numeri per beccheggio e rollio.
Se desideri ancora ulteriori informazioni, puoi cercare "fusione di sensori con filtro complementare" su Google.