Contenido principal

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

ahrsfilter

Orientación a partir de lecturas de acelerómetro, giroscopio y magnetómetro

Descripción

ahrsfilter System object™ fusiona datos del sensor acelerómetro, magnetómetro y giroscopio para estimar la orientación del dispositivo.

Para estimar la orientación del dispositivo:

  1. Cree el objeto ahrsfilter y configure sus propiedades.

  2. Llame al objeto con argumentos, como si fuera una función.

Para más información sobre el funcionamiento de los System objects, consulte ¿Qué son los System Objects?

Creación

Descripción

FUSE = ahrsfilter devuelve un filtro Kalman indirecto System object, FUSE, para la fusión de datos del sensor del acelerómetro, giroscopio y magnetómetro para estimar la orientación y la velocidad angular del dispositivo. El filtro utiliza un vector de estado de 12 elementos para rastrear el error de estimación de la orientación, el sesgo del giroscopio, la aceleración lineal y la perturbación magnética.

ejemplo

FUSE = ahrsfilter('ReferenceFrame',RF) devuelve un ahrsfilter System object que fusiona datos del acelerómetro, giroscopio y magnetómetro para estimar la orientación del dispositivo en relación con el marco de referencia RF.

FUSE = ahrsfilter(___,Name=Value) establece una o más propiedades utilizando argumentos de nombre-valor además de cualquiera de los argumentos de entrada anteriores.

ejemplo

Argumentos de entrada

expandir todo

Sistema de coordenadas de navegación local, especificado como 'NED' (Noreste-Abajo) o 'ENU' (Este-Norte-Arriba).

Tipos de datos: char | string

Propiedades

expandir todo

A menos que se indique lo contrario, las propiedades son no ajustables, lo que significa que no puede modificar sus valores después de llamar al objeto. Los objetos se bloquean cuando llama a ellos, y la función release los desbloquea.

Si una propiedad es ajustable, puede modificar su valor en cualquier momento.

Para obtener más información sobre cómo modificar los valores de las propiedades, consulte Diseñar sistemas en MATLAB utilizando System objects.

Frecuencia de muestreo de entrada de los datos del sensor en Hz, especificada como un escalar positivo.

Ajustable: No

Tipos de datos: single | double

Factor de diezmado mediante el cual reducir la velocidad de datos del sensor de entrada como parte del algoritmo de fusión, especificado como un número entero positivo.

El número de filas de las entradas –– accelReadings, gyroReadings y magReadings –– debe ser un múltiplo del factor de diezmado.

Tipos de datos: single | double

Varianza del ruido de la señal del acelerómetro en (m/s2)2, especificada como un escalar real positivo.

Ajustable: Yes

Tipos de datos: single | double

Varianza del ruido de la señal del magnetómetro en μT2, especificada como un escalar real positivo.

Ajustable: Yes

Tipos de datos: single | double

Varianza del ruido de la señal del giroscopio en (rad/s)2, especificada como un escalar real positivo.

Ajustable: Yes

Tipos de datos: single | double

Varianza de la deriva del giroscopio en (rad/s)2, especificada como un escalar real positivo.

Ajustable: Yes

Tipos de datos: single | double

Varianza del ruido de aceleración lineal en (m/s2)2, especificada como un escalar real positivo. La aceleración lineal se modela como un proceso de ruido blanco filtrado por paso bajo.

Ajustable: Yes

Tipos de datos: single | double

Factor de caída para la deriva de aceleración lineal, especificado como un escalar en el rango [0,1). Si la aceleración lineal cambia rápidamente, configure LinearAcclerationDecayFactor en un valor más bajo. Si la aceleración lineal cambia lentamente, configure LinearAcclerationDecayFactor en un valor más alto. La deriva de la aceleración lineal se modela como un proceso de ruido blanco filtrado por paso bajo.

Ajustable: Yes

Tipos de datos: single | double

Varianza del ruido de perturbación magnética en μT2, especificado como un escalar positivo finito real.

Ajustable: Yes

Tipos de datos: single | double

Factor de decaimiento para perturbaciones magnéticas, especificado como un escalar positivo en el rango [0,1]. La perturbación magnética se modela como un proceso de Markov de primer orden.

Ajustable: Yes

Tipos de datos: single | double

