Оценка ориентации с помощью синтеза инерционного датчика и MPU-9250

Этот пример показывает, как получить данные с датчика InvenSense MPU-9250 IMU и использовать 6-осевой и 9-осевой алгоритмы слияния в данных датчика для вычисления ориентации устройства.

MPU-9250 датчик с 9 осями с акселерометром, гироскопом и магнитометром. Акселерометр измеряет ускорение, гироскоп измеряет скорость вращения, а магнитометр измеряет магнитное поле в осях x -, y - и z -. Ось датчика зависит от модели датчика.

Необходимые продукты MathWorks ®

  • MATLAB ®

  • Пакет поддержки MATLAB для оборудования Arduino ®

  • Sensor Fusion and Tracking Toolbox™ или Navigation Toolbox™

Необходимое оборудование

  • Arduino

  • Функции InvenSense MPU-9250

Аппаратное подключение

Подключите контакты SDA, SCL, GND и VCC датчика MPU-9250 к соответствующим контактам на оборудовании Arduino ®. В этом примере используется плата Arduino Uno со следующими соединениями:

  • SDA - A4

  • SCL - A5

  • VCC - + 3,3 В

  • GND - GND

Убедитесь, что соединения с датчиками целы. Рекомендуется использовать экран прототипа и припаять к нему датчик, чтобы избежать свободных соединений при перемещении датчика. На странице «Поиск и устранение проблем» (MATLAB Support Package for Arduino Hardware) приведены сведения о датчиках для устранения проблем, связанных с датчиком.

Создайте объект датчика

Создайте arduino и включать библиотеку I2C.

a = arduino('COM9', 'Uno', 'Libraries', 'I2C');
Updating server code on board Uno (COM9). This may take a few minutes.

Создайте объект MPU-9250 датчика.

fs = 100; % Sample Rate in Hz   
imu = mpu9250(a,'SampleRate',fs,'OutputFormat','matrix'); 

Компенсация искажений жесткого железа

Алгоритмы слияния используют показания магнитометра, которые должны компенсировать магнитные искажения, такие как твердое искажение железа. Твердые искажения железа производятся материалами, которые создают магнитное поле, что приводит к перемене источника координат на поверхности отклика. Эти искажения могут быть исправлены путем вычитания значений коррекции из показаний магнитометра для каждой оси. В порядок поиска коррекции значений выполните следующее:

1. Поверните датчик от 0 до 360 степеней вокруг каждой оси.

2. Получите минимальные и максимальные показания магнитометра.

3. Среднее значение минимального и максимального показаний для получения значений коррекции для каждой оси.

Значения коррекции изменяются с учетом окружения.

Следующие фрагменты кода могут использоваться, чтобы получить значения смещения для оси x, аналогичная процедура может соблюдаться и для других осей:

displayMessage(['Fusion algorithms use magnetometer readings which need to compensate for magnetic distortions.' ...
    'The given code snippet can be used to find the correction values for compensating Hard Iron Distortions. When the code '...
    'is executing, rotate the sensor around x axis from 0 to 360 degree. For other axes, modify the code accordingly and rotate the ' ...
    'sensor along that axis'],'Compensating Hard Iron Distortions');
tic;
stopTimer = 100;
magReadings=[];
while(toc<stopTimer)
    % Rotate the sensor around x axis from 0 to 360 degree.
    % Take 2-3 rotations to improve accuracy.
    % For other axes, rotate around that axis.
    [accel,gyro,mag] = read(imu);
    magReadings = [magReadings;mag];
end

% For y axis, use magReadings (:,2) and for z axis use magReadings(:,3)
magx_min = min(magReadings(:,1));
magx_max = max(magReadings(:,1));
magx_correction = (magx_max+magx_min)/2;

Для более точного отслеживания калибруйте магнитометр также для других искажений. The magcal функция (эта функция доступна в Sensor Fusion and Tracking Toolbox™ и Navigation Toolbox™) также может использоваться, чтобы компенсировать мягкие искажения железа. Измените значения коррекции, рассчитанные для вашего датчика в readSensorDataMPU9250 функция в папке примера .

Выравнивание оси MPU-9250 датчика с координатами NED

Алгоритмы слияния датчиков, используемые в этом примере, используют North-East-Down (NED) в качестве фиксированной, родительской системы координат. В опорной системе координат NED ось X указывает на север, ось Y - на восток, а ось Z точек вниз. В зависимости от алгоритма, север может быть магнитным севером или истинным севером. Алгоритмы в этом примере используют магнитный север. Алгоритмы, используемые здесь, ожидают, что все датчики объекта будут выровнены по оси и соответствуют соглашению NED .

