Simulatore interattivoIntermedio

Simulatore di copertura per robot aspirapolvere

Confronta nel browser la copertura casuale con rimbalzo, a spirale e boustrophedon, misurando ogni strategia rispetto alla distanza di una spazzata perfetta.

Categoria
Robot autonomi
Tempo
20–40 min
Piattaforma
Browser · Arduino · Raspberry Pi
Schema tecnico: Simulatore di copertura per robot aspirapolvereBRUSHSERPENTINE COVERAGE PATH

01 / Inizia qui

Introduzione

Coprire un pavimento non equivale a raggiungere un luogo. Un pianificatore trova una rotta verso un obiettivo; un pianificatore di copertura deve toccare ogni quadrato raggiungibile, e la misura onesta è la distanza percorsa per metro quadro pulito. Il laboratorio confronta copertura casuale con rimbalzo, spirale in espansione e spazzata serpentina nella stessa stanza, misurando ciascuna con il massimo teorico.

Live lab / Coverage path planning

Coverage path planning simulator

Three ways to cover a floor — random bounce, expanding spiral, and a planned boustrophedon sweep — measured against the one number that matters: the distance a perfect robot would need.

Browser native
A top-down coverage lab. A robot sweeps a room containing four pieces of furniture using the selected strategy, shading each patch of floor as its brush passes over it. Use the controls below to run it, and the keyboard hint to move the furniture.
A plot of floor covered against distance travelled. The straight dashed line is a perfect systematic sweep; the curved dashed line is the theoretical result for random sweeping, one minus e to the minus d over optimal; the solid line is the run happening above.

Shaded floor is covered. The thin line is where the robot has driven, the circle is its brush. Below, the same run plotted as coverage against distance — the dashed straight line is a perfect sweep, the dashed curve is the theory for random sweeping. Drag furniture to rebuild the room.

  • Covered floor
  • Furniture (drag it)
  • Path driven
  • Perfect sweep
Simulation

Ready. Press Start to sweep the room, or Step to advance one move.

Covered
0%
Distance
0.00× optimal
Half the floor
—
90% covered
—
99% covered
—
Bumps
0

Keyboard: focus the room, then Space to run/pause, N to step, R to reset, M for a new room, F for full screen. Press 1–4 to pick a piece of furniture and the arrow keys to move it.

Controlli

Strategia passa da una all’altra. La stanza viene ricostruita e l’esecuzione riparte immediatamente, perché un valore di copertura ha significato qualcosa solo per la stanza in cui è stato misurato.

Trascina un qualsiasi mobile con il puntatore oppure premi 1–4 per selezionarne uno e spostarlo con i tasti freccia. L’esecuzione riparte mentre lo trascini. Metti un tavolo al centro del pavimento e guarda aumentare la distanza della spazzata pianificata mentre diminuisce la copertura.

Nuova stanza distribuisce di nuovo i mobili. Velocità di esecuzione scambia morbidezza e pazienza — la strategia casuale ha bisogno di diverse migliaia di mosse per terminare, quindi iniziala ad alta velocità.

Teoria

Un pianificatore di percorso risponde alla domanda come arrivo lì. Un pianificatore di copertura risponde alla domanda come li tocco tutti, e i due hanno quasi nulla in comune.

L’unico metro onesto è la distanza che servirebbe a un robot perfetto. Con un pavimento di area A e una spazzola di larghezza w, coprire ogni quadrato una sola volta senza ripetizioni richiede:

d_optimal = A / w

Tutto ciò che il laboratorio riporta è un multiplo di quel numero. Una strategia a 1.2× impiega il 20% della propria vita a ripercorrere un pavimento già fatto; una a 8× ne impiega sette ottavi.

Il rimbalzo casuale ha una forma chiusa, e non è incoraggiante. Un robot senza mappa copre il nuovo pavimento in proporzione a quanto è ancora scoperto, quindi l’area non coperta decade esponenzialmente:

covered(d) ≈ 1 − e^(−d / d_optimal)

Questa è la curva tratteggiata nel grafico. Leggi tre punti: il 63% del pavimento dopo una distanza ottimale, il 90% dopo 2.3 e il 99% dopo 4.6. L’ultimo decimo della stanza costa il doppio dei primi tre quarti — il problema del collezionista di coupon, con una spazzola.

La copertura sistematica è lineare, quindi termina a 1× più il sovraccarico dovuto alla spaziatura delle file e alle inversioni. In questo laboratorio il sovraccarico è di circa il 35%.

Le esecuzioni misurate restano vicine alla teoria e, quando se ne discostano, lo fanno nella direzione prevista: una vera camminata casuale rivisita il pavimento vicino invece di teletrasportarsi, quindi è leggermente peggiore di quanto suggerisca la curva di campionamento indipendente.

Algoritmo