Matriz de covarianza para el ruido del proceso, especificada como una matriz de 12 por 12. El valor predeterminado es:

  Columns 1 through 6

   0.000006092348396                   0                   0                   0                   0                   0
                   0   0.000006092348396                   0                   0                   0                   0
                   0                   0   0.000006092348396                   0                   0                   0
                   0                   0                   0   0.000076154354947                   0                   0
                   0                   0                   0                   0   0.000076154354947                   0
                   0                   0                   0                   0                   0   0.000076154354947
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0

  Columns 7 through 12

                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
                   0                   0                   0                   0                   0                   0
   0.009623610000000                   0                   0                   0                   0                   0
                   0   0.009623610000000                   0                   0                   0                   0
                   0                   0   0.009623610000000                   0                   0                   0
                   0                   0                   0   0.600000000000000                   0                   0
                   0                   0                   0                   0   0.600000000000000                   0
                   0                   0                   0                   0                   0   0.600000000000000

La matriz de covarianza del proceso inicial explica el error en el modelo de proceso.

Tipos de datos: single | double

Estimación esperada de la intensidad del campo magnético en μT, especificada como un escalar positivo real. La intensidad del campo magnético esperada es una estimación de la intensidad del campo magnético de la Tierra en la ubicación actual.

Ajustable: Yes

Tipos de datos: single | double

Formato de orientación de salida, especificado como 'quaternion' o 'Rotation matrix'. El tamaño de la salida depende del tamaño de entrada, N, y del formato de orientación de salida:

  • 'quaternion' –– La salida es un N por 1 quaternion.

  • 'Rotation matrix' –– La salida es una matriz de rotación de 3 por 3 por N.

Tipos de datos: char | string

Uso

Descripción

[orientation,angularVelocity,interData] = FUSE(accelReadings,gyroReadings,magReadings) fusiona datos del acelerómetro, giroscopio y magnetómetro para calcular mediciones de orientación y velocidad angular. El algoritmo supone que el dispositivo está parado antes de la primera llamada.

ejemplo

Argumentos de entrada

expandir todo

Lecturas del acelerómetro en el sistema de coordenadas del cuerpo del sensor en m/s2, especificadas como una matriz N por 3. N es el número de muestras y las tres columnas de accelReadings representan las [x y z] mediciones. Se supone que las lecturas del acelerómetro corresponden a la frecuencia de muestreo especificada por la propiedad SampleRate.

Tipos de datos: single | double

Lecturas del giroscopio en el sistema de coordenadas del cuerpo del sensor en rad/s, especificadas como una matriz de N por 3. N es el número de muestras y las tres columnas de gyroReadings representan las [x y z] mediciones. Se supone que las lecturas del giroscopio corresponden a la frecuencia de muestreo especificada por la propiedad SampleRate.

Tipos de datos: single | double

Lecturas del magnetómetro en el sistema de coordenadas del cuerpo del sensor en µT, especificadas como una matriz de N por 3. N es el número de muestras y las tres columnas de magReadings representan las [x y z] mediciones. Se supone que las lecturas del magnetómetro corresponden a la frecuencia de muestreo especificada por la propiedad SampleRate.

Tipos de datos: single | double

Argumentos de salida

expandir todo

Orientación que puede rotar cantidades del sistema de coordenadas de navegación local a un sistema de coordenadas corporales, devuelta como cuaterniones o un arreglo. El tamaño y el tipo de orientation dependen de si la propiedad OrientationFormat está establecida en 'quaternion' o 'Rotation matrix':

  • 'quaternion' –– la salida es un vector de cuaterniones M por 1, con el mismo tipo de datos subyacente que las entradas

  • 'Rotation matrix' –– la salida es un arreglo de matrices de rotación de 3 por 3 por M del mismo tipo de datos que las entradas

El número de muestras de entrada, N, y la propiedad DecimationFactor determinan M.

Puede utilizar orientation en una función rotateframe para rotar cantidades desde un sistema de navegación local a un sistema de coordenadas del cuerpo del sensor.

Tipos de datos: quaternion | single | double

Velocidad angular con el sesgo del giroscopio eliminado en el sistema de coordenadas del cuerpo del sensor en rad/s, devuelta como un arreglo M por 3. El número de muestras de entrada, N, y la propiedad DecimationFactor determinan M.

Tipos de datos: single | double

Desde R2024a

Datos intermedios, devueltos como una estructura que contiene residuos y covarianza residual.

Tipos de datos: struct

Funciones del objeto

Para usar una función de objeto, especifique el System object como el primer argumento de entrada. Por ejemplo, para liberar recursos de sistema de un System object llamado obj, utilice la siguiente sintaxis:

release(obj)

expandir todo

tuneAjuste los parámetros ahrsfilter para reducir el error de estimación
residualCalcular la covarianza residual y residual para ahrsfilter
stepEjecutar el algoritmo System object
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object

