Tutorial · Intermedio · 30 min

Navigazione GPS a punti di passaggio per un robot da esterno

Converti latitudine e longitudine in metri per il robot e scopri perché un fix GPS a 1 Hz, da solo, rende un robot seguilinea quattordici volte peggiore.

I gradi sono l’unità sbagliata per un robot

Un modulo GPS fornisce latitudine e longitudine in gradi. Ogni controllore che possiedi vuole metri. La conversione è il primo compito ed è più facile di quanto suggerisca Internet.

Sui pochi centinaia di metri percorsi da un rover hobbistico, la Terra è sufficientemente piatta da rendere un’approssimazione equirettangolare accurata ben oltre il rumore del ricevitore stesso:

north (m) = (lat − lat₀) × 111 320
east  (m) = (lon − lon₀) × 111 320 × cos(lat₀)

Scegli una volta un’origine lat₀, lon₀, all’inizio della missione: ogni punto di passaggio diventerà una normale coppia (east, north) in metri che pure pursuit può seguire senza sapere che cos’è un grado.

La formula dell’haversine è più corretta, ma non ti serve. Diventa importante su centinaia di chilometri; a 500 m i due risultati coincidono entro pochi millimetri, tre ordini di grandezza sotto il tuo errore.

Il numero da ricordare: un grado di latitudine è 111.3 km, quindi cinque cifre decimali danno 1.1 m e sei danno 11 cm. Memorizza i punti di passaggio con sei cifre. Oltre questo stai memorizzando rumore e un float su un AVR contiene soltanto circa sette cifre significative: abbastanza per 19.076123, non per nient’altro. Per questo converti in metri rispetto a un’origine anziché fare aritmetica sui gradi grezzi.

Tre problemi di un fix

È in ritardo. Un tipico NEO-6M comunica a 1 Hz. A 1.5 m/s il robot percorre 1.5 m fra un fix e l’altro e il fix ricevuto descrive dove si trovava quando è stata calcolata la soluzione, non dove si trova adesso.

È rumoroso. Un GPS di consumo si trova entro circa 2.5 m dalla verità metà delle volte, all’aperto e con il cielo sereno. Sotto gli alberi, accanto a un edificio o con una geometria satellitare scarsa è molto peggio e il guasto non è una perdita di segnale rilevabile, ma una risposta sbagliata ma plausibile.

Non ha un orientamento. Un fix GPS è una posizione. Non può indicarti verso dove è rivolto il robot, perché un robot fermo rivolto a nord e lo stesso robot rivolto a sud producono fix identici. La direzione rispetto al suolo deriva da posizioni consecutive ed è significativa solo quando il robot si muove davvero: sotto circa 1 m/s è quasi tutto rumore.

Che cosa comporta per un robot seguilinea

Fornisci allo stesso controllore pure pursuit la stessa rotta due volte, una con odometria perfetta e una con un fix a 1 Hz a ±1.5 m mantenuto tra un aggiornamento e l’altro:

Due pannelli sovrapposti. Quello superiore mostra la rotta come linea tratteggiata con due percorsi sovrapposti: il percorso odometrico coincide con la linea, mentre quello GPS ondeggia chiaramente attorno a essa e punti rossi dispersi indicano i fix rumorosi forniti al controllore. Il pannello inferiore rappresenta l'errore assoluto trasversale al percorso per entrambi, con la traccia GPS che raggiunge ripetutamente due o tre metri mentre quella odometrica resta vicina a zero.
Stesso controllore, stessa rotta, stessa regolazione. Il fix a 1 Hz costa 0.09 m RMS contro 1.25 m, quattordici volte peggio, e 4.5× lo sforzo di sterzo, mentre il robot si slancia verso ogni nuovo fix. Scarica SVG

Nota che cosa non sta accadendo: il robot non si perde. Resta all’incirca sulla rotta e raggiunge la fine. La navigazione basata solo sul GPS funziona, ma è enormemente peggiore di quanto sembri sulla scheda tecnica e il costo ricade soprattutto sull’attuatore.

Le tre soluzioni, in ordine di valore

1 — Fusiona, non seguire. Integra l’odometria delle ruote e una fonte di orientamento alla frequenza del loop e usa ogni fix GPS per correggere quella stima anziché sostituirla. Anche una semplice miscela complementare grossolana trasforma il risultato:

