В этом примере показано, как симулировать измерения инерциального измерительного блока (IMU) с помощью imuSensor
(Sensor Fusion and Tracking Toolbox) Системный объект. IMU может включать комбинацию отдельных датчиков, включая гироскоп, акселерометр и магнитометр. Можно задать свойства отдельных датчиков с помощью gyroparams
(Sensor Fusion and Tracking Toolbox), accelparams
(Sensor Fusion and Tracking Toolbox) и magparams
(Sensor Fusion and Tracking Toolbox), соответственно.
В следующих графиках, если не указано иное, только показывают измерения оси 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)')
Следующая модель параметров случайный шум в измерениях датчика. Больше информации об этих параметрах может быть найдено в Инерционном Анализе Шума Датчика Используя Аллана Вэриэнса (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)')