Calibração em forma de magnetômetro


15

Em telefones celulares e outros dispositivos usando uma bússola eletrônica de 3 eixos, um movimento em forma de ∞ / 8 / S é usado para calibrar o magnetômetro, como mostrado nesses vídeos .

Por que esse movimento é realizado, qual é a teoria e alguém pode dar um exemplo de código C para implementá-lo?

Você deve ter que passar por minha outra pergunta semelhante contendo mais informações.


Algumas informações adicionais para esta pergunta em particular: A plataforma é o AtMega32 de 8 bits, usando o AVR Studio 5.

Até agora, tentei: tentei dividir a média por 2 dos valores vetoriais do magnetômetro que faz a forma. Pensar pode ajudar no cálculo de compensações. Eu acho que de alguma forma as duas partes / lados idênticos da forma estão cancelando o campo magnético da Terra e fornecendo os valores de deslocamento. Eu posso estar errado. Mas particularmente para a calibração baseada em formas, é onde estou atualmente. Eu acho que a calibração funciona dessa maneira. A idéia é descobrir se isso funciona dessa maneira?


Ok, o código pelo qual eu posso calcular as compensações e mais tarde simplesmente subtrair as do vetor 3D magnético Raw. Eu posso estar totalmente errado e não ter explicação sobre como isso funciona. Vendo o vídeo e os dados plotados na esfera, de alguma forma acelerou meu pensamento e usei esse pensamento na forma de equação. B)

Código:

As funções Read_accl();e Read_magnato(1);estão lendo os dados do sensor. Espero que o código seja auto-explicativo. Esperando que as pessoas sábias certamente usem isso de maneiras muito melhores. : \

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;

                } 
    }   
} 

Depois de obter essas compensações, usei-as da seguinte maneira:

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 ;
...
}

Conforme mencionei.


2
Esta pergunta precisa de muita ajuda. Você precisa de ajuda com a programação? Teoria sobre magnetômetros? Qual plataforma? O que você tentou ou procurou?
Novell

a figura 8 não é simplesmente um gesto para iniciar a calibração?
geometrikal

1
Não sei por que as pessoas se comportam como se fossem robôs. Eu dei um link para o mesmo trabalho. Eu trabalhei muito nisso e pessoas sem saber, apenas vote. Eu odeio quando minha pergunta é votada para baixo por causa de minha pergunta incerta. Por favor, pergunte o que é necessário antes de votar. Estou realmente morrendo de vontade de obter resultados e as pessoas nem pensam antes de votar. É ruim e tenta me desviar do trabalho na direção certa. Por favor, preciso de ajuda para não ambos os lados do voto.
Rick2047

1
@Kellenjb: Estou trabalhando em uma IMU usando um simples atmega32 de 8 bits. Tentei trabalhar nisso e concluir que um uC de 32 bits é como usar uma espada no lugar de uma agulha. (Desculpe pelo meu enigma:)) Tentei somar todos os valores RAW do magnetômetro criando a forma. Em seguida, divida pelo número de entradas. Pensar pode ajudar no cálculo do deslocamento. Eu acho que de alguma forma as duas partes / lados idênticos da forma são como cancelar o campo magnético da Terra e fornecer os valores de deslocamento. Eu posso estar errado. Mas particularmente para a calibração baseada em formas, é onde estou atualmente. Eu acho que o ...
Rick2047

1
O problema não estava com a pergunta, mas com o número de pessoas neste site que votaram negativamente nas perguntas simplesmente porque não estão familiarizadas o suficiente com o assunto para entender o que foi solicitado. Se você não sabe, apenas deixe em paz!
Chris Stratton

Respostas:


21

O padrão em forma de 8 / S é usado para calibrar magnetômetros em telefones celulares e outros dispositivos.

fundo

Os magnetômetros típicos da era do telefone móvel medem a força do campo magnético ao longo de três eixos ortogonais, por exemplo:

m=mxı^+myȷ^+mzk^

Com a magnitude do campo dada por,

m=mx2+my2+mz2

e o ângulo de rotação de cada eixo como

θk=porque-1mk__m__, Onde k[x,y,z]

Calibração

