exponenta event banner

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

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

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

Загрузить данные регистрируемого инерциального измерительного блока (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$

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