exponenta event banner

imuSensor

Имитационная модель IMU

Описание

imuSensor Модели object™ системы, получающие данные от инерциального измерительного блока (IMU).

Для моделирования IMU:

  1. Создать imuSensor и задайте его свойства.

  2. Вызовите объект с аргументами, как если бы это была функция.

Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.

Создание

Описание

пример

IMU = imuSensor возвращает объект System, IMU, который вычисляет показания инерциального измерительного блока на основе инерциального входного сигнала. IMU имеет идеальный акселерометр и гироскоп.

пример

IMU = imuSensor('accel-gyro') возвращает imuSensor Системный объект с идеальным акселерометром и гироскопом. imuSensor и imuSensor('accel-gyro') - эквивалентные синтаксисы создания.

пример

IMU = imuSensor('accel-mag') возвращает imuSensor Объект системы с идеальным акселерометром и магнитометром.

пример

IMU = imuSensor('accel-gyro-mag') возвращает imuSensor Системный объект с идеальным акселерометром, гироскопом и магнитометром.

IMU = imuSensor(___,'ReferenceFrame',RF) возвращает imuSensor Объект системы, вычисляющий инерциальный измерительный блок, считывающий данные относительно опорного кадра RF. Определить RF как 'NED' (Север-Восток-вниз) или 'ENU' (Восток-Север-Вверх). Значение по умолчанию: 'NED'.

пример

IMU = imuSensor(___,Name,Value) задает каждое свойство Name к указанному Value. Неопределенные свойства имеют значения по умолчанию. Этот синтаксис может использоваться в сочетании с любым из предыдущих входных аргументов.

Свойства

развернуть все

Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.

Если свойство настраивается, его значение можно изменить в любое время.

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

Тип инерциальной единицы измерения, указанный как 'accel-gyro', 'accel-mag', или 'accel-gyro-mag'.

Тип единицы инерциального измерения определяет, какие показания датчика следует моделировать:

  • 'accel-gyro' - Акселерометр и гироскоп

  • 'accel-mag' - Акселерометр и магнитометр

  • 'accel-gyro-mag' - Акселерометр, гироскоп и магнитометр

Можно указать IMUType как аргумент только значения во время создания или как Name,Value пара.

Типы данных: char | string

Частота дискретизации модели датчика в Гц, заданная как положительный скаляр.

Типы данных: single | double

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

Когда объект вычисляет коэффициенты температурной шкалы и шумы дрейфа окружающей среды, в качестве номинальной температуры используется 25 oC.

Настраиваемый: Да

Типы данных: single | double

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

Магнитное поле по умолчанию соответствует магнитному полю на нулевой широте, нулевой долготе и нулевой высоте.

Настраиваемый: Да

Типы данных: single | double

Параметры датчика акселерометра, указанные accelparams объект.

Настраиваемый: Да

Параметры датчика гироскопа, определяемые gyroparams объект.

Настраиваемый: Да

Параметры датчика магнитометра, указанные magparams объект.

Настраиваемый: Да

Источник случайных чисел, указанный как символьный вектор или строка:

  • 'Global stream' - Случайные числа генерируются с использованием текущего глобального потока случайных чисел.

  • 'mt19937ar with seed' - Случайные числа генерируются с использованием алгоритма mt19937ar с начальным числом, указанным Seed собственность.

Типы данных: char | string

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

Зависимости

Чтобы включить это свойство, установите RandomStream кому 'mt19937ar with seed'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Использование

Описание

[accelReadings,gyroReadings] = IMU(acc,angVel) формирует показания акселерометра и гироскопа с входов ускорения и угловой скорости.

Этот синтаксис допустим только в том случае, если IMUType имеет значение 'accel-gyro' или 'accel-gyro-mag'.

[accelReadings,gyroReadings] = IMU(acc,angVel,orientation) формирует показания акселерометра и гироскопа с входов ускорения, угловой скорости и ориентации.

Этот синтаксис допустим только в том случае, если IMUType имеет значение 'accel-gyro' или 'accel-gyro-mag'.

[accelReadings,magReadings] = IMU(acc,angVel) формирует показания акселерометра и магнитометра с входов ускорения и угловой скорости.

Этот синтаксис допустим только в том случае, если IMUType имеет значение 'accel-mag'.

