Progetto Artificial Intelligence

Lego Mindstorms

 

 

 

 

 

 

 

IL DELIVERY ROBOT

BRACCOBALDO

 

 

 

 

 

 

 

 

Realizzato da:

Mileo Alessandra

Radicioni Roberto

Salvetti Franco

 

 

a.a. 2000/2001

 

---

 

Indice

 

1. Introduzione

 

2. Realizzazione del progetto

 

 2.1 Scelte di costruzione

 2.2 Steps di implementazione

          Step 1 – Braccobaldo ”stupido”

Step 2 – Braccobaldo ritira e consegna

Step 3 – Braccobaldo ti da un’altra chance

Step 4 – Non intralciare Braccobaldo

 

3. Sviluppi futuri e considerazioni conclusive

 

Step n-4 - Braccobaldo rileva oggetti che non può sollevare

          Step n-3 - Braccobaldo occupato

        Step n-2 - Braccobaldo imbrogliato

Step n-1 – L’autoconservazione di Braccobaldo     

Step n – Verso un Braccobaldo intelligente

 

4. Links utili per la documentazione e l’approfondimento

 

5. Photo Gallery

 

---

 

1.Introduzione

 

Un delivery robot vaga in un determinato ambiente prelevando oggetti da una sorgente e consegnandoli ad una destinazione.

Noi partiamo da una versione semplificata, quella di M. Pagnucco, che abbiamo testato sul nostro robot indipendentemente dalle diverse caratteristiche di costruzione ed implementazione.

