Этот пример показывает, как симулировать измерения инерциальный измерительный блок (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)')