Этот пример показывает, как передать данные БИНС из Arduino и оценить ориентацию с помощью дополнительного фильтра.
Подключите контакты SDA, SCL, GND и VCC датчика MPU-9250 к соответствующим контактам оборудования Arduino ®. В этом примере используется плата Arduino ® Uno со следующими соединениями:
SDA - A4
SCL - A5
VCC - + 3,3 В
GND - GND
Убедитесь, что соединения с датчиками целы. Рекомендуется прикрепить/подключить датчик к экрану прототипа, чтобы избежать свободных соединений во время движения датчика. Для отладки проблем, связанных с датчиком, см. страницу «Поиск и устранение проблем датчиков».
Создайте arduino
объект и mpu9250
объект. Задайте частоту дискретизации датчика Fs
и количество времени для запуска циклов. Вы можете включить isVerbose
флаг для проверки переполнения выборок. Путем отключения useHW
флаг, можно также запустить пример с данными о датчике, сохраненными в MAT-файле loggedMPU9250Data.mat
.
Данные в loggedMPU9250Data.mat
был записан в журнал, в то время как БИНС, как правило, сталкивался с South, а затем вращался:
+ 90 степени вокруг оси Z
-180 степени вокруг оси Z
+ 90 степени вокруг оси Z
+ 90 степени вокруг оси Y
-180 степени вокруг оси Y
+ 90 степени вокруг оси Y
+ 90 степени вокруг оси X
-270 степени вокруг оси X
+ 180 степени вокруг оси X
Заметьте, что последние два поворота вокруг оси X являются дополнительными на 90 степени. Это было сделано, чтобы перевернуть устройство вверх тормашками. Окончательная ориентация БИНС совпадает с начальной ориентацией, обусловленной Югом.
Fs = 100; samplesPerRead = 10; runTime = 20; isVerbose = false; useHW = true; if useHW a = arduino; imu = mpu9250(a, 'SampleRate', Fs, 'OutputFormat', 'matrix', ... 'SamplesPerRead', samplesPerRead, 'Streaming', true); else load('loggedMPU9250Data.mat', 'allAccel', 'allGyro', 'allMag', ... 'allT', 'allOverrun', ... 'numSamplesAccelGyro', 'numSamplesAccelGyroMag') end
Оси акселерометра, гироскопа и магнитометра в MPU-9250 не совмещены друг с другом. Задайте индекс и знак x -, y - и z-ось каждого датчика так, чтобы датчик был выровнен с системой координат North-East-Down (NED), когда он находится в состоянии покоя. В этом примере оси магнитометра изменяются, в то время как оси акселерометра и гироскопа остаются неподвижными. Для собственных приложений при необходимости измените следующие параметры.
% Accelerometer axes parameters. accelXAxisIndex = 1; accelXAxisSign = 1; accelYAxisIndex = 2; accelYAxisSign = 1; accelZAxisIndex = 3; accelZAxisSign = 1; % Gyroscope axes parameters. gyroXAxisIndex = 1; gyroXAxisSign = 1; gyroYAxisIndex = 2; gyroYAxisSign = 1; gyroZAxisIndex = 3; gyroZAxisSign = 1; % Magnetometer axes parameters. magXAxisIndex = 2; magXAxisSign = 1; magYAxisIndex = 1; magYAxisSign = 1; magZAxisIndex = 3; magZAxisSign = -1; % Helper functions used to align sensor data axes. alignAccelAxes = @(in) [accelXAxisSign, accelYAxisSign, accelZAxisSign] ... .* in(:, [accelXAxisIndex, accelYAxisIndex, accelZAxisIndex]); alignGyroAxes = @(in) [gyroXAxisSign, gyroYAxisSign, gyroZAxisSign] ... .* in(:, [gyroXAxisIndex, gyroYAxisIndex, gyroZAxisIndex]); alignMagAxes = @(in) [magXAxisSign, magYAxisSign, magZAxisSign] ... .* in(:, [magXAxisIndex, magYAxisIndex, magZAxisIndex]);
При необходимости можно калибровать магнитометр, чтобы компенсировать магнитные искажения. Для получения дополнительной информации смотрите раздел «Компенсация искажений твёрдого железа» в Оценке ориентации с использованием синтеза инерционного датчика и MPU-9250 примере.
The complementaryFilter
имеет два настраиваемых параметров. The AccelerometerGain
параметр определяет, насколько доверяется измерение акселерометра при измерении гироскопа. The MagnetometerGain
параметр определяет, насколько доверяется измерение магнитометра при измерении гироскопа.
compFilt = complementaryFilter('SampleRate', Fs)
compFilt = complementaryFilter with properties: SampleRate: 100 AccelerometerGain: 0.0100 MagnetometerGain: 0.0100 HasMagnetometer: 1 OrientationFormat: 'quaternion'
Установите HasMagnetometer
свойство к false
чтобы отключить вход измерения магнитометра. В этом режиме фильтр принимает только измерения акселерометра и гироскопа в качестве входов. Кроме того, фильтр принимает, что начальная ориентация БИНС выровнена с родительской навигационной системой координат. Если БИНС не выровнен с навигационной системой координат, то в оценке ориентации будет постоянное смещение.
compFilt = complementaryFilter('HasMagnetometer', false); tuner = HelperOrientationFilterTuner(compFilt); if useHW tic else idx = 1:samplesPerRead; overrunIdx = 1; end while true if useHW [accel, gyro, mag, t, overrun] = imu(); accel = alignAccelAxes(accel); gyro = alignGyroAxes(gyro); else accel = allAccel(idx,:); gyro = allGyro(idx,:); mag = allMag(idx,:); t = allT(idx,:); overrun = allOverrun(overrunIdx,:); idx = idx + samplesPerRead; overrunIdx = overrunIdx + 1; pause(samplesPerRead/Fs) end if (isVerbose && overrun > 0) fprintf('%d samples overrun ...\n', overrun); end q = compFilt(accel, gyro); update(tuner, q); if useHW if toc >= runTime break; end else if idx(end) > numSamplesAccelGyro break; end end end
Со значениями по умолчанию AccelerometerGain
и MagnetometerGain
фильтр больше доверяет измерениям гироскопа в краткосрочной перспективе, но больше доверяет измерениям акселерометра и магнитометра в долгосрочной перспективе. Это позволяет фильтру быть более реактивным к быстрым изменениям ориентации и препятствует дрейфу оценок ориентации в течение более длительных периодов времени. Для конкретных датчиков БИНС и прикладных целей можно захотеть настроить параметры фильтра, чтобы улучшить точность оценки ориентации.
compFilt = complementaryFilter('SampleRate', Fs); tuner = HelperOrientationFilterTuner(compFilt); if useHW tic end while true if useHW [accel, gyro, mag, t, overrun] = imu(); accel = alignAccelAxes(accel); gyro = alignGyroAxes(gyro); mag = alignMagAxes(mag); else accel = allAccel(idx,:); gyro = allGyro(idx,:); mag = allMag(idx,:); t = allT(idx,:); overrun = allOverrun(overrunIdx,:); idx = idx + samplesPerRead; overrunIdx = overrunIdx + 1; pause(samplesPerRead/Fs) end if (isVerbose && overrun > 0) fprintf('%d samples overrun ...\n', overrun); end q = compFilt(accel, gyro, mag); update(tuner, q); if useHW if toc >= runTime break; end else if idx(end) > numSamplesAccelGyroMag break; end end end
Этот пример показал, как оценить ориентацию БИНС с помощью данных Arduino и дополнительного фильтра. Этот пример также показал, как сконфигурировать БИНС и обсудил эффекты настройки параметров дополнительного фильтра.