A minha experiência com IMU’s no ROS resume-se ás placas de exploração do MPU6050 com a referência GY-521, e diga-se desde já que tem sido problemática devido a minha incapacidade de concretizar configurações estáveis que explorem este IMU nos robots.
A GY-520 é uma placa de exploração do MPU6050 com o aspecto da imagem abaixo.

O esquema desta placa é o exibido abaixo.

Segundo este esquema, a placa deve ser alimentada com 5v, e é também notório que inclui pullups de 4.7k para os 3.3V, assim como um condensador de decoupling de 0.1uF, entre oVDD e GND.
O interface do IMU com o ROS pode ser :
- Directo, ou seja, o Raspberry Pi comunica directamente com o IMU por meio do bus i2c.
- Indirecto, ou seja, um microcontrolador (ex: Arduino) encarrega-se de efectuar as leituras e as entregar ao Pi por ligação serie.
Segundo os howto a ligação entre o Raspberry Pi, Banana Pi, ou Arduinos como GY-521 é fácil de efectuar.

Depois de efectuadas as ligações é necessário escrever um node para o ROS que efectue as leituras do MPU6050 e as publique num tópico como mensagens do tipo:
sensor_msgs/imu
Outra opção é usar um dos pacotes ROS que contêm um node para o MPU6050 indicados na lista abaixo.
- matpalm
- brNX
- fsteinhardt
- chrisspen
Um aspecto importante é conseguir explorar o mpu6050 no modo DMP pois isso permite conhecer a orientação e preencher os campos orientation.(xyz) das mensagens (sensor_msgs/imu).
matpalm
https://github.com/matpalm/ros-mpu6050-node
Directo. Usa lib WiringPi.
Funciona (isolada)
- Sem DMP
- Sem TF
- Sem Valores de covariancia
Launch parameters: (none)
Apenas angular_velocity e linear_acceleration com base nos raw values.
brNX
https://github.com/brNX/ros_mpu6050_node
Branch: rpi-mpu6050-hmc5883l
Directo. Usa lib linux-mpu9150.
Funciona (isolada)
Caracteristicas:
- Com DMP
- Com tf
- Com magnetometro (HCM5883)
- etc
Launch parameters:
- frequency
- i2c_bus
- yaw_mix_factor
- frame_id
MPU 6050 + hmc5883 node for ROS using the /dev/i2c-x device
Para este node funcionar no Raspberry Pi Na linha 39, ou perto, trocar:
pn.param<int>("i2c_bus",i2c_bus,0);
para
pn.param<int>("i2c_bus",i2c_bus,1);
O valor 1 corresponde ao bus i2c utilizável no Raspberry Pi.
fsteinhardt
https://github.com/fsteinhardt/mpu6050_serial_to_imu
Indirecto, via serial com um arduino a controlar o MPU6050 com a biblioteca do Jeff Rowberg.
Não experimentei.
chrisspen
https://github.com/chrisspen/ros_mpu6050_node
Directo. Usa I2CdevLib (Jeff Rowberg) e Bcm2835 (requer a instalação destas bibliotecas; instruções no endereço acima)
Funciona (isolada)
Caracteristicas:
- Com DMP
- Com tf
- Com magnetometro (HCM5883)
- etc
Launch parameters:
- frequency
- ado
- frame_id
- ax
- ay
- az
- gx
- gy
- gz
- linear_acceleration_stdev
- angular_velocity_stdev
- pitch_roll_stdev
- yaw_stdev
Necessita de ser executado como root
sudo bash -c “source /opt/ros/kinetic/setup.bash; source /home/ubuntu/catkin_ws/devel/setup.bash; roslaunch ros_mpu6050_node mpu6050.launch”
Outros
https://github.com/mdleiton/MPU9255
Aplicações do IMU no ROS.
O IMU pode pode ser usado para melhorar a odometria, pela fusão dos seus dados com os encoders.
Problemas com o MPU6050 no ROS
Muitos…
Usando a lib i2cdevlib, o mpu6050 no modo dmp tem problemas de estabilidade no arduino.
https://forum.arduino.cc/index.php?topic=199671.0
https://forum.arduino.cc/index.php?topic=279431.0
Outras ligações
https://forum.arduino.cc/index.php?topic=394691.0 (GY-521 com condensador errado)
hhttp://wiki.ros.org/imu_filter_madgwick
ttp://docs.ros.org/melodic/api/robot_localization/html/index.html
https://answers.ros.org/question/312290/how-to-fuse-encoder-ticks-imu-for-odometry/
http://www.pibits.net/code/raspberry-pi-mpu6050-python-example.php
https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial/all
https://github.com/jrowberg/i2cdevlib/tree/master/RaspberryPi_bcm2835
https://github.com/richardghirst/PiBits/tree/master/MPU6050-Pi-Demo
https://github.com/mdleiton/MPU9255
https://github.com/matpalm/ros-mpu6050-node
https://github.com/chrisspen/ros_mpu6050_node