Введение в симуляцию измерений IMU

Этот пример показывает, как моделировать измерения инерционного модуля измерения (IMU). Sensor Fusion and Tracking Toolbox™ позволяет данным модели, полученным от 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 влияет на размер шага цифровых измерений. Используйте этот параметр, чтобы смоделировать эффекты квантования от аналого-цифрового конвертера (ADC). Эффект показывают путем увеличения параметра до намного большего значения, чем типично.

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 является суммой скоса в осях датчика. Этот скос обычно происходит, когда датчик смонтирован к PCB и может быть исправлен посредством калибровки. Эффект показывают путем скоса оси 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)')

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

Следующая модель параметров случайный шум в измерениях датчика. Больше информации об этих параметрах может быть найдено в Инерционном Анализе Шума Датчика Используя пример Аллана Вэриэнса.

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