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.
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 :
- Tenez le capteur parfaitement immobile contre une entrée connue et invariable.
- Enregistrez quelques milliers d’échantillons bruts avec horodatages.
- Calculez la moyenne et l’écart type.
- 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