Этот пример показывает, как получить данные с датчика Bosch BNO055 IMU через HC-05 Bluetooth ® модуль и использовать 9-осевой алгоритм слияния AHRS на данных датчика для вычисления ориентации устройства. Пример создает рисунок, которая обновляется при перемещении устройства .
BNO055 датчик с 9 осями с акселерометром, гироскопом и магнитометром. Акселерометр измеряет ускорение, гироскоп измеряет скорость вращения, а магнитометр измеряет магнитное поле в осях x -, y - и z -.
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).
Сконфигурируйте плату 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');
Алгоритмы слияния используют показания магнитометра, которые нужно компенсировать для магнитных искажений, таких как твердое искажение железа. Твердые искажения железа производятся материалами, которые создают магнитное поле, что приводит к перемене источника координат на поверхности отклика. Эти искажения могут быть исправлены путем вычитания значений коррекции из показаний магнитометра для каждой оси. В порядок, чтобы найти коррекцию значения,
Поверните датчик от 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
Алгоритмы 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.