Calibrazione dinamica del magnetometro


19

Sto lavorando su un magnetometro AK8975 che fa parte di una IMU. Il che sembra essere molto complicato per me. Questo chip fornisce un vettore 3D come output che descrive il campo magnetico terrestre in qualsiasi punto della terra o vicino ad esso.

Ho provato due tipi di algoritmi di calcolo dell'intestazione: uno è semplice arctan(-y/x)e un altro è l'inclinazione (inclinazione) e l'inclinazione (inclinazione) della matematica annullata, come indicato di seguito. Sia sull'inclinazione che sulle sponde danno un risultato sbagliato.

Sono in grado di ottenere la direzione corretta verso la terra (usando semplici risorse di studio aperte disponibili) quando viene ruotata mantenendo orizzontale rispetto al piano terra usando uno dei due algos.

Ho provato la calibrazione per errori di ferro morbido e duro. Potrei tracciarlo in 3D e mostra una sfera 3D perfetta. Non funziona ancora su inclinazione o declinazione.

Qualsiasi puntatore sarà utile.

Il codice e le sue implementazioni sono i seguenti:

void Compass_Heading()
{
  double MAG_X;
  double MAG_Y;
  double cos_roll;
  double sin_roll;
  double cos_pitch;
  double sin_pitch;

  cos_roll = cos(roll);
  sin_roll = sin(roll);
  cos_pitch = cos(pitch);
  sin_pitch = sin(pitch); 

  //// Tilt compensated Magnetic filed X:
  MAG_X = magnetom_x*cos_pitch + magnetom_y*sin_roll*sin_pitch + magnetom_z*cos_roll*sin_pitch;
  //// Tilt compensated Magnetic filed Y:
  MAG_Y = magnetom_y*cos_roll-magnetom_z*sin_roll;
  //// Magnetic Heading


  MAG_Heading = atan2(-MAG_Y, MAG_X) ;

}

Dove magnetom_x, #_ye #_zsono componenti di un vettore 3D che in realtà sono valori RAW magnetometro. roll and pitch provengono da un misterioso filtro Kalman dall'accelerometro e dal giroscopio di bordo. Questi tre sensori sono in ATAVRSBIN1 . Il rollio e il pitch sono ok fino a questo punto.

Ora un semplice calcolo dell'intestazione secondo journal_of_sensors_renaudin et al_2010c.pdf avrebbe dovuto essere MAG_Heading = atan2(-magnetom_y, magnetom_x) ;e con una compensazione come sopra.

Il codice complessivo proviene semplicemente da OPEN AHRS .


Dati in formato Roll, Pitch e Yaw. Ho ruotato il dispositivo solo con la mia mano. I primi tre sono stati concentrati solo su Roll, Pitch e Yaw rispettivamente. Gli altri due vengono prima ruotati del dispositivo di circa 45 gradi lungo X (arrotolato), quindi ruotati lungo la Z locale del magnetometro. Quindi lo stesso è stato ripetuto con una rotazione di circa 45 gradi lungo Y (inclinato), quindi ruotato lungo la Z locale del magnetometro.

I grafici tracciati nell'intervallo da -180 a 180 gradi.

rotolo Angoli in gradi in un file Le caratteristiche YAW su Roll.

Intonazione Angoli in gradi in un file Le caratteristiche YAW su Pitch.

straorzata Angoli in gradi in un file Le caratteristiche YAW su Yaw stesso.

Yaw wrt inclinato di 45 gradi (arrotolato) Angoli in gradi in un file Le caratteristiche YAW su Yaw con 45 gradi arrotolati.

Yaw wrt 45 gradi inclinato (inclinato) Angoli in gradi in un file Le caratteristiche YAW su Yaw con inclinazione di 45 gradi.

Nota: per le ultime 2 foto: prima mantenute nella posizione iniziale, lo stesso vale per tutti (consultare i file txt). Quindi ruotato di 45 gradi, quindi utilizzando il dispositivo piano (con magnetometro) è stato ruotato lungo l'asse Z del magnetometro.

Allo stesso modo per l'ultima immagine il dispositivo è stato inclinato di 45 gradi, quindi lungo l'asse Z del magnetometro.

Spero che questi possano aiutare a risolvere il mio problema.


I nuovi sviluppi sono i seguenti:

Ho lavorato un po 'sulla rubrica. Ho seguito l'output. rotolo csv

Intonazione csv

straorzata csv



nessuna risposta ancora !!

4
Penso che otterrai più risposte se mostri la matematica che stai tentando di implementare e il codice che hai usato per implementarlo. Per noi c'è ben poco da fare altrimenti diverso da "non funziona, aiuta" - che è come legge la tua domanda. Scusate!
Martin Thompson,

L'uso del magnetometro è un'area molto specializzata con cui relativamente poche persone avranno esperienza. Leggendo alcune volte la tua domanda, non sono ancora sicuro di cosa sia esattamente sbagliato. Dici che dà "un risultato sbagliato" ma è piuttosto vago. Forse alcuni esempi numerici?
Jason R,