[accelReadings,magReadings] = IMU(acc,angVel,orientation) формирует показания акселерометра и магнитометра с входов ускорения, угловой скорости и ориентации.

Этот синтаксис допустим только в том случае, если IMUType имеет значение 'accel-mag'.

[accelReadings,gyroReadings,magReadings] = IMU(acc,angVel) формирует показания акселерометра, гироскопа и магнитометра с входов ускорения и угловой скорости.

Этот синтаксис допустим только в том случае, если IMUType имеет значение 'accel-gyro-mag'.

[accelReadings,gyroReadings,magReadings] = IMU(acc,angVel,orientation) генерирует показания акселерометра, гироскопа и магнитометра из входов ускорения, угловой скорости и ориентации.

Этот синтаксис допустим только в том случае, если IMUType имеет значение 'accel-gyro-mag'.

Входные аргументы

развернуть все

Ускорение IMU в локальной навигационной системе координат, задаваемое как действительный, конечный массив N-by-3 в метрах в секунду в квадрате. N - количество выборок в текущем кадре.

Типы данных: single | double

Угловая скорость IMU в локальной навигационной системе координат, заданная как действительный, конечный массив N-by-3 в радианах в секунду. N - количество выборок в текущем кадре.

Типы данных: single | double

Ориентация IMU относительно локальной навигационной системы координат, указанной как quaternion Вектор столбца N-элемента или матрица вращения 3-by-3-by-N. Каждый quaternion или матрица поворота представляет поворот кадра от локальной навигационной системы координат к текущей системе координат корпуса датчика IMU. N - количество выборок в текущем кадре.

Типы данных: single | double | quaternion

Выходные аргументы

развернуть все

Измерение акселерометра IMU в системе координат корпуса датчика, определяемое как действительный, конечный массив N-by-3 в метрах в секунду в квадрате. N - количество выборок в текущем кадре.

Типы данных: single | double

Гироскоп измерения IMU в системе координат корпуса датчика, определяемый как действительный, конечный массив N-by-3 в радианах в секунду. N - количество выборок в текущем кадре.

Типы данных: single | double

Магнитометрическое измерение IMU в системе координат корпуса датчика, определяемое как действительная, конечная N-by-3 матрица в микротельце. N - количество выборок в текущем кадре.

Типы данных: single | double

Функции объекта

Чтобы использовать функцию объекта, укажите объект System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:

release(obj)

развернуть все

loadparamsЗагрузить параметры датчика из файла JSON
stepЗапустить алгоритм объекта System
releaseДеблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков
resetСброс внутренних состояний объекта System

Примеры

свернуть все

imuSensor Система object™ позволяет моделировать данные, полученные от инерциального измерительного блока, состоящего из комбинации гироскопа, акселерометра и магнитометра.

Создание значения по умолчанию imuSensor объект.

IMU = imuSensor
IMU = 
  imuSensor with properties:

          IMUType: 'accel-gyro'
       SampleRate: 100
      Temperature: 25
    Accelerometer: [1x1 accelparams]
        Gyroscope: [1x1 gyroparams]
     RandomStream: 'Global stream'

imuSensor объект, IMU, содержит идеализированный гироскоп и акселерометр. Используйте точечную нотацию для просмотра свойств гироскопа.

IMU.Gyroscope
ans = 
  gyroparams with properties:

    MeasurementRange: Inf        rad/s      
          Resolution: 0          (rad/s)/LSB
        ConstantBias: [0 0 0]    rad/s      
    AxesMisalignment: [0 0 0]    %          

       NoiseDensity: [0 0 0]    (rad/s)/√Hz
    BiasInstability: [0 0 0]    rad/s      
         RandomWalk: [0 0 0]    (rad/s)*√Hz

           TemperatureBias: [0 0 0]    (rad/s)/°C    
    TemperatureScaleFactor: [0 0 0]    %/°C          
          AccelerationBias: [0 0 0]    (rad/s)/(m/s²)

Свойства датчика определяются соответствующими объектами параметров. Например, модель гироскопа, используемая imuSensor определяется экземпляром gyroparams класс. Можно изменить свойства модели гироскопа с помощью точечной нотации. Установите диапазон измерений гироскопа 4,3 рад/с.

IMU.Gyroscope.MeasurementRange = 4.3;

