Tutoriel · Débutant · 17 min de lecture

Bruit, biais et filtrage des capteurs en robotique

Donnez sens aux capteurs bruités : la différence entre bruit, biais et dérive, comment choisir un filtre, le retard qu'il ajoute, et quand la fusion aide.

Chaque robot agit sur des mesures bruitées, retardées, biaisées et parfois manquantes. Traiter une lecture brute comme la vérité est le chemin le plus rapide vers un robot au comportement imprévisible. Ce guide couvre le vocabulaire et les compromis nécessaires avant de faire confiance à un capteur. Essayez chaque effet dans le simulateur de capteurs du robot.

Le bruit, le biais et la dérive sont des problèmes différents

  • Le bruit varie aléatoirement d’un échantillon à l’autre. Moyenner ou filtrer le réduit.
  • Le biais est un décalage fixe de la vraie valeur. Le filtrage ne le retirera pas ; il faut le mesurer pendant l’étalonnage et le soustraire.
  • La dérive est un biais qui change lentement dans le temps, d’ordinaire avec la température. Un étalonnage pris au démarrage cesse progressivement de correspondre à la réalité, et c’est pourquoi les longues courses exigent un réétalonnage périodique ou une référence contre laquelle corriger.

Les confondre mène au mauvais correctif — plus de filtrage ne guérira jamais un biais.

Quatre tracés en fonction de vingt secondes de temps autour d'une vraie valeur horizontale en pointillés. Un tracé bruité se disperse largement au-dessus et au-dessous de la vraie valeur mais se moyenne dessus. Un tracé biaisé se tient en décalage constant au-dessus de la vraie valeur avec peu de dispersion. Un tracé en dérive part de la vraie valeur et grimpe régulièrement loin d'elle pendant tout l'enregistrement.
Trois défauts qui ressemblent tous à « une mauvaise lecture » et exigent trois correctifs différents. Moyenner ne guérit que le premier. Télécharger le SVG

Choisir un filtre

Trois filtres courants couvrent la plupart des cas :

  • Une moyenne glissante et un passe-bas exponentiel lissent tous deux le bruit aléatoire, échangeant réactivité contre douceur via leur fenêtre ou constante de temps.
  • Un filtre médian retire mieux les pics et pertes occasionnels, parce que quelques mauvais échantillons ne déplacent pas la valeur médiane.

Choisissez le filtre le plus léger qui satisfait l’exigence de ce qui consomme la mesure — pas celui qui produit le graphe le plus lisse.

Le filtrage ajoute toujours du retard

Chaque filtre de lissage retarde le vrai signal, et plus de lissage signifie plus de retard. Un filtre passe-bas à longue constante de temps rejette plus de bruit mais traîne davantage derrière les changements rapides. Tracez toujours l’estimée filtrée contre les échantillons bruts et la vérité pour que le retard soit visible avant de mettre le filtre dans une boucle de commande, où le retard peut causer de l’instabilité.

class LowPass:
    def __init__(self, alpha):
        self.alpha = alpha      # smaller alpha = smoother but more lag
        self.value = None
    def update(self, sample):
        if self.value is None:
            self.value = sample
        else:
            self.value += self.alpha * (sample - self.value)
        return self.value

Ce que la fusion de capteurs peut et ne peut pas faire

La fusion combine plusieurs capteurs en une estimée, et elle aide seulement quand les capteurs apportent de l’information complémentaire et que leur incertitude est représentée honnêtement. Combiner deux mesures biaisées ne crée pas la vérité. Un filtre complémentaire, par exemple, croit un capteur aux hautes fréquences et un autre aux basses ; un filtre de Kalman pondère chaque source par son incertitude. Dans les deux cas, commencez par étalonnage, horodatages et repères de coordonnées partagés avant de fusionner quoi que ce soit.

Horodatez tout

Les échantillons arrivent rarement à intervalle parfaitement fixe, et filtrage comme fusion supposent que vous savez quand chaque valeur a été mesurée. Les horodatages permettent de détecter la gigue, d’aligner des données de capteurs différents, et de rejeter les lectures périmées. Enregistrez les valeurs brutes à côté des traitées pour que les pannes comme écrêtage et pertes restent reproductibles.

Mesurez votre capteur avant de le filtrer

