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