Quale algoritmo dovrei implementare per programmare un robot per la pulizia delle stanze?


25

Per questa domanda supponiamo che le seguenti cose siano sconosciute:

  • Le dimensioni e la forma della stanza
  • La posizione del robot
  • La presenza di eventuali ostacoli

Supponi anche che le seguenti cose siano costanti:

  • Le dimensioni e la forma della stanza
  • Il numero, la forma e la posizione di tutti gli ostacoli (se presenti)

E supponiamo che il robot abbia le seguenti proprietà:

  • Può avanzare solo con incrementi di unità assolute e ruotare in gradi. Anche l'operazione che si sposta tornerà vera se ha avuto successo o falsa se non si è mossa a causa di un'ostruzione
  • Una fonte di energia ragionevolmente illimitata (diciamo che è un robot ad energia solare posizionato su una stazione spaziale che si affaccia sempre al sole senza soffitto)
  • Ogni movimento e rotazione viene eseguito con assoluta precisione ogni volta (non preoccuparti di dati inaffidabili)

Infine, considera le seguenti proprietà dell'ambiente del robot:

  • Essendo su una stazione spaziale senza soffitto, la stanza è una distanza sicura ma frustrantemente vicina alle comete che passano, quindi la polvere (e il ghiaccio) riempiono costantemente l'ambiente.

Mi è stata posta una versione molto più semplice di questa domanda (la stanza è un rettangolo e non ci sono ostacoli, come ti sposteresti su di esso garantendo che potresti almeno ogni parte su ogni parte) e dopo ho iniziato a chiedermi come affrontare questo problema se non potessi non garantisce la forma o la presenza di ostacoli. Ho iniziato a guardare questo con l'algoritmo di Dijkstra , ma sono affascinato nel sentire come gli altri si avvicinano a questo (o se c'è una risposta ben accettata a questo? (Come fa Roomba a farlo?)


tag come + algoritmo e + teoria aiuterebbero una domanda come questa ma non ho ancora la reputazione di aggiungerle
Jason Sperske,

sicuramente qualcosa di meglio di Roomba
Octopus il

Interessante. Ho bobsweep ed è programmato perfettamente momblogsociety.com/meet-newest-addition-family-bobsweep lo consiglio a tutti. Saluti!

1
Questa è una pubblicità? Altrimenti, potresti voler pubblicare informazioni, piuttosto che solo il link, spiegando come si comporta il robot e perché è semplicemente perfetto.
Shahbaz,

Risposte:


18

Per quanto ne so, questo problema non è stato "risolto".

Formalmente, questo è un problema di copertura online. Copertura, perché dobbiamo coprire ogni punto del piano e online perché non abbiamo accesso offline alla mappa. Se sei interessato ai risultati più recenti, ti suggerisco di cercare " algoritmi robotici di copertura online ", forse su Google Scholar (ci sono molti e molti grandi risultati). Oltre al post (re) molto colorato di @ embedded.kyle, aggiungerò alcuni dettagli (cercherò anche di trovare rapidamente alcuni semplici risultati):

  • Dijkstra ti fornirà un percorso, ma non necessariamente una copertura. Ad esempio, come si specifica a Dijkstra che è necessario visitare ogni punto del grafico, anziché visitare un punto il più rapidamente possibile? È possibile eseguire percorsi più brevi di tutte le coppie, ma quali sono i punti? Non hai una mappa.

  • Algoritmi online come questo sono spesso chiamati algoritmi "bug" perché tendono ad apparire come un bug che vaga in un'area, urtando qualcosa e vagando un po 'attorno ad essa.

  • Senza ostacoli, e una stanza rettangolare, e supponendo che inizi sul confine un percorso boustrophedon (via del bue) è ottimale. inserisci qui la descrizione dell'immagine

Divertente che gli agricoltori lo facciano da sempre, giusto? http://it.wikipedia.org/wiki/Boustrophedon . Questo può essere esteso alle stanze con ostacoli trovando un'area approssimativamente rettangolare che è priva di ostacoli. Howie Choset ci ha lavorato un po ' .

  • π*d2d
  • Questa è un'area enorme e affascinante. Mi dispiace non poter fornire un riepilogo migliore!

