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

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

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

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

  • MATLAB ®

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

  • Instrument Control Toolbox™

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

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

  • Arduino ® Uno

  • Датчик BNO055 Bosch

  • HC-05 модуль Bluetooth ®

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

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

  • SDA - A4

  • SCL - A5

  • VCC - + 3,3 В

  • GND - GND

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

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

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

  • VCC - 5V

  • GND - GND

Убедитесь, что соединения с датчиками и модулем Bluetooth ® сохранены. Рекомендуется использовать BNO055 щит для Arduino Uno (Arduino 9 Axis Motion Shield). Чтобы решить проблемы, связанные с датчиком, смотрите раздел «Поиск и устранение проблем с датчиками» (MATLAB Support Package for Arduino Hardware).

Setup и настройка Arduino для Bluetooth ® Communication

Сконфигурируйте плату Arduino Uno для связи через Bluetooth ® с помощью arduinosetup команда из командной строки MATLAB. Инструкции по конфигурированию платы Arduino для связи через Bluetooth ® см. в разделе Setup и настройка оборудования Arduino. Убедитесь, что флажок «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'); 

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

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

  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

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

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

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

Пример использует ahrsfilter, чтобы продемонстрировать оценку ориентации. Смотрите Determine Orientation Using Inertial Sensors (Sensor Fusion and Tracking Toolbox) для получения дополнительной информации, связанной с алгоритмами инерционного слияния.

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

Система ссылки ориентации и курса (AHRS) состоит из 9-осевой системы, которая использует акселерометр, гироскоп и магнитометр для вычисления ориентации устройства. The ahrsfilter формирует плавно изменяющуюся оценку ориентации устройства при правильной оценке северного направления. The 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.

Для просмотра документации необходимо авторизоваться на сайте