Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Transmisión inalámbrica de datos y fusión de sensores mediante BNO055

Este ejemplo muestra cómo obtener datos de un sensor IMU BNO055 de Bosch a través de un módulo Bluetooth® HC-05 y cómo utilizar el algoritmo de fusión AHRS de 9 ejes en los datos del sensor para calcular la orientación del dispositivo. El ejemplo crea una figura que se actualiza a medida que mueve el dispositivo.

BNO055 es un sensor de 9 ejes con acelerómetro, giroscopio y magnetómetro. El acelerómetro mide la aceleración, el giroscopio mide la velocidad angular y el magnetómetro mide el campo magnético en los ejes x, y y z.

Productos MathWorks necesarios

  • MATLAB®

  • Paquete de soporte MATLAB para hardware Arduino®

  • Instrument Control Toolbox™

  • Sensor Fusion and Tracking Toolbox™ o Navigation Toolbox™

Hardware requerido

  • ArduinoUno

  • Sensor Bosch BNO055

  • Módulo Bluetooth® HC-05

Conexión de hardware

Conecte los pines SDA, SCL, GND y VCC del sensor BNO055 a los pines correspondientes en la placa Arduino Uno con las conexiones:

  • ADV - A4

  • SCL-A5

  • VCC-+3,3 V

  • Tierra - Tierra

Conecte los pines TX, RX, GND y VCC del módulo HC-05 a los pines correspondientes en la placa Arduino Uno. Este ejemplo utiliza las conexiones:

  • TX – Pin digital 0 (RX)

  • RX – Pin digital 1 (TX)

  • VCC – 5V

  • Tierra – Tierra

Asegúrese de que las conexiones a los sensores y al módulo Bluetooth® estén intactas. Se recomienda utilizar un shield BNO055 para Arduino Uno (Arduino 9 Axis Motion Shield). Consulte Troubleshooting Sensors para depurar los problemas relacionados con el sensor.

Configurar Arduino para la comunicación Bluetooth

Configure la placa Arduino Uno para comunicarse a través de Bluetooth usando el comando arduinosetup desde el línea de comandosMATLAB. Consulte Set Up and Configure Arduino Hardware para conocer los pasos sobre cómo configurar la placa Arduino para la comunicación a través de Bluetooth. Asegúrese de marcar la casilla para que las bibliotecas I2C se incluyan durante la configuración.

Crear objeto sensor

Crea un objeto arduino.

a = arduino('btspp://98D33230EB9F', 'Uno');

Crea el objeto sensor bno055 en OperatingMode 'amg'.

 fs = 100; % Sample Rate in Hz 
imu = bno055(a,'SampleRate',fs,'OutputFormat','matrix','OperatingMode','amg'); 

Compensación de distorsiones de hierro duro y hierro suave

Los algoritmos de fusión utilizan lecturas de magnetómetro que deben compensarse por distorsiones magnéticas como la distorsión del hierro duro. Las distorsiones del hierro duro son producidas por materiales que crean un campo magnético, lo que provoca un desplazamiento del origen en la superficie de respuesta. Estas distorsiones se pueden corregir restando los valores de corrección de las lecturas del magnetómetro para cada eje. Para encontrar los valores de corrección,

  1. Gire el sensor de 0 a 360 grados a lo largo de cada eje.

  2. Utilice la función magcal para obtener los coeficientes de corrección.

Estos valores de corrección cambian con el entorno.

Para obtener coeficientes de corrección para distorsiones tanto de hierro duro como de hierro dulce:

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 

Alineación del eje del sensor BNO055 con las coordenadas NED

Los algoritmos de Sensor Fusion utilizados en este ejemplo utilizan Noreste-Abajo (NED) como sistema de coordenadas principal fijo. En el marco de referencia NED, el eje x apunta al norte, el eje y apunta al este y el eje z apunta hacia abajo. Dependiendo del algoritmo, el norte puede ser el norte magnético o el norte verdadero. Los algoritmos de este ejemplo utilizan el norte magnético. Los algoritmos utilizados aquí esperan que todos los sensores del objeto tengan sus ejes alineados con la convención NED. Los valores de los sensores deben invertirse para que coincidan con las coordenadas NED.

Ajuste de los parámetros del filtro

Los algoritmos utilizados en este ejemplo, cuando se ajustan correctamente, permiten la estimación de la orientación y son robustos frente a fuentes de ruido ambiental. Debe considerar las situaciones en las que se utilizan los sensores y ajustar los filtros en consecuencia. Consulte Custom Tuning of Fusion Filters (Sensor Fusion and Tracking Toolbox) para obtener más detalles relacionados con el ajuste de los parámetros del filtro.

El ejemplo utiliza ahrsfilter para demostrar la estimación de la orientación. Consulte Determine Orientation Using Inertial Sensors (Sensor Fusion and Tracking Toolbox) para obtener más detalles relacionados con los algoritmos de fusión inercial.

Fusión Acelerómetro-Giroscopio-Magnetómetro

Un sistema de referencia de actitud y rumbo (AHRS) consta de un sistema de 9 ejes que utiliza un acelerómetro, giroscopio y magnetómetro para calcular la orientación del dispositivo. ahrsfilter produce una estimación de la orientación del dispositivo que cambia suavemente, al tiempo que estima correctamente la dirección norte. El ahrsfilter tiene la capacidad de eliminar el sesgo del giroscopio y también puede detectar y rechazar interferencias magnéticas leves.

Los siguientes fragmentos de código utilizan ahrsfilter System object ™ para determinar la orientación del sensor y crear una figura que se actualiza a medida que mueve el sensor. La posición inicial del sensor debe ser tal que el eje x del dispositivo apunte hacia el norte magnético, el eje y del dispositivo apunte hacia el este y el eje z del dispositivo apunte hacia abajo. Podrías usar un teléfono celular o una brújula para determinar el norte magnético.

% 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; 

Después de ejecutar el siguiente fragmento de código, mueva lentamente el sensor y verifique si el movimiento en la figura coincide con el movimiento del sensor. Aumente el valor stopTimer si necesita realizar un seguimiento de la orientación durante más tiempo.

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

Si el sensor está estacionario en la posición inicial donde el eje x del dispositivo apunta al norte magnético, el eje y del dispositivo apunta al este y el eje z del dispositivo apunta hacia abajo, el eje x en la figura será paralelo y estará alineado con el eje positivo x, el eje y en la figura será paralelo y estará alineado con el eje positivo y, y el eje z en la figura será paralelo y estará alineado con el eje positivo z.

Limpiar

Cuando la conexión ya no sea necesaria, suelte y borre los objetos.

release(imu);
delete(imu);
clear;

Cosas para probar

Puede probar este ejemplo con otros sensores como InvenSense MPU-6050, MPU-9250 y STMicroelectronics LSM9DS1.