Choisir un filtre avant de savoir à quoi ressemble le bruit est deviner. Dix minutes d’enregistrement tranchent, et la procédure est la même pour tout capteur :

  1. Tenez le capteur parfaitement immobile contre une entrée connue et invariable.
  2. Enregistrez quelques milliers d’échantillons bruts avec horodatages.
  3. Calculez la moyenne et l’écart type.
  4. Tracez les échantillons, et tracez-en un histogramme.

Ces quatre nombres et deux graphes disent lequel des trois défauts vous avez :

Ce que vous observez Ce que c’est Le correctif
La moyenne colle à la vérité, les valeurs se dispersent symétriquement Bruit Filtrez
La moyenne est décalée de la vérité, dispersion faible Biais Mesurez et soustrayez-le — le filtrage n’aidera jamais
La moyenne s’éloigne en marchant sur des minutes Dérive Réétalonnez périodiquement, ou corrigez contre une référence
Essentiellement serré, avec des valeurs folles occasionnelles Valeurs aberrantes Médiane, pas moyenne
Les valeurs atterrissent sur des paliers discrets Quantification Attendu ; elle borne votre résolution

L’histogramme est la partie sautée, et c’est la plus informative. Le bruit gaussien fait une cloche ; les valeurs aberrantes font une cloche avec quelques points loin dans les queues. Les deux exigent des filtres différents, et aucun temps à fixer un tracé temporel ne les distingue aussi nettement.

Choisir un filtre, quantifié

Filtre Tue le bruit gaussien Tue les aberrantes Retard Coût
Moyenne glissante, N échantillons Oui — par √N Non — étale un pic sur N échantillons (N−1)/2 échantillons Tampon de N échantillons
Passe-bas exponentiel (EMA) Oui Non ≈ (1−α)/α échantillons Un flottant
Médiane sur N Un peu Complètement, jusqu’à N/2 aberrantes (N−1)/2 échantillons Tri, trivial à petit N
Médiane puis EMA Oui Oui Les deux Les deux

Le √N de la première ligne est le nombre utile : moyenner 4 échantillons divise le bruit par deux ; moyenner 100 échantillons le réduit par dix, au prix de 50 échantillons de retard. La réduction du bruit a des rendements fortement décroissants et le retard non, et c’est pourquoi les très longues moyennes sont presque toujours la mauvaise réponse.

Pour un EMA, la constante de temps se relie à α par :

tau = dt x (1 - alpha) / alpha

Donc à une boucle de 10 ms, α = 0,1 donne une constante de temps de 90 ms. Régler α au feeling est comment on finit avec des filtres bien plus lents qu’on ne croit — calculez-le une fois et vous savez ce que vous avez.

Le retard n’est pas gratuit, et voici ce qu’il coûte

Chaque filtre de lissage retarde le signal, et dans une boucle de commande ce retard est indiscernable du système plus lent à répondre. Il réduit directement le gain supportable par la boucle avant d’osciller.

Filtre Retard à une boucle de 10 ms Distance parcourue à 0,3 m/s
Médiane sur 3 10 ms 3 mm
Médiane sur 5 20 ms 6 mm
Moyenne glissante sur 10 45 ms 14 mm
EMA, α = 0.1 90 ms 27 mm
EMA, α = 0.02 490 ms 147 mm

Cette dernière ligne vaut qu’on s’y attarde. Un α de 0,02 produit un graphe magnifiquement lisse et une demi-seconde de retard — le robot braque sur l’endroit où l’obstacle était 15 cm plus tôt. C’est la façon la plus courante pour un filtre bien intentionné de rendre un robot pire, et c’est invisible sauf à tracer le filtré contre le brut avec la vérité à côté.

Choisissez le filtre le plus léger qui satisfait l’exigence, et vérifiez toujours ce que le retard coûte dans les unités qui comptent pour le robot — millimètres, ou degrés, pas échantillons.

Un filtre complémentaire, et comment choisir sa constante

Le filtre complémentaire est le cheval de labour de la robotique amateur parce qu’il fait trois lignes et résout le vrai problème : deux capteurs qui échouent en sens opposés.

// gyroRate in deg/s, accelAngle in degrees, dt in seconds.
angle = alpha * (angle + gyroRate * dt) + (1.0f - alpha) * accelAngle;

alpha fixe la fréquence de croisement — au-dessus vous croyez le gyro, en dessous l’accéléromètre :