MPU-9250 имеет два устройства, магнитометр и акселерометр-гироскоп, на одной плате. Оси этих устройств отличаются друг от друга. Ось магнитометра выровнена по координатам NED. Ось акселерометра-гироскопа отличается от магнитометра по MPU-9250. Акселерометр и ось гироскопа должны быть заменены и/или инвертированы, чтобы соответствовать оси магнитометра. Для получения дополнительной информации см. раздел «Ориентация осей» в MPU-9250 таблице данных.

Для выравнивания осей MPU-9250 акселерометра-гироскопа по координатам NED выполните следующее:

1. Задайте ось устройства: Задайте мнимую ось как ось устройства на датчике в соответствии с системой координат NED, которая может быть или не совпадать с осями датчика. Для MPU-9250 ось магнитометра может рассматриваться как ось устройства.

2. Измените значения x и y показаний акселерометра и гироскопа так, чтобы ось акселерометра и гироскопа совмещалась с осью магнитометра.

3. Определите значения полярности для акселерометра и гироскопа.

A. Акселерометр

  • Поместите датчик таким образом, чтобы ось X устройства указывала вниз, перпендикулярно поверхности, на которой находится датчик. Показания акселерометра должны считываться приблизительно [9.8 0 0]. Если не отменить значения X акселерометра.

  • Поместите датчик таким образом, чтобы ось Y устройства указывала вниз, перпендикулярно поверхности, на которой находится датчик. Показания акселерометра должны быть примерно [0 9.8 0]. Если не отменить значения y акселерометра.

  • Установите датчик таким образом, чтобы ось Z устройства указывала вниз, перпендикулярно поверхности, на которой находится датчик. Показания акселерометра должны быть примерно [0 0 9.8]. Если не отменить z-значения акселерометра.

б. Гироскоп

Поверните датчик вдоль каждой оси и захватите показания. Используйте правило правого винта, чтобы исправить полярность вращения.

Вышеописанный метод используется, чтобы задать ось датчика в этом примере.

Параметры фильтра настройки

Алгоритмы, используемые в этом примере, при правильной настройке, позволяют оценить ориентацию и устойчивы к источникам экологического шума. Необходимо учитывать ситуации, в которых используются датчики, и соответствующим образом настраивать фильтры. Для получения информации о том, как настроить параметры фильтра, смотрите раздел «Параметры фильтра настройки» в разделе «Оценка ориентации через синтез инерционного датчика».

Пример демонстрирует три алгоритма для определения ориентации, а именно ahrsfilter, imufilter, и ecompass. Дополнительные сведения, связанные с алгоритмами инерционного слияния, см. в разделе «Определение ориентации с помощью инерционных датчиков».

Синтаксис акселерометра-гироскопа-магнитометра

Система ссылки ориентации и курса (AHRS) состоит из 9-осевой системы, которая использует акселерометр, гироскоп и магнитометр для вычисления ориентации устройства. The ahrsfilter формирует плавно изменяющуюся оценку ориентации устройства при правильной оценке северного направления. The ahrsfilter обладает способностью удалять смещение гироскопа, а также может обнаруживать и отвергать мягкие магнитные помехи.

Следующие фрагменты кода используют ahrsfilter системный объект для определения ориентации датчика и создает рисунок, которая обновляется при перемещении датчика. Датчик должен быть стационарным, до начала этого примера.

% GyroscopeNoise and AccelerometerNoise is determined from datasheet.
GyroscopeNoiseMPU9250 = 3.0462e-06; % GyroscopeNoise (variance value) in units of rad/s
AccelerometerNoiseMPU9250 = 0.0061; % AccelerometerNoise(variance value)in units of m/s^2
viewer = HelperOrientationViewer('Title',{'AHRS Filter'});
FUSE = ahrsfilter('SampleRate',imu.SampleRate, 'GyroscopeNoise',GyroscopeNoiseMPU9250,'AccelerometerNoise',AccelerometerNoiseMPU9250);
stopTimer = 100;

Пока следующий код выполняется, медленно перемещайте датчик и проверяйте, соответствует ли движение на рисунке движению датчика.

% Use ahrsfilter to estimate orientation and update the viewer as the
% sensor moves for time specified by stopTimer
displayMessage(['This section uses AHRS filter to determine orientation of the sensor by collecting live sensor data from the \slmpu9250 \rm' ...
    'system object. Move the sensor to visualize orientation of the sensor in the figure window. Keep the sensor stationery before you' ...
    'click OK'],...
    'Estimate Orientation using AHRS filter and MPU-9250')
