Этот пример показывает, как получить данные от датчика BNO055 IMU Bosch до модуля HC-05 Bluetooth® и использовать алгоритм сплава AHRS с 9 осями на данных о датчике, чтобы вычислить ориентацию устройства. В примере создается фигура, которая обновляется при перемещении устройства.
BNO055 - 9-осевой датчик с акселерометром, гироскопом и магнитометром. Акселерометр измеряет ускорение, гироскоп измеряет угловую скорость, а магнитометр измеряет магнитное поле в осях x, y и z.
MATLAB ®
Пакет поддержки MATLAB для аппаратного обеспечения Arduino ®
Toolbox™ управления приборами
Слияние датчиков и отслеживание Toolbox™ или навигационные Toolbox™
Arduino ® Uno
Датчик Bosch BNO055
HC-05 Модуль Bluetooth ®

Подключите контакты SDA, SCL, GND и VCC датчика BNO055 к соответствующим контактам платы Arduino ® Uno с помощью соединений:
ПДД - A4
SCL - A5
VCC - + 3,3 В
ЗАЗЕМЛЕНИЕ - ЗАЗЕМЛЕНИЕ
Подключите контакты TX, RX, GND и VCC модуля HC-05 к соответствующим контактам платы Arduino ® Uno. В этом примере используются соединения:
TX - цифровой контакт 0 (RX)
RX - цифровой контакт 1 (TX)
VCC - 5V
ЗАЗЕМЛЕНИЕ - ЗАЗЕМЛЕНИЕ
Убедитесь, что соединения с датчиками и модулем Bluetooth ® не повреждены. Рекомендуется использовать BNO055 щит для Arduino Uno (Arduino 9 Axis Motion Shield). См. раздел Устранение неполадок датчиков (пакет поддержки MATLAB для оборудования Arduino) для отладки проблем, связанных с датчиками.
Настройте плату Arduino Uno для взаимодействия через Bluetooth ® с помощью arduinosetup из командной строки MATLAB. Инструкции по настройке платы Arduino для связи через Bluetooth ® см. в разделе Установка и настройка оборудования Arduino. Убедитесь, что установлен флажок «Библиотеки I2C» для включения в программу установки .
Создание arduino объект.
a = arduino('btspp://98D33230EB9F', 'Uno');
Создать bno055 объект датчика в OperatingMode 'amg'.
fs = 100; % Sample Rate in Hz imu = bno055(a,'SampleRate',fs,'OutputFormat','matrix','OperatingMode','amg');
Алгоритмы слияния используют магнитометрические показания, которые необходимо компенсировать для компенсации магнитных искажений, таких как деформация твердого железа. Искажения из твердого железа производятся материалами, которые создают магнитное поле, что приводит к смещению исходной точки на ответной поверхности. Эти искажения могут быть скорректированы путем вычитания значений коррекции из показаний магнитометра для каждой оси. Чтобы найти корректирующие значения,
Поверните датчик от 0 до 360 градусов вдоль каждой оси.
Используйте функцию 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
Алгоритмы преобразования датчиков, использованные в этом примере, используют NED (North-East-Down) в качестве фиксированной родительской системы координат. В системе координат NED ось X указывает на север, ось y указывает на восток, а ось Z - вниз. В зависимости от алгоритма, север может быть либо магнитным севером, либо истинным севером. Алгоритмы в этом примере используют магнитный север. Значения датчиков должны быть инвертированы таким образом, чтобы они соответствовали координатам NED.
Алгоритмы, используемые в этом примере, при правильной настройке позволяют оценивать ориентацию и являются устойчивыми к воздействию источников шума окружающей среды. Необходимо рассмотреть ситуации, в которых используются датчики, и соответствующим образом настроить фильтры. Дополнительные сведения о настройке параметров фильтра см. в разделе «Настройка параметров фильтра» документа «Оценка ориентации по инерционному синтезу датчиков» (Sensor Fusion and Tracking Toolbox).
В примере используется ahrsfilter для демонстрации оценки ориентации. Дополнительные сведения о алгоритмах инерционного слияния см. в разделе Определение ориентации с помощью инерционных датчиков (панель инструментов слияния и отслеживания датчиков).
Опорная система ориентации и курса (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.