Fabio Zinno (zaino@tiscalinet.it)
Luigi Zappa (lz562575@silab.dsi.unimi.it)
Norberto Valcamonica (scoglu@inwind.it)
1.
Introduzione:
Il progetto consiste nella costruzione di un agente (un robot) che esibisca un comportamento autonomo
"delivery-like".
·
Hardware: a nostra disposizione, per la costruzione del robot,
avevamo una confezione
"Lego Mindstorm" ed una di "Lego Tecnics" contenenti, oltre ai vari mattoncini:
A. Blocco RCX
(Robotic Command Explorer), la tecnologia RCX consiste in un dispositivo indipendente, un processore Hitachi
H8/3297 montato all'interno di
un blocco Lego che dispone di:
·
tre input sensoriali
·
tre output cui e’ possibile collegare motori
·
una porta di I/O ad infrarossi
·
una memoria capace di contenere fino a cinque programmi
·
un display LCD multifunzione
·
un altoparlante per produrre output di controllo.
B. Una serie di
sensori per fornire input all'RCX, come sensori di contatto, di luminosita’, di rotazione e termici.
C. Tre motori ed
una sorgente luminosa, da collegare agli output dello RCX.
D. Un Beacon, cioe’ un
ricetrasmettitore di impulsi all' infrarosso che interfaccia l'RCX al PC (va collegato alla porta
seriale).
·
Software:
A. NQC (Not Quite
C), un linguaggio di programmazione C-like che permette di definire procedure sincrone e task asincroni
per il monitoraggio dei sensori.
B. Legolog, un sistema di
trasmissione avanzato che permette di comunicare, tramite interi di dimensione variabile, con l'RCX.
C. Golog, un
meta-interprete ProLog basato sul Situation Calculus di McHarty, che supporta flussi di controllo, scelte
non deterministiche, priorita’, concorrenza, interrupts, azioni esogene e
sensing.
2.
Descrizione Del Dominio:
Di tipo controllato, ma
aperto. Consta di un tavolo, una pista, il robot ed infine un oggetto:
A. La pista, realizzata con
nastro adesivo scuro, che puo’ essere di forma qualsiasi, sulla quale sono presenti sei stazioni,
piu’ o meno equidistanti,
costruite con carta stagnola di colore argenteo.
B. Il tavolo, di color beige
con dei bordi marrone scuro (i colori sono importanti per il sensore di luminosita’).
C. Il robot, e’ un
cingolato, monta tre motori: due per i cingoli ed uno per il meccanismo di acquisizione dell'oggetto che
e’ di tipo "tenaglie", simili a quelle descritte sul manuale (differiscono per la vite infinita da noi utilizzata) poste sulla parte anteriore del
robot. Sono utilizzati inoltre un sensore di luminosita’, posizionato sotto le tenaglie, ed infine uno di contatto in
mezzo alle tenaglie. Siccome il sensore di contatto e’ risultato di ridotte dimensioni e poco sensibile, abbiamo ideato un meccanismo scorrevole che poggia
sullo stesso (in caso di avvenuto
contatto ovviamente) premendolo perfettamente e che aumenta la superficie di contatto.
D. L'oggetto, rappresenta
l'ente su cui effettuare la delivery, e’ costruito anch'esso soltanto con pezzi presenti nel kit Lego
Mindstorm & Tecnics. E' stato
studiato appositamente pensando alla struttura fisica del nostro robot: ha una struttura a
“spaventapasseri" che permette una facile e sicura presa alle tenaglie del robot. Tale forma fa in modo che una volta afferrato l'oggetto si sollevi
leggermente dalla superficie del
tavolo in modo che non venga trascinato provocando cosi’ impedimenti al regolare incedere del robot.
Alla base dello stesso vi sono delle
ruote in posizione orizzontale che fanno attrito con il suolo conferendo stabilita’ all'oggetto, in modo
che il robot lo possa afferrare senza
che scivoli via.
3.
Goal:
Rispetto alla versione realizzata da Pagnucco, Reiter e
Levesque, noi abbiamo reso
l'esecuzione della delivery piu’ robusta
assumendo dominio parzialmente
aperto. Tale compito consiste nella ricerca di un blocco, l'acquisizione, ed il trasporto a destinazione;
dopodiche’ il robot ritorna "a
casa" ossia alla prima stazione. La situazione iniziale rimane
pressoche’invariata cioe’ il robot si trova alla stazione numero tre orientato
verso la parte piu’ lunga
della pista. L'oggetto puo’ essere posizionato in un punto qualsiasi del tavolo oppure puo’ non essere
presente sullo stesso. Il nostro
obiettivo e’ quello di cercare sulla pista e nei suoi dintorni l'oggetto per portarlo alla stazione che l'utente
indica mediante una query fatta con
l'interprete Prolog. Se il robot, dopo una esplorazione completa della pista, non trova nulla la percorre
nuovamente pero’seguendola con un andamento irregolare, simile ad uno zig-zag,
per cercare l'oggetto nelle
prossimita’ della stessa. Se anche dopo questa seconda ricerca non si ha successo, il robot ritorna alla
stazione numero uno in attesa di nuove
query dall'utente (si e’ assunto che l'oggetto non e’presente nel dominio).
Durante l'ultima esplorazione (quella con andamento a zig-zag) e’ possibile che il robot si imbatta
con il limitare del tavolo, allora ci si
arresta e si arretra un po' per evitare un macabro epilogo. Nel caso il robot trovi l'oggetto, lo afferra e lo
trasporta alla stazione desiderata
emettendo due tonalita’sonore differenti al momento della acquisizione e del rilascio dell'oggetto.
4.
Autonomia e Comportamenti Intelligenti:
Come gia’ scritto nella sezione "goal" ci siamo
proposti di rendere il compito della
delivery piu’ sicuro e adattivo. L'oggetto da trasportare puo’ essere sito in un qualsiasi locazione sul tavolo (in un intorno
definito della pista), viene raccolto autonomamente dal robot senza bisogno dell'intervento umano. Inoltre, il robot, sa riconoscere i confini del dominio (i
bordi del tavolo) evitando cosi’ di
danneggiarsi. Abbiamo inserito nel dominio anche il robot stesso perche’ la sua stessa stazza va considerata come
parametro. Infatti, per esempio, quando
si rilascia l'oggetto alla stazione di destinazione spesso e’ necessaria una azione di "turnAround"
(ovvero il robot ruota su di se’ di 180 gradi) per ritornare alla prima stazione. Questo comportamento potrebbe causare l'urto del robot con l'oggetto appena
consegnato con conseguente rovesciamneto
dello stesso. Per evitare questo fenomeno indesiderato si rende utile una piccola "retromarcia"
prima di girarsi e di tornare alla stazione "home". Nella nostra implementazione le query vengono
effettuate nella medesima
maniera della versione originale, anche se il primo parametro risulta essere non necessario, in quanto
il blocco da trasportare verrebbe
comunque ricercato nel dominio.
5. Programma:
Il
programma utilizzato come canovaccio per il nostro progetto e’ il delivery (.pl
e .nqc) del dott. Pagnucco. Date le modifiche necessarie al raggiungimento del
goal propostoci, abbiamo deciso di rielaborare quasi completamente il file
originale, riordinandolo secondo il nostro gusto ed eliminando tutto cio’ che non
abbiamo ritenuto essenziale. Le query hanno lo stesso schema del delivery
originale, ma il primo paramentro, ovvero la stazione di partenza, risulta nel
nostro caso inutile. Inoltre sono stati inseriti dei nuovi fluenti:
·
where_to_deliver, il quale indica la stazione alla quale
deve essere consegnato l’oggetto;
·
bot_state, necessario per tenere traccia dello
stato in cui si trova il robottino (ulteriori spiegazioni di seguito);
·
cargo, che indica se il robot ha con se l’oggetto
oppure no (empty e full);
·
motion, che indica il tipo di movimento del
robot, e puo’ assumere i valori moving, stopped e retreating.
Il
valore iniziale del fluente bot_state e’ “tranquillo”.Una volta
richiesta una delivery al robot, esso parte alla ricerca di un oggetto sulla
pista. Percorre esaustivamente la pista nella direzione in cui si trova, e nel
caso non riesca a trovarlo, passa dallo stato “tranquillo” allo stato “preoccupato”.
A questo punto ripercorre nuovamente la pista in direzione opposta per
assicurarsi di aver controllato tutte le stazioni. Se la sua ricerca fallisce
nuovamente, il robot diventa “isterico”. Il comportamento dell’agente subisce allora
una mutazione sostanziale: percorre la pista in modo piu’ accurato controllando
anche un intorno della pista, muovendosi alla sua sinistra ed alla sua destra
per una decina di centimetri ad ogni piccolo avanzamento. Se finalmente riesce
a trovare un oggetto, torna ad essere tranquillo e lo porta alla stazione
desiderata, altrimenti torna sconsolato alla base.
Per quanto riguarda le azioni che l’agente puo’ compiere, l’unica variazione
sostanziale e’ l’introduzione delle azioni take_object e
release_object. Per quanto riguarda invece il file .nqc, sono stati
aggiunti dei controlli per rilevare il bordo del tavolo, e sono state
modificati i task e le procedure originali per soddisfare le caratteristiche
dell’ambiente nel quale si muove il nostro robot.
6.
Problemi:
La comunicazione e’ certamente la parte piu’ problematica
e cio’ che crea problemi e' il
sistema a raggi infrarossi,
notoriamente imprecisi e soggetti a problemi di direzionalita’. Quello che si puo’ fare e’ cercare di piazzare il
dispositivo di trasmissione seriale nella
posizione e nella direzione giusta, ma questo ovviamente dipende dall'ambiente di lavoro. E' inoltre importante sapere che le batterie
dell'RCX devono sempre essere cariche; sotto i 7.5 Volt i problemi di comunicazione si fanno troppo frequenti. In ogni caso, e’ bene tenere presente
che il sistema di comunicazione
puo’ cadere in ogni momento: spesso appare un messaggio che indica la perdita di contatto fra l'RCX ed il
Golog con richiesta di premere un tasto
per continuare. Spesso premendo l'esecuzione continua normalmente, ma altre volte occorre
reinizializzare il tutto.
Ulteriori
problemi sono nati nella manipolazione del file NQC:
·
limitato
numeri di variabili “int”, superato convertendo in variabili globali alcune di esse;
·
limitata
memoria a disposizione nell’RCX, che impedisce la definizione di troppe procedure e ne limita l’estensione.
A questo proposito abbiamo notato che convertendo una procedura in “task” lo
spazio risultava bastevole; infatti i task hanno un porzione di memoria
dedicata;
·
necessita’
di assicurarsi che i task non interferissero, a volte il fatto che il robot non esibisse il
comportamento desiderato dipende dalla presenza in background di task
differenti che sovrascrivono il comportamento desiderato.