In tale versione base, il robot si muove seguendo una pista nera su fondo bianco, contrassegnata da 6 stazioni (6 strisce di carta di alluminio rilevabili facilmente dal sensore luminoso; parte dalla stazione 3, rivolto verso la stazione 4; alla ricezione di query del tipo +(n,m) da tastiera, si reca nella stazione ‘n’, attende che venga premuto un pulsante, poi va nella stazione ‘m’ed attende di nuovo la pressione del pulsante prima di tornare alla stazione 1.

Abbiamo poi apportato delle modifiche a tale versione affinchè si adattasse meglio alle nostre esigenze, modifiche che verranno analizzate in dettaglio nelle sezioni successive.

Il dominio all’interno del quale si muove Braccobaldo è controllato ma in un certo senso “aperto” in quanto tiene conto di eventuali imprevisti ed assume particolari comportamenti autonomi, come vedremo nell’analizzare le singole fasi della demo.

 

 

2.Realizzazione del progetto

 

Analizzeremo in questa sezione, le scelte che sono state fatte nella costruzione del robot e le ragioni che le hanno motivate, nonchè il processo di implementazione.

 

2.1 Scelte di costruzione

 

fig. 1


Come mostrato in figura 1,  il robot si sposta movendosi su cingoli anzichè utilizzando ruote: dava l’idea di maggiore stabilità.

Nella parte anteriore abbiamo scelto di montare una benna che solleva degli oggetti a T.

Abbiamo utilizzato, oltre ai vari mattoncini per la realizzazione “estetica”, le seguenti componenti:

 

*  2 motori per il movimento del robot;

*  1 motore per il movimento della benna;

*  1 sensore di contatto;

*  1 sensore luminoso.

 

Il movimento dei motori ed i sensori del robottino sono controllati da un microcomputer RCX montato sul robottino stesso, che comunica con il pc tramite una porta a infrarossi.

L’RCX e’ programmabile sia tramite un linguaggio visuale fornito direttamente con il CD rom di Legomindstorms, sia utilizzando direttamente un vero e proprio linguaggio di programmazione simile al C: il linguaggio nqc.

Poiche’ il progetto ha come punto di riferimento l’implementazione legolog, si usa un interprete golog scritto in SWI prolog, che implementa primitive di azioni e situation calculus (McCarthy).

 

2.2 Steps di implementazione

 

Come accennato nell’introduzione, siamo partiti dal programma realizzato da M. Pagnucco per la delivery, e lo abbiamo gradualmente modificato aumentando sempre più la possibilità che si verifichino eventi esterni ed imprevisti  che il robot è in grado di trattare assumendo comportamenti autonomi particolari.

Abbiamo deciso di strutturare la demo di ciò che è stato realizzato suddivisa in step.

Ad ogni step verrà illustrata una “evoluzione” di Braccobaldo, con relative modifiche del codice e dei comportamenti.

 

Step 1 – Braccobaldo ”stupido”  ( sorgente golog, sorgente nqc )

 

La prima modifica è stata quella di eliminare l’attesa dell’evento “bottone premuto” prima di ripartire, e la differenziazione delle azioni di Braccobaldo quando si trova ad una stazione in cui deve prelevare l’oggetto, piuttosto che consegnarlo.

In questa prima versione, Braccobaldo si comporta come segue:

 

*  riceve una richiesta di delivery da tastiera

*  si reca alla stazione specificata come mittente

*  solleva la benna (esegue una pickup)

*  va alla stazione di destinazione

*  abbassa la benna (esegue una putdown)

 

A differenza della versione di M. Pagnucco, abbiamo dovuto introdurre due azioni primitive diverse, la pickup e la putdown, definite nel file delivery.nqc, affinchè Braccobaldo si comportasse in due modi diversi al raggiungimento della stazione di partenza e di quella di arrivo, cioè rilevasse due diverse interrupt, stop_for_pickup(N) e stop_for_putdown(N) anziché una sola, stop_requested(N).

Abbiamo quindi modificato il codice relativo alle interrupt nel file delivery.pl perchè attivasse due diverse azioni al verificarsi di una delle due situazioni.

In questa versione, Braccobaldo è chiamato “stupido” poichè indipendentemente della presenza dell’oggetto alla stazione richiesta, lui solleva la benna, arriva a destinazione e l’abbassa.

Se mentre la benna e’ alzata Braccobaldo transita in una stazione dalla quale è stata richiesta una delivery, non la effettua se non dopo aver depositato l’oggetto che ha (ipoteticamente) in mano alla stazione di destinazione.

Già da questa “primitiva” versione, Braccobaldo “ricorda” le richieste di delivery che ha ricevuto, e quando non ha la benna alzata (non ha nulla in mano), in qualsiasi punto della pista si trovi, esegue la delivery più vicina.

Non sono previsti oggetti estranei sulla pista.

 

Step 2 –  Braccobaldo ritira e consegna ( sorgente golog, sorgente nqc )

 

In questa seconda versione, in aggiunta alla prima, Braccobaldo utilizza un sensore frontale di contatto per rilevare l’effettiva presenza di oggetti nella stazione dalla quale è stata richiesta la delivery.

Se l’oggetto si trova un attimo prima che venga rilevata la stazione, oppure nell’istante esatto in cui ciò avviene, viene emesso un suono speciale ad indicare che l’oggetto è stato trovato.

Braccobaldo prende dunque l’oggetto e lo consegna alla stazione di destinazione.

Da notare che stiamo sempre e comunque parlando di oggetti che Braccobaldo è in grado di sollevare alzando la benna, ovvero oggetti a T e di un determinato peso. Se l’oggetto ha un’altra forma e non viene perciò effettivamente sollevato, il robot considera comunque la delivery in corso di esecuzione, dal momento che ha rilevato frontalmente la presenza dell’oggetto.

Non è gestito in questa versione il caso in cui l’oggetto da sollevare sia troppo pesante per la potenza del motore che attiva il movimento della benna.

Se invece non viene trovato nessun oggetto prima o durante il rilevamento della stazione in cui dovrebbe esserci l’oggetto da prelevare, il robot entra in stato di panico, comincia ad abbassare ed alzare velocemente le pinze, ad indicare disappunto per essere stato preso in giro, e se ne torna nella stazione 1 a meno che non ci siano delle richieste di delivery pendenti.

Per realizzare il caso in cui non viene trovato nessun oggetto, abbiamo introdotto l’azione mypanic definita nel file delivery.nqc, ed introdotto la gestione del sensore di contatto tramite un evento push_sense_button che, modificando il valore di verità del fluente in_front_of_object, mette Braccobaldo in grado di capire se l’oggetto è realmente presente di fronte a lui oppure no. Questo fluente torna ad avere valore falso quando l’oggetto viene consegnato alla stazione di destinazione (quindi con la putdown).

Da questa versione in poi, Braccobaldo indietreggia un po’ dopo aver consegnato l’oggetto, per evitare di travolgerlo mentre gira per tornare alla stazione 1.

Anche qui non sono previsti oggetti estranei sulla pista.

 

Step 3 - Braccobaldo ti da un’altra chance ( sorgente golog, sorgente nqc )

 

A questo punto della sua “evoluzione”, Braccobaldo si rende conto che l’oggetto potrebbe essere posizionato anche un attimo dopo la stazione dalla quale è stata richiesta la delivery.

Quindi effettua una breve ricerca in avanti prima di entrare in panico come succedeva nella precedente versione.

Per realizzare questo comportamento, abbiamo introdotto l’azione primitiva check_front nel file delivery.nqc e modificato l’interrupt relativa nel file delivery.pl.

Dopo aver tentato di rilevare l’oggetto poco più avanti della stazione, il programma ritorna a controllare se il sensore di contatto lo ha rilevato, così che Braccobaldo possa sapere se l’oggetto è presente.

In caso affermativo, dopo aver prelevato l’oggetto ritorna indietro al punto in cui era prima di effettuare la check_front e parte alla volta della stazione destinazione.

In caso contrario entra in panico come nella versione precedente.

Anche qui non sono previsti oggetti estranei sulla pista.

 

Step 4 – Non intralciare Braccobaldo  ( sorgente golog, sorgente nqc )

 

Qui Braccobaldo comincia a riconoscere la presenza di oggetti estranei, trascinati sulla pista da topi malvagi per intralciare il suo lavoro.

Questi oggetti che spuntano all’improvviso dove non dovrebbero essere, vengono rilevati tramite lo stesso sensore di contatto usato nella versione precedente, e trasportati fuori dalla pista prima di proseguire con la delivery.

Per realizzare questo comportamento autonomo e’ stata introdotta una nuova azione, put_away, grazie alla quale il robottino

 

*   raccoglie l’oggetto estraneo

*   ruota di 90 gradi

*   si allontana dalla pista

*   ripone l’oggetto

*   torna sui suoi passi riprendendo l’attivita’ precedente.

 

Il controllo che attiva questo comportamento e’ fatto sul valore di un nuovo fluente, object_on_the_way, che segnala la presenza dell’oggetto estraneo, e della funzione unespected, che assume valore vero quando nella locazione corrente il robot non si aspetta di trovare oggetti.

Non e’ previsto il trattamento di oggetti estranei quando Braccobaldo ha le mani occupate per una delivery in corso. Tuttavia tale aspetto viene trattato nella successiva sezione.

 

 

3. Sviluppi futuri e considerazioni conclusive

 

Ci sono numerosi aspetti che non sono stati implementati in questo progetto ma che ragionevolmente potrebbero condurre Braccobaldo a sapersi sempre meglio adattare alle situazioni impreviste, muovendosi in un dominio sempre più aperto e gestendo molte più situazioni.

Forniamo qui solo alcune delle considerazioni sorte, che possono fare da spunto per future implementazioni.

 

Step n-4 - Braccobaldo rileva oggetti che non può sollevare

 

Si tratta di gestire, tramite un secondo sensore di contatto, la possibilità che nell’esecuzione della pickup la benna non riesca ad alzarsi perché l’oggetto da sollevare è troppo pesante per Braccobaldo.

A questo punto egli comunica di non essere qualificato per questo tipo di oggetti e se ne torna a casa o esegue la prossima delivery.

Potremmo trattare similmente anche i casi in cui l’oggetto ha una forma che non ne consente il sollevamento per la costruzione ed il movimento delle “braccia” del robot.

 

Step n-3 - Braccobaldo occupato

 

Braccobaldo gestisce qui la situazione in cui trovi un oggetto estraneo sul suo cammino mentre sta andando a consegnare un altro oggetto, ed ha quindi le mani occupate.

Potrebbe gestire quest’imprevisto chiedendo "Per favore liberatemi la pista, ho le mani occupate".

In alternativa potrebbe gestire autonomamente la situazione depositando l’oggetto che ha in mano, liberando la strada come faceva nella versione 4, riprendere l’oggetto e continuare la delivery.

 

Step n-2 - Braccobaldo imbrogliato

 

Per gestire le situazioni in cui qualcuno prende Braccobaldo e lo sposta in un altro punto della pista per cui egli perde il conto delle stazioni, si può fare in modo che una volta arrivato alla fine della pista (non riesce più a rilevare il nastro nero su fondo bianco tramite il sensore luminoso), si ferma e dica "Mi avete imbrogliato non mi avete messo nella stazione di partenza o mi avete spostato intralciando il mio lavoro. Considero annullate tutte le vostre richieste di delivery... torno a casa" e se ne torni all'altro capo della pista o alla stazione numero 1, ripartendo a contare da lì per eventuali prossime richieste di delivery.

 

Step n-1 – L’autoconservazione di Braccobaldo

 

Un’altra situazione che non è stata implementata ma che è degna di nota è il raggiungimento del fine pista o di un punto al di là del quale Braccobaldo non deve andare, pena la sua incolumità (ad esempio il bordo di un tavolo, un precipizio, una zona fortemente magnetizzata, ecc…).

Si possono utilizzare altri sensori per riuscire a raggiungere tale obiettivo.

                         

Step n – Verso un Braccobaldo “intelligente”

 

Tra le tante “evoluzioni” del progetto, ce ne sono di rilevanti che riguardano la generalizzazione dell’ambiente in cui il robot si muove.

Noi utilizziamo una semplice pista ad S, ma le possiblita’ sono molteplici, e possono essere implementate in successive versioni.

Ne consideriamo alcune qui di seguito:

 

*   piste che si biforcano o che hanno forme strane

*   porzioni di cammino che cambiano colore a seconda della particolare zona per differenziare le azioni che il robot deve compiere

*   vere e proprie reti topologiche, per cui il robot si vede costretto a scegliere il cammino minimo per andare da un posto ad un altro

*   … e tante altre ancora …

 

Altro aspetto che non abbiamo sviluppato e’ la convivenza tra piu’ robot nello stesso ambiente, e la consapevolezza di non essere soli, per poter assumere dei particolari comportamenti con i propri simili.

Sono tante e tante ancora le possibilità e le ipotesi, verso un robot sempre più “intelligente”.

Per esempio, durante le pause nella stazione base, in attesa di richieste di delivery, Braccobaldo potrebbe dedicarsi ad una delle sue attività preferite: fare dei salti acrobatici, fischiettare, scrivere su un foglio il suo nome, giocare a canestro, costruire torri di mattoncini, leggere delle poesie di Leopardi e commentarle ad alta voce...

… e le possibilità sono infinite!!

 

 

4. Links utili per la documentazione e l’approfondimento

 

*  Il Legolog

*  Il microcomputer RCX

*  SWI-Prolog

*  L'interprete Golog

*  Il linguaggio nqc

 

 

5. Photo Gallery

 

*  Il gruppo “Braccobaldo”

*  Le prove in laboratorio

*  Braccobaldo in azione

*  Il tranquillo mondo di Braccobaldo

*  Braccobaldo aggressivo

*  Particolari

*  Fine

 

 

Il gruppo “Braccobaldo”

 

Da sinistra a destra: Roberto Radicioni, Alessandra Mileo, Franco Salvetti.

 

 

 

 

Le prove in laboratorio

 

Roberto controlla dal PC l’evoluzione delle prove, mentre Alessandra e Franco stanno

in agguato ai lati del tavolo, per confondere Braccobaldo ed osservare le sue reazioni.

 

 

 

 

 

 

 

Braccobaldo in azione

 

Si vede qui Braccobaldo alle prese con le sue attivita’.

 

Mentre rileva la presenza di un oggetto

 

Mentre trasporta l’oggetto

 

 

 

Il tranquillo mondo di Braccobaldo

 

 

 

 

 

Braccobaldo Aggressivo

 

 

 

 

 

 

Particolari

 

La benna

 

La parte posteriore

 

La targa

 

La parte frontale: il sensore di contatto

 

 

 

Fine