В этом примере показано, как выровнять и предварительно обработать записанные данные датчика. Это позволяет фильтрам слияния выполнять ожидаемую оценку ориентации. Записанные данные были собраны с акселерометра и гироскопа, установленного на наземном транспортном средстве.
Загрузить данные регистрируемого инерциального измерительного блока (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 уменьшается, в то время как показания гироскопа положительны. Это означает, что регистрируемый кватернион ориентации должен применяться в качестве оператора поворота точки ().
Чтобы кватернион ориентации соответствовал фильтрам ориентации, например, imufilter, кватернион должен применяться в качестве оператора поворота кадра ().
Это может быть сделано путем сопряжения зарегистрированного кватерниона ориентации.
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-файла в этом примере для выравнивания были проверены следующие аспекты:
Блоки для акселерометра и гироскопа.
Оси выравнивания акселерометра и гироскопа.
Оператор поворота кватерниона ориентации (точка:
или рамка:)
В зависимости от формата регистрируемых данных могут потребоваться различные преобразования единиц измерения, выравнивания осей и преобразования кватернионов.