Magnetometro calibration a forma di calibrazione


15

Nei telefoni cellulari e in altri dispositivi che utilizzano una bussola elettronica a 3 assi, un movimento a forma di ∞ / 8 / S viene utilizzato per calibrare il magnetometro come mostrato in questi video .

Perché viene eseguito questo movimento, qual è la teoria e qualcuno può dare qualche esempio di codice C per implementarlo?

Devi passare attraverso un'altra mia domanda simile contenente maggiori informazioni.


Alcune informazioni aggiuntive per questa particolare domanda: La piattaforma è AtMega32 a 8 bit, utilizzando AVR Studio 5.

Fino ad ora ho provato: ho provato a dividere la media per 2 dei valori vettoriali del magnetometro creando la forma. Il pensiero potrebbe aiutare nel calcolo degli offset. Penso in qualche modo come le due parti / lati identici della forma stiano cancellando il campo magnetico terrestre e producendo i valori di offset. Potrei sbagliarmi. Ma in particolare per la calibrazione basata sulla forma, questo è dove sono attualmente. Penso che la calibrazione funzioni in questo modo. L'idea è di scoprire che funziona in questo modo?


Ok il codice con cui posso calcolare gli offset e successivamente sottrarre semplicemente quelli dal vettore magnetico 3D Raw. Potrei sbagliarmi totalmente e non avere spiegazioni su come funzioni. Vedendo dopo il video e i dati tracciati sulla sfera, in qualche modo ha accelerato il mio pensiero e ho usato quel pensiero su una forma di equazione. B)

Codice:

Le funzioni Read_accl();e Read_magnato(1);stanno leggendo i dati del sensore. Spero che il codice sia autoesplicativo. Sperando che il saggio ppl lo userà sicuramente in modi molto migliori. : \

void InfinityShapedCallibration()
{
    unsigned char ProcessStarted = 0;
    unsigned long cnt = 0; 

    while (1)
    {

            Read_accl();

            // Keep reading Acc data
            // Detect Horizontal position
            // Detect Upside down position
            // Then detect the Horizontal position again.
            // Meanwhile an infinity shaped movement will be created.
            // Sum up all the data, divide by the count, divide by 2 .
            // !We've offsets.          

                if (ProcessStarted!=3)
                {
                //
                    //USART_Transmit_String("\r");
                    //rprintfFloat(4, g_structAccelerometerData.accx_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accy_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accz_RAW);

                }


            if (
             abs( g_structAccelerometerData.accx_RAW) < 100 
            && abs(g_structAccelerometerData.accy_RAW) < 100 
            && g_structAccelerometerData.accz_RAW < -350 
            && ProcessStarted != 2 && ProcessStarted != 3 && ProcessStarted != 1 )
            {
                ProcessStarted = 1; 
            }   

            if (ProcessStarted==1)
            { 

            Read_magnato(1);

                structMagnetometerOffsetDataToEEPROM.Off_X += g_structMegnetometerData.magx_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Y += g_structMegnetometerData.magy_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Z += g_structMegnetometerData.magz_RAW;

                cnt++;

            }               
                if ( g_structAccelerometerData.accz_RAW > 350 
                && ProcessStarted==1)
                {
                    ProcessStarted = 2; 
                }

                if ( g_structAccelerometerData.accz_RAW < -350 
                && ProcessStarted == 2 )
                {
                    ProcessStarted=3; 
                    structMagnetometerOffsetDataToEEPROM.Off_X /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_X /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Y /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Y /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Z /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Z /= 2;  

                    UpdateOFFSETDATAinEEPROM();  

                    break;

                } 
    }   
} 

Dopo aver ottenuto questi offset li ho usati come segue:

void main()
{
...

Read_magnato(1);
        g_structMegnetometerData.magx_RAW -= structMagnetometerOffsetDataToEEPROM.Off_X ;
        g_structMegnetometerData.magy_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Y ;
        g_structMegnetometerData.magz_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Z ;
...
}

