Calibración con magnetómetro ∞


15

En los teléfonos móviles y otros dispositivos que usan una brújula electrónica de 3 ejes, se usa un movimiento en forma de ∞ / 8 / S para calibrar el magnetómetro como se muestra en estos videos .

¿Por qué se realiza este movimiento, cuál es la teoría, y alguien puede dar algún código C de ejemplo para implementarlo?

Debes revisar mi otra pregunta similar que contiene más información.


Alguna información adicional para esta pregunta en particular: la plataforma es AtMega32 de 8 bits, usando AVR Studio 5.

Hasta ahora lo he intentado: he intentado dividir el promedio entre 2 de los valores vectoriales del magnetómetro que forma la figura. Pensar podría ayudar a calcular las compensaciones. Creo que de alguna manera las dos partes / lados idénticos de la forma están cancelando el campo magnético de la Tierra y dando los valores de desplazamiento. Podría estar equivocado. Pero particularmente para la calibración basada en la forma, aquí es donde estoy actualmente. Creo que la calibración funciona de esta manera. La idea es descubrir si eso funciona de esta manera.


Ok, el código por el cual puedo calcular los desplazamientos y luego simplemente restarlos del vector 3D magnético sin procesar. Podría estar totalmente equivocado y no tengo explicación de cómo funciona. Al ver el video y los datos trazados en la esfera, de alguna manera ha acelerado mi pensamiento y usé ese pensamiento en forma de ecuación. SI)

Código:

Las funciones Read_accl();y Read_magnato(1);están leyendo los datos del sensor. Espero que el código se explique por sí mismo. Esperando que las personas sabias seguramente usen esto de maneras mucho mejores. : \

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;

                } 
    }   
} 

Después de obtener estas compensaciones, las usé de la siguiente manera:

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

Como he mencionado.


2
Esta pregunta necesita mucha ayuda. ¿Necesitas ayuda con la programación? Teoría sobre los magnetómetros? Que plataforma ¿Qué has intentado o mirado?
Kellenjb

¿No es la figura 8 simplemente un gesto para iniciar la calibración?
geometrikal

1
No sé por qué las personas se comportan como si fueran robots. He dado un enlace para el mismo trabajo. Trabajé mucho en eso y ppl simplemente sin saberlo, solo vote hacia abajo. Odio cuando mi pregunta se rechaza debido a mi pregunta poco clara. Pregunte qué se necesita justo antes de rechazarlo. Realmente me muero por obtener resultados y la gente ni siquiera piensa antes de rechazarlo. Se siente mal e intenta desviarme de trabajar en la dirección correcta. Por favor, necesito ayuda no en ninguno de los lados del voto
Rick2047

1
@ Kellenjb: Estoy trabajando en una IMU usando un simple atmega32 de 8 bits. Intenté trabajar en ello y concluir que un 32CU uC es como usar una espada en lugar de una aguja. (Perdón por mi acertijo:)) Traté de sumar todos los valores RAW del magnetómetro haciendo la forma. Luego divida por el no de entradas. Pensar podría ayudar a calcular el desplazamiento. Creo que de alguna manera las dos partes / lados idénticos de la forma son algunos de cómo cancelar el campo magnético de la Tierra y dar los valores de desplazamiento. Podría estar equivocado. Pero particularmente para la calibración basada en la forma, aquí es donde estoy actualmente. Creo que el ...
Rick2047

1
El problema no fue con la pregunta, sino con la cantidad de personas en este sitio que rechazarán las preguntas simplemente porque no están lo suficientemente familiarizadas con el tema para comprender lo que se ha preguntado. Si no lo sabes, ¡déjalo en paz!
Chris Stratton el

Respuestas:


21

El patrón en forma de 8 / S se utiliza para calibrar magnetómetros en teléfonos móviles y otros dispositivos.

Antecedentes

Los magnetómetros típicos de la era de los teléfonos móviles miden la intensidad del campo magnético a lo largo de tres ejes ortogonales, por ejemplo:

metro=metroXyo^+metroyȷ^+metrozk^

Con la magnitud del campo dada por,

metro=metroX2+metroy2+metroz2

y el ángulo de rotación de cada eje como

θk=cos-1metrokmetro, dónde k[X,y,z]

Calibración

