Dérive des mesure module MPU 6050

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

Bonsoir,

Quand je lis "Intégration des données du gyroscope pour obtenir les angles", problème classique d'intégration (donc cumul des erreurs d'imprécision sur les valeurs temporelles et physiques) qui fait que cela ne peut que partir en vrille...

La solution est de "se recaler" sur des valeurs exactes et/ou appliquer un filtre de Kalman qui est une autre paire de manche à implémenter

NB: Faire une recherche de: arduino filtre de Kalman et accessoirement lire pour la culture l'article Centrale à inertie

A suivre...

Qu'entendez vous par se recaler sur des valeurs exactes? J'avait en effet lu un article sur le filtre de Kalman mais cela me semble trop compliqué a appliquer pour une utilisation comme la mienne. Ce serait donc un dernier recours...