Логгированное выравнивание данных о датчике для оценки ориентации

Этот пример показывает, как выровнять и предварительно обработать записанные данные датчика. Это позволяет фильтрам слияния выполнять оценку ориентации, как ожидалось. Записанные данные были собраны с акселерометра и гироскопа, установленного на наземном транспортном средстве.

Загрузка записанных данных о датчике

Загрузите данные инерциального измерительного блока (IMU) и извлеките отдельные данные о датчике и временные метки.

load('imuData', 'imuTT')

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

Смотрите данные гироскопа

Из области значений показаний скорости вращения записанные данные гироскопа указаны в радианах в секунду вместо степеней в секунду. Кроме того, большие значения оси Z и маленькие значения осей X и Y указывают, что устройство вращалось только вокруг оси Z.

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

Смотрите данные акселерометра

Поскольку показания по оси Z акселерометра составляют около 10, записанные данные указаны в метрах в секунду в квадрате вместо g.

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

Просмотр данных ориентации

Преобразуйте записанные данные кватерниона ориентации в углы Эйлера в степенях. Ось Z изменяется, в то время как ось X и Y относительно фиксированы. Это соответствует показаниям гироскопа и акселерометра. Поэтому никакое отрицание или вращение оси не требуется. Однако угол Эйлера по оси Z уменьшается, в то время как показания гироскопа положительны. Это означает, что записанный кватернион ориентации, как ожидается, будет применяться как оператор поворота точки (). $v' = qvq^{*}$Порядок кватернион ориентации совпадал с фильтрами ориентаций, такими как imufilterкватернион должен применяться как оператор вращения системы координат (). $v' = q^{*}vq$Это может быть сделано путем сопряжения логгированного кватерниона ориентации.

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

Поиск частоты дискретизации записанных данных

Оценка частоты дискретизации может быть получена путем взятия среднего значения различия между временными метками. Заметьте, что во временных различиях существуют некоторые отклонения. Поскольку отклонения для этих записанных данных малы, можно использовать среднее значение временных различий. В качестве альтернативы данные о датчике могут быть интерполированы с использованием временных меток и разнесенных на равные расстояния временных меток в качестве точек запроса.

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')

Сравнение преобразованного записанного кватерниона с imufilter Кватернион

Сопряжите логарифмированный кватернион ориентации перед сравнением с предполагаемым кватернионом ориентации из imufilter. Из приведенного ниже графика все еще существует постоянное смещение в оценке угла Эйлера по оси Z. Это потому, что imufilter принимает, что начальная ориентация устройства совмещена с навигационной системой координат.

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')

Выравнивание записанной ориентации и imufilter Ориентация

Выравнивание imufilter кватернион ориентации с логарифмированным кватернионом ориентации путем применения постоянного смещения с помощью первого логарифмированного кватерниона ориентации. Для кватернионов постоянное смещение вращения может быть применено путем предварительного умножения поворотов системы координат или после умножения поворотов точки. Начиная с imufilter сообщает кватернионы как операторы вращения системы координат, предполагаемые кватернионы ориентации предварительно умножаются на первый записанный кватернион ориентации.

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')

Заключение

Для MAT-файла в этом примере для выравнивания были проверены следующие аспекты:

  • Модули для акселерометра и гироскопа.

  • Выравнивания осей акселерометра и гироскопа.

  • Оператор поворота кватерниона ориентации (точка:$v' = qvq^{*}$ или система координат:)$v' = q^{*}vq$

Различные модули измерения, выравнивания осей и преобразования кватерниона могут потребоваться в зависимости от формата записанных данных.