Можно также задать свойства датчика для предварительно определенных объектов параметров. Создание accelparams объект для имитации определенного аппаратного обеспечения, а затем установки IMU Accelerometer к свойству accelparams объект. Отображение Accelerometer для проверки правильности установки свойств.

SpecSheet1 = accelparams( ...
    'MeasurementRange',19.62, ...
    'Resolution',0.00059875, ...
    'ConstantBias',0.4905, ...
    'AxesMisalignment',2, ...
    'NoiseDensity',0.003924, ...
    'BiasInstability',0, ...
    'TemperatureBias', [0.34335 0.34335 0.5886], ...
    'TemperatureScaleFactor', 0.02);

IMU.Accelerometer = SpecSheet1;

IMU.Accelerometer
ans = 
  accelparams with properties:

    MeasurementRange: 19.62                     m/s²      
          Resolution: 0.00059875                (m/s²)/LSB
        ConstantBias: [0.4905 0.4905 0.4905]    m/s²      
    AxesMisalignment: [2 2 2]                   %         

       NoiseDensity: [0.003924 0.003924 0.003924]    (m/s²)/√Hz
    BiasInstability: [0 0 0]                         m/s²      
         RandomWalk: [0 0 0]                         (m/s²)*√Hz

           TemperatureBias: [0.34335 0.34335 0.5886]    (m/s²)/°C
    TemperatureScaleFactor: [0.02 0.02 0.02]            %/°C     

Используйте imuSensor Система object™ для моделирования получения данных от стационарного идеального IMU, содержащего акселерометр, гироскоп и магнитометр.

Создайте идеальную модель датчика IMU, содержащую акселерометр, гироскоп и магнитометр.

IMU = imuSensor('accel-gyro-mag')
IMU = 
  imuSensor with properties:

          IMUType: 'accel-gyro-mag'
       SampleRate: 100
      Temperature: 25
    MagneticField: [27.5550 -2.4169 -16.0849]
    Accelerometer: [1x1 accelparams]
        Gyroscope: [1x1 gyroparams]
     Magnetometer: [1x1 magparams]
     RandomStream: 'Global stream'

Определите истинное состояние земли, лежащее в основе моделируемого IMU. Ускорение и угловая скорость определяются относительно локальной системы координат NED.

numSamples = 1000;
acceleration = zeros(numSamples,3);
angularVelocity = zeros(numSamples,3);

Звонить IMU с ускорением «земля-истина» и угловой скоростью. Объект выводит показания акселерометра, гироскопа и магнитометра, смоделированные по свойствам imuSensor Системный объект. Показания акселерометра, гироскопа и магнитометра относятся к системе координат корпуса датчика IMU.

[accelReading,gyroReading,magReading] = IMU(acceleration,angularVelocity);

Постройте график показаний акселерометра, гироскопа и магнитометра.

t = (0:(numSamples-1))/IMU.SampleRate;
subplot(3,1,1)
plot(t,accelReading)
legend('X-axis','Y-axis','Z-axis')
title('Accelerometer Readings')
ylabel('Acceleration (m/s^2)')

subplot(3,1,2)
plot(t,gyroReading)
legend('X-axis','Y-axis','Z-axis')
title('Gyroscope Readings')
ylabel('Angular Velocity (rad/s)')

subplot(3,1,3)
plot(t,magReading)
legend('X-axis','Y-axis','Z-axis')
title('Magnetometer Readings')
xlabel('Time (s)')
ylabel('Magnetic Field (uT)')

Figure contains 3 axes. Axes 1 with title Accelerometer Readings contains 3 objects of type line. These objects represent X-axis, Y-axis, Z-axis. Axes 2 with title Gyroscope Readings contains 3 objects of type line. These objects represent X-axis, Y-axis, Z-axis. Axes 3 with title Magnetometer Readings contains 3 objects of type line. These objects represent X-axis, Y-axis, Z-axis.

Ориентация не указана, и движение земля-истина неподвижно, поэтому система координат тела датчика IMU и локальная система координат NED перекрываются для всего моделирования.

  • Показания акселерометра: ось Z корпуса датчика соответствует оси Down. Ускорение 9,8 м/с ^ 2 вдоль оси Z обусловлено гравитацией.

  • Чтения гироскопа: чтения гироскопа - ноль вдоль каждой оси, как ожидалось.

  • Показания магнитометра: Поскольку система координат корпуса датчика выровнена с локальной системой координат NED, показания магнитометра соответствуют MagneticField имущество imuSensor. MagneticField определяется в локальной системе координат NED.

