Mobot#

Articolo di Cosku Acay, Edwin Cho, Kenneth Li e Nishant Pol. PDF.

Descrizione del progetto#

Nella competizione Mobot della Carnegie Mellon, i robot devono attraversare una serie di 14 cancelli posizionati lungo una linea bianca curva di 255 piedi su un marciapiede all’aperto. Il percorso include due rampe ripide e un’area con punto di decisione in cui il robot deve selezionare il percorso corretto per attraversare i 14 cancelli in ordine seriale. Poiché la linea è all’aperto e sottoposta al clima di Pittsburgh, il robot deve funzionare in una varietà di condizioni. Quest’anno il giorno della competizione era piovoso e ventoso. Ulteriori informazioni si trovano su http://www.cs.cmu.edu/mobot/mobot.html

Mobot Mobot

Mobot (full size)Mobot (full size)

Soluzione con la CMUcam4#

Abbiamo scelto di affrontare il compito del line following usando la CMUcam4 perché richiedeva un hardware minimo e aveva un’interfaccia ben adatta al tracciamento di una linea.

Mobot hardware Mobot hardware (full size)

La CMUcam4 acquisisce un’immagine della linea a 30 fotogrammi al secondo e invia l’immagine di tracciamento del colore all’Arduino Mega tramite una delle tre linee seriali. L’Arduino Mega elabora quindi questa immagine (vedi la Descrizione del software qui sotto) e fornisce i comandi di velocità del motore e di svolta al controller PID tramite un’altra linea seriale. Il controller PID a sua volta fornisce all’Arduino Mega i conteggi dell’encoder sia per la ruota destra che sinistra, il che ci consente di tenere traccia della nostra posizione e direzione rispetto al gate 0.

Il controller PID (MD-25) è prodotto da Robot-Electronics nel Regno Unito. Pilota due motori a spazzole DC con riduttore dotati di encoder magnetici sull’albero del motore. Lo schermo LCD è a scopo di debug. Avevamo due rail di alimentazione, 12V per i motori e 5V per la logica, che condividevano la stessa massa ed erano entrambi alimentati da una singola batteria ricaricabile da 12V.

Inizialmente avevamo pianificato di realizzare un prototipo da una base di legno per passare rapidamente alla fase di programmazione, poi lavorare su una base più veloce e affidabile come un’auto RC. Tuttavia, abbiamo scoperto che il prototipo era molto affidabile e facile da usare, quindi lo abbiamo mantenuto per il progetto finale. L’impermeabilizzazione della carrozzeria consisteva in uno strato di pellicola di cellophane sotto uno strato di nastro da imballaggio. La pioggia però filtrava attraverso il nastro da imballaggio ma fortunatamente non attraverso la pellicola di cellophane. La telecamera era coperta da un quadrato di plastica proveniente da un sacchetto Ziploc poiché abbiamo scoperto che il «filtro» migliorava la capacità della telecamera di ignorare piccole macchie della linea che, per la telecamera, sembravano il cemento di sfondo.

Descrizione dell’algoritmo#

Contesto#

Usiamo la CMUcam4 in modalità di tracciamento del colore con la modalità YUV abilitata, che ci fornisce una rappresentazione binaria dell’immagine della linea. Il software della telecamera filtra tutto ciò che non è bianco (cioè lo sfondo) e mette un pixel «acceso» dove c’è una linea (dove è bianca). Usiamo la modalità YUV in modo che il tracciamento del colore sia insensibile all’intensità della luce, così che il nostro robot possa funzionare in un’ampia varietà di condizioni, sia al chiuso che all’aperto.

Line Following#

La CMUcam4 fornisce al nostro chip Arduino un’immagine binaria di 80 per 60. Campioniamo 10 righe di pixel equispaziate dall’immagine e calcoliamo il centroide dei pixel «accesi» (vedi qui: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Assumiamo quindi che la linea si trovi sul centroide. Facendo questo su 10 righe diverse nell’immagine, otteniamo una buona approssimazione della linea collegando i punti. Possiamo poi utilizzare questi dati individuando quanto ciascun punto della linea è distante dalla linea verticale che si trova al centro dell’immagine per ottenere un valore che rappresenta quanto è curva la linea. Questo può essere visto come qualcosa di simile al trovare l’area tra la linea tangente e una curva e utilizzare quell’area per determinare di quanto dobbiamo girare. Il segno determina se la svolta è a sinistra o a destra, mentre la magnitudine determina di quanto dobbiamo girare per seguire la linea. Come ci si aspetterebbe, se misurassimo un’area pari a zero, allora la linea si trova direttamente di fronte al robot ed è una linea retta. Se la magnitudine dell’area è grande, allora il robot deve girare per cercare di minimizzare la magnitudine di quest’area.

Punti di decisione#

Per determinare se il robot si trova a un punto di decisione, prendiamo i dati che la telecamera raccoglie dal line following e controlliamo quanti punti centrali medi appaiono nello spazio nero. Questo funziona basandosi sul presupposto che il punto medio tra due linee non dovrebbe trovarsi su nessuna delle due linee, a meno che le linee non siano la stessa linea. Se il robot rileva più punti medi nello spazio nero, può concludere che qui devono esserci due linee. Quindi seleziona la svolta appropriata e orienta la sua sterzata verso quella direzione finché non vede solo una linea.

Vai su https://github.com/cacay/Mobot per vedere una versione semplificata del nostro codice o qui per una copia locale.