Rimbalzo casuale. Guidare dritti. In caso di urto scegliere a caso una nuova direzione e verificare che sia libera. È tutto, e richiede un solo bit di percezione e nessuna memoria.

Spirale, poi spostamento. Ruotare di un angolo inversamente proporzionale alla distanza percorsa dal centro: si traccia così una spirale in espansione. In caso di urto, avanzare rettilineo per una distanza fissa e iniziare una nuova spirale. Eccellente su un pavimento aperto — una spirale ha quasi nessuna sovrapposizione — e impotente in una stanza affollata, dove ogni spirala viene interrotta dopo pochi giri.

Spazzata serpentina pianificata. Tre passaggi, e il secondo è quello che le persone saltano:

  1. Gonfiare. Ingrandire ogni ostacolo del raggio del robot più un margine di sicurezza. Ciò che rimane è dove può andare il centro del robot.
  2. Affettare. Percorrere la mappa gonfiata a file distanti una larghezza di spazzola. Ogni file diventa uno o più tratti liberi.
  3. Unire. Visitare i tratti in ordine serpentino e collegare tratti consecutivi con il percorso più breve attraverso lo spazio libero, così il robot passa attorno al divano invece che dentro.

Il passaggio 3 è l’origine del sovraccarico in distanza ed è il motivo per cui una stanza affollata penalizza un pianificatore più di una vuota.

Codice sorgente

La strategia casuale è quella che vale la pena avere per prima su un robot reale, perché funziona con la percezione che hai già:

// Random-bounce coverage. Two bump switches, no map, no encoders.
const uint8_t BUMP_L = 2, BUMP_R = 3;
const uint16_t CRUISE = 170;      // PWM
unsigned long turnUntil = 0;
int turnDir = 1;

void loop() {
  bool left  = digitalRead(BUMP_L) == LOW;   // switches are active-low with pull-ups
  bool right = digitalRead(BUMP_R) == LOW;

  if (millis() < turnUntil) {                 // still executing a bounce
    drive(turnDir * CRUISE, -turnDir * CRUISE);
    return;
  }

  if (left || right) {
    // Back off first — turning while wedged against a chair leg does nothing.
    reverseFor(320);
    // A random turn between 90 and 270 degrees. The randomness is what stops the
    // robot tracing the same closed loop around the room forever.
    turnDir = right ? -1 : 1;
    turnUntil = millis() + random(420, 1250);
    return;
  }

  drive(CRUISE, CRUISE);
}

L’angolo di rimbalzo deve essere casuale. Una riflessione fissa trasforma la stanza in un tavolo da biliardo e una palla da biliardo su un tavolo rettangolare traccia un percorso chiuso che manca quasi sempre la maggior parte della superficie per sempre.

La spazzata pianificata richiede il passaggio gonfia-affetta-unisci descritto sopra e un’odometria abbastanza buona da mantenere una file dritta, che è una classe di robot diversa. Prototipala qui, dove la posizione è esatta per costruzione, prima di decidere se il tuo hardware può sostenerla.

Ipotesi e differenze hardware

Il laboratorio dà al robot un’odometria perfetta, una mappa perfettamente nota, rotazioni istantanee sul posto e una spazzola che copre un cerchio pulito. Una macchina reale non ha nulla di tutto questo.

Lo slittamento delle ruote e la deriva del giroscopio separano le file entro circa dieci, ed è per questo che i robot commerciali si rlocalizzano rispetto a pareti, elementi del soffitto o un segnalatore. Le inversioni richiedono tempo, che questo laboratorio addebita come distanza zero. E la spazzola non copre un cerchio: copre un rettangolo dietro il robot, quindi tornare indietro sul pavimento già fatto non pulisce nulla.

La differenza tra le strategie sopravvive a tutto questo. Se qui un pianificatore batte il rimbalzo casuale di 3×, su hardware reale lo batte forse di 2×; l’ordine non cambia.

Schema elettrico

La percezione si divide nettamente in tre compiti, e solo il primo è obbligatorio.

Urto. Due microswitch su un paraurti elastico anteriore, collegati attivi bassi a pin capaci di interrupt con le resistenze di pull-up interne abilitate. Questa è la percezione che rende possibile il rimbalzo casuale ed è l’ultima cosa a guastarsi.

Bordo. Sensori di riflettanza rivolti verso il basso agli angoli anteriori, letti a ogni passaggio del ciclo. Un’esecuzione di copertura visita ovunque, cosa che include la sommità delle scale — il calcolo di quanto il robot può superare il bordo prima di fermarsi è svolto qui.

Posizione. Encoder in quadratura su entrambe le ruote e un giroscopio se vuoi file che restino parallele. Solo la strategia pianificata ne ha bisogno, e proprio questa necessità è il motivo per cui esistono le altre due.

Per le strategie di copertura come progetto, vedi il robot per la copertura della stanza; per lo strato reattivo sotto tutte quante, il simulatore di evitamento ostacoli copre le soglie di arresto e la scansione.