Использовать imuSensor для моделирования данных, полученных из вращающегося IMU, содержащего идеальный акселерометр и идеальный магнитометр. Использовать kinematicTrajectory для определения движения земля-истина. Предохранить imuSensor выходные данные модели с использованием ecompass для определения ориентации во времени.

Определите движение «земля-истина» для платформы, которая поворачивается на 360 градусов за четыре секунды, а затем еще на 360 градусов за две секунды. Использовать kinematicTrajectory для вывода ориентации, ускорения и угловой скорости в системе координат NED.

fs = 100;
firstLoopNumSamples = fs*4;
secondLoopNumSamples = fs*2;
totalNumSamples = firstLoopNumSamples + secondLoopNumSamples;

traj = kinematicTrajectory('SampleRate',fs);

accBody = zeros(totalNumSamples,3);
angVelBody = zeros(totalNumSamples,3);
angVelBody(1:firstLoopNumSamples,3) = (2*pi)/4;
angVelBody(firstLoopNumSamples+1:end,3) = (2*pi)/2;

[~,orientationNED,~,accNED,angVelNED] = traj(accBody,angVelBody);

Создание imuSensor объект с идеальным акселерометром и идеальным магнитометром. Звонить IMU с ускорением «земля-истина», угловой скоростью и ориентацией для вывода показаний акселерометра и магнитометра. Постройте график результатов.

IMU = imuSensor('accel-mag','SampleRate',fs);

[accelReadings,magReadings] = IMU(accNED,angVelNED,orientationNED);

figure(1)
t = (0:(totalNumSamples-1))/fs;
subplot(2,1,1)
plot(t,accelReadings)
legend('X-axis','Y-axis','Z-axis')
ylabel('Acceleration (m/s^2)')
title('Accelerometer Readings')

subplot(2,1,2)
plot(t,magReadings)
legend('X-axis','Y-axis','Z-axis')
ylabel('Magnetic Field (\muT)')
xlabel('Time (s)')
title('Magnetometer Readings')

Figure contains 2 axes. Axes 1 with title Accelerometer Readings contains 3 objects of type line. These objects represent X-axis, Y-axis, Z-axis. Axes 2 with title Magnetometer Readings contains 3 objects of type line. These objects represent X-axis, Y-axis, Z-axis.

Показания акселерометра показывают, что на платформе отсутствует трансляция. Показания магнитометра показывают, что платформа вращается вокруг оси Z.

Подать показания акселерометра и магнитометра в ecompass для оценки ориентации во времени. ecompass функция возвращает ориентацию в формате кватерниона. Преобразуйте ориентацию в углы Эйлера и постройте график результатов. График ориентации показывает, что платформа вращается только вокруг оси Z.

orientation = ecompass(accelReadings,magReadings);

orientationEuler = eulerd(orientation,'ZYX','frame');

figure(2)
plot(t,orientationEuler)
legend('Z-axis','Y-axis','X-axis')
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation')

Figure contains an axes. The axes with title Orientation contains 3 objects of type line. These objects represent Z-axis, Y-axis, X-axis.

Использовать imuSensor для моделирования данных, полученных из вращающегося IMU, содержащего реалистичный акселерометр и реалистичный магнитометр. Использовать kinematicTrajectory для определения движения земля-истина. Предохранить imuSensor выходные данные модели с использованием ecompass для определения ориентации во времени.

Определите движение «земля-истина» для платформы, которая поворачивается на 360 градусов за четыре секунды, а затем еще на 360 градусов за две секунды. Использовать kinematicTrajectory для вывода ориентации, ускорения и угловой скорости в системе координат NED.

fs = 100;
firstLoopNumSamples = fs*4;
secondLoopNumSamples = fs*2;
totalNumSamples = firstLoopNumSamples + secondLoopNumSamples;

traj = kinematicTrajectory('SampleRate',fs);

