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 está cambiando mientras que los ejes x y 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 está disminuyendo mientras que 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 orientación, 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 logarítmico transformado con el cuaternión imufilter
Conjuga el cuaternión de orientación registrado antes de compararlo con el cuaternión de orientación estimado de imufilter
. Del gráfico a continuación, 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')
Alinear 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 los cuaterniones como operadores de rotación de marco, los cuaterniones de orientación estimados se premultiplican 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 de este ejemplo, comprobó los siguientes aspectos de 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.