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.

Alineación de datos del sensor registrado para estimación de orientación

Este ejemplo muestra cómo alinear y preprocesar los datos del sensor registrados. Esto permite que los filtros de fusión realicen una estimación de la orientación como se esperaba. Los datos registrados se recopilaron mediante un acelerómetro y un giroscopio montados en un vehículo terrestre.

Cargar datos del sensor registrados

Cargue datos de unidades de medición inercial (IMU) registrados y extraiga datos de sensores individuales y marcas de tiempo.

load('imuData', 'imuTT')

time = imuTT.Time;
accel = imuTT.LinearAcceleration;
gyro = imuTT.AngularVelocity;
orient = imuTT.Orientation;

Inspeccionar los datos del giroscopio

Desde el rango de lecturas de velocidad angular, los datos registrados del giroscopio están en radianes por segundo en lugar de grados por segundo. Además, los valores más grandes del eje z y los valores pequeños de los ejes x e y indican que el dispositivo giró alrededor del eje z únicamente.

figure
plot(time, gyro)
title('Gyroscope')
ylabel('rad/s')
legend('x-axis', 'y-axis', 'z-axis')

Inspeccionar los datos del acelerómetro

Dado que la lectura del eje z del acelerómetro es de alrededor de 10, los datos registrados están en metros por segundo al cuadrado en lugar de g.

figure
plot(time, accel)
title('Accelerometer')
ylabel('m/s^2')
legend('x-axis', 'y-axis', 'z-axis')

Inspeccionar los datos de orientación

Convierta los datos del cuaternión de orientación registrados a ángulos de Euler en grados. El eje z cambia mientras que los ejes x e y están relativamente fijos. Esto coincide con las lecturas del giroscopio y el acelerómetro. Por lo tanto, no se requiere ningún eje que se niegue o gire. Sin embargo, el ángulo de Euler del eje z disminuye mientras la lectura del giroscopio es positiva. Esto significa que se espera que el cuaternión de orientación registrado se aplique como un operador de rotación de puntos (). Para que el cuaternión de orientación coincida con los filtros de orientaciones, como imufilter, el cuaternión debe aplicarse como un operador de rotación de marco (). Esto se puede hacer conjugando el cuaternión de orientación registrado.

figure
plot(time, eulerd(orient, 'ZYX', 'frame'))
title('Euler Angles')
ylabel('\circ') % Degrees symbol.
legend('z-axis', 'y-axis', 'x-axis')

Encuentre la frecuencia de muestreo de los datos registrados

Se puede obtener una estimación de la tasa de muestreo tomando la media de la diferencia entre las marcas de tiempo. Tenga en cuenta que existen algunas variaciones en las diferencias horarias. Dado que las variaciones son pequeñas para estos datos registrados, se puede utilizar la media de las diferencias temporales. Alternativamente, los datos del sensor podrían interpolarse utilizando marcas de tiempo y marcas de tiempo igualmente espaciadas como puntos de consulta.

deltaTimes = seconds(diff(time));
sampleRate = 1/mean(deltaTimes);

figure
plot([deltaTimes, repmat(mean(deltaTimes), numel(deltaTimes), 1)])
title('Time Differences')
ylabel('s')
legend('differences', 'mean')

Compare el cuaternión registrado transformado con el imufilter cuaternión

Conjugue el cuaternión de orientación registrado antes de compararlo con el cuaternión de orientación estimado de imufilter. Según el gráfico siguiente, todavía hay un desplazamiento constante en la estimación del ángulo de Euler del eje z. Esto se debe a que imufilter asume que la orientación inicial del dispositivo está alineada con el marco de navegación.

loggedOrient = conj(orient);

filt = imufilter('SampleRate', sampleRate);
estOrient = filt(accel, gyro);


figure
subplot(2, 1, 1)
plot(time, eulerd(loggedOrient, 'ZYX', 'frame'), '--')
title('Logged Euler Angles')
ylabel('\circ') % Degrees symbol.
legend('z-axis', 'y-axis', 'x-axis')
subplot(2, 1, 2)
plot(time, eulerd(estOrient, 'ZYX', 'frame'))
title('|imufilter| Euler Angles')
ylabel('\circ') % Degrees symbol.
legend('z-axis', 'y-axis', 'x-axis')

Alinee la orientación registrada y la orientación imufilter

Alinee el cuaternión de orientación imufilter con el cuaternión de orientación registrado aplicando un sesgo constante utilizando el primer cuaternión de orientación registrado. Para los cuaterniones, se puede aplicar un sesgo de rotación constante multiplicando previamente las rotaciones del marco o rotaciones de puntos posteriores a la multiplicación. Dado que imufilter informa cuaterniones como operadores de rotación de cuadros, los cuaterniones de orientación estimados se multiplican previamente por el primer cuaternión de orientación registrado.

alignedEstOrient = loggedOrient(1) .* estOrient;

figure
subplot(2, 1, 1)
plot(time, eulerd(loggedOrient, 'ZYX', 'frame'), '--')
title('Logged Euler Angles')
ylabel('\circ') % Degrees symbol.
legend('z-axis', 'y-axis', 'x-axis')
subplot(2, 1, 2)
plot(time, eulerd(alignedEstOrient, 'ZYX', 'frame'))
title('Aligned |imufilter| Euler Angles')
ylabel('\circ') % Degrees symbol.
legend('z-axis', 'y-axis', 'x-axis')

Conclusión

Para el archivo MAT en este ejemplo, verificó los siguientes aspectos para la alineación:

  • Unidades para acelerómetro y giroscopio.

  • Alineaciones de ejes de acelerómetro y giroscopio.

  • Operador de rotación de cuaternión de orientación (punto: o marco: )

Es posible que sea necesario aplicar diferentes conversiones de unidades, alineaciones de ejes y transformaciones de cuaterniones según el formato de los datos registrados.