accBody = zeros(totalNumSamples,3);
angVelBody = zeros(totalNumSamples,3);
angVelBody(1:firstLoopNumSamples,3) = (2*pi)/4;
angVelBody(firstLoopNumSamples+1:end,3) = (2*pi)/2;

[~,orientationNED,~,accNED,angVelNED] = traj(accBody,angVelBody);

Создание imuSensor объект с реалистичным акселерометром и реалистичным магнитометром. Звонить IMU с ускорением «земля-истина», угловой скоростью и ориентацией для вывода показаний акселерометра и магнитометра. Постройте график результатов.

IMU = imuSensor('accel-mag','SampleRate',fs);

IMU.Accelerometer = accelparams( ...
    'MeasurementRange',19.62, ...            % m/s^2
    'Resolution',0.0023936, ...              % m/s^2 / LSB
    'TemperatureScaleFactor',0.008, ...      % % / degree C
    'ConstantBias',0.1962, ...               % m/s^2
    'TemperatureBias',0.0014715, ...         % m/s^2 / degree C
    'NoiseDensity',0.0012361);               % m/s^2 / Hz^(1/2)

IMU.Magnetometer = magparams( ...
    'MeasurementRange',1200, ...             % uT
    'Resolution',0.1, ...                    % uT / LSB
    'TemperatureScaleFactor',0.1, ...        % % / degree C
    'ConstantBias',1, ...                    % uT
    'TemperatureBias',[0.8 0.8 2.4], ...     % uT / degree C
    'NoiseDensity',[0.6 0.6 0.9]/sqrt(100)); % uT / Hz^(1/2)

[accelReadings,magReadings] = IMU(accNED,angVelNED,orientationNED);

figure(1)
t = (0:(totalNumSamples-1))/fs;
subplot(2,1,1)
plot(t,accelReadings)
legend('X-axis','Y-axis','Z-axis')
ylabel('Acceleration (m/s^2)')
title('Accelerometer Readings')

subplot(2,1,2)
plot(t,magReadings)
legend('X-axis','Y-axis','Z-axis')
ylabel('Magnetic Field (\muT)')
xlabel('Time (s)')
title('Magnetometer Readings')

Figure contains 2 axes. Axes 1 with title Accelerometer Readings contains 3 objects of type line. These objects represent X-axis, Y-axis, Z-axis. Axes 2 with title Magnetometer Readings contains 3 objects of type line. These objects represent X-axis, Y-axis, Z-axis.

Показания акселерометра показывают, что на платформе отсутствует трансляция. Показания магнитометра показывают, что платформа вращается вокруг оси Z.

Подать показания акселерометра и магнитометра в ecompass для оценки ориентации во времени. ecompass функция возвращает ориентацию в формате кватерниона. Преобразуйте ориентацию в углы Эйлера и постройте график результатов. График ориентации показывает, что платформа вращается только вокруг оси Z.

orientation = ecompass(accelReadings,magReadings);

orientationEuler = eulerd(orientation,'ZYX','frame');

figure(2)
plot(t,orientationEuler)
legend('Z-axis','Y-axis','X-axis')
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation')

Figure contains an axes. The axes with title Orientation contains 3 objects of type line. These objects represent Z-axis, Y-axis, X-axis.

%

Моделирование наклонного IMU, который содержит акселерометр и гироскоп с помощью imuSensor object™ системы. Используйте идеальные и реалистичные модели для сравнения результатов отслеживания ориентации с помощью imufilter Системный объект.

Загрузите структуру, описывающую движение «земля-истина» и частоту дискретизации. Структура движения описывает последовательные повороты:

  1. рыскание: 120 градусов в течение двух секунд

  2. шаг: 60 градусов в течение одной секунды

  3. крен: 30 градусов в течение половины секунды

  4. крен: -30 градусов в течение половины секунды

  5. шаг: -60 градусов в течение одной секунды

  6. рыскание: -120 градусов в течение двух секунд

На последнем этапе структура движения объединяет 1-е, 2-е и 3-е вращения в одноосное вращение. Ускорение, угловая скорость и ориентация определяются в локальной системе координат NED.

load y120p60r30.mat motion fs
accNED = motion.Acceleration;
angVelNED = motion.AngularVelocity;
orientationNED = motion.Orientation;

numSamples = size(motion.Orientation,1);
t = (0:(numSamples-1)).'/fs;

