В этом примере показано, как получить данные от датчика BNO055 IMU Bosch до модуля HC-05 Bluetooth® и использовать алгоритм сплава AHRS с 9 осями на данных о датчике, чтобы вычислить ориентацию устройства. Пример создает фигуру, которая обновляется, когда вы перемещаете устройство.
BNO055 является датчиком с 9 осями с акселерометром, гироскопом и магнитометром. Ускорение мер по акселерометру, скорость вращения мер по гироскопу и магнитометр измеряют магнитное поле в x-, y-и z-осях.
MATLAB®
Пакет поддержки MATLAB для оборудования Arduino®
Instrument Control Toolbox™
Sensor Fusion and Tracking Toolbox™ или Navigation Toolbox™
Arduino® Uno
Датчик Bosch BNO055
HC-05 Bluetooth® Module
Соедините SDA, SCL, GND и контакты VCC датчика BNO055 к соответствующим контактам на плате Arduino® Uno со связями:
SDA - A4
SCL - A5
VCC - +3.3V
GND - GND
Соедините TX, RX, GND и контакты VCC модуля HC-05 к соответствующим контактам на плате Arduino® Uno. Этот пример использует связи:
TX – цифровой контакт 0 (RX)
RX – цифровой контакт 1 (TX)
VCC – 5 В
GND – GND
Убедитесь, что связи с датчиками и модулем Bluetooth® неповреждены. Рекомендуется использовать щит BNO055 для Uno Arduino (Щит Движения Оси Arduino 9). Смотрите Датчики Поиска и устранения проблем (Пакет Поддержки MATLAB для Оборудования Arduino), чтобы отладить связанные с датчиком проблемы.
Сконфигурируйте плату Uno Arduino, чтобы связаться через Bluetooth® с помощью arduinosetup
команда из командной строки MATLAB. Смотрите Setup и Сконфигурируйте Оборудование Arduino для шагов о том, как сконфигурировать управление Arduino по коммуникации через Bluetooth®. Убедитесь, что установили флажок для Библиотек 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');
Алгоритмы Fusion используют показания магнитометра, которые должны быть компенсированы магнитные искажения, такие как трудное железное искажение. Трудные железные искажения производятся материалами, которые создают магнитное поле, приводящее к сдвигу источника на поверхности ответа. Эти искажения могут быть откорректированы путем вычитания значений коррекции из показаний магнитометра для каждой оси. Для того, чтобы найти значения коррекции,
Вращайте датчик от 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
Алгоритмы Fusion датчика, используемые в этом примере, используют Северо-восток вниз (NED) в качестве фиксированной системы координаты вышестоящего элемента. В системе координат NED ось X указывает север, ось Y указывает восток и точки оси z вниз. В зависимости от алгоритма север может или быть магнитным северным или истинным севером. Алгоритмы в этом примере используют магнитный север. Алгоритмы, используемые здесь, ожидают все датчики в объекте выровнять их оси с соглашением NED. Значения датчика должны быть инвертированы так, чтобы они соответствовали координатам NED.
Алгоритмы, используемые в этом примере, когда правильно настроено, включают оценку ориентации и устойчивы против экологических источников шума. Необходимо рассмотреть ситуации, в которых датчики используются и настраивают фильтры соответственно. Дополнительную информацию см. в Настраивающихся Параметрах Фильтра, связанных с настраивающимися параметрами фильтра.
Пример использует 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.