tau = alpha x dt / (1 - alpha)          # the filter's time constant, seconds
f_crossover = 1 / (2 x pi x tau)        # Hz
α à dt = 5 ms Constante de temps Croisement Comportement
0.90 45 ms 3.5 Hz Très réactif, visiblement bruyant de l’accéléromètre
0.98 245 ms 0.65 Hz Le défaut courant — un bon équilibre
0.995 1.0 s 0.16 Hz Très lisse, dérive nettement avant de corriger
0.999 5.0 s 0.03 Hz Effectivement gyro seul sur toute courte manœuvre

Choisissez-le depuis la physique plutôt qu’au feeling : la constante de temps doit être longue devant les perturbations à rejeter, et courte devant le taux de dérive du gyro. Un gyro biaisé de 1 °/s atteint 1° d’erreur en une seconde, donc une constante de temps de plusieurs secondes laisse l’erreur réelle s’accumuler avant que l’accéléromètre la ramène.

Notez aussi qu’α dépend de dt. Copier un α d’un projet à un autre taux de boucle donne un autre filtre — ce qui est une source courante et invisible de « ces gains ne marchent pas chez moi ».

Ce que la fusion ne peut pas faire

La fusion n’est pas magique, et trois limites valent d’être dites plainement :

Elle ne peut retirer un biais partagé. Deux accéléromètres lisant tous deux 2° haut produisent une estimée fusionnée lisant 2° haut. La fusion exploite des erreurs indépendantes ; une erreur de mode commun survit intacte.

Elle ne peut créer de l’information absente. Aucun filtrage ne donne à une IMU six axes un cap absolu. Le lacet n’a pas de référence de gravité, donc il dérive, et seul un magnétomètre ou une référence extérieure le corrige.

Elle ne peut corriger de mauvais horodatages. Fusionner un fix GPS à 10 Hz avec un gyro à 200 Hz exige de savoir quand chacun a été mesuré, à une fraction de l’intervalle le plus rapide. Un fix périmé de 100 ms et traité comme courant corrompra activement une estimée que le gyro seul avait juste.

Les horodatages, concrètement

« Horodatez tout » est facile à approuver et facile à sauter. La version pratique :

struct Sample {
  float value;
  unsigned long micros;    // when it was MEASURED, not when it was read
};

// Reject anything too old to be useful, rather than fusing it.
bool isFresh(const Sample &s, unsigned long maxAgeUs) {
  return (micros() - s.micros) < maxAgeUs;
}

Capturez l’horodatage au plus près de la mesure — dans l’interruption, pas après l’analyse. Une phrase GPS analysée 80 ms après que le fix a été pris et horodatée à l’analyse est fausse de 80 ms, et rien en aval ne peut récupérer cela.

Dépannage

Symptôme Cause probable Correctif
Plus de filtrage, pas d’amélioration C’est un biais, pas du bruit Mesurez le décalage au repos et soustrayez
L’estimée s’éloigne lentement en marchant Dérive Réétalonnage périodique, ou référence absolue
Un pic occasionnel survit au filtre Utilisation d’une moyenne La médiane rejette les aberrantes ; une moyenne les étale
La boucle de commande oscille après ajout d’un filtre Le retard a réduit le gain stable Filtre plus léger, ou réglez à nouveau
Graphe lisse, robot qui réagit tard Constante de temps bien plus longue que prévue Calculez τ depuis α — ne réglez pas α au feeling
Estimée fusionnée pire que chaque capteur Horodatages périmés, ou biais partagé Horodatez à la mesure ; vérifiez les décalages des deux capteurs
Le filtre marche sur l’établi, pas sur le robot La vibration est un vrai signal, pas du bruit Montez le capteur sur silentblocs ; le filtre ne peut les distinguer
Le filtre complémentaire se comporte différemment d’un tutoriel α dépend de dt Calculez α pour votre fréquence de boucle

Essayez vous-même

Dans le simulateur de capteurs du robot, vous pouvez doser bruit, biais, dérive et pertes, puis comparer les données brutes aux estimées passe-bas, moyenne glissante et médiane. C’est le chemin le plus rapide pour sentir le compromis bruit-contre-retard — le même compromis qui décide de la réaction d’un robot dans le simulateur d’évitement d’obstacles.

Explorer le graphe

Fait partie de ces réalisations

Les projets et parcours d'apprentissage qui incluent ce tutoriel.

Pour aller plus loin

Références