Этот пример показывает, как получить данные с датчика 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.
Алгоритмы, используемые в этом примере, при правильной настройке, позволяют оценить ориентацию и устойчивы к источникам экологического шума. Необходимо учитывать ситуации, в которых используются датчики, и соответствующим образом настраивать фильтры. Для получения информации о том, как настроить параметры фильтра, смотрите раздел «Параметры фильтра настройки» в разделе «Оценка ориентации через синтез инерционного датчика» (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.