Bonjour,
J'essaye actuellement de concevoir un robot qui maintient son équilibre avec des roues de réaction. J'utilise donc un module MPU 6050 afin de mesurer la position de mon robot et la corriger en actionnant mes moteurs.
Cependant en utilisant tout d'abord un code basique me permettant de récupérer la position angulaire de mon robot, j'ai constaté une rapide dérive des mesures. J'ai alors utilisé la méthode de filtrage complémentaire afin d'en finir avec cette dérive mais cela n'a fait que ralentir la dérive qui est toujours non négligeable, ce qui ne m'arrange pas pour incrémenter la position de mon robot. Voici le code utilisé (il n'est pas complètement de moi):
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 mpu;
const int MPU = 0x68;
double accAngleX, accAngleY; // Angles calculés à partir de l'accéléromètre sur les axes X et Y
double gyroAngleX, gyroAngleY, gyroAngleZ; // Angles calculés à partir du gyroscope sur les axes X, Y et Z
double angleX, angleY, angleZ; // Angles combinés (filtrés) sur les axes X, Y et Z
double elapsedTime, currentTime, previousTime; // Variables pour calculer le temps écoulé
void setup() {
Serial.begin(115200); // Initialisation de la communication série à 115200 baud
Wire.begin(); // Initialisation du bus I2C
// Réveil du MPU6050
Wire.beginTransmission(MPU);
Wire.write(0x6B); // Registre PWR_MGMT_1
Wire.write(0); // Mettre à zéro pour réveiller le MPU6050
Wire.endTransmission(true);
mpu.initialize(); // Initialisation du MPU6050
previousTime = millis(); // Initialisation du temps précédent
}
void loop() {
int16_t accX, accY, accZ;
int16_t gyroX, gyroY, gyroZ;
// Lecture des valeurs brutes
mpu.getMotion6(&accX, &accY, &accZ, &gyroX, &gyroY, &gyroZ);
// Calcul des angles à partir de l'accéléromètre
accAngleX = (atan(accY / sqrt(pow(accX, 2) + pow(accZ, 2))) * 180 / PI);
accAngleY = (atan(-1 * accX / sqrt(pow(accY, 2) + pow(accZ, 2))) * 180 / PI);
// Intégration des données du gyroscope pour obtenir les angles
currentTime = millis(); // Temps actuel
elapsedTime = (currentTime - previousTime) / 1000.0; // Temps écoulé en secondes
previousTime = currentTime; // Mise à jour du temps précédent
// Conversion des valeurs brutes du gyroscope en degrés par seconde
gyroAngleX = gyroX / 131.0;
gyroAngleY = gyroY / 131.0;
gyroAngleZ = gyroZ / 131.0;
// Calcul des angles filtrés autour des axes
angleX = 0.98 * (angleX + gyroAngleX * elapsedTime) + 0.02 * accAngleX;
angleY = 0.98 * (angleY + gyroAngleY * elapsedTime) + 0.02 * accAngleY;
angleZ += gyroAngleZ * elapsedTime;
Serial.print(angleZ);
Serial.println(";");
delay(10);
}
Voici la dérive:
Auriez-vous des solutions pour en finir avec ce problème? La dérive me semble linéaire donc je pensais la compenser en retrouvant la fonction complémentaire mais cela n'a pas fonctionné...
Merci d'avance