// 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);
}

È un filtro complementare che svolge lo stesso lavoro che svolge per l’inclinazione: un segnale che deriva ma è regolare, corretto da uno che è rumoroso ma limitato.

2 — Ricava l’orientamento da un’altra fonte. Un magnetometro fornisce un orientamento assoluto da fermo e richiede calibrazione del ferro dolce e duro, oltre a distanza dai motori. Un giroscopio fornisce un ottimo orientamento a breve termine ma deriva. Insieme sono ciò che usa ogni vero rover; la direzione GPS rispetto al suolo corregge poi la coppia quando il robot si muove abbastanza veloce da poterci fidare.

3 — Aumenta la frequenza prima di aumentare la precisione. Un modulo a 10 Hz elimina la obsolescenza responsabile di gran parte dell’ondeggiamento. Di solito è un primo aggiornamento migliore che inseguire una precisione centimetrica ed è molto più economico.

Lettura del modulo

I moduli GPS comunicano in NMEA 0183 su una porta seriale a 9600 baud: frasi separate da virgole, una per riga. Ti servono due di queste.

  • $GPRMC — ora, validità, latitudine, longitudine, velocità rispetto al suolo e direzione rispetto al suolo.
  • $GPGGA — qualità del fix, satelliti utilizzati e HDOP, la diluizione orizzontale della precisione.

Decodifica il fix, ma valuta la qualità. Due regole evitano la maggior parte dei disastri all’aperto:

  • Rifiuta un fix con stato V (void) o qualità del fix pari a 0. Continuerà a contenere numeri dall’aspetto plausibile.
  • Rifiuta un HDOP superiore a circa 2.5. L’HDOP descrive la geometria dei satelliti e una geometria errata produce una risposta convincente che può essere sbagliata di decine di metri.

Usa una libreria di parsing anziché scrivere la tua, ma leggi abbastanza delle frasi da sapere cosa stai scartando. Inoltre: un avvio a freddo richiede da 30 secondi a diversi minuti senza almanacco. Non trattare un robot che non ha ancora ottenuto un fix come un robot situato all’origine. Aspetta, mostrando in modo visibile che stai aspettando.

Imposta una geofence prima di provarlo

Un robot da esterno che si comporta male se ne va. Prima del primo test sul campo, aggiungi in software un limite rigido: una distanza massima dal punto di partenza e un arresto se viene superata.

if (hypotf(x, y) > FENCE_RADIUS) { stop(); return; }   // before anything else

Dieci righe, e sono la differenza tra un bug e un robot in un canale. Abbinala a un timeout di missione e a un’interruzione manuale che puoi raggiungere: un interruttore a leva sul piano superiore funziona e non richiede alcun collegamento radio.

Quando va storto

Sintomo Di solito
Ondeggia visibilmente lungo un tratto rettilineo Sta seguendo i fix grezzi invece di fondere; vedi la figura sopra
Fornisce una posizione convincente ma sbagliata di decine di metri Geometria satellitare errata: non hai controllato l’HDOP
La posizione è corretta, ma il robot va nella direzione sbagliata Nessuna fonte di orientamento; la direzione rispetto al suolo non ha significato a bassa velocità
I punti di passaggio finiscono nel posto sbagliato Origine non impostata oppure gradi memorizzati in un float
Niente funziona finché non è rimasto all’aperto per un po’ Avvio a freddo; attendi il fix anziché presupporre l’origine
L’orientamento oscilla vicino ai motori Il magnetometro rileva la corrente dei motori; spostalo o usa un giroscopio
Funziona all’aperto, ma fallisce vicino all’edificio Percorsi multipli. Non esiste una soluzione software; pianifica il percorso lontano dall’edificio

Percorri la stessa rotta con entrambe le fonti di posizione nel simulatore di inseguimento dei percorsi, poi costruisci il rover con navigazione GPS a punti di passaggio, dove il modulo stesso e la fusione descritta sopra costituiscono l’intero progetto.

Esplora il grafo

Fa parte di queste costruzioni

Progetti e percorsi di apprendimento che includono questo tutorial.

Per approfondire

Fonti