Progetto Artificial Intelligence
IL
DELIVERY ROBOT
BRACCOBALDO
Realizzato da:
a.a. 2000/2001
Indice
Step 1 – Braccobaldo ”stupido”
Step 2 – Braccobaldo ritira e consegna
3. Sviluppi futuri e
considerazioni conclusive
Step n-3 - Braccobaldo occupato
Step n-2 -
Braccobaldo imbrogliato
Step
n-1 – L’autoconservazione di Braccobaldo
4. Links utili per la documentazione
e l’approfondimento
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.
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.
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).
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
Forniamo qui solo alcune
delle considerazioni sorte, che possono fare da spunto per future
implementazioni.
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.
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 tranquillo mondo
di Braccobaldo
Da
sinistra a destra: Roberto Radicioni, Alessandra Mileo, Franco Salvetti.
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.
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
La
benna
La
parte posteriore
La
targa
La
parte frontale: il sensore di contatto