1
È una domanda su come interpretare le uscite del sensore o su come calcolare le misure utili dal punto di vista della navigazione dal vettore x, y, z fornito dal sensore? Le tue misurazioni sono ripetibili con un'altra istanza dello stesso sensore?
vicatcu,

1
@Rahul - Sono sorpreso che questo non stia ricevendo più attenzione!
Kevin Vermeer,

Risposte:


8

Mi piacciono i tuoi grafici. Mostrano chiaramente che roll, pitch e yaw sembrano funzionare. Congratulazioni! Sono già più progressi di quanti ne facciano molte persone.

Immagino che il codice che hai presentato stia calcolando il valore MAG_Heading "sbagliato", diverso dal valore MAG_Heading che ti aspettavi.

Sarebbe molto più facile per noi aiutarti se ci fornissi: (Questa è la sezione "descrivi i sintomi" di "Come porre domande in modo intelligente" )

  • l' uscita del magnetometro AK8975 valori m_x, m_y e m_z in un singolo punto nel tempo.
  • I valori di beccheggio e rollio nello stesso istante
  • il valore di uscita MAG_Heading presumibilmente errato calcolato da tali valori
  • quello che ti aspettavi fosse il MAG_Heading corretto

Quindi sono rimasto a speculare che forse stai incontrando gli stessi tipi di problemi che creo per me :-).

  • Quale formato angolare si aspettano le tue funzioni sin () e cos () e atan2 ()? Devi fare una sorta di conversione tra il formato pitch e roll in cui sono memorizzati? Devi convertire da quel formato a quello che ti serve MAG_heading? (brad, gradi o radianti? virgola mobile o virgola fissa?)
  • C'è un offset nei valori grezzi m_x, m_y, m_z che devono essere sottratti?
  • Tutte le parti sono allineate nel modo assunto dal codice? In particolare, l'asse di beccheggio e rollio è allineato con l'asse del magnetometro? (Si suppone che m_x punti in avanti, lungo l'asse di rollio? M_y dovrebbe puntare a destra, lungo l'asse di inclinazione?)
  • Forse un valore del sensore o un altro - forse m_z - deve essere negato prima di inserire questo codice?
  • Forse questo codice viene interrotto da un interrupt o da un altro che corrompe i suoi valori interni? Mi sembra di ricordare un progetto diverso che, dopo che qualcuno ha messo una "divisione" in una routine di interruzione, ogni calcolo della funzione di trigger in qualsiasi altra parte del programma darebbe spesso il risultato sbagliato.
  • Forse si interrompe l'attivazione così spesso che questo codice non finisce mai di funzionare?

Sembra che ci siano altre persone che discutono di codice molto simile altrove: http://diydrones.com/forum/topics/heading-from-3d-magnetometer ; http://diydrones.ning.com/profiles/blogs/dcm-imu-theory-first-draft ; http://aeroquad.com/showthread.php?1138-REVOLUTION!!!-New-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-Magnetometer ; eccetera.


L'ho visto ora .. Torno indietro.
Rick2047,

\ 1 / Sto creando un file CSV per [Roll, pitch, yaw e (Mx, My, Mz)]. \ 2 / Mi aspetto che MAG_Heading non cambi con il cambio di rollio e beccheggio almeno fino a due quadranti successivi. L'intestazione significa che, se si sta dirigendo verso NE, dovrebbe continuare a puntare verso NE fino a quando non attraversa i 90 gradi dall'orizzonte su direzioni di rotazione verso l'alto o verso il basso per l'inclinazione e dovrebbe essere la stessa in caso di inclinazione o combinazione.
Rick2047,

\ 3 / Tutti i calcoli interni sono stati effettuati in radianti e tutte le funzioni consine prevedono solo radianti. Solo per la visualizzazione i valori vengono copiati e convertiti in gradi. \ 4 / virgola mobile. \ 5 / Tutti i sensori sono allineati e anche tutte le possibili combinazioni pertinenti sono state provate per l'allineamento usando SENSOR_SIGN [9]. \ 6 / Lo sto facendo nel polling, quindi in base all'interrupt tutti i problemi non saranno qui.
Rick2047,

Per il mio punto \ 1 / qui per tutti i grafici ho anche allegato i file CSV corrispondenti. O hai chiesto qualcos'altro. Grazie per questa buona risposta :) Implementerò "Come porre domande nel modo più intelligente" tanto quanto il mio impegno e il mio tempo lo consentono. :)
Rick2047

\ 1 / Lavorerò per [Roll, pitch, yaw e (Mx, My, Mz) (titolo, declinazione)] piuttosto.
Rick2047

1

La nota applicativa dell'LSM303 contiene un'utile guida alla calibrazione di una bussola con compensazione dell'inclinazione applicabile al problema. È abbastanza dettagliato, altrimenti avrei riscritto i calcoli qui. Si noti che i valori dell'accelerometro sono necessari per i calcoli di passo completo, rollio e imbardata poiché una rotazione attorno all'asse delle linee del campo magnetico non comporta alcuna variazione dei valori del magnetometro. Allo stesso modo per gravità con l'accelerometro.


Il collegamento mostra segni diversi nella stessa equazione. Proverò tutte le altre combinazioni.
Rick2047,
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.