Come ho già detto.


2
Questa domanda ha bisogno di molto aiuto. Hai bisogno di aiuto con la programmazione? Teoria dei magnetometri? Quale piattaforma? Cosa hai provato o cercato?
Kellenjb,

la figura 8 non è semplicemente un gesto per iniziare la calibrazione?
geometrikal,

1
Non so perché i ppl si comportino come se fossero robot. Ho fornito un link per lo stesso lavoro. Ci ho lavorato molto e ppl solo senza saperlo, votalo e basta. Lo odio quando la mia domanda è sotto votata a causa della mia domanda poco chiara. Si prega di chiedere ciò che è necessario appena prima di votare. Sto davvero morendo dalla voglia di ottenere risultati e il ppl non ci pensa nemmeno prima di votare. Mi sento male e cerca di impedirmi di lavorare nella giusta direzione. Per favore, ho bisogno di aiuto non di entrambi i lati del voto.
Rick2047,

1
@Kellenjb: sto lavorando su una IMU usando un semplice atmega32 a 8 bit. Ho provato a lavorarci su e concludere che un uC a 32 bit è come usare una spada al posto di un ago. (Scusate il mio indovinello:)) Ho provato ad aggiungere tutti i valori RAW del magnetometro creando la forma. Quindi dividere per il numero di input. Il pensiero potrebbe aiutare nel calcolo dell'offset. Penso in qualche modo come le due parti / lati identici della forma siano in qualche modo come cancellare il campo magnetico terrestre e dare i valori di offset. Potrei sbagliarmi. Ma in particolare per la calibrazione basata sulla forma, questo è dove sono attualmente. Penso che ...
Rick2047,

1
Il problema non era con la domanda, ma con il numero di persone su questo sito che declasseranno le domande semplicemente perché non hanno abbastanza familiarità con l'argomento per capire cosa è stato chiesto. Se non lo sai, lascialo da solo!
Chris Stratton,

Risposte:


21

Il modello a forma di 8 / S viene utilizzato per calibrare i magnetometri nei telefoni cellulari e in altri dispositivi.

sfondo

I tipici magnetometri dell'era del telefono cellulare misurano l'intensità del campo magnetico lungo tre assi ortogonali, ad esempio:

m=mXio^+myȷ^+mzK^

Con la grandezza del campo data da,

m=mX2+my2+mz2

e l'angolo di rotazione di ciascun asse come

θK=cos-1mKm, dove K[X,y,z]

Calibrazione

Poiché il campo magenetico della terra è relativamente costante, anche l'ampiezza del campo as misurato dal magnetometro dovrebbe essere costante, indipendentemente dall'orientamento del sensore. cioè se si volesse ruotare il sensore attorno e tracciare , m y , m z in 3D, i percorsi dovrebbero tracciare la superficie di una sfera con raggio costante.mXmymz

Idealmente dovrebbe apparire qualcosa del genere:

sfera

Tuttavia a causa di effetti di ferro duro e morbido e altre distorsioni, finisce per apparire come una sfera deformata:

deforme

Questo perché l'ampiezza del campo magnetico misurata dal sensore sta cambiando con l'orientamento. Il risultato è che la direzione del campo magnetico quando calcolata secondo le formule precedenti è diversa dalla direzione reale.

La calibrazione deve essere eseguita per regolare ciascuna delle letture dei tre assi in modo tale che l'ampiezza sia costante indipendentemente dall'orientamento: è possibile considerarlo come la sfera deformata deve essere deformata in una sfera perfetta. La nota sull'applicazione LSM303 contiene molte istruzioni dettagliate su come eseguire questa operazione.

E per quanto riguarda il modello di figura 8 !?

