Введение в симуляцию измерений БИНС

Этот пример показывает, как симулировать измерения инерциальный измерительный блок (IMU) с помощью imuSensor Системный объект. БИНС может включать комбинацию отдельных датчиков, включая гироскоп, акселерометр и магнитометр. Можно задать свойства отдельных датчиков, используя 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)')

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

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

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