Checklist hardware

Componenti

  • Base a trazione differenziale di cui puoi misurare la larghezza della spazzola
  • Rilevamento di urto che continua a funzionare anche contro i mobili
  • Encoder, se il robot deve pianificare invece di vagare
  • Sensore di bordo, perché la copertura finisce sulle scale

Esplora il grafo

Dove si usa questo simulatore

I progetti, i percorsi di apprendimento e i tutorial che si basano su questo laboratorio.

Continua a costruire

Scarica le risorse

Usa questi riferimenti nella pagina mentre lavori al progetto. I pacchetti di progetto scaricabili verranno aggiunti solo dopo la pubblicazione del loro codice sorgente e della loro versione.

Domande comuni

Domande frequenti

Perché gli aspirapolvere economici rimbalzano in modo casuale?

Perché il rimbalzo casuale non richiede una mappa, né encoder, né localizzazione — l'intera strategia consiste nel guidare dritto e ruotare di una quantità casuale quando si urta qualcosa. Funziona su un microcontrollore a otto bit con due interruttori di urto. Il laboratorio mostra quanto costa: la prima metà del pavimento viene coperta con la stessa rapidità di una spazzata pianificata, ma il 90 percento richiede circa tre volte la distanza ideale e il 99 percento sei o più volte. Il robot arriva comunque alla fine, ed è per questo che la strategia sopravvive — impiega solo un'ora a fare il lavoro di venti minuti.

Perché la copertura è così lenta alla fine e così veloce all'inizio?

Perché un robot che spazza senza una mappa copre il nuovo pavimento in proporzione a quanto terreno è ancora scoperto. All'inizio quasi tutto ciò che attraversa è nuovo; alla fine quasi tutto è un passaggio ripetuto. Si ottiene il classico avvicinamento esponenziale, una copertura di circa uno meno e alla meno d rispetto all'ottimale, che il laboratorio disegna come curva di riferimento tratteggiata. È la stessa matematica del problema del collezionista di coupon e significa che l'ultimo decimo di una stanza costa più dei primi tre quarti.

Se la spazzata sistematica è così migliore, perché il laboratorio la interrompe al 90 percento?

Perché un pianificatore deve tenere il corpo del robot lontano da tutto, quindi pianifica un percorso che mantiene un margine da ogni parete e ogni gamba di un tavolo — e non copre mai ciò che non può raggiungere. In questo laboratorio, 130 dei 133 quadrati che la spazzata pianificata manca si trovano entro due celle da una parete o da un mobile. Ecco perché gli aspirapolvere robotici reali hanno una spazzola laterale che sporge oltre il telaio e seguono le pareti con un passaggio separato. Il rimbalzo casuale raggiunge prima o poi quei bordi, puramente per caso.

Di cosa ha bisogno la spazzata pianificata che quella casuale non richiede?

Ha bisogno di sapere dove si trova. Una rotta serpentina ha senso solo se il robot può guidare in linea retta, ruotare di un angolo noto e spostarsi lateralmente di una larghezza della spazzola — cioè ha bisogno di odometria, e l'odometria deriva. Il laboratorio pianifica su una mappa perfetta con un robot perfetto, quindi considera il suo valore di 1.35 volte l'ottimale come il limite inferiore di ciò che una macchina reale può ottenere, non come un obiettivo. Aggiungi slittamento delle ruote e deriva del giroscopio e le file smettono di essere parallele entro circa dieci file.

Quanto larghe devono essere le file?

Una larghezza della spazzola, meno una sovrapposizione scelta deliberatamente. Se le spazi esattamente di una larghezza, qualsiasi errore di orientamento lascia una striscia non pulita tra le file che nessun passaggio successivo troverà. Con una sovrapposizione del 10–20 percento le strisce si chiudono al costo della stessa percentuale in distanza. Il laboratorio spazia le file in base al numero intero di celle più grande coperto dalla spazzola, ed è per questo che la distanza risulta 1.35 volte l'ottimale anziché 1.0 — il sovraccarico è reale e ogni robot da copertura ne paga una sua versione.

Si applica a qualcosa oltre agli aspirapolvere?

È lo stesso problema per un robot tagliaerba, un pulitore di piscine, una lavasciuga, un'irroratrice per colture e un drone di rilevamento. Tutti hanno una larghezza di lavoro, una regione da coprire e un budget energetico che rende la distanza la quantità da minimizzare. Le strategie differiscono soprattutto per la possibilità di permitersi la percezione necessaria a sapere dove si trova — un drone di rilevamento ha il GPS e pianifica sempre; un pulitore di piscine non ha nulla e vaga sempre.

Per approfondire

Fonti

Fonti autorevoli per andare oltre il modello didattico, volutamente limitato, di questo simulatore.