Il problema più grande è che non hai una mappa. Senza una mappa, sei limitato a semplici azioni come seguire il perimetro e spostarti lungo un percorso (come la spirale menzionata). Quindi, esistono alcuni robot che costruiscono effettivamente la mappa durante la pulizia, scompongono l'area tracciata in forme, quindi coprono ogni forma per garantire la copertura. Vedi: http://mintcleaner.com/


9

Roomba inizia a spirale fino a quando non colpisce qualcosa, quindi esegue una scansione perimetrale. Quindi rimbalza. Roomba è lo standard di fatto negli aspirapolvere robot domestici, immagino che si possa definire la "soluzione accettata". Ma per esperienza personale (ne possiedo due), c'è sicuramente margine di miglioramento.

Da come funziona roba :

algoritmo

Da un'intervista a Nancy Dussault Smith, Vice President of Marketing Communications presso iRobot:

All'inizio noterai un motivo a spirale, che si espanderà su un'area sempre più grande fino a quando non colpisce un oggetto. Quando trova un oggetto, seguirà il bordo di quell'oggetto per un certo periodo di tempo, quindi inizierà a incrociarsi, cercando di capire la distanza massima che può percorrere senza colpire un altro oggetto, e questo lo aiuta a capire quanto è grande lo spazio, ma se dura troppo a lungo senza colpire un muro, ricomincerà a spirale, perché immagina di trovarsi in uno spazio spalancato, e lo calcola e lo capisce costantemente.

È simile ai sensori di sporcizia sottostanti, quando uno di quei sensori viene attivato cambia i suoi comportamenti per coprire quella zona. Andrà quindi alla ricerca di un'altra area sporca in un percorso rettilineo. Nel modo in cui questi diversi schemi si accatastano l'un l'altro mentre vanno, sappiamo che è il modo più efficace per coprire una stanza.

I modelli che abbiamo scelto e il modo in cui l'algoritmo è stato originariamente sviluppato si basavano su algoritmi basati sul comportamento nati dal MIT che studiavano animali e su come procedono alla ricerca di cibo nelle aree. Quando guardi come escono le formiche e le api e cercano le aree, questo tipo di copertura e la comprensione di tutto ciò viene da quella ricerca. Non è esatto, ovviamente, non sto dicendo che siamo api, ma è quella comprensione di come cercare un'area nella natura che è la base dietro lo sviluppo della nostra tecnologia adattiva.

Alcune foto a lunga esposizione di Roombas con LED su di esse illustrano come funziona in pratica:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


È un contenuto copia-incolla dal link?
Josh Vander Hook,

@Josh Il materiale pertinente per rispondere alla domanda è stato copiato dai siti collegati e inserito in una quotazione in blocco al fine di prevenire la putrefazione dei collegamenti.
embedded.kyle

7

Neato utilizza un approccio organizzato. Usando SLAM e paraurti, mappa la stanza "attuale", prima perimetrale, quindi applica alcuni algoritmi per la pulizia nel modo più efficiente possibile. Non ho mai posseduto un Roomba, ma dato quello che ho letto sul suo algoritmo, non passerei mai da un neato.

Il telemetro laser nel neato è spesso cannabizzato per la robotica, in quanto è un sensore economico per gli algoritmi SLAM.

Se mi venisse assegnato il tuo compito, per prima cosa troverei un'implementazione SLAM adatta , basata sull'hardware che avevo.

Quindi utilizzerei un algoritmo di pianificazione Motion ISLAND di CNC . La mia esperienza è che tendono ad essere molto efficienti nel coprire un'area arbitraria con la minima quantità di movimento.


SLAM non è del tutto appropriato per questo problema perché è una simulazione in cui non c'è incertezza nel posizionamento. Per un vero robot, hai assolutamente ragione.
Ian,

L'ho perso (se è lì). In realtà dice che i seguenti sono sconosciuti; la posizione del robot.
Spiked3

Pensavo che la posizione fosse iniziata come sconosciuta, ma quando è stata creata una topologia della stanza potrebbe essere conosciuta.
Jason Sperske,