Создайте идеальный объект датчика IMU и объект фильтра IMU по умолчанию.

IMU = imuSensor('accel-gyro','SampleRate',fs);

aFilter = imufilter('SampleRate',fs);

В цикле:

  1. Моделирование выходного сигнала IMU путем подачи движения «земля-истина» на объект датчика IMU.

  2. Фильтрация выходных данных IMU с помощью объекта фильтра IMU по умолчанию.

orientation = zeros(numSamples,1,'quaternion');
for i = 1:numSamples

    [accelBody,gyroBody] = IMU(accNED(i,:),angVelNED(i,:),orientationNED(i,:));

    orientation(i) = aFilter(accelBody,gyroBody);

end
release(aFilter)

Постройте график ориентации с течением времени.

figure(1)
plot(t,eulerd(orientation,'ZYX','frame'))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation Estimation -- Ideal IMU Data, Default IMU Filter')
legend('Z-axis','Y-axis','X-axis')

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

IMU.Accelerometer = accelparams( ...
    'MeasurementRange',19.62, ...
    'Resolution',0.00059875, ...
    'ConstantBias',0.4905, ...
    'AxesMisalignment',2, ...
    'NoiseDensity',0.003924, ...
    'BiasInstability',0, ...
    'TemperatureBias', [0.34335 0.34335 0.5886], ...
    'TemperatureScaleFactor',0.02);
IMU.Gyroscope = gyroparams( ...
    'MeasurementRange',4.3633, ...
    'Resolution',0.00013323, ...
    'AxesMisalignment',2, ...
    'NoiseDensity',8.7266e-05, ...
    'TemperatureBias',0.34907, ...
    'TemperatureScaleFactor',0.02, ...
    'AccelerationBias',0.00017809, ...
    'ConstantBias',[0.3491,0.5,0]);

orientationDefault = zeros(numSamples,1,'quaternion');
for i = 1:numSamples

    [accelBody,gyroBody] = IMU(accNED(i,:),angVelNED(i,:),orientationNED(i,:));

    orientationDefault(i) = aFilter(accelBody,gyroBody);

end
release(aFilter)

figure(2)
plot(t,eulerd(orientationDefault,'ZYX','frame'))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation Estimation -- Realistic IMU Data, Default IMU Filter')
legend('Z-axis','Y-axis','X-axis')

Способность imufilter для отслеживания данных «земля-истина» при моделировании реалистичного IMU значительно уменьшается. Чтобы повысить производительность, измените свойства imufilter объект. Эти значения определяли эмпирически. Снова запустите цикл и постройте график оценки ориентации с течением времени.

aFilter.GyroscopeNoise          = 7.6154e-7;
aFilter.AccelerometerNoise      = 0.0015398;
aFilter.GyroscopeDriftNoise     = 3.0462e-12;
aFilter.LinearAccelerationNoise = 0.00096236;
aFilter.InitialProcessNoise     = aFilter.InitialProcessNoise*10;

orientationNondefault = zeros(numSamples,1,'quaternion');
for i = 1:numSamples
    [accelBody,gyroBody] = IMU(accNED(i,:),angVelNED(i,:),orientationNED(i,:));

    orientationNondefault(i) = aFilter(accelBody,gyroBody);
end
release(aFilter)

figure(3)
plot(t,eulerd(orientationNondefault,'ZYX','frame'))
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation Estimation -- Realistic IMU Data, Nondefault IMU Filter')
legend('Z-axis','Y-axis','X-axis')

Количественная оценка улучшенной производительности измененного imufilter, постройте график расстояния кватерниона между движением земля-истина и ориентацией, возвращенной imufilter со свойствами по умолчанию и не по умолчанию.

qDistDefault = rad2deg(dist(orientationNED,orientationDefault));
qDistNondefault = rad2deg(dist(orientationNED,orientationNondefault));

figure(4)
plot(t,[qDistDefault,qDistNondefault])
title('Quaternion Distance from True Orientation')
legend('Realistic IMU Data, Default IMU Filter', ...
       'Realistic IMU Data, Nondefault IMU Filter')
xlabel('Time (s)')
ylabel('Quaternion Distance (degrees)')

Алгоритмы

развернуть все

Расширенные возможности

.

См. также

Классы

Объекты

Представлен в R2018b