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:
Cree el objeto
ahrsfilter
y configure sus propiedades.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
devuelve un filtro Kalman indirecto System object, FUSE
= ahrsfilterFUSE
, 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.
devuelve un FUSE
= ahrsfilter('ReferenceFrame',RF
)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
.
establece una o más propiedades utilizando argumentos de nombre-valor además de cualquiera de los argumentos de entrada anteriores.FUSE
= ahrsfilter(___,Name=Value
)
Argumentos de entrada
Sistema de coordenadas de navegación local, especificado como 'NED'
(Noreste-Abajo) o 'ENU'
(Este-Norte-Arriba).
Tipos de datos: char
| string
Propiedades
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 1quaternion
.'Rotation matrix'
–– La salida es una matriz de rotación de 3 por 3 por N.
Tipos de datos: char
| string
Uso
Descripción
[
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.orientation
,angularVelocity
,interData
] = FUSE(accelReadings
,gyroReadings
,magReadings
)
Argumentos de entrada
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
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)
Ejemplos
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)')
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
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:
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:
Ecuaciones de Kalman utilizadas en este algoritmo:
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.
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.
Lea el algoritmo para obtener una explicación de cada etapa de la descripción detallada.
El algoritmo modela la aceleración y el cambio angular como procesos lineales.
La orientación del cuadro actual se predice estimando primero el cambio angular respecto del cuadro anterior:
donde N es el factor de diezmado especificado por la propiedad DecimationFactor y fs es la frecuencia de muestreo especificada por la propiedad SampleRate.
El cambio angular se convierte en cuaterniones utilizando la sintaxis de construcción rotvec
quaternion
:
La estimación de orientación anterior se actualiza girándola por Δ Q:
Durante la primera iteración, la estimación de orientación, q−, se inicializa mediante ecompass
.
El vector de gravedad se interpreta como la tercera columna del cuaternión, q−, en forma de matriz de rotación:
Consulte [1] para obtener una explicación de por qué la tercera columna de rPrior puede interpretarse como el vector de gravedad.
Se realiza una segunda estimación del vector de gravedad restando la estimación de aceleración lineal decaida de la iteración anterior de las lecturas del acelerómetro:
El vector magnético de la Tierra se estima rotando la estimación del vector magnético de la iteración anterior por la estimación de orientación a priori, en forma de matriz de rotación:
El modelo de error combina dos diferencias:
La diferencia entre la estimación de la gravedad a partir de las lecturas del acelerómetro y la estimación de la gravedad a partir de las lecturas del giroscopio:
La diferencia entre la estimación del vector magnético a partir de las lecturas del giroscopio y la estimación del vector magnético a partir del magnetómetro:
El magnetómetro calcula correctamente el error en la estimación del vector magnético y detecta interferencias magnéticas.
El error de perturbación magnética se calcula multiplicando la matriz de la ganancia de Kalman asociada al vector magnético con la señal de error:
La ganancia de Kalman, K, es la ganancia de Kalman calculada en la iteración actual.
La interferencia magnética se determina verificando que la potencia de la perturbación magnética detectada sea menor o igual a cuatro veces la potencia de la intensidad del campo magnético esperado:
ExpectedMagneticFieldStrength es una propiedad de ahrsfilter
.
Las ecuaciones de Kalman utilizan la estimación de gravedad derivada de las lecturas del giroscopio, g, la estimación del vector magnético derivada de las lecturas del giroscopio, mGyro, y la observación del proceso de error, z, para actualizar las matrices de ganancia de Kalman y de covarianza intermedia. La ganancia de Kalman se aplica a la señal de error, z, para generar una estimación de error a posteriori, x+.
El modelo de observación asigna los estados observados de 1 por 3, g y mGyro, al estado real de 6 por 12, H.
El modelo de observación se construye como:
donde gx, gy y gz son los elementos x, y y z del vector de gravedad estimado a partir de la orientación a priori, respectivamente. mx, my y mz son los elementos x, y y z del vector magnético estimado a partir de la orientación a priori, respectivamente. κ es una constante determinada por las propiedades SampleRate y DecimationFactor: κ = DecimationFactor
/SampleRate
.
Consulte las secciones 7.3 y 7.4 de [1] para obtener una derivación del modelo de observación.
La covarianza de innovación es una matriz de 6 por 6 que se utiliza para rastrear la variabilidad en las mediciones. La matriz de covarianza de innovación se calcula como:
donde
H es la matriz del modelo de observación
P− es la estimación predicha (a priori) de la covarianza del modelo de observación calculado en la iteración anterior
R es la covarianza del ruido del modelo de observación, calculada como:
donde
y
Las siguientes propiedades definen la variación del ruido del modelo de observación:
La covarianza de la estimación del error es una matriz de 12 por 12 que se utiliza para rastrear la variabilidad en el estado.
La matriz de covarianza de estimación de error se actualiza como:
donde K es la ganancia de Kalman, H es la matriz de medición y P− es la covarianza de estimación de error calculada durante la iteración anterior.
La covarianza de la estimación del error es una matriz de 12 por 12 que se utiliza para rastrear la variabilidad en el estado. La covarianza de estimación de error a priori, P−, se establece en la covarianza de ruido del proceso, Q, determinada durante la iteración anterior. Q se calcula como una función de la covarianza de estimación de error a posteriori, P+. Al calcular Q, se supone que los términos de correlación cruzada son insignificantes en comparación con los términos de autocorrelación y se establecen en cero:
dónde
P+ –– es la covarianza de estimación de error actualizada (a posteriori)
β –– GyroscopeDriftNoise
η –– GyroscopeNoise
Consulte la sección 10.1 de [1] para obtener una derivación de los términos de la matriz de error del proceso.
La matriz de ganancia de Kalman es una matriz de 12 por 6 que se utiliza para ponderar la innovación. En este algoritmo, la innovación se interpreta como el proceso de error, z.
La matriz de ganancia de Kalman se construye como:
donde
P− –– covarianza del error previsto
H –– modelo de observación
S –– covarianza de la innovación
La estimación del error a posterior se determina combinando la matriz de ganancia de Kalman con el error en las estimaciones del vector de gravedad y del vector magnético:
Si se detecta interferencia magnética en la iteración actual, se ignora la señal de error del vector magnético y la estimación del error a posterior se calcula como:
La estimación de orientación se actualiza multiplicando la estimación anterior por el error:
La estimación de la aceleración lineal se actualiza decayendo la estimación de la aceleración lineal de la iteración anterior y restando el error:
donde
La estimación del desplazamiento del giroscopio se actualiza restando el error de desplazamiento del giroscopio del desplazamiento del giroscopio de la iteración anterior:
Para estimar la velocidad angular, se promedia el marco de gyroReadings
y se resta el desplazamiento del giroscopio calculado en la iteración anterior:
donde N es el factor de diezmado especificado por la propiedad DecimationFactor
.
La estimación de compensación del giroscopio se inicializa en ceros para la primera iteración.
Si no se detectó interferencia magnética en la iteración actual, la estimación del vector magnético, m, se actualiza utilizando el error de perturbación magnética a posteriori y la orientación a posteriori.
El error de perturbación magnética se convierte al marco de navegación:
El error de perturbación magnética en el marco de navegación se resta de la estimación del vector magnético anterior y luego se interpreta como inclinación:
La inclinación se convierte en una estimación de vector magnético restringido para la siguiente iteración:
ExpectedMagneticFieldStrength es una propiedad de ahrsfilter
.
Referencias
[1] Open Source Sensor Fusion. https://github.com/memsindustrygroup/Open-Source-Sensor-Fusion/tree/master/docs
[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
Indicaciones y limitaciones de uso:
Consulte System Objects in MATLAB Code Generation (MATLAB Coder).
Este System object también admite la generación estricta de código de precisión simple.
Historial de versiones
Introducido en R2018bObjeto ahrsfilter
, FUSE
devuelve un tercer argumento de salida, interData
, que contiene residuos y covarianza residual almacenados como una estructura.
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Seleccione un país/idioma
Seleccione un país/idioma para obtener contenido traducido, si está disponible, y ver eventos y ofertas de productos y servicios locales. Según su ubicación geográfica, recomendamos que seleccione: .
También puede seleccionar uno de estos países/idiomas:
Cómo obtener el mejor rendimiento
Seleccione China (en idioma chino o inglés) para obtener el mejor rendimiento. Los sitios web de otros países no están optimizados para ser accedidos desde su ubicación geográfica.
América
- América Latina (Español)
- Canada (English)
- United States (English)
Europa
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)