Ejemplos

contraer todo

Cargue el archivo rpy_9axis, que contiene datos registrados de los sensores acelerómetro, giroscopio y magnetómetro de un dispositivo que oscila en cabeceo (alrededor del eje y), luego en guiñada (alrededor del eje z) y luego en balanceo (alrededor del eje x). El archivo también contiene la frecuencia de muestreo de la grabación.

load 'rpy_9axis' sensorData Fs
accelerometerReadings = sensorData.Acceleration;
gyroscopeReadings = sensorData.AngularVelocity;
magnetometerReadings = sensorData.MagneticField;

Cree un ahrsfilter System object ™ con SampleRate establecido en la frecuencia de muestreo de los datos del sensor. Especifique un factor de diezmado de dos para reducir el coste computacional del algoritmo.

decim = 2;
fuse = ahrsfilter('SampleRate',Fs,'DecimationFactor',decim);

Pase las lecturas del acelerómetro, del giroscopio y del magnetómetro al objeto ahrsfilter, fuse, para generar una estimación de la orientación del cuerpo del sensor a lo largo del tiempo. De forma predeterminada, la orientación se genera como un vector de cuaterniones.

q = fuse(accelerometerReadings,gyroscopeReadings,magnetometerReadings);

La orientación se define por el desplazamiento angular requerido para rotar un sistema de coordenadas principal a un sistema de coordenadas secundario. Trazar la orientación en ángulos de Euler en grados a lo largo del tiempo.

ahrsfilter estima correctamente el cambio de orientación a lo largo del tiempo, incluida la orientación inicial orientada al sur.

time = (0:decim:size(accelerometerReadings,1)-1)/Fs;

plot(time,eulerd(q,'ZYX','frame'))
title('Orientation Estimate')
legend('z-axis', 'y-axis', 'x-axis')
ylabel('Rotation (degrees)')

Figure contains an axes object. The axes object with title Orientation Estimate, ylabel Rotation (degrees) contains 3 objects of type line. These objects represent z-axis, y-axis, x-axis.

Este ejemplo muestra cómo el rendimiento del ahrsfilter System object™ se ve afectado por el bloqueo magnético.

Cargue StationaryIMUReadings, que contiene lecturas del acelerómetro, magnetómetro y giroscopio de una IMU estacionaria.

load 'StationaryIMUReadings.mat' accelReadings magReadings gyroReadings SampleRate

numSamples = size(accelReadings,1);

El ahrsfilter utiliza la intensidad del campo magnético para estabilizar su orientación frente al supuesto campo magnético constante de la Tierra. Sin embargo, hay muchos objetos naturales y artificiales que generan campos magnéticos y pueden confundir el algoritmo. Para tener en cuenta la presencia de campos magnéticos transitorios, puede establecer la propiedad MagneticDisturbanceNoise en el objeto ahrsfilter.

Cree un objeto ahrsfilter con el factor de diezmado establecido en 2 y anote la intensidad del campo magnético esperada predeterminada.

decim = 2;
FUSE = ahrsfilter('SampleRate',SampleRate,'DecimationFactor',decim);

Fusione las lecturas de la IMU utilizando el filtro del sistema de referencia de actitud y rumbo (AHRS) y luego visualice la orientación del cuerpo del sensor a lo largo del tiempo. La orientación fluctúa al principio y se estabiliza después de aproximadamente 60 segundos.

orientation = FUSE(accelReadings,gyroReadings,magReadings);

orientationEulerAngles = eulerd(orientation,'ZYX','frame');
time = (0:decim:(numSamples-1))'/SampleRate;

figure(1)
plot(time,orientationEulerAngles(:,1), ...
     time,orientationEulerAngles(:,2), ...
     time,orientationEulerAngles(:,3))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
legend('z-axis','y-axis','x-axis')
title('Filtered IMU Data')

Imite la interferencia magnética añadiendo un campo magnético transitorio y fuerte al campo magnético registrado en magReadings. Visualice el campo magnético interfiriéndose.

jamStrength = [10,5,2];
startStop = (50*SampleRate):(150*SampleRate);
jam = zeros(size(magReadings));
jam(startStop,:) = jamStrength.*ones(numel(startStop),3);

magReadings = magReadings + jam;

figure(2)
plot(time,magReadings(1:decim:end,:))
xlabel('Time (s)')
ylabel('Magnetic Field Strength (\mu T)')
title('Simulated Magnetic Field with Jamming')
legend('z-axis','y-axis','x-axis')

