Aller au contenu

Variables aléatoires

Le monde réel n'est pas déterministe

Dans un monde parfait, le sonar de ton robot mesurerait exactement 42,0 cm à chaque lecture. Tes encodeurs compteraient exactement le bon nombre d'impulsions. Le gyroscope donnerait un angle précis à la milliseconde près.

Mais dans la réalité, ça ne se passe jamais ainsi.

Voici ce qu'on observe en lisant le sonar 10 fois de suite sur un objet immobile à environ 40 cm :

42.1  39.8  41.5  40.2  43.0  38.9  41.8  40.6  42.3  39.5

Les valeurs tournent autour de 40 cm, mais aucune n'est identique. Cette variabilité s'appelle le bruit de mesure, et elle est inévitable dans tout système physique.

Pourquoi les capteurs sont bruités

Plusieurs phénomènes causent ce bruit :

  • Sonar : les ultrasons rebondissent de façon légèrement différente selon la surface, la température de l'air, les vibrations du robot
  • Encodeurs : les roues glissent légèrement, les engrenages ont un jeu mécanique
  • MPU-6050 : le gyroscope dérive lentement, l'accéléromètre capte les vibrations du moteur

Pour décrire ces phénomènes mathématiquement, on utilise les variables aléatoires.

Qu'est-ce qu'une variable aléatoire ?

Une variable aléatoire est une quantité dont la valeur n'est pas fixe, mais suit une distribution de probabilité. En d'autres mots, elle peut prendre différentes valeurs avec différentes probabilités.

Pour le filtre de Kalman, on modélise chaque mesure comme :

mesure = vraie_valeur + bruit

où le bruit est une variable aléatoire. Les deux paramètres les plus importants de cette variable sont :

  • La moyenne (µ) : vers quelle valeur les mesures convergent en moyenne
  • La variance (σ²) : à quel point les mesures s'éparpillent autour de la moyenne

Exemple concret : sonar du Ranger

Si le robot est à 40 cm d'un mur et que le sonar a une variance de 4 cm² (σ = 2 cm), cela signifie qu'environ 68% des lectures tomberont entre 38 et 42 cm.

Vérifier le bruit de tes capteurs

Avant d'utiliser le filtre de Kalman, il est utile de mesurer expérimentalement le bruit de tes capteurs. Voici un sketch Arduino pour le sonar :

#include <MeAuriga.h>

MeUltrasonicSensor sonar(PORT_10);

const int NB_MESURES = 100;
float mesures[NB_MESURES];

void setup() {
  Serial.begin(115200);
  Serial.println("Mesure du bruit du sonar...");
  Serial.println("Garde le robot immobile !");
  delay(2000);

  // Collecte des mesures
  float somme = 0;
  for (int i = 0; i < NB_MESURES; i++) {
    mesures[i] = sonar.distanceCm();
    somme += mesures[i];
    delay(50);
  }

  // Calcul de la moyenne
  float moyenne = somme / NB_MESURES;

  // Calcul de la variance
  float variance = 0;
  for (int i = 0; i < NB_MESURES; i++) {
    float ecart = mesures[i] - moyenne;
    variance += ecart * ecart;
  }
  variance /= NB_MESURES;

  Serial.print("Moyenne     : ");
  Serial.print(moyenne, 2);
  Serial.println(" cm");

  Serial.print("Variance    : ");
  Serial.print(variance, 4);
  Serial.println(" cm²");

  Serial.print("Écart-type  : ");
  Serial.print(sqrt(variance), 4);
  Serial.println(" cm");
}

void loop() {}

À retenir

La variance que tu mesures ici servira directement comme paramètre R (bruit de mesure) dans ton filtre de Kalman. Plus cette valeur est grande, moins le filtre fera confiance au capteur.

Même chose pour les encodeurs

#include <MeAuriga.h>

MeEncoderOnBoard encodeurGauche(SLOT1);

void isr_process_encoder1(void) {
  if (digitalRead(encodeurGauche.getPortB()) == 0) {
    encodeurGauche.pulsePosMinus();
  } else {
    encodeurGauche.pulsePosPlus();
  }
}

void setup() {
  Serial.begin(115200);
  attachInterrupt(encodeurGauche.getIntNum(), isr_process_encoder1, RISING);
  TCCR1A = _BV(WGM10);
  TCCR1B = _BV(CS11) | _BV(WGM12);
  TCCR2A = _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS21);
}

void loop() {
  encodeurGauche.loop();

  // Affiche la vitesse en RPM toutes les 100ms
  static unsigned long dernierAffichage = 0;
  if (millis() - dernierAffichage > 100) {
    dernierAffichage = millis();
    Serial.println(encodeurGauche.getCurrentSpeed());
  }
}

Fais tourner les roues à vitesse constante (par exemple à main) et observe la variabilité des lectures — c'est le bruit de l'encodeur.

Résumé

Concept Définition simple
Variable aléatoire Une valeur qui varie de façon imprévisible
Moyenne (µ) La valeur "centrale" vers laquelle on tend
Variance (σ²) L'ampleur de la dispersion autour de la moyenne
Bruit de capteur La variabilité inévitable des mesures physiques

Dans la prochaine section, on verra comment modéliser ce bruit avec la distribution gaussienne — la forme en cloche que tu as sûrement déjà vue.