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