Ejecute la simulación nuevamente utilizando magReadings con interferencia magnética. Trace los resultados y observe la disminución del rendimiento en la estimación de la orientación.

reset(FUSE)
orientation = FUSE(accelReadings,gyroReadings,magReadings);

orientationEulerAngles = eulerd(orientation,'ZYX','frame');

figure(3)
plot(time,orientationEulerAngles(:,1), ...
     time,orientationEulerAngles(:,2), ...
     time,orientationEulerAngles(:,3))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
legend('z-axis','y-axis','x-axis')
title('Filtered IMU Data with Magnetic Disturbance and Default Properties')

El filtro AHRS malinterpretó la interferencia magnética y la orientación del cuerpo del sensor se estimó incorrectamente. Puedes compensar el atasco aumentando la propiedad MagneticDisturbanceNoise. Al aumentar la propiedad MagneticDisturbanceNoise aumenta el rango de ruido asumido para la perturbación magnética, y toda la señal del magnetómetro tiene menos ponderación en el algoritmo de fusión subyacente de ahrsfilter.

Establezca MagneticDisturbanceNoise en 200 y ejecute la simulación nuevamente.

La salida de estimación de orientación de ahrsfilter es más precisa y se ve menos afectada por el transitorio magnético. Sin embargo, debido a que la señal del magnetómetro tiene menos peso en el algoritmo de fusión subyacente, el algoritmo puede tardar más en reestabilizarse.

reset(FUSE)
FUSE.MagneticDisturbanceNoise = 20;

orientation = FUSE(accelReadings,gyroReadings,magReadings);

orientationEulerAngles = eulerd(orientation,'ZYX','frame');

figure(4)
plot(time,orientationEulerAngles(:,1), ...
     time,orientationEulerAngles(:,2), ...
     time,orientationEulerAngles(:,3))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
legend('z-axis','y-axis','x-axis')
title('Filtered IMU Data with Magnetic Disturbance and Modified Properties')

Este ejemplo utiliza ahrsfilter System object™ para fusionar datos IMU de 9 ejes de un cuerpo de sensor que se agita. Trace la distancia del cuaternión entre el objeto y su posición de reposo final para visualizar el rendimiento y la rapidez con la que el filtro converge a la posición de reposo correcta. A continuación, ajuste los parámetros de ahrsfilter para que el filtro converja más rápidamente a la posición de reposo de ground-truth .

Cargue IMUReadingsShaken en su espacio de trabajo actual. Estos datos se registraron desde una IMU que se agitó y luego se colocó en posición de reposo. Visualice la aceleración, el campo magnético y la velocidad angular registrados por los sensores.

load 'IMUReadingsShaken' accelReadings gyroReadings magReadings SampleRate
numSamples = size(accelReadings,1);
time = (0:(numSamples-1))'/SampleRate;

figure(1)
subplot(3,1,1)
plot(time,accelReadings)
title('Accelerometer Reading')
ylabel('Acceleration (m/s^2)')

subplot(3,1,2)
plot(time,magReadings)
title('Magnetometer Reading')
ylabel('Magnetic Field (\muT)')

subplot(3,1,3)
plot(time,gyroReadings)
title('Gyroscope Reading')
ylabel('Angular Velocity (rad/s)')
xlabel('Time (s)')

Cree un ahrsfilter y luego fusione los datos de la IMU para determinar la orientación. La orientación se devuelve como un vector de cuaterniones; convierta los cuaterniones a ángulos de Euler en grados. Visualice la orientación del cuerpo del sensor a lo largo del tiempo trazando los ángulos de Euler necesarios, en cada paso de tiempo, para rotar el sistema de coordenadas global al sistema de coordenadas del cuerpo del sensor.

fuse = ahrsfilter('SampleRate',SampleRate);
orientation = fuse(accelReadings,gyroReadings,magReadings);

orientationEulerAngles = eulerd(orientation,'ZYX','frame');

figure(2)
plot(time,orientationEulerAngles(:,1), ...
     time,orientationEulerAngles(:,2), ...
     time,orientationEulerAngles(:,3))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation over Time')
legend('Rotation around z-axis', ...
       'Rotation around y-axis', ...
       'Rotation around x-axis')

En la grabación IMU, el temblor se detiene después de aproximadamente seis segundos. Determina la orientación en reposo para que puedas caracterizar qué tan rápido converge ahrsfilter.

Para determinar la orientación en reposo, calcule los promedios del campo magnético y la aceleración durante los últimos cuatro segundos y luego utilice la función ecompass para fusionar los datos.

Visualice la distancia del cuaternión desde la posición de reposo a lo largo del tiempo.