Questo è uno di quegli strani problemi accademici in cui le semplificazioni producono strane implicazioni. Dato che non hai una mappa, una posizione di partenza, un posizionamento perfetto e nessuna entità esterna con cui coordinarti, la posizione assoluta è irrilevante. Decidi arbitrariamente che (0,0) è il tuo punto di partenza, quindi costruisci la tua mappa relativa a quel punto. Questo non è davvero pratico nel mondo reale, ma ti dà un po 'di pratica con gli algoritmi di copertura.
Ian,

La tua risposta è buona dal punto di vista dei sistemi. Tuttavia, credo che questa domanda sia una migliore teoria / algoritmi.
Josh Vander Hook,

6

La prima cosa che devi stabilire è l'obiettivo del robot - non abbastanza chiaro dalla tua domanda. Il robot deve svolgere due compiti principali: scoprire la forma dell'area lavabile e quindi pulirla.

Ma la quantità di sporco è costante? Lo sporco viene aggiunto costantemente? Il tuo obiettivo è ridurre al minimo il tempo medio di permanenza dello sporco sul pavimento o il tempo mediano? L'obiettivo è mantenere il pavimento ugualmente pulito? O è solo per pulire una volta, il più rapidamente possibile? Ci sono schemi nell'accumulo di sporcizia che puoi misurare e usare a tuo vantaggio per raggiungere il tuo obiettivo?

La risposta a queste domande ti aiuterà a guidare l'algoritmo che scegli. Nel caso del robot di Roomba, potrebbe non essere utile imparare l'esatta disposizione della stanza perché mobili (come sedie attorno a un tavolo), persone e altri ostacoli si muovono molto spesso. Tuttavia, nel tuo caso potrebbe essere meglio esplorare lo spazio per costruire una mappa completa (una combinazione di un modello di rasaerba con bordi di ricerca), quindi utilizzare quella mappa per calcolare il percorso più breve attraverso lo spazio (il termine è "copertura", e ci sono diversi modi per farlo, ad es . con l' algoritmo spanning tree ).

Un'altra cosa di cui devi preoccuparti è come discretizzare lo spazio in cui ti trovi. Perché puoi muoverti in qualsiasi direzione - anche con quantità di gradi interi e unità di distanza intere - le tue posizioni X e Y possono avere frazionarie valori. Dovrai decidere come rappresentare gli ostacoli su quella mappa senza farla diventare un numero infinito di punti dati.


Bene, dal momento che sto facendo sadicamente una domanda di intervista più dura su me stesso, suppongo di poter trovare qualche informazione in più. Mi piacciono i punti che stai sollevando :)
Jason Sperske il

2

Non sono sicuro se ne hai ancora bisogno, ma per coloro che sono capitati a Google per questo thread, ho realizzato una versione semplice dell'algoritmo.

Fondamentalmente, cerca di costruire la mappa dell'area mentre pulisce e usa la mappa per trovare il nodo non più vicino (parte della stanza). Quando non ne trova nessuno, significa che la stanza viene pulita (o le parti non pulite sono inaccessibili al robot).

Potrebbe essere più lento di altri algoritmi, ma può garantire la copertura indipendentemente dalla posizione di partenza, dalla direzione e dagli ostacoli.

https://github.com/dungba88/cleaner_robot

AGGIORNAMENTO: ho fatto una demo qui e confrontandola con un DFS di backtracking. Quindi, anche se il mio algoritmo è O (N ^ 2), è molto più ottimizzato in termini di numero di mosse e turni.

http://jenova.dungba.org/cleaner/showdown


Interessante, quindi divide la stanza in una griglia 2D, sto ancora leggendo il tuo codice, quale approccio di ricerca del percorso usi per raggiungere le tue regioni non pulite? Dijkstra?
Jason Sperske,

Ho usato BFS per trovare la posizione non pulita più vicina.
Anh Dũng Bùi,

-1

Osservando il problema più semplice che ti è stato chiesto: una stanza rettangolare, senza ostacoli e pulire ogni parte almeno una volta.

La soluzione è trovare un angolo della stanza e trovare un angolo non sarà un grosso problema. Una volta ottenuto ciò, segui semplicemente un percorso a spirale verso il centro della stanza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.