L'esecuzione del modello della figura 8 "traccia" parte della sfera deformata sopra. Dalle coordinate ottenute è possibile stimare la deformazione della sfera e ottenere i coefficienti di calibrazione. Un buon modello è quello che traccia attraverso la più ampia gamma di orientamenti e quindi stima la massima deviazione dalla vera magnitudine costante.

Per stimare la forma della sfera deformata, è possibile utilizzare il raccordo ellittico dei minimi quadrati . La nota sull'applicazione LSM303 contiene anche informazioni al riguardo.

Un metodo semplice per una calibrazione di base

Secondo la nota dell'app se non si assume alcuna distorsione del ferro dolce, la sfera deformata non verrà inclinata. Pertanto può essere possibile un metodo semplice per una calibrazione di base:

  • Trova il valore massimo e minimo per ciascun asse e ottieni l'intervallo 1/2 e il punto zero

rK=12(max(mK)-min(mK))

zK=max(mK)-rK

  • Spostare e ridimensionare ogni misura dell'asse

mK'=mK-zKrK

  • mK'

Questo si basa sul codice trovato qui.

Risolvere usando i minimi quadrati

Di seguito è mostrato il codice MATLAB da risolvere usando i minimi quadrati. Il codice assume una variabile in magcui le colonne sono i valori xyz.

H = [mag(:,1), mag(:,2), mag(:,3), - mag(:,2).^2, - mag(:,3).^2, ones(size(mag(:,1)))];
w = mag(:,1).^2;
X = (H'*H)\H'*w;
offX = X(1)/2;
offY = X(2)/(2*X(4));
offZ = X(3)/(2*X(5));
temp = X(6) + offX^2 + X(4)*offY^2 + X(5)*offZ^2;
scaleX = sqrt(temp);
scaleY = sqrt(temp / X(4));
scaleZ= sqrt(temp / X(5));

Per eseguire una calibrazione dinamica della figura 8, è possibile eseguire la routine dei minimi quadrati con ogni nuova lettura e terminare quando si sono stabilizzati i fattori di offset e scala.

Campo magnetico terrestre

Nota, il campo magnetico terrestre di solito non è parallelo alla superficie e potrebbe esserci un grande componente verso il basso.


Ciao, questo è uno sforzo apprezzabile che hai fatto per spianare la strada al problema del modello della figura 8. Ora posso collegare alcuni dei miei lavori precedenti con il lavoro attuale. Ho visto alcuni miglioramenti ma non all'altezza. Come ho spiegato prima in questo solo una domanda; la NEWS viene mostrata correttamente utilizzando i dati di output dopo aver creato la forma 8, quindi ottenendo la metà della media di tutti i vettori. Sorprendentemente funziona per il piano orizzontale (per fluke). Quindi sono di nuovo nello stesso posto da dove ho iniziato a lavorare sull'algo a 8 forme. Tornerò dopo "Least Square". Tuttavia non sono in grado di capire il colpo di fortuna.
Rick2047,

... Sembra che nel mio caso anche la sfera sia deformata sull'asse Z. Per favore, sappi che sono a conoscenza dell'effetto Ferro duro e morbido sulla sfera tridimensionale. Proverò a tracciarlo di nuovo sul 3D. Vediamo.
Rick2047,

@ Rahul2047 Beh, spero solo che sia corretto, ma per me ha senso. Devo fare una calibrazione simile per uno strumento che sto costruendo, ma non sono ancora all'altezza dell'implementazione del codice.
geometrikal,

Mi chiedo che per i telefoni che di solito sono interessati solo alla direzione sul piano orizzontale, un semplice gesto copra tutti i punti necessari. Usi matlab? È facile adattarsi. I minimi quadrati si riferiscono al metodo di misurazione dell'errore.
geometrikal,

1
Alcuni dei collegamenti alle immagini in questo articolo si sono interrotti: è possibile aggiungere nuovamente le immagini? SE ora ha una funzione che carica le immagini e le memorizza localmente, per evitare rotture future. Grazie!
Nuova Alessandria,
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.