Беспроводная потоковая передача данных и cочетание датчиков Используя BNO055

В этом примере показано, как получить данные от датчика BNO055 IMU Bosch до модуля HC-05 Bluetooth®, и использовать алгоритм сплава AHRS с 9 осями на данных о датчике, чтобы вычислить ориентацию устройства. Пример создает фигуру, которая обновляется, когда вы перемещаете устройство.

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

Необходимый MathWorks® Products

  • MATLAB®

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

  • Instrument Control Toolbox™

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

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

  • Arduino® Uno

  • Датчик Bosch BNO055

  • HC-05 Bluetooth® Module

Аппаратная связь

Соедините SDA, SCL, GND и контакты VCC датчика BNO055 к соответствующим контактам на плате Arduino® Uno со связями:

  • SDA - A4

  • SCL - A5

  • VCC - +3.3V

  • GND - GND

Соедините TX, RX, GND и контакты VCC модуля HC-05 к соответствующим контактам на плате Arduino® Uno. Этот пример использует связи:

  • TX – цифровой контакт 0 (RX)

  • RX – цифровой контакт 1 (TX)

  • VCC – 5 В

  • GND – GND

Убедитесь, что связи с датчиками и модулем Bluetooth® неповреждены. Рекомендуется использовать щит BNO055 для Uno Arduino (Щит Движения Оси Arduino 9). Смотрите Датчики Поиска и устранения проблем (Пакет поддержки MATLAB для Оборудования Arduino), чтобы отладить связанные с датчиком проблемы.

Setup и конфигурирует Arduino для Bluetooth® Communication

Сконфигурируйте плату Uno Arduino, чтобы связаться через Bluetooth® с помощью arduinosetup команда из командной строки MATLAB. Смотрите Setup и Сконфигурируйте Оборудование Arduino для шагов о том, как сконфигурировать управление Arduino по коммуникации через Bluetooth®. Убедитесь, что установили флажок для Библиотек I2C, которые будут включены во время Setup.

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

Создайте arduino объект.

a = arduino('btspp://98D33230EB9F', 'Uno');

Создайте bno055 объект датчика в OperatingMode 'amg'.

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

Компенсация трудных железных и мягких железных искажений

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

  1. Вращайте датчик от 0 до 360 степеней вдоль каждой оси.

  2. Используйте функцию magcal, чтобы получить коэффициенты.

Эти значения коррекции изменяются со средой.

Получить коэффициенты и для трудных железных и для мягких железных искажений:

ts = tic; 
stopTimer = 50; 
magReadings=[]; 
while(toc(ts) < stopTimer) 
    % Rotate the sensor along x axis from 0 to 360 degree. 
    % Take 2-3 rotations to improve accuracy. 
    % For other axes, rotate along that axes. 
   [accel,gyro,mag] = read(imu); 
   magReadings = [magReadings;mag]; 
end 

[A, b] = magcal(magReadings); % A = 3x3 matrix for soft iron correction 
                              % b = 3x1 vector for hard iron correction 

Выравнивание оси датчика BNO055 с Координатами NED

Алгоритмы Cочетания датчиков, используемые в этом примере, используют Северо-восток вниз (NED) в качестве фиксированной системы координаты вышестоящего элемента. В системе координат NED ось X указывает север, ось Y указывает восток и точки оси z вниз. В зависимости от алгоритма север может или быть магнитным северным или истинным севером. Алгоритмы в этом примере используют магнитный север. Алгоритмы, используемые здесь, ожидают все датчики в объекте выровнять их оси с соглашением NED. Значения датчика должны быть инвертированы так, чтобы они соответствовали координатам NED.

Настройка параметров фильтра

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

Пример использует ahrsfilter, чтобы продемонстрировать оценку ориентации. Смотрите Определяют Ориентацию Используя Инерционные Датчики для получения дополнительной информации, связанных с инерционными алгоритмами сплава.

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

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

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

% GyroscopeNoise, AccelerometerNoise and MagnetometerNoise are determined from the BNO055 datasheet using the following formula 
% NoisePower = OutputNoisePowerDensityrms^2 * Bandwidth 

GyroscopeNoiseBNO055 = 3.05e-06; % GyroscopeNoise (variance value) in units of (rad/s)^2 
AccelerometerNoiseBNO055 = 67.53e-06; % AccelerometerNoise (variance value)in units of (m/s^2)^2 
MagnetometerNoiseBNO055 = 1; %MagnetometerNoise (variance value) in units of uT^2 

viewer = HelperOrientationViewer('Title',{'AHRS Filter'}); 

FUSE = ahrsfilter('SampleRate',imu.SampleRate,'GyroscopeNoise',GyroscopeNoiseBNO055,'AccelerometerNoise',AccelerometerNoiseBNO055,'MagnetometerNoise',MagnetometerNoiseBNO055); 

stopTimer=10; 

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

magx_correction = b(1); 
magy_correction = b(2); 
magz_correction = b(3); 
 
ts = tic; 
while(toc(ts) < stopTimer) 
    [accel,gyro,mag] = read(imu); 
    % Align coordinates in accordance with NED convention 
    accel = [-accel(:,1), accel(:,2), accel(:,3)]; 
    gyro = [gyro(:,1), -gyro(:,2), -gyro(:,3)]; 
    mag = [(mag(:,1)-magx_correction), -(mag(:,2)- magy_correction), -(mag(:,3)-magz_correction)] * A; 
    rotators = FUSE(accel,gyro,mag); 
    for j = numel(rotators) 
      viewer(rotators(j)); 
    end 
end

Если датчик является стационарным в исходном положении, где ось X устройства указывает на магнитный север, ось Y устройства указывает на восток, и ось z устройства указывает вниз, ось X на рисунке будет параллельна и выровненный с положительной осью X, ось Y на рисунке будет параллельна и выровненный с положительной осью Y, и ось z на рисунке будет параллельна и выровненный с положительной осью z.

Очистка

Когда связь больше не будет необходима, выпустите и очистите объекты.

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

Вещи попробовать

Можно попробовать этот пример другими датчиками, такими как InvenSense MPU-6050, MPU-9250 и STMicroelectronics LSM9DS1.