Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Calibración del magnetómetro

Los magnetómetros detectan la intensidad del campo magnético a lo largo de los ejes X, Y y Z de un sensor. Las mediciones precisas del campo magnético son esenciales para la fusión de sensores y la determinación del rumbo y la orientación.

Para que sean útiles para el cálculo de rumbo y orientación, los magnetómetros MEMS típicos de bajo coste deben calibrarse para compensar el ruido ambiental y los defectos de fabricación.

Magnetómetros ideales

Un magnetómetro de tres ejes ideal mide la intensidad del campo magnético a lo largo de los ejes ortogonales X, Y y Z. En ausencia de interferencia magnética, las lecturas del magnetómetro miden el campo magnético de la Tierra. Si las mediciones del magnetómetro se toman mientras el sensor gira en todas las orientaciones posibles, las mediciones deben estar en una esfera. El radio de la esfera es la intensidad del campo magnético.

Para generar muestras de campo magnético, utilice el objeto imuSensor . Para estos propósitos, es seguro asumir que la velocidad angular y la aceleración son cero en cada orientación.

N = 500;
rng(1);
acc = zeros(N,3);
av = zeros(N,3);
q = randrot(N,1); % uniformly distributed random rotations
imu = imuSensor('accel-mag');
[~,x] = imu(acc,av,q);
scatter3(x(:,1),x(:,2),x(:,3));
axis equal
title('Ideal Magnetometer Data');

Efectos de hierro duro

Las fuentes de ruido y los defectos de fabricación degradan la medición de un magnetómetro. Los más llamativos son los efectos del hierro duro. Los efectos del hierro duro son fuentes estacionarias de ruido magnético perturbador. A menudo, estos provienen de otros objetos metálicos que se encuentran en la placa de circuito del magnetómetro. Los efectos del hierro duro desplazan el origen de la esfera ideal.

imu.Magnetometer.ConstantBias = [2 10 40];
[~,x] = imu(acc,av,q);
figure;
scatter3(x(:,1),x(:,2),x(:,3));
axis equal
title('Magnetometer Data With a Hard Iron Offset');

Efectos de hierro dulce

Los efectos del hierro dulce son más sutiles. Surgen de objetos cercanos al sensor que distorsionan el campo magnético circundante. Estos tienen el efecto de estirar e inclinar la esfera de medidas ideales. Las medidas resultantes se encuentran en un elipsoide.

Los efectos del campo magnético del hierro dulce se pueden simular girando el vector del campo geomagnético de la IMU hacia el marco del sensor, estirándolo y luego girándolo nuevamente al marco global.

nedmf = imu.MagneticField;
Rsoft = [2.5 0.3 0.5; 0.3 2 .2; 0.5 0.2 3];
soft = rotateframe(conj(q),rotateframe(q,nedmf)*Rsoft);

for ii=1:numel(q)
    imu.MagneticField = soft(ii,:);
    [~,x(ii,:)] = imu(acc(ii,:),av(ii,:),q(ii));
end
figure;
scatter3(x(:,1),x(:,2),x(:,3));
axis equal
title('Magnetometer Data With Hard and Soft Iron Effects');

Técnica de corrección

La función magcal se puede utilizar para determinar los parámetros de calibración del magnetómetro que tienen en cuenta los efectos del hierro duro y blando. Los datos del magnetómetro no calibrados se pueden modelar como si estuvieran sobre un elipsoide con la ecuación

En esta ecuación, R es una matriz de 3 por 3, b es un vector de 1 por 3 que define el centro del elipsoide, x es un vector de 1 por 3 de mediciones de magnetómetros no calibrados y es un escalar que indica la intensidad del campo magnético. La ecuación anterior es la forma general de una cónica. Para un elipsoide, R debe ser definido positivo. La función magcal utiliza una variedad de solvers, basados ​​en diferentes suposiciones sobre R. En la función magcal , se puede suponer que R es la matriz identidad, una matriz diagonal o una matriz simétrica.

La función magcal produce coeficientes de corrección que toman medidas que se encuentran en un elipsoide desplazado y las transforman para que se encuentren en una esfera ideal, centrada en el origen. La función magcal devuelve una matriz real A de 3 por 3 y un vector b de 1 por 3. Para corregir el cálculo de datos no calibrados

Aquí x es un arreglo de 1 por 3 de mediciones de magnetómetro no calibradas y m es el arreglo de 1 por 3 de mediciones de magnetómetro corregidas, que se encuentran en una esfera. La matriz A tiene determinante 1 y es la raíz cuadrada de la matriz de R. Además, A tiene la misma forma que R: la matriz identidad, diagonal o simétrica. Debido a que este tipo de matrices no pueden impartir rotación, la matriz A no rotará los datos del magnetómetro durante la corrección.

La función magcal también devuelve una tercera salida que es la intensidad del campo magnético . Puede utilizar la intensidad del campo magnético para establecer la propiedad ExpectedMagneticFieldStrength de ahrsfilter.

Usando la función magcal

Utilice la función magcal para determinar los parámetros de calibración que corrigen los datos ruidosos del magnetómetro. Cree datos de magnetómetro ruidosos configurando la propiedad NoiseDensity de la propiedad Magnetometer en imuSensor. Utilice el campo magnético girado y estirado en la variable soft para simular efectos de hierro dulce.

imu.Magnetometer.NoiseDensity = 0.08;
for ii=1:numel(q)
    imu.MagneticField = soft(ii,:);
    [~,x(ii,:)] = imu(acc(ii,:),av(ii,:),q(ii));
end

Para encontrar los parámetros A y b que mejor corrigen los datos del magnetómetro no calibrados, simplemente llame a la función como:

[A,b,expMFS]  = magcal(x);
xCorrected = (x-b)*A;

Trazar los datos originales y corregidos. Muestre el elipsoide que mejor se ajuste a los datos originales. Muestre la esfera en la que deben estar los datos corregidos.

de = HelperDrawEllipsoid;
de.plotCalibrated(A,b,expMFS,x,xCorrected,'Auto');

La función magcal utiliza una variedad de solvers para minimizar el error residual. El error residual es la suma de las distancias entre los datos calibrados y una esfera de radio expMFS.

r = sum(xCorrected.^2,2) - expMFS.^2;
E = sqrt(r.'*r./N)./(2*expMFS.^2);
fprintf('Residual error in corrected data : %.2f\n\n',E);
Residual error in corrected data : 0.01

Puede ejecutar los solvers individuales si solo es necesario corregir algunos defectos o para lograr un cálculo de corrección más simple.

Cálculo de solo compensación

Muchos magnetómetros MEMS tienen registros dentro del sensor que pueden usarse para compensar el desplazamiento del hierro duro. De hecho, la parte (x-b) de la ecuación anterior ocurre a bordo del sensor. Cuando solo se necesita una compensación de compensación de hierro duro, la matriz A se convierte efectivamente en la matriz de identidad. Para determinar solo la corrección de hierro duro, la función magcal se puede llamar de esta manera:

[Aeye,beye,expMFSeye] = magcal(x,'eye');
xEyeCorrected = (x-beye)*Aeye;
[ax1,ax2] = de.plotCalibrated(Aeye,beye,expMFSeye,x,xEyeCorrected,'Eye');
view(ax1,[-1 0 0]);
view(ax2,[-1 0 0]);

Compensación de hierro duro y cálculo de escala de ejes

Para muchas aplicaciones, es suficiente tratar la matriz elipsoide como una matriz diagonal. Geométricamente, esto significa que el elipsoide de los datos del magnetómetro no calibrado se aproxima para que sus semiejes estén alineados con los ejes del sistema de coordenadas y un centro desplazado del origen. Aunque es poco probable que estas sean las características reales del elipsoide, reduce la ecuación de corrección a una única multiplicación y una única resta por eje.

[Adiag,bdiag,expMFSdiag] = magcal(x,'diag');
xDiagCorrected = (x-bdiag)*Adiag;
[ax1,ax2] = de.plotCalibrated(Adiag,bdiag,expMFSdiag,x,xDiagCorrected,...
    'Diag');

Compensación total de hierro duro y blando

Para forzar a la función magcal a resolver un elipsoide arbitrario y producir una matriz A densa y simétrica, llame a la función como:

[A,b] = magcal(x,'sym');

Ajuste automático

Los 'eye', 'diag' y 'sym' deben usarse con cuidado y se deben inspeccionar los valores de salida. En algunos casos, puede que no haya datos suficientes para un ajuste de orden alto ('diag' o 'sym') y se puede encontrar un mejor conjunto de parámetros de corrección utilizando un más simple. $A matriz. La opción de ajuste 'auto' , que es la predeterminada, maneja esta situación.

Considere el caso en el que se utilizan datos insuficientes con un ajustador de alto nivel.

xidx = x(:,3) > 100;
xpoor = x(xidx,:);
[Apoor,bpoor,mfspoor] = magcal(xpoor,'diag');

No hay suficientes datos repartidos sobre la superficie del elipsoide para lograr un buen ajuste y parámetros de calibración adecuados con la opción 'diag' . Como resultado, la matriz Apoor es compleja.

disp(Apoor)
   0.0000 + 0.4722i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.5981i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.0000i   3.5407 + 0.0000i

El uso de la opción de ajuste 'auto' evita este problema y encuentra una matriz A más simple que es real, simétrica y definida positiva. Llamar a magcal con la cadena de opción 'auto' es lo mismo que llamar sin ninguna cadena de opción.

[Abest,bbest,mfsbest] = magcal(xpoor,'auto');
disp(Abest)
     1     0     0
     0     1     0
     0     0     1

La comparación de los resultados del uso del ajustador 'auto' y un ajustador incorrecto de alto nivel muestra los peligros de no examinar la matriz A devuelta antes de corregir los datos.

de.compareBest(Abest,bbest,mfsbest,Apoor,bpoor,mfspoor,xpoor);

Llamar a la función magcal con el indicador 'auto' , que es el valor predeterminado, probará todas las posibilidades de 'eye', 'diag' y 'sym' buscando el A y b lo que minimiza el error residual, mantiene A real, y asegura que R sea positivo definido y simétrico.

Conclusión

La función magcal puede proporcionar parámetros de calibración para corregir las compensaciones de hierro duro y blando en un magnetómetro. Llamar a la función sin cadena de opción, o equivalentemente la cadena de opción 'auto' , produce el mejor ajuste y cubre la mayoría de los casos.