Como o campo magenético da Terra é relativamente constante, a magnitude do campo as, medida pelo magnetômetro, também deve ser constante, independentemente da orientação do sensor. ou seja, se alguém girar o sensor e plotar , e em 3D, os caminhos devem plotar a superfície de uma esfera com raio constante.mxmymz

Idealmente, deve ser algo como isto:

esfera

No entanto, devido aos efeitos de ferro duro e macio e outras distorções, acaba parecendo uma esfera deformada:

deformado

Isso ocorre porque a magnitude do campo magnético, medida pelo sensor, está mudando com a orientação. O resultado é que a direção do campo magnético, quando calculada de acordo com as fórmulas acima, é diferente da direção verdadeira.

A calibração deve ser realizada para ajustar cada uma das leituras dos três eixos, de modo que a magnitude seja constante, independentemente da orientação - você pode pensar nisso como a esfera deformada deve ser deformada em uma esfera perfeita. A nota de aplicação do LSM303 possui muitas instruções detalhadas sobre como fazer isso.

E o padrão da figura 8 !?

A execução do padrão da figura 8 'rastreia' parte da esfera deformada acima. A partir das coordenadas obtidas, a deformação da esfera pode ser estimada e os coeficientes de calibração obtidos. Um bom padrão é aquele que rastreia a maior variedade de orientações e, portanto, estima o maior desvio da verdadeira magnitude constante.

Para estimar a forma da esfera deformada, o ajuste da elipse de mínimos quadrados pode ser usado. A nota de aplicação do LSM303 também possui informações sobre isso.

Um método simples para uma calibração básica

De acordo com a nota do aplicativo, se você não assumir nenhuma distorção de ferro macio, a esfera deformada não será inclinada. Portanto, um método simples para uma calibração básica pode ser possível:

  • Encontre o valor máximo e mínimo para cada eixo e obtenha a faixa 1/2 e o ponto zero

rk=12(max(mk)-min(mk))

zk=max(mk)-rk

  • Deslocar e dimensionar cada medição de eixo

mk=mk-zkrk

  • Calcular valores como antes, exceto usandomk

Isso é baseado no código encontrado aqui.

Resolução usando mínimos quadrados

O código MATLAB para resolver usando mínimos quadrados é mostrado abaixo. O código assume uma variável em magque as colunas são os valores 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));

Para fazer uma calibração dinâmica da figura 8, você pode executar a rotina de mínimos quadrados a cada nova leitura e terminar quando os fatores de deslocamento e escala estiverem estabilizados.

Campo Magnético da Terra

Observe que o campo magnético da Terra geralmente não é paralelo à superfície e pode haver um grande componente descendente.


O problema é que, em alguns casos, é necessário que o usuário tenha uma conta de e-mail cadastrada no sistema e que não tenha acesso à sua conta de e-mail, o que significa que você não pode acessar o site da empresa. apenas a pergunta; o NEWS é mostrado corretamente usando os dados de saída depois de fazer a forma 8, obtendo metade da média de todos os vetores. Surpreendentemente, ele funciona para o plano horizontal (por acaso) .Então, novamente, estou no mesmo lugar de onde comecei a trabalhar no 8 shape algo. Voltarei depois de "Least Square". Contudo, não sou capaz de entender o que aconteceu.
Rick2047

... Parece que no meu caso também a esfera está deformada no eixo Z. Saiba que eu conheço o efeito Ferro duro e macio na esfera 3D plotada. Vou tentar plotá-lo no 3D novamente. Vamos ver.
Rick2047

@ Rahul2047 Bem, só espero que esteja correto, mas faz sentido para mim. Preciso fazer uma calibração semelhante para um instrumento que estou construindo, mas ainda não estou pronto para implementar o código.
geometrikal.

Gostaria de saber que, para telefones que geralmente só estão interessados ​​em direção no plano horizontal, um simples gesto cobre todos os pontos necessários. Você usa matlab? É fácil fazer o ajuste lá. Os mínimos quadrados referem-se ao método de medição de erros.
geometrikal

1
Alguns dos links de imagens deste artigo foram quebrados - você pode adicionar novamente as imagens? O SE agora tem uma função que carrega as imagens e as armazena localmente, para evitar quebras futuras. Obrigado!
New Alexandria
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.