Беспроводная потоковая передача данных и слияние датчиков с использованием 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.

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

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

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

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

Система ссылки ориентации и курса (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.