Calcolo di beccheggio, imbardata e rollio dai dati mag, acc e gyro


19

Ho una scheda Arduino con un sensore di libertà di 9 gradi, dal quale devo determinare l'intonazione, l'imbardata e il rollio della tavola.

Ecco un esempio di un set di dati dal sensore 9-DOF:

Accelerometro (m / s)

  • AccX = -5,85
  • AccY = 1,46
  • AccZ = 17,98

Giroscopio (RPM)

  • GyrX = 35,14
  • GyrY = -40,22
  • GyrZ = -9,86

Magnetometro (Gauss)

  • MagX = 0,18
  • MagY = -0,04
  • MagZ = -0,15

Come posso calcolare intonazione, imbardata e rollio da questi dati?


1
Principio di base: dal rilevamento della gravità nel tuo accelerometro sai da che parte è abbassata; dalla rilevazione del campo magnetico terrestre nel tuo magnetometro sai in che direzione è il Nord. Basandoti su questo e supponendo che non vi siano altre importanti accelerazioni o forti campi magnetici, puoi determinare il tuo atteggiamento.
mercoledì

1
I dati del giroscopio forniscono una velocità di rotazione, ma non una posizione assoluta. Può essere integrato per stimare il cambiamento da un atteggiamento noto, ma in genere è rumoroso e incline alla deriva se non viene utilizzato insieme agli altri sensori.
welf,

1
si riferiscono anche ai filtri kalman, poiché i numeri statici devono essere elaborati parecchio, per fornire stime affidabili di roll-pitch e yaw. Si noti inoltre che la posizione del sensore è importante (è necessario tenerne conto).
Gürkan Çetin,

Risposte:


15

Pitch, roll e yaw sono definiti come la rotazione attorno agli assi X, Y e Z. Di seguito come un'immagine per illustrare la definizione.

Roll Pitch and Yaw

In un precedente progetto ho usato un accelerometro ADXL345 di Analog Devices per calcolare rollio e beccheggio. Di seguito sono riportate le equazioni utilizzate per calcolare rollio e beccheggio. Ho reso disponibile parte del codice sorgente per uso pubblico.

accelerationX = (signed int)(((signed int)rawData_X) * 3.9);
accelerationY = (signed int)(((signed int)rawData_Y) * 3.9);
accelerationZ = (signed int)(((signed int)rawData_Z) * 3.9);
pitch = 180 * atan (accelerationX/sqrt(accelerationY*accelerationY + accelerationZ*accelerationZ))/M_PI;
roll = 180 * atan (accelerationY/sqrt(accelerationX*accelerationX + accelerationZ*accelerationZ))/M_PI;

Il codice sorgente completo può essere trovato qui .

Basarsi sulle definizioni sopra

yaw = 180 * atan (accelerationZ/sqrt(accelerationX*accelerationX + accelerationZ*accelerationZ))/M_PI;

Nota: M_PI = 3.14159265358979323846 è una costante definita in math.h

Di seguito sono riportati alcuni riferimenti incluso il codice sorgente di base di Arduino che potrebbero esserti utili.


Riferimenti:


2
Bella risposta, varrebbe la pena aggiungere che la posizione e l'orientamento del sensore nel veicolo sarebbero importanti e che i dati debbano essere ulteriormente elaborati per fornire risultati affidabili. (filtrato o fuso con dati a bassa frequenza più affidabili, come il GPS)
Gürkan Çetin

(@Zubair) "yaw = 180 * atan (accelerationZ / sqrt (accelerationXaccelerationX + accelerationZaccelerationZ)) / M_PI;" cos'è questo "M_PI" ??
Wasabi

@Wasabi M_PI = 3.14159265358979323846. È costante definito nella libreria math.h.
Mahendra Gunawardena,

8

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.


3

Dai dati del sensore dell'acceleratore, è possibile calcolare solo il beccheggio e il rollio. Il seguente documento di Freescale spiega con molte informazioni di cosa hai bisogno:

AN3461 - Rilevamento dell'inclinazione mediante un accelerometro a tre assi

Sulla base dei detti del documento,

tanϕxyz=GpyGpz

tanθxyz=GpxGpysinϕ+Gpzcosϕ=GpxGpy2+Gpz2

che equivale a:

roll = atan2(accelerationY, accelerationZ)

pitch = atan2(-accelerationX, sqrt(accelerationY*accelerationY + accelerationZ*accelerationZ))

Naturalmente, il risultato è questo solo quando si verificano le rotazioni su un ordine specifico (Rxyz):

  1. ϕ
  2. θ
  3. ψ

Rxyzψ


1
Lui, benvenuto su Engineering SE! Questo sito supporta Latex, guarda quanto è diventata bella la tua risposta ora. :-)
Peter - Ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.