exponenta event banner

Введение в моделирование измерений IMU

В этом примере показано, как моделировать измерения единицы измерения инерции (IMU) с помощью imuSensor(Панель инструментов слияния и отслеживания датчиков) Системный объект. IMU может включать в себя комбинацию отдельных датчиков, включая гироскоп, акселерометр и магнитометр. Свойства отдельных датчиков можно задать с помощью gyroparams(панель инструментов слияния и отслеживания датчиков), accelparams(панель инструментов слияния и отслеживания датчиков), и magparams (Объединение датчиков и панель инструментов отслеживания), соответственно.

На следующих графиках, если не указано иное, показаны только измерения по оси X.

Параметры по умолчанию

Параметры по умолчанию для модели гироскопа моделируют идеальный сигнал. При синусоидальном входе выход гироскопа должен точно совпадать.

params = gyroparams

% Generate N samples at a sampling rate of Fs with a sinusoidal frequency
% of Fc.
N = 1000;
Fs = 100;
Fc = 0.25;

t = (0:(1/Fs):((N-1)/Fs)).';
acc = zeros(N, 3);
angvel = zeros(N, 3);
angvel(:,1) = sin(2*pi*Fc*t);

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Ideal Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')
params = 

  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²)

Настройка аппаратных параметров

Следующие параметры моделируют аппаратные ограничения или дефекты. Некоторые из них можно скорректировать путем калибровки.

MeasurementRange определяет максимальное абсолютное значение, сообщаемое гироскопом. Большие абсолютные значения насыщены. Эффект показан установкой диапазона измерений на величину, меньшую амплитуды синусоидальной угловой скорости земля-истина.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.MeasurementRange = 0.5; % rad/s

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Saturated Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Resolution влияет на размер шага цифровых измерений. Этот параметр используется для моделирования эффектов квантования аналого-цифрового преобразователя (АЦП). Эффект показан увеличением параметра до гораздо большего значения, чем обычно.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.Resolution = 0.5; % (rad/s)/LSB

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Quantized Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

AxesMisalignment - величина перекоса в осях датчиков. Этот перекос обычно возникает при установке датчика на ПП и может быть скорректирован путем калибровки. Эффект показан путем небольшого перекоса оси X и построения графика как по оси X, так и по оси Y.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.AxesMisalignment = [2 0 0]; % percent

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1:2), '--', t, gyroData(:,1:2))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Misaligned Gyroscope Data')
legend('x (ground truth)', 'y (ground truth)', ...
    'x (gyroscope)', 'y (gyroscope)')

ConstantBias возникает в измерениях датчика из-за аппаратных дефектов. Поскольку это смещение не вызвано факторами окружающей среды, такими как температура, оно может быть скорректировано посредством калибровки.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.ConstantBias = [0.4 0 0]; % rad/s

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Biased Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Настройка параметров случайного шума

Следующие параметры моделируют случайный шум в измерениях датчика. Дополнительную информацию об этих параметрах можно найти в примере Анализ шума инерциального датчика с использованием дисперсии Allan (Sensor Fusion and Tracking Toolbox).

NoiseDensity - величина белого шума в измерении датчика. Иногда это называется угловой случайной прогулкой для гироскопов или скоростной случайной прогулкой для акселерометров.

rng('default')

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.NoiseDensity = 1.25e-2; % (rad/s)/sqrt(Hz)

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('White Noise Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

BiasInstability - величина розового или мерцающего шума в измерении датчика.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.BiasInstability = 2.0e-2; % rad/s

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Bias Instability Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

RandomWalk - величина броуновского шума в измерении датчика. Иногда это называется случайной скоростью ходьбы для гироскопов или ускорением случайной ходьбы для акселерометров.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.RandomWalk = 9.1e-2; % (rad/s)*sqrt(Hz)

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Random Walk Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Настройка параметров окружающей среды

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

TemperatureBias - смещение, добавляемое к измерениям датчика из-за разности температур от рабочей температуры по умолчанию. В большинстве спецификаций датчиков рабочая температура по умолчанию составляет 25 градусов Цельсия. Это смещение показано путем установки параметра на ненулевое значение и установки рабочей температуры выше 25 градусов Цельсия.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.TemperatureBias = 0.06; % (rad/s)/(degrees C)
imu.Temperature = 35;

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Temperature-Biased Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

TemperatureScaleFactor - погрешность масштабного коэффициента датчика из-за изменения рабочей температуры. Это приводит к ошибкам в масштабировании измерения; другими словами, меньшие идеальные значения имеют меньшую погрешность, чем большие значения. Эта ошибка проявляется линейным увеличением температуры.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.TemperatureScaleFactor = 3.2; % %/(degrees C)

standardTemperature = 25; % degrees C
temperatureSlope = 2; % (degrees C)/s

temperature = temperatureSlope*t + standardTemperature;

gyroData = zeros(N, 3);
for i = 1:N
    imu.Temperature = temperature(i);
    [~, gyroData(i,:)] = imu(acc(i,:), angvel(i,:));
end

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Temperature-Scaled Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

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

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.AccelerationBias = 0.3; % (rad/s)/(m/s^2)

acc(:,1) = 1;

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Acceleration-Biased Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')