Dado que el campo magnético de la tierra es relativamente constante, la magnitud del campo medido por el magnetómetro también debe ser constante, independientemente de la orientación del sensor. es decir, si uno girara el sensor y trazara , m y y m zmetroXmetroymetroz en 3D, las rutas deberían trazar la superficie de una esfera con radio constante.

Idealmente debería verse algo así:

esfera

Sin embargo, debido a los efectos de hierro duro y blando y otras distorsiones, termina pareciéndose a una esfera deformada:

deformado

Esto se debe a que la magnitud del campo magnético medido por el sensor está cambiando con la orientación. El resultado es que la dirección del campo magnético cuando se calcula de acuerdo con las fórmulas anteriores es diferente de la dirección verdadera.

Se debe realizar una calibración para ajustar cada una de las lecturas de los tres ejes de modo que la magnitud sea constante independientemente de la orientación; puede pensar que la esfera deformada debe deformarse en una esfera perfecta. La nota de aplicación LSM303 tiene muchas instrucciones detalladas sobre cómo realizar esto.

Entonces, ¿qué pasa con el patrón de la figura 8?

La ejecución del patrón de la figura 8 'traza' parte de la esfera deformada de arriba. A partir de las coordenadas obtenidas, se puede estimar la deformación de la esfera y obtener los coeficientes de calibración. Un buen patrón es aquel que traza el mayor rango de orientaciones y, por lo tanto, estima la mayor desviación de la verdadera magnitud constante.

Para estimar la forma de la esfera deformada, se puede usar el ajuste de elipse de mínimos cuadrados . La nota de aplicación LSM303 también tiene información al respecto.

Un método simple para una calibración básica.

Según la nota de la aplicación, si supone que no hay distorsión de hierro suave, la esfera deformada no se inclinará. Por lo tanto, un método simple para una calibración básica puede ser posible:

  • Encuentre el valor máximo y mínimo para cada eje, y obtenga el rango de 1/2 y el punto cero

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

zk=max(metrok)-rk

  • Cambia y escala cada medida de eje

metrok=metrok-zkrk

  • metrok

Esto se basa en el código que se encuentra aquí.

Resolver usando mínimos cuadrados

El código MATLAB para resolver usando mínimos cuadrados se muestra a continuación. El código asume una variable magdonde las columnas son los 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 realizar una calibración dinámica de la figura 8, puede ejecutar la rutina de mínimos cuadrados con cada nueva lectura y finalizar cuando los factores de desplazamiento y escala se hayan estabilizado.

Campo magnético de la tierra

Tenga en cuenta que el campo magnético de la Tierra generalmente no es paralelo a la superficie y puede haber un gran componente descendente.


Hola, ese es un esfuerzo apreciable que has hecho para despejar el camino para el problema del patrón de la figura 8. Ahora puedo conectar parte de mi trabajo anterior con el trabajo actual. Vi algunas mejoras pero no hasta la marca. Como expliqué anteriormente en este solo pregunta; las NOTICIAS se muestran correctamente utilizando los datos de salida después de hacer la forma 8, luego obteniendo la mitad del promedio de todos los vectores. Sorprendentemente funciona para el plan horizontal (por casualidad). Así que nuevamente estoy en el mismo lugar desde donde comencé a trabajar en el algoritmo de 8 formas. Volveré después de "Least Square". Sin embargo, no puedo entender la casualidad.
Rick2047

... Parece en mi caso también que la esfera está deformada en el eje Z. Tenga en cuenta que soy consciente del efecto de hierro duro y blando en la esfera 3D trazada. Intentaré trazarlo en 3D nuevamente. Vamos a ver.
Rick2047

@ Rahul2047 Bueno, solo espero que sea correcto, pero tiene sentido para mí. Tengo que hacer una calibración similar para un instrumento que estoy construyendo, pero aún no estoy listo para implementar el código.
geometrikal

Me pregunto que para los teléfonos que generalmente solo están interesados ​​en la dirección en el plano horizontal, un simple gesto cubre todos los puntos necesarios. ¿Usas matlab? Es fácil hacer el ajuste allí. Los mínimos cuadrados se refieren al método de medición de errores.
geometrikal

1
Algunos de los enlaces de imágenes en este artículo se rompieron. ¿Puede volver a agregar las imágenes? SE ahora tiene una función que carga las imágenes y las almacena localmente, para evitar futuras roturas. ¡Gracias!
Nueva Alejandría
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.