В этом примере показано, как моделировать измерения единицы измерения инерции (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.
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)')