restingOrientation = ecompass(mean(accelReadings(6*SampleRate:end,:)), ...
                              mean(magReadings(6*SampleRate:end,:)));

figure(3)
plot(time,rad2deg(dist(restingOrientation,orientation)))
hold on
xlabel('Time (s)')
ylabel('Quaternion Distance (degrees)')

Modifique las propiedades predeterminadas ahrsfilter para que el filtro converja a la gravedad más rápidamente. Aumente GyroscopeDriftNoise a 1e-2 y disminuya LinearAccelerationNoise a 1e-4. Esto le indica al algoritmo ahrsfilter que pondere menos los datos del giroscopio y más los datos del acelerómetro. Debido a que los datos accelerometer proporcionan el vector de gravedad estabilizador y consistente, la orientación resultante converge más rápidamente.

Restablezca el filtro, fusione los datos y trace los resultados.

fuse.LinearAccelerationNoise = 1e-4;
fuse.GyroscopeDriftNoise     = 1e-2;
reset(fuse)

orientation = fuse(accelReadings,gyroReadings,magReadings);

figure(3)
plot(time,rad2deg(dist(restingOrientation,orientation)))
legend('Default AHRS Filter','Tuned AHRS Filter')

Algoritmos

expandir todo

Nota: El siguiente algoritmo sólo se aplica a un marco de referencia NED.

El ahrsfilter utiliza la estructura de filtro Kalman de nueve ejes descrita en [1]. El algoritmo intenta rastrear los errores de orientación, desplazamiento del giroscopio, aceleración lineal y perturbación magnética para generar la orientación final y la velocidad angular. En lugar de rastrear la orientación directamente, el filtro Kalman indirecto modela el proceso de error, x, con una actualización recursiva:

xk=[θkbkakdk]=Fk[θk1bk1ak1dk1]+wk

donde xk es un vector de 12 por 1 que consta de:

  • θk –– Vector de error de orientación de 3 por 1, en grados, en el tiempo k

  • bk –– Vector de sesgo de velocidad angular cero del giroscopio 3 por 1, en grados/s, en el momento k

  • ak –– Vector de error de aceleración de 3 por 1 medido en el marco del sensor, en g, en el tiempo k

  • dk –– Vector de error de perturbación magnética de 3 por 1 medido en el marco del sensor, en µT, en el tiempo k

y donde wk es un vector de ruido aditivo de 12 por 1, y Fk es el modelo de transición de estado.

Dado que xk se define como el proceso de error, la estimación a priori siempre es cero y, por lo tanto, el modelo de transición de estado, Fk, es cero. Esta idea da como resultado la siguiente reducción de las ecuaciones estándar de Kalman:

Ecuaciones de Kalman estándar:

xk=Fkxk1+Pk=FkPk1+FkT+Qkyk=zkHkxkSk=Rk+HkPkHkTKk=PkHkT(Sk)1xk+=xk+KkykPk+=PkKkHkPk

Ecuaciones de Kalman utilizadas en este algoritmo:

xk=0Pk=Qkyk=zkSk=Rk+HkPkHkTKk=PkHkT(Sk)1xk+=KkykPk+=PkKkHkPk

donde:

  • xk –– estimación del estado predicho (a priori); el proceso de error

  • Pk –– estimación de covarianza prevista (a priori)

  • yk –– innovación

  • Sk –– covarianza de la innovación

  • Kk –– Ganancia de Kalman

  • xk+ –– estimación de estado actualizada (a posteriori)

  • Pk+ –– estimación de covarianza actualizada (a posteriori)

k representa la iteración, el superíndice + representa una estimación a posteriori y el superíndice representa una estimación a priori.

El gráfico y los siguientes pasos describen una iteración basada en un solo cuadro a través del algoritmo.

Algorithm Flow Chart

Antes de la primera iteración, las entradas accelReadings, gyroReadings y magReadings se dividen en cuadros DecimationFactor por 3. Para cada fragmento, el algoritmo utiliza las lecturas más actuales del acelerómetro y magnetómetro correspondientes al fragmento de lecturas del giroscopio.

Referencias

[2] Roetenberg, D., H.J. Luinge, C.T.M. Baten, and P.H. Veltink. "Compensation of Magnetic Disturbances Improves Inertial and Magnetic Sensing of Human Body Segment Orientation." IEEE Transactions on Neural Systems and Rehabilitation Engineering. Vol. 13. Issue 3, 2005, pp. 395-405.

Capacidades ampliadas

expandir todo

Historial de versiones

Introducido en R2018b

expandir todo

Consulte también

| | |