tic;
while(toc < stopTimer)
    [accel,gyro,mag] = readSensorDataMPU9250(imu);
    rotators = FUSE(accel,gyro,mag);
    for j = numel(rotators)
        viewer(rotators(j));
    end
end

Когда ось датчика X устройства указывает на север, ось Y устройства указывает на восток, а ось Z устройства указывает вниз.

Когда ось X устройства указывает на север, ось Y устройства указывает на запад, а ось Z устройства указывает вверх.

Синтаксис акселерометра-гироскопа

The imufilter системный объект предохраняет данные акселерометра и гироскопа с помощью внутреннего фильтра Калмана с состоянием ошибки. Фильтр способен устранить шум смещения гироскопа, который дрейфует со временем. Фильтр не обрабатывает данные магнитометра, поэтому он не правильно оценивает направление севера. Алгоритм принимает начальное положение датчика таким образом, что ось X датчика указывает на магнитный север, устройство ось Y датчика указывает на восток, а устройство Z-ось датчика - на вниз. Датчик должен быть стационарным, до начала этого примера.

Следующие фрагменты кода используют imufilter объект для определения ориентации датчика и создает рисунок, которая обновляется при перемещении датчика.

displayMessage(['This section uses  IMU filter to determine orientation of the sensor by collecting live sensor data from the \slmpu9250 \rm' ...
    'system object. Move the sensor to visualize orientation of the sensor in the figure window. Keep the sensor stationery before you'...
    'click OK'],...
    'Estimate Orientation using IMU filter and MPU-9250.')
% GyroscopeNoise and AccelerometerNoise is determined from datasheet.
GyroscopeNoiseMPU9250 = 3.0462e-06; % GyroscopeNoise (variance) in units of rad/s
AccelerometerNoiseMPU9250 = 0.0061; % AccelerometerNoise (variance) in units of m/s^2
viewer = HelperOrientationViewer('Title',{'IMU Filter'});
FUSE = imufilter('SampleRate',imu.SampleRate, 'GyroscopeNoise',GyroscopeNoiseMPU9250,'AccelerometerNoise', AccelerometerNoiseMPU9250);
stopTimer=100;

Пока следующий код выполняется, медленно перемещайте датчик и проверяйте, соответствует ли движение на рисунке движению датчика.

% Use imufilter to estimate orientation and update the viewer as the
% sensor moves for time specified by stopTimer
tic;
while(toc < stopTimer)
    [accel,gyro] = readSensorDataMPU9250(imu);
    rotators = FUSE(accel,gyro);
    for j = numel(rotators)
        viewer(rotators(j));
    end
end

The imufilter алгоритм может также использоваться и с MPU6050, поскольку он не требует значений магнитометра.

Когда ось X устройства указывает на север, ось Z устройства указывает вниз, а ось Y - на восток.

Когда ось X устройства указывает вверх, ось Y устройства точек на запад, а ось Z устройства указывает на юг.

Синтаксис акселерометра-магнитометра

The ecompass системный объект запирает данные акселерометра и магнитометра. Алгоритм Ecompass является незабываемым алгоритмом, который не требует настройки параметра, но очень восприимчив к шуму датчика. Можно использовать сферическую линейную интерполяцию (SLERP), чтобы lowpass фильтровать шумную траекторию. Дополнительные сведения см. в примере с Lowpass Filter Orientation Using Quaternion SLERP

displayMessage(['This section uses \slecompass \rmfunction to determine orientation of the sensor by collecting live sensor data from the \slmpu9250 ' ...
    '\rmsystem object. Move the sensor to visualize orientation of the sensor in the figure window. Keep the sensor stationery before you click OK'],...
    'Estimate Orientation using Ecompass algorithm.')
tic;
viewer = HelperOrientationViewer('Title',{'Ecompass Algorithm'});
stopTimer = 100;
tic;
% Use ecompass algorithm to estimate orientation and update the viewer as the
% sensor moves for time specified by stopTimer.
while(toc < stopTimer)
    [accel,gyro,mag] = readSensorDataMPU9250(imu);
    rotators = ecompass(accel,mag);
    for j = numel(rotators)
        viewer(rotators(j));
    end
end

Очистка

Когда соединение больше не нужно, отпустите и очистите объекты

release(imu);
delete(imu);
clear;

Чем попробовать

Можно попробовать этот пример с другими датчиками, такими как InvenSense MPU-6050 и STMicroelectronics LSM9DS1. Обратите внимание, что датчик MPU-6050 может использоваться только со imufilter системный объект.