Tutoriel · Intermédiaire · 30 min de lecture
Navigation GPS par points de passage pour robot d'extérieur
Convertir latitude et longitude en mètres exploitables par un robot, et pourquoi une position à 1 Hz seule rend un suiveur quatorze fois moins bon.
Les degrés sont la mauvaise unité pour un robot
Un module GPS fournit latitude et longitude en degrés. Tous vos contrôleurs veulent des mètres. Convertir est le premier travail, et c’est plus simple qu’Internet ne le prétend.
Sur les quelques centaines de mètres couverts par un rover amateur, la Terre est assez plate pour qu’une approximation équirectangulaire soit exacte bien en deçà du bruit propre du récepteur :
north (m) = (lat − lat₀) × 111 320
east (m) = (lon − lon₀) × 111 320 × cos(lat₀)
Choisissez une origine lat₀, lon₀ une fois — le départ de la mission — et chaque point de passage devient une simple paire (east, north) en mètres que la poursuite pure peut viser sans savoir ce qu’est un degré.
La formule de haversine est plus exacte et vous n’en avez pas besoin. Elle compte sur des centaines de kilomètres ; à 500 m les deux s’accordent à quelques millimètres près, soit trois ordres de grandeur sous votre erreur.
Le nombre à retenir : un degré de latitude vaut 111,3 km, donc cinq décimales valent 1,1 m et six valent 11 cm. Stockez les points de passage avec six décimales. Au-delà, c’est du bruit stocké, et un float sur AVR ne porte qu’environ sept chiffres significatifs — assez pour 19.076123 et pas davantage, d’où la conversion en mètres relatifs à une origine plutôt que des calculs sur des degrés bruts.
Trois défauts d’une position
Elle est en retard. Un NEO-6M typique rend compte à 1 Hz. À 1,5 m/s le robot parcourt 1,5 m entre deux positions, et celle qu’il reçoit décrit où il était quand la solution a été calculée, pas où il est maintenant.
Elle est bruitée. Un GPS grand public tombe à environ 2,5 m de la vérité une fois sur deux, en plein air sous ciel dégagé. Sous les arbres, près d’un bâtiment, ou avec une mauvaise géométrie satellitaire, c’est bien pire — et la panne n’est pas un décrochage détectable mais une réponse fausse et plausible.
Elle n’a pas de cap. Une position GPS est une position. Elle ne peut pas dire vers où pointe le robot, car un robot immobile pointant au nord et le même pointant au sud produisent des positions identiques. Le cap fond (course-over-ground) dérive de positions successives et n’a de sens qu’en mouvement réel — sous environ 1 m/s, c’est surtout du bruit.
Ce que cela fait à un suiveur de trajectoire
Donnez au même contrôleur en poursuite pure le même parcours deux fois, une fois avec une odométrie parfaite et une fois avec une position à 1 Hz à ±1,5 m maintenue entre les mises à jour :
Notez ce qui ne se produit pas : le robot ne se perd jamais. Il reste à peu près sur le parcours et atteint la fin. La navigation au GPS seul fonctionne — elle est juste énormément moins bonne que ne le suggère la fiche technique, et le coût pèse surtout sur l’actionneur.
Les trois correctifs, par ordre d’intérêt
1 — Fusionnez, ne suivez pas. Intégrez l’odométrie des roues et une source de cap à votre fréquence de boucle, et utilisez chaque position GPS pour corriger cette estimation plutôt que la remplacer. Même un mélange complémentaire rudimentaire transforme le résultat :
// Between fixes: dead reckon. This runs at the loop rate.
x += cos(heading) * v * dt;
y += sin(heading) * v * dt;
// On a fix: pull the estimate toward it, gently. alpha near 0.1 trusts odometry
// over the second between fixes, which is exactly the right instinct.
if (newFix && fix.hdop < 2.5) {
x += ALPHA * (fixX - x);
y += ALPHA * (fixY - y);
}
C’est un filtre complémentaire qui fait le même travail que pour l’inclinaison : un signal qui dérive mais reste lisse, corrigé par un autre bruité mais borné.
2 — Prenez le cap ailleurs. Un magnétomètre donne un cap absolu à l’arrêt, et exige un étalonnage fer dur et fer doux plus de la distance avec vos moteurs. Un gyroscope donne un excellent cap à court terme et dérive. Ensemble, c’est ce qu’utilise tout vrai rover ; le cap fond GPS corrige ensuite la paire quand on va assez vite pour lui faire confiance.
3 — Augmentez la fréquence avant la précision. Un module à 10 Hz corrige l’ancienneté qui cause l’essentiel des oscillations. C’est généralement une meilleure première amélioration que de courir après la précision centimétrique, et c’est bien moins cher.
Lire le module
Les modules GPS parlent NMEA 0183 sur un port série à 9600 bauds : des phrases séparées par virgules, une par ligne. Il vous en faut deux.
$GPRMC— heure, validité, latitude, longitude, vitesse sol, cap fond.$GPGGA— qualité de position, satellites utilisés, et HDOP, la dilution horizontale de précision.
Analysez la position, mais filtrez sur la qualité. Deux règles qui évitent la plupart des catastrophes en extérieur :
- Rejetez une position avec statut
V(void) ou qualité 0. Elle contiendra quand même des nombres d’apparence plausible. - Rejetez une HDOP au-dessus d’environ 2,5. La HDOP décrit la géométrie satellitaire, et une mauvaise géométrie produit une réponse assurée mais fausse de dizaines de mètres.
Utilisez une bibliothèque d’analyse plutôt que d’écrire la vôtre — mais lisez assez les phrases pour savoir ce que vous jetez. Et aussi : un démarrage à froid prend 30 secondes à plusieurs minutes sans almanach. Ne traitez pas un robot sans position comme un robot à l’origine. Attendez, avec un voyant qui montre que vous attendez.
Géorepérez avant de tester
Un robot d’extérieur qui se comporte mal s’en va. Avant le premier essai sur le terrain, ajoutez une limite stricte dans le logiciel : une distance maximale au point de départ, et un arrêt si elle est dépassée.
if (hypotf(x, y) > FENCE_RADIUS) { stop(); return; } // before anything else
Dix lignes, et c’est la différence entre un bogue et un robot dans le canal. Ajoutez un délai de mission et une coupure manuelle accessible — un contact de collision sur le pont supérieur fonctionne et n’exige aucune liaison radio.
Quand ça tourne mal
| Symptôme | Généralement |
|---|---|
| Oscille visiblement en ligne droite | Suivi des positions brutes au lieu de les fusionner ; voir la figure ci-dessus |
| Position assurée à des dizaines de mètres | Mauvaise géométrie satellitaire — vous n’avez pas vérifié la HDOP |
| La position est bonne, le robot part du mauvais côté | Pas de source de cap ; le cap fond n’a aucun sens à basse vitesse |
| Les points de passage tombent au mauvais endroit | Origine non fixée, ou degrés stockés dans un float |
| Rien ne marche avant un moment dehors | Démarrage à froid ; attendez la position au lieu de supposer l’origine |
| Le cap oscille près des moteurs | Magnétomètre perturbé par le courant moteur ; éloignez-le ou utilisez un gyroscope |
| Fonctionne en plein air, échoue près du bâtiment | Multitrajets. Aucun correctif logiciel ; tracez l’itinéraire à l’écart |
Roulez le même parcours avec les deux sources de position dans le simulateur de suivi de trajectoire, puis construisez le rover GPS à points de passage — où le module lui-même et la fusion ci-dessus forment tout le projet.
Explorer le graphe
Fait partie de ces réalisations
Les projets et parcours d'apprentissage qui incluent ce tutoriel.
Pour aller plus loin