Presentazione di PowerPoint - Sistemi per il Governo dei Robot
by user
Comments
Transcript
Presentazione di PowerPoint - Sistemi per il Governo dei Robot
1 Proposta di progetto Sia assegnato un ambiente chiuso con ostacoli. Assegnata una tana, si vogliono raccogliere una serie di cubi accumulati in alcuni luoghi non noti all’interno dell’ambiente. Raccogliere un cubo alla volta e portarlo alla tana, evitando gli ostacoli e cercando il percorso migliore. Terminati i cubi accumulati in un posto cercare gli altri. Gli ostacoli sono di colore blu, i cubi di colore rosso, la tana di colore giallo. Dotare il robot di un sistema sensoriale facendo ricorso a sensori disponibili sul mercato (sonar, bumper, bussole, luminosità (colore), suoni, etc.). Può esserci una piccola memoria ma il paradigma di riferimento deve essere quello reattivo. http://www.informatik.uni-bremen.de/simrobot/index_e.htm 2 Obiettivi della lezione • Usare lo schema theory per progettare behavior usando la programmazione a oggetti. • Progettare un sistema comportamentale completo, includendo il coordinamento e il controllo di behavior concomitanti e multipli. • Per un dato sistema comportamentale, disegnare una tabella comportamentale che specifichi i releasers, gli schemi percettivi e motori per ogni comportamento. • Descrivere due metodi per assemblare e coordinare behavior primitivi all'interno di un behavior astratto: automi a stati finiti e script. •Essere capaci di rappresentare una sequenza di behavior con un 3 diagramma di stato o con uno pseudocodice in script. Equipaggiamenti come Lego Mindstorms, con accoppiamento rapido di sensori ed attuatori, facilitano gli utenti a costruire behavior reattivi. I problemi sono come mettere più intelligenza nel software e come sfruttare meglio i sensori. Le buone intenzioni spesso sono frustrate da due deficit. Primo, progettare behavior è più un'arte che una scienza. Spesso i giovani robotici sono incerti su come iniziare il processo di progettazione, e come sapere quando hanno realizzato un sistema ragionevole. Il secondo deficit è più sottile. Una volta che il progettista ha alcuni behavior bene progettati e testati, come si integrano in un sistema? 4 Nei primi lavori sul paradigma reattivo, come abbiamo visto, si avevano robot caratterizzati da un set molto piccolo di behavior i quali erano combinati internamente per produrre un behavior emergente e complessivo. Si è mostrato che i componenti chiave di un'architettura reattiva sono i behavior più il meccanismo di fusione dei behavior concomitanti. Molte applicazioni sono state progettate come una serie comportamenti, che funzionano secondo una sequenza riconoscibile. 5 di Una delle prime applicazioni alla quale molti robotici guardarono consisteva nel raccogliere e depositare in un secchio una lattina di una qualche bevanda. Questo problema implica che il robot vada alla ricerca di una lattina, si muova verso la lattina, quando l’ha trovata la raccolga, cerchi il bidone della spazzatura, si muova verso il bidone, lasci cadere la lattina. E’ controintuitivo pensare che questi behaviors siano concorrenti o fusi. (C'è certamente la possibilità di concorrenza, per esempio quando evita gli ostacoli mentre si muove verso la lattina o il bidone.) 6 Le tecniche introdotte per controllare sequenze di behavior sono per la maggior parte concettualmente equivalenti alla costruzione di macrobehavior, dove la struttura dello schema è usata ricorsivamente per semplificare la programmazione del programma di controllo. Questo capitolo tenta di aiutare il progettista a costruire un sistema di robot reattivo, alla luce di questi due deficit. Primo, è presentato un approccio diretto alla programmazione a oggetti per i behavior. Questo approccio è basato sullo schema theory presentato nella lez. 3. Il caso di studio enfatizza l'importanza di stabilire una nicchia ecologica per un robot reattivo. 7 Behaviors e Schema Theory Nella applicazione fatta da Arbib dello schema theory verso una teoria computazionale dell'intelligenza, un behavior è uno schema che è composto da un schema motorio ed uno schema percettivo. Lo schema motorio rappresenta la modalità per l'attività fisica; lo schema percettivo incarna il sentire. Lo schema motorio e lo schema percettivo sono come pezzi di un puzzle; entrambi i pezzi devono essere messi insieme prima di avere un behavior. Releaser Sensory Input BEHAVIOR Schema percettivo Schema motorio Pattern of Motor Action 8 Secondo, sono presentate due tecniche per maneggiare sequenze di behavior : automi a stati finiti e script. Vedremo ancora come era da aspettarsi dal materiale presentato nella Lez. 3, che entrambe queste tecniche sembreranno molto simili all’ IRM di Tinbergen e Lorenz. 9 Behavior come Oggetti in OOP Anche se la Programmazione a Oggetti non era ancora popolare nel periodo in cui si è sviluppato il Paradigma Reattivo, è utile guardare i behavior in termini di OOP. Lo Schema theory va bene per trasferire concetti teorici in termini di OOP. Lo Schema theory sarà anche usato come ponte tra i concetti dell'intelligenza biologica e quella robotica, rendendo possibile una realizzazione pratica della reattività che sfrutta meccanismi di releasing innati ed affordances. 10 Si ricordi che un oggetto consiste di dati e metodi, anche chiamati attributi ed operazioni. Come notato in precedenza, gli schemi contengono conoscenza specifica, dati locali, strutture e altri schemi. In Fig. si vede come potrebbe essere definito uno schema. Secondo Arbib, uno schema in programmazione a oggetti sarà una classe. La classe avrà un metodo opzionale detto programma di controllo coordinato. Il programma di controllo coordinato è una funzione che coordina alcuni metodi o schemi nella classe derivata. Fig. 5.1 Classi: a.) schema e b.) behavior 11 Tre classi sono derivate dalla Classe Schema: Schema motore, Schema Percettivo e Behavior. I Behavior sono composti da almeno uno Schema Percettivo ed uno Schema motore; questi schemi si comportano come metodi per la classe Behavior. Lo Schema Percettivo ha almeno un metodo; tale metodo prende in input il sensore e lo trasforma in una struttura dati detta percetto. Lo Schema motore ha almeno un metodo che trasforma il percetto in un vettore o altra forma di rappresentazione in un'azione. Lo Schema Percettivo è collegato ai sensori, mentre lo Schema motore è collegato agli attuatori del robot. I sensori e gli attuatori possono essere rappresentati se necessario dalle loro proprie classi software; questo è utile quando si usano driver software per l’hardware. 12 Usando l’UML (Unified Modeling Language) le classi Schema e Behavior appaiono come in fig. L'organizzazione degli OOP permette ad un behavior di essere composto di schemi percettivi multipli, schemi motore e behavior, il che equivale a dire che la definizione di un behavior è ricorsiva. Perché è utile avere schemi percettivi e schemi motore multipli? Ad esempio in qualche caso, può tornare utile avere due schemi percettivi, uno per sapere le condizioni di luce di giorno se si usa una telecamera ed uno per la notte se si usano gli infrarossi. 13 Si ricordi che un behavior primitivo è composto solo di uno schema percettivo e uno schema a motore; non c'è nessun bisogno di avere alcun programma di controllo per il coordinamento. Si può pensare che i Behavior primitivi siano monolitici, in quanto essi fanno solo una cosa. Poiché di solito essi sono un semplice mapping tra lo stimolo e la risposta, sono spesso programmati come un solo metodo, non composti da metodi multipli od oggetti. I Behavior che sono assemblati da altri behavior o hanno schemi percettivi multipli e schemi motore li chiameremo “behavior astratti”, perché, rispetto a un behavior primitivo, sono alquanto lontani dai sensori e dagli attuatori. L'uso del termine “behavior astratto" non deve essere confuso con una classe astratta in OOP. 14 Esempio: Un behavior primitivo di move_to_goal Questo esempio mostra come può essere progettato un behavior primitivo che usa i principi della OOP. Nel 1994, l’annuale AAAI Mobile Robot Competition aveva una gara su ”Raccogli l'Immondizia", gara che fu ripetuta nel 1995 all'AAA-IJCAI Mobile Robot Competition. L'idea di base era che un robot era messo in un'arena vuota grande circa quanto un ufficio. Nell'arena ci sarebbero state lattine di CocaCola e tazze bianche collocate a caso. In due dei quattro angoli, c’era un bidone di raccolta blu; negli altri due, un bidone di immondizia colorato diversamente. Il robot che raccoglieva più immondizia e la metteva nel bidone giusto nel tempo assegnato era il vincitore. Per molto tempo, la strategia fu di trovare e riciclare le lattine di CocaCola, perché erano più facili da percepire per gli algoritmi di visione del robot essendo di colore rosso e blu. 15 Uno dei behavior di base necessario per raccogliere una lattina rossa e muoversi verso un bidone blu è move_to_goal. Quando il robot vede una lattina rossa, deve muoversi verso di essa. Quando ha raccolto una lattina, allora deve trovare e poi muoversi verso un bidone blu. È corretto dal punto di vista dell’ingegneria del software scrivere un behavior generale per muovere verso il goal, dove solo quello che è il goal regione rossa o blu può variare. Il goal in questo esempio può essere passato come una instanziazione attraverso il costruttore dell’oggetto. Scrivere un solo behavior generico per move_to_goal (color) è preferibile rispetto a scrivere un behavior move_to_red ed un behavior move_to_blue. Dal punto di vista dell’ingegneria del software, scrivere due behavior che fanno la stessa cosa è un’occasione per introdurre bug 16 di programmazione. Behavior generici condividono anche la stessa filosofia come la fattorizzazione in matematica. Si voglia semplificare l'equazione 45x2 + 90x + 45. Il primo passo è semplificare l'equazione trovando i fattori comuni. In questo caso, 45 può essere messo in evidenza e l'equazione riscritta come 45(x + 1)2. Il colore del goal, rosso o azzurro, è come il coefficiente comune 45; è importante, ma tende a nascondere che la chiave alla soluzione era la x in questo caso la direzione in move_to_goal. 17 Un codice modulare, generico può essere ben gestito dagli schemi. Il behavior move_to_goal consisterà di uno schema percettivo che sarà chiamato extract_goal ed uno schema motore che usa un campo attrattore chiamato pfields.attraction.extract_goal che usa l'affordance del colore per estrarre dove è nell'immagine il goal, e poi calcolare l'angolo al centro della regione colorata e la grandezza della regione. Queste informazioni formano il percetto del goal; l’affordance della lattina di Coca cola può essere il colore, mentre le informazioni estratte dalla percezione sono l'angolo e la grandezza. Lo schema motore attrattivo riceve il percetto ed è responsabile di far girare il robot verso il centro della regione rossa e muoverlo in avanti. Questo si può fare facilmente usando un campo attrattivo, in cui più grande è la regione, più forte è l'attrazione e più velocemente si muove il robot. 18 Releaser Sensory Input move_to_goal Pattern of Motor Action Schema extract_goal pfields.attraction.extract_goal 19 Il behavior move_to_goa1 può essere implementato come un behavior primitivo, dove goal_color è una maniera per rappresentare colori diversi come rosso e blu: move_to_goal (goal_color): Object Behavioral Analog Identifier Data percept Methods perceptual_schema motor_schema goal_angle goal_strength extract_goal(goal_color) pfields.attraction(goal_angle,goal_strength) 20 La tabella implica alcuni punti molto importanti per la programmazione con i behavior. 1. Il behavior è la "colla" tra gli schemi percettivo e motore. Gli schemi non comunicano nel senso che sono entrambi entità indipendenti; lo Schema Percettivo non sa che lo schema motore esiste. Invece, il behavior mette il percetto creato dallo Schema Percettivo in un luogo dove lo schema motore può trovarlo. 2. I behavior possono (e dovrebbero) usare biblioteche di schemi. Il suffisso pfields su pfields. attraction() vuole dire che quell'attrazione è un metodo all'interno di un altro oggetto identificato come pfields. I cinque campi di potenziali primitivi visti precedentemente potrebbero essere incapsulati in una classe chiamato PFields che ogni schema motore potrebbe usare. PFields servirebbe come una libreria. Una volta che i campi potenziali in PFields sono scritti e verificati, il 21 progettista non deve più programmarli di nuovo. 3. I Behavior si possono riusare se scritti adeguamente. In questo esempio, il behavior move_to_goal è scritto per accettare una struttura (od oggetto) definito da un colore e si muove poi verso una regione di quel colore. Questo vuole dire che il behavior può essere usato con lattine di Coca cola rosse e secchi di immondizia blu. 22 Esempio: Un behavior astratto di follow_corridor Nell’esempio move_to_goal abbiamo usato un solo schema motore con un solo schema percettivo. Questo esempio mostra come può essere implementata una metodologia a campi potenziale che usa schemi. Nell’esempio seguente del corridoio, il follow_corridor a campo di potenziale visto nella lezione 4 consisteva di due campi primitivi: due istanze di perpendicular ai muri ed una di uniform parallela ai muri. Il campo follow_corridor può essere implementato in schemi in almeno due modi diversi come mostrato di seguito. In qualche maniera, ognuno dei campi primitivi può essere uno schema motore separato. 23 Lo schema motore di follow_corridor consiste di tre primitive e di un programma di controllo coordinato. Il programma di controllo coordinato è la funzione che sa che un campo è perpendicolare al muro sinistro e va verso il centro del corridoio in che modo è diretto, ecc. Questi campi sono sommati dal programma di controllo coordinato nello schema comportamentale per produrre un solo vettore di uscita. VF VL VR DR DL VF+L+R VR-L VF DL, DR VF VR-L VR VL 24 Lo Schema Percettivo di follow_corridor esamina il diagramma polare del sonar ed estrae l'ubicazione relativa dei muri del corridoio. Lo Schema Percettivo ritorna la distanza dal muro sinistro e dal muro destro. VF VL VR DR DL VF+L+R VR-L VF DL, DR VF VR-L VR VL 25 Un altro modo per realizzare lo stesso behavior complessivo è avere follow_wall composto di due istanze di un behavior segui il muro: follow_wall (sinistro) e follow_wall (destro). Ogni istanza di segui il muro riceve il plot polare del sonar ed estrae il muro corrispondente. In entrambe le realizzazioni, gli schemi motore funzionano continuamente, ed i vettori sono sommati internamente per produrre un solo vettore di output. Poiché ci sono schemi motore multipli, il programma di controllo coordinato per follow_corridor non è nullo come era per move_to_goal. La sommatoria vettoriale e la concorrenza formano in questo caso il programma concettuale di controllo coordinato. VF+R VF VR VF+L VL VF+L VF+R VF+L+R VF+R VF VL VF+L VL DL VR DR VR 26 DL DR Dove vanno a finire i releasers in OOP? Gli esempi precedenti mostrano come i behavior possono essere implementati usando costrutti OOP, come le classi. Un'altra importante aspetto di un behavior è come esso è attivato. Come è stato discusso nella lezione 3, la percezione serve a due scopi: rilasciare un behavior e guidarlo. Gli schemi Percettivi sono chiaramente usati per guidare il behavior, sia per muoversi verso un goal diversamente colorato sia per seguire un muro. Ma quale oggetto o struttura contiene il releaser e come è "attaccato" al comportamento? 27 La risposta alla prima parte della domanda è che il releaser è esso stesso uno schema percettivo. Può funzionare indipendentemente da tutto quello che sta accadendo al robot; è uno Schema Percettivo non limitato da uno schema motore. Supponiamo per esempio, che il robot sta cercando lattine di Coca cola rosse con lo schema percettivo di extract_color. Un modo di implementare questo è: quando lo schema vede rosso, allora può segnalare al programma principale che c'è rosso. Il programma principale può stabilire che il releaser per il behavior move_to_goal è stato soddisfatto, e quindi instanziare move_to_goal() con goal = red. 28 move_to_goal può instanziare una nuova istanza di extract_color o il programma principale può passare un puntatore all’extract_color attualmente attivo. move_to_goal deve poi instanziare pfield.attraction, altrimenti gli schemi di attrazione motore non potrebbero funzionare. In questo approccio, il programma principale è responsabile di chiamare gli oggetti corretti al momento giusto; il releaser è attaccato al behavior dal progettista con piccoli meccanismi formali per assicurarsene la correttezza. 29 Un altro approccio più comune di programmare è quello che il releaser è parte del behavior: in questo caso il singolo Schema Percettivo svolge un doppio compito. Questo stile di programmazione richiede un programma di controllo coordinato. Il behavior è sempre attivo, ma se il releaser non è soddisfatto, il programma di controllo coordinato cortocircuita l’elaborazione. Il behavior ritorna una funzione identità, cioè un vettore (0,0) nel caso di campi di potenziale il che equivale ad un behavior non attivo. Questo stile di programmare può limitare alcune risorse, ma è un modo semplice ed efficace di programmare. 30 In entrambi i casi, una volta che il robot vede rosso, l'aspetto osservabile di move_to_goal (cioè muoversi direttamente verso il goal) comincia. Gli schemi extract_goal aggiornano i dati del percetto (angolo relativo del goal e dimensione della superfice rossa) ogni volta che viene chiamato. Questi percetti sono poi disponibili per lo schema motore che può a sua volta produrre un vettore. 31 In seguito si mostrerà che i releaser devono essere progettati per sostenere una sequenza corretta. A seconda di dove il robot si trova nella sequenza delle attività, il robot usa move_to_goal per andare verso una lattina di Coca cola rossa o un bidone di riciclaggio blu. Altrimenti, il robot potrebbe perseguire una Coca cola rossa o un bidone di riciclaggio blu simultaneamente. In questa situazione, dovrebbero esserci due oggetti move_to_goal , uno instanziato con goal "rosso" e l'altro con goal "blu." Si noti che il behavior move_to_goal può usare qualunque Schema Percettivo che può produrre un angolo e una forza per il goal. Se il robot avesse bisogno di muoversi verso una luce brillante (fototropismo), si dovrebbe cambiare solo lo schema percettivo. Questo è un esempio di riusabilità del software. 32 Passi per progettare un Sistema Reattivo La fig. mostra i passi per progettare un sistema con behavior reattivi ed è presa da un articolo di Murphy. In questa parte si farà prima una ampia discussione sul processo di progettazione, poi si esamineranno i vari passi usando un approccio del 1994. La metodologia in fig. presume che a un progettista è dato: il task che il robot deve fare (1), una piattaforma robotica (2) (o dei vincoli, in genere economici). Il goal è progettare un robot come un agente situato (3). Perciò, i primi tre passi servono a ricordare al progettista di specificare la nicchia ecologica del robot. 33 Al quarto passo comincia un processo iterativo in cui si fa l’identificazione e il raffinamento del set di behavior per il task. Viene posta la domanda: cosa farà il robot (4)? Definire la nicchia ecologica determina i vincoli e le opportunità ma non presenta necessariamente altri suggerimenti nella situatedness del robot: come esso agisce e reagisce alla variabilità nella sua nicchia ecologica. Questo passo è dove un novizio comincia a capire che progettare behavior è un'arte. 34 Qualche volta, una decomposizione in behavior appare ovvia al Robotico dopo avere pensato alla nicchia ecologica. Per esempio, nelle gare del 1994 e 1995 la maggior parte delle squadre usarono la seguente divisione di compiti: • ricerca casuale fino a che vedi il rosso, muovi verso il rosso, raccogli, • ricerca casuale fino a che vedi il blu, muovi verso il blu, rilascia la lattina. 35 I Robotici spesso tentano di trovare un'analogia con un compito portato a termine da un animale o da una creatura umana, e quindi studiano la letteratura etologica o cognitiva per ulteriori informazioni su come l'animale o l’uomo porta a termine quella classe di compiti. Questo, chiaramente schiva la domanda di come i Robotici fanno a capire a quale classe di compiti animali può essere simile il compito del robot. In pratica, i Robotici che usano suggerimenti biologici e cognitivi tendono a leggere e a rimanere al corrente della letteratura etologica così da poter poi trovare qualche collegamento. 36 I passi 5-7 sono meno astratti. Una volta che l’insieme di behavior candidato è stato proposto, il progettista lavora sul progetto di ogni behavior individuale, specificando il suo Schema Percettivo e motore. A questo punto descrive l'algoritmo per trovare in maniera casuale macchie rosse in un'immagine televisiva e, quando scopre il rosso si muove verso di esso con il behavior rosso. Il progettista di solito programma ogni schema indipendentemente (5), poi li integra in un behavior e prova il behavior da solo prima (6) di integrare tutti i comportamenti (7). Questo stile di test è consistente coi principi dell’ingegneria del software, ed enfatizza i vantaggi pratici del Paradigma Reattivo. 37 L'elenco dei passi per implementare un sistema reattivo può essere fuorviante. Nonostante le frecce di ritorno, il processo complessivo in fig. sembra essere lineare. In pratica, esso è iterativo. Per esempio, una certa affordance potrebbe essere impossibile per il robot da scoprire affidabilmente coi suoi sensori, o un affordance non prevista nella prima analisi della nicchia ecologica potrebbe emergere improvvisamente. La sola maniera di iterare può essere quella di provare tutti i behavior insieme nel " mondo reale”. Il software che spesso in simulazione ha funzionato perfettamente fallisce nel mondo reale. 38 Un caso Studio: Unmanned Ground Robotics Competition Questo caso di studio è basato sull'approccio introdotto dalla squadra della Colorado School of Mine (CSM) che partecipò alla gara all’aperto per veicoli senza equipaggio del 1994. L'obiettivo della competizione era avere un piccolo veicolo non controllato (non più grande di un carrello da golf) che autonomamente navigasse in uno spazio aperto seguendo linee bianche dipinte sull'erba. Il CSM vinse il primo posto ed un premio di $5,000. Vediamo ora il progetto passo passo e discutiamo i vari passi. Questo caso di studio illustra l'uso effettivo solo di alcuni behavior, sviluppati incrementalmente, e l'uso di affordances combinate con una conoscenza della nicchia ecologica. 39 Step 1: Descrivere il task. Lo scopo di questo passo è specificare quello che il robot deve fare per avere successo. Il compito del robot (veicolo) è di seguire un percorso con svolte brusche, ostacoli fermi sul percorso ed una buca di sabbia. Il robot che va più lontano possibile senza andare fuori dei limiti è il vincitore, se due o più robot raggiungono la stessa distanza o completano il corso, il vincitore è quello più veloce. La velocità massima è di 5 mph. Se il robot va parzialmente fuori dei limiti (una ruota o simili), viene data una penalità. Se il robot spinge un ostacolo per rimuoverlo, viene data un'altra penalità sempre in termini di distanza raggiunta. Perciò, la competizione favorisce quelli che completano il percorso senza accumulare alcuna penalità, che sono più veloci, non escono fuori dai confini o non abbattono ostacoli. I concorrenti dovevano fare tre corse in un giorno e due giorni per prepararsi ed esaminare la pista del percorso; l’ordine di partenza fu 40 sorteggiato. Step 2: Descrizione del robot. Lo scopo di questo passo è determinare le abilità fisiche e di base del robot e le sue limitazioni. In teoria, ci si aspetta, che il progettista voglia avere il controllo sul robot (costruirlo lui stesso), decidere quello che può fare, di quali sensori essere dotato ecc. In pratica, la maggior parte dei Robotici opera con piattaforme commerciali che possono avere limitazioni su hardware e sui sensori che possono essere aggiunti, o sulle piattaforme sotto forma di kit con equipaggiamento poco costoso ma dove ci sono vincoli sulla potenza. Al progettista di solito sono perciò imposti dei vincoli fissi dalla piattaforma del robot che hanno un impatto sulla relativa progettazione. 41 In questa competizione si stabilì che il veicolo robotico doveva avere una base di almeno 90cm per 105cm e comunque doveva essere non più grande di un carrello da golf. Inoltre, il robot doveva portare onboard la sua alimentazione elettrica e il suo sistema di elaborazione (non era permessa nessuna comunicazione radio con un processore non a bordo), infine essere in grado di trasportare un peso di 9 Kg. In fig. è mostrato il robot del CSM (Omnibot). 42 Il veicolo di base era una jeep con ruote motorizzate acquistata in un negozio di giocattoli. La base soddisfaceva esattamente le richieste minime per le dimensioni. Venne usato uno sterzo Ackerman (come nelle auto) per il governo, un motore per muovere le ruote posteriori ed un motore per le ruote anteriori. Il veicolo aveva un angolo di rotazione di 22°. Il calcolatore on-board era un PC 486 a 33MHz. L’insieme dei sensori consisteva di tre apparecchiature: •shaft encoders sui motori di movimento e rotazione, •una videocamera montata su un albero vicino al centro del veicolo ed • un sonar panoramico montato sotto una grata sul davanti. L’output della videocamera veniva digitalizzata da un sistema bianco e nero. Il sonar era un Polaroid. L'apparecchiatura aveva una panoramica di 180°. Ogni codifica era fatta in C++. 43 A causa del sistema di motori e di rotazione, Omnibot poteva andare solo a 1.5 mph. Questa limitazione implicava che avrebbe potuto vincere solamente se fosse andato più lontano con un minor numero di penalità. Questo significava anche che bisognava aggiornare la lettura dei sensori almeno ogni 150ms o il robot sarebbe potuto andare fuori dei limiti senza accorgersi che lasciava il percorso previsto. Una acquisizione in bianco e nero eliminò il problema del colore. Inoltre, la velocità di aggiornamento del framegrabber era di circa 150ms; l’algoritmo che tratta la visione deve essere molto veloce altrimenti il robot si muove prima di un nuovo aggiornamento. Le riflessioni dovute all’erba disuguale ridussero il range standard del sonar da 7.5mt a circa 3mt. 44 Step 3: Descrizione dell'Ambiente. Questo passo è critico per due ragioni. Primo, è un fattore chiave nel determinare la situatedness del robot. Secondo, identifica le opportunità percettive per i behavior, sia su come un evento percettivo instanzierà un behavior, sia su come funzioneranno gli schemi percettivi per i behavior. Si ricordi dalla lezione 4 che il paradigma Reattivo favorisce la percezione diretta o percezione basata su affordance perché ha una fase di esecuzione rapida e non comporta nessun ragionamento o memoria. 45 Il percorso era all’aperto su un campo erboso con piccoli pendii. Consisteva di una corsia larga 3 mt marcata con vernice bianca, della forma di Fig. La lunghezza esatta del percorso e la configurazione degli ostacoli non era nota fino al giorno della gara, e alle squadre non era permesso di misurare il percorso o fare prove su di esso. Gli ostacoli erano fissi e consistevano in balle di fieno avvolte in teli di plastica di colore bianco o rosso. Le balle erano di circa 60x120 cm e non occupavano mai più di 90 cm nella corsia. 46 Il sonar era capace di scoprire affidabilmente le balle coperte e di plastica da più angoli di approccio da una distanza massima di 2,4 mt. I veicoli dovevano correre tra le 9 e le 17 del 22 maggio, anche con tempo coperto. Oltre ai problemi di visione dovuti al cambiare dell’illuminazione causata dalle nubi, le balle proiettavano ombre sulle linee bianche tra le 9 e le 11 e tra le 15 e le 17. La buca di sabbia era lunga solo 1,2 mt e messa su una parte diritta del percorso. 47 L'analisi dell'ambiente permise una semplificazione del compito. Il posizionamento degli ostacoli lasciava uno spazio libero di 1,2 mt. Poichè Omnibot era largo solo 0,90 mt, questo permetteva di trattare il percorso come privo di ostacoli se il robot fosse potuto rimanere al centro della corsia con una tolleranza di 0.15mt. Questo eliminò la necessità di un behavior per evitare gli ostacoli. 48 L'analisi dell'ambiente identificò anche un affordance per controllare il robot. L'unico oggetto di interesse per il robot era la linea bianca che avrebbe dovuto avere un forte contrasto con il verde (grigio scuro) dell'erba. Ma il valore dell’illuminazione della linea bianca cambiava col tempo. Comunque, se la telecamera fosse stata puntata direttamente su una linea, invece di tentare di vedere entrambe le linee la maggioranza dei punti più brillanti nell'immagine sarebbero appartenuti alla linea (con una riduzione del rapporto segnale/rumore perché la maggior parte dell'immagine conteneva la linea). Alcuni dei punti brillanti potevano essere attibuiti a riflessioni, ma questi si presumeva fossero distribuiti casualmente. Perciò, se il robot tentava di tenere il centroide dei punti bianchi nel centro dell'immagine, si poteva collocare al centro della corsia. 49 Step 4: Descrizione delle reazioni del robot in risposta all’ambiente. Lo scopo di questo passo è identificare l’insieme di uno o più behavior primitivi; questi behavior saranno raffinati o eliminati successivamente. Non appena il progettista descrive come il robot dovrebbe agire, di solito appare il behavior. Si mette in evidenza che a questo passo è solo necessario concentrarsi su quello che dovrebbe fare il robot, non su come lo farà, anche se spesso il progettista vede le due cose insieme. Nel caso della CSM, inizialmente fu proposto solo un behavior: follow_line. Lo schema percettivo doveva usare la linea bianca per calcolare la differenza fra dove era il centroide della linea bianca e dove il robot avrebbe dovuto essere, mentre gli schemi motori dovevano convertire questa differenza in un comando per lo sterzo del motore. 50 Al fine di ricavare i behavior per un task, è spesso vantaggioso costruire una tavola dei behavior così da avere tutti i behavior su un solo foglio di carta. Il releaser per ogni behavior è utile per confermare che il behavior opererà correttamente senza conflitti. E’ spesso utile per il progettista classificare gli schemi percettivi e motori. Per esempio, si consideri quello che accade se una implementazione ha uno schema motorio puramente riflessivo, move_to_goal, ed un behavior AVOID per evitare gli ostacoli. Cosa accade se il behavior AVOID causa la perdita della percezione del goal da parte del robot? In questo caso, lo Schema Percettivo dice che non c’è un goal ed il behavior move_to_goal è terminato! Probabilmente quello che il progettista suppone è che il behavior ha un modello con un pattern di azione fisso e quindi persiste nel muoversi verso l'ultima ubicazione nota del goal. 51 Behavior Table Releaser Behavior Motor Schema always on follow-line() stay-on-path(c_x) Percept Perceptual schema c_x Computecentroid(image,white) Come si vede dalla tavola dei behavior, la squadra del CSM propose inizialmente solamente un behavior: follow-line . Il behavior di follow-line consisteva di un schema motore, stay-onpath(centroid) che era riflessivo (stimolo-risposta) e taxonomico (orientava il robot in funzione dello stimolo). Lo Schema Percettivo, compute-centroid(image,white), estraeva un affordance del centroide del bianco dall'immagine come se fosse la linea. Solamente la componente x, c_x, o ubicazione orizzontale, del 52 centroide veniva usata. Step 5. Raffinare ogni behavior. A questo punto, il progettista ha un'idea complessiva dell'organizzazione del sistema reattivo e cosa sono le attività. Ora bisogna concentrarsi sul progetto di ogni singolo behavior. Quando il progettista costruisce le strutture degli algoritmi per gli Schemi motore e percettivo, è importante essere sicuri di considerare sia l’insieme delle condizioni normali ambientali in cui il robot si aspetta di operare sia quando il behavior fallisce. 53 Il behavior di follow-line fu basato sull'analisi che le uniche cose bianche nell'ambiente erano le linee e le balle di fieno coperte di plastica. Pur se questa era una buona assunzione, accadde un evento umoristico durante il secondo turno della competizione. Mentre il robot seguiva la linea bianca lungo il percorso, uno dei giudici capitò nel mirino della telecamera. Sfortunatamente, il giudice portava scarpe bianche, ed Omnibot girò in una direzione a metà tra le scarpe e la linea. Il capitano della squadra del CSM, Floyd Henning si rese conto di quello che stava accadendo e gridò al giudice di spostarsi. Troppo tardi, le ruote anteriori del robot erano già sulla linea; la telecamera ora guardava fuori della linea e non c'era nessuna possibilità di recuperare. Improvvisamente, giusto prima che la ruota posteriore sinistra lasciasse il confine, Omnibot si raddrizzò e cominciò ad procedere parallelamente alla linea! Il percorso girava a destra, Omnibot attraversò di nuovo il percorso e riacquisì la linea. Probabilmente era uscito fuori della linea per un capello. La folla diventò pazza, mentre la squadra di CSM si scambiò occhiate confuse. 54 Cosa era accaduto da fare tornare Omnibot nei confini? Lo Schema Percettivo stava usando il 20% dei pixels più brillanti dell'immagine per calcolare il centroide. Quando si girò verso l'erba, Omnibot proseguì diritto perché la riflessione sull'erba era largamente casuale e le posizioni erano state annullate, mentre il centroide era rimasto sempre al centro dell'immagine. I giardinieri avevano tagliato solamente l'erba nelle aree dove doveva passare il percorso. Lungo il percorso e in parallelo ad esso vi era un pezzo di erba intonsa pieno di fiorellini di dente di leone. La fila di fiorellini bianchi agì come se fosse una linea bianca, ed una volta che Omnibot la vide corresse leggermente il suo percorso per rimanere parallelo a loro. Fu una fortuna pura e semplice che il percorso curvasse in quel punto così che quando i dente di leone furono fuori quadro, Omnibot continuò diritto e si intersecò di nuovo col percorso. Quindi Omnibot non era stato programmato per reagire a scarpe o ai dente di leone, ma reagì 55 considerando correttamente la sua nicchia ecologica. Step 6: Verifica ogni behavior indipendentemente. Come in ogni progetto di ingegneria del software, moduli o behavior sono esaminati individualmente. Idealmente, il test si fa in simulazione prima di esaminare il robot immerso nell’ambiente. Molti robot commerciali disponibili, come Khepera e Nomads, vengono forniti con simulatori impressionanti. Comunque, è importante ricordare che i simulatori spesso imitano solo le meccaniche del robot, non le capacità percettive. Essi sono utili per verificare che il codice dello schema motore è corretto, ma spesso l'unico modo di verificare lo Schema Percettivo è quello di provarlo nel mondo reale. 56 Step 7: Test con gli altri behavior. Il passo finale del progetto e dell’implementazione del sistema reattivo è fare un test sull’integrazione quando cioè i behavior sono combinati insieme. Questo include anche il collaudo dei behavior nell'ambiente reale. Anche se il behavior di follow_line funzionò bene quando fu fatto il test con le linee bianche, non funzionò però bene quando fu fatto con linee bianche ed ostacoli. Gli ostacoli, balle di fieno avvolte di plastica luccicante poste vicino alla linea, erano spesso più brillanti dell'erba. Perciò lo schema percettivo di follow_line nel calcolare il centroide teneva conto di pixels che facevano parte della balla. Invariabilmente il robot si fissava sulla balla, e seguiva il suo perimetro piuttosto che la linea. 57 Le balle erano viste come "distrazioni visuali." Le balle fortunatamente erano relativamente piccole. Se il robot avesse potuto chiudere gli occhi per circa due secondi e quindi andare diritto, sarebbe rimasto certamente sul percorso. Questo fu chiamato il behavior della mossa_in_avanti (move_ahead). Esso usava la direzione del robot (angolazione, direzione) essenzialmente per produrre un campo uniforme. Il problema divenne come sapere quando ignorare l’input visivo e far intervenire move_ahead. L'approccio al problema di quando ignorare la visione era di usare il sonar come un releaser per move_ahead. Il sonar era puntato sulla linea ed ogni qualvolta faceva una lettura, move_ahead interveniva per due secondi. 58 A causa delle difficoltà di lavorare sotto DOS, il CSM doveva usare una sincronizzazione e uno scheduling per tutti i processi. Fu più facile e più affidabile far funzionare ogni processo ad ogni ciclo di aggiornamento, anche se poi i risultati venivano scartati. Di conseguenza i releaser del sonar per move_ahead essenzialmente interdivano follow_line, mentre la mancanza di un releaser del sonar interdiva move_ahead. Entrambi i behavior funzionavano continuamente, ma solo uno aveva qualche influenza su quello che il robot faceva. In fig. si vede questa inibizione, e la nuova Behavior Table. 59 Nuova Behavior Table Releaser Inhibited by Behavior Motor Schema Perc ept Perceptual schena always on Near=read_sonar() follow-line() stay-on-path(c_x) c_x Computecentroid(image,white) always on Far=read_sonar() Move_ahead(dir) Uniform(dir) dir Dead_reckon(shaftencoders) sonar Move_ahead TV cam Follow_line T 60 La versione finale funzionò abbastanza bene per la squadra del CSM che arrivò prima. Il robot percorse la pista fino a circa 90 cm dalla linea di fine. I giudici avevano messo una buca di sabbia poco profonda per esaminare la trazione. La buca di sabbia dava qualche preoccupazione perchè la sabbia era di un colore chiaro, e poteva essere interpretata come parte della linea. Siccome la sabbia era a livello del suolo, il lettore di distanza non poteva essere usato come inibitore. Infine, la squadra decise che siccome la grandezza della buca di sabbia era circa metà della lunghezza di una balla, non avrebbe avuto abbastanza influenza sul robot da fargli cambiare il delicato scheduling programmato. 61 La squadra ebbe ragione perchè la buca di sabbia era troppo piccola per essere una distrazione visuale significativa. Comunque, si dimenticarono del problema della trazione. Per trovare più trazione la squadra optò per veri pneumatici invece che ruote di plastica lisce, ma dimenticò di collegarli. Una volta nella sabbia, il robot iniziò a slittare. Dopo che il limite di tempo fu superato, alla squadra fu permesso di spingere leggermente il robot in avanti (fatto con un colpetto da parte del capo equipe) per vedere se avesse completato il percorso intero. Effettivamente lo fece. Nessuna altra squadra andò tanto lontano dalla buca di sabbia. È chiaro che un sistema reattivo andava bene per questa applicazione. L'uso di behavior reattivi primitivi era computazionalmente molto poco costoso, permettendo al robot di aggiornare gli attuatori pressocché alla stessa velocità di aggiornamento del framegrabber 62 della visione. Ci sono molte importanti lezioni che possono essere estratte da questo caso di studio : • La squadra del CSM sviluppò un robot che andava bene per la sua nicchia ecologica. Comunque, essa era una nicchia molto limitata. I behavior non funzionerebbero per un dominio del tipo: segui un marciapiede o un percorso di linee bianche con intersezioni. In realtà, il robot reagì ad un oggetto inaspettato nell'ambiente come le scarpe bianche del giudice. •In questo caso il releaser o lo stimolo inibitore per il behavior non è costituito dalla stessa percezione necessaria per portare a termine il compito. Infatti per interdire il behavior fu usato un sonar. Follow_line usava la visione, mentre move_ahead integrava i dati degli shaft encoder per continuare a muoversi verso l'ultima direzione buona. Questo esempio illustra anche la tendenza negli schemi motore 63 puramente reattivi di assegnare un sensore per behavior. Assemblaggi di Behavior Il caso di studio precedente ha illustrato i principi di base del progetto di behavior reattivi. In esso, ci sono un numero banale di behavior. Cosa accade quando ci sono molti behavior, alcuni dei quali devono funzionare concomitantemente ed altri in sequenza? Ci sono, da qualche parte nel sistema, dei releasers che determinano la sequenza. Il problema è come rappresentare formalmente i releasers e le loro interazioni in una qualche forma di sequenza logica. Se un set di behavior forma un pattern prototipico di azione, essi possono essere considerati “meta" o "macro" behavior, dove un behavior è compattato, a partire da altri behavior primitivi, in un behavior astratto. Di qui il problema di come incapsulare il set di behavior e la64 loro sequenza logica in un modulo separato. La stessa struttura a schema dell’OOP, usata per raccogliere uno Schema Percettivo ed uno schema motore in un behavior, può essere usata per raccogliere più behavior in un behavior astratto, come mostrato in Fig dal behavior composto di behavior. Il programma di controllo coordinato, membro del behavior astratto, fornisce il releasers per i behavior componenti. 65 Resta il problema di come rappresentare formalmente i releasers in maniera che il robot li possa eseguire ed il progettista umano li possa visualizzare e diagnosticare. Ci sono tre maniere per compattare una sequenza di behavior: automi a stati finiti, scripts e skills. Gli automi a stati finiti (FSA) e gli scripts sono logicamente equivalenti, ma danno luogo a modi lievemente diversi di implementazione. Gli skills raccolgono i tipo-behavior primitivi, chiamati ReazioneAzione Packages (RAPs), in un "piano abbozzato" che può essere poi riempito man mano che il robot li esegue. Coordinazione e controllo con behavior tipo FSA furono usati con successo dal team della Georgia che vinse nel 1994 la gara di raccolta della spazzatura dell’AAAI, e dal team LOLA vincente nella 66 stessa competizione dell’JCAI nel 1995. Gli Scripts furono usati dalla squadra della CSM nella competizione del 1995; essi dal punto di vista comportamentale funzionarono come per le squadre vincenti ma la squadra non entrò in classifica a causa di una penale dovuta alla mancanza di un manipolatore. Queste squadre usarono al massimo otto behavior, anche se LOLA aveva un gripper più sofisticato della squadra del Georgia Tech. Al contrario, CHIP la squadra che vinse il secondo posto nella competizione dell’IJCAI, aveva 34 skill e 80 RAP per fare lo stesso task. Poiché in generale gli skills portano ad una implementazione più complessa degli FSA e degli scripts, non li tratteremo. Il punto più importante da ricordare nell'assemblaggio dei behavior è di tentare di avere un sistema di trigger, o releaser, per decidere il prossimo passo nella sequenza, piuttosto che contare su un modello interno di quello che il robot ha fatto recentemente. 67 68 Automi a Stati Finiti (FSA) Gli Automi a Stati Finiti (FSA) sono un meccanismo utile per specificare quello che un programma dovrebbe fare ad un certo tempo o circostanza. Il FSA può essere scritto come una tavola o progettato come un diagramma di stato, dando così al progettista una rappresentazione visiva. La maggior parte dei progettisti fanno entrambe le cose. Ci sono molte varianti di FSA, ma lavorano tutte pressappoco allo stesso modo. 69 Per cominciare, il progettista deve essere capace di specificare un numero limitato di stati distinti nei quali il robot potrebbe trovarsi. Il set di stati è rappresentato da K, e ogni stato q K è una lista dei behavior che dovrebbero essere attivi contemporaneamente. Nel caso della competizione precedente, c’erano solamente due stati: seguire la linea e muoversi in avanti. Gli stati sono rappresentati in una tavola sotto l'intestazione q, e da cerchi in un grafico. (Vedi fig.). 70 Per convenzione, vi è sempre un stato di Start, ed il robot dovrebbe partire sempre di là. Lo stato di Start è spesso scritto come s o q0 e disegnato con un doppio cerchio. Nel caso dell'UGR, lo stato di following-line era sempre lo stato di inizio poichè il robot cominciava col behavior di follow-line attivo. La successiva parte del FSA è l’input (anche detto alfabeto). Gli input sono i releasers comportamentali, ed appaiono sotto la colonna dove capeggia . La tavola del FSM considera quello che accade ad ogni stato q per tutti i possibili input. 71 Come mostrato in Fig., ci sono solamente due releasers per l'esempio di UGR, così la tavola non ha molte righe. 72 La terza parte del FSM è la funzione di transizione, detta che specifica in che stato va il robot dato uno stimolo in input. Il set di stimoli o affordances che può essere riconosciuto dal robot è rappresentato da . Questi stimoli sono rappresentati da frecce. Ogni freccia rappresenta il releaser per un behavior. Il nuovo behavior triggerato dal releaser dipende dallo stato nel quale il robot è. Questo è lo stesso dell’IRM, dove l'animale letteralmente ignora i releasers che non sono rilevanti per il suo stato corrente. Si ricordi anche che nella Lez. 3 nella implementazione del programma seriale dell’IRMs l'agente "osservava“ i releasers ogni secondo. Ad ogni iterazione, l’agente avrebbe potuto avere fame e “sarebbe entrato" nello stato di alimentarsi. Nella successiva iterazione, ancora avrebbe potuto avere fame e sarebbe rientrato nello stato di alimentarsi. Questo può essere rappresentato avendo frecce che partono dallo stato di alimentarsi e puntano di nuovo allo stesso 73 stato. Il codice C è implementato come una sequenza implicita, dove l’ordine di esecuzione dipende dal valore dei releasers. Una implementazione come sequenza esplicita potrebbe essere la seguente: Releaser food, hungry, nursed, predator; while (TRUE) { predator = sensePredator() ; if (predator==PRESENT) flee() ; food = senseFood(); hungry = checkStateHunger() ; parent = checkStateParent() ; if (hungry==PRESENT) searchForFood () ; feed() ; nurse() ; sleep() ; 74 } Per l'esempio in fig, il robot comincia nello stato di seguire una linea. Questo vuole dire che il robot non è preparato a gestire una distrazione visuale (range near) finché non ha cominciato a seguire una linea. Se lo fa, il programma può fallire perché il FSA chiaramente mostra che non risponderà alla distrazione per almeno un ciclo di aggiornamento. In questo periodo, il robot può dirigersi in direzioni sbagliate. Cominciare nello stato di following-line andava bene per la competizione di UGR, dove si sapeva in anticipo che non c'erano balle di fieno vicino alla linea iniziale. 75 Un caso più generale è mostrato in Fig. 5.9, dove il robot può partire sia su un percorso libero sia in presenza di una balla. 76 Il quarto pezzo di informazione che un progettista ha bisogno di sapere è quando il robot ha completato il task. Ogni stato che il robot può raggiungere e che termina il task è un membro del set di stati finali, F. Nell'esempio di UGR il robot non si ferma mai e non c’è uno stato finale - il robot funziona finché non è spento a mano o si scarica la batteria. Così, entrambi gli stati sono stati finali. Se il robot potesse riconoscere la linea di arrivo, allora potrebbe avere un stato finale. Lo stato finale potrebbe essere giusto fermati o potrebbe essere un altro behavior, come in caso di vittoria agitare la telecamera. Si noti che questo aggiunge altre righe alla tabella del FSA, poiché vi deve essere una riga per ogni singolo stato. Da molti punti di vista, la tabella del FSA è una estensione della tabella comportamentale. La tabella risultante è nota come una macchina a stati finiti (FSM) abbreviato M. 77 La notazione M = K, , , s, F è usata per ricordare che per usare un FSA il progettista deve sapere tutti i q stati (K), gli input le transizioni tra gli stati , lo stato iniziale speciale q0 e lo stato/i finale (F). Ci deve essere una freccia nel diagramma di stato per ogni riga nella tabella . La tabella sotto compendia le relazioni tra gli FSA e i behavior: FSA Behavior K Tutti i behaviors per un task I releasers for ciascun behavior in K La funzione che calcola il nuovo stato s Behavior di start per il robot F Behavior che il robot deve eseguire per smettere 78 In domini più complessi, i robot hanno bisogno di evitare ostacoli (specialmente le persone). AVOID dovrebbe essere sempre attivo, per cui è spesso implicito nel FSA. Move_to_goal è spesso inteso come move_to_goal e AVOID. Questo raggruppamento implicito di “behavior interessante per il task" e "quei behavior che proteggono il robot" sono anche visti come behavior strategici e tattici. Un altro punto importante circa l’uso dei FSA è che essi descrivono il behavior complessivo di un sistema, mentre le implementazioni possono variare. 79 In fig. c’è una descrizione accurata dei cambi di stato all’inizio dell’UGV. Il controllo per i behavior poteva essere implementato come indicato dal FSA: se following-line è attiva e range ritorna range near, allora move-ahead. Gli esempi seguenti mostreranno come il concetto di FSA può essere implementato con la sussunzione e i sistemi a schema-theory. 80 Un FSA per la raccolta dell‘immondizia Come altro esempio di come costruire ed applicare un FSA, si consideri il task della raccolta dell’immondizia. Supponiamo che il robot sia un piccolo veicolo, come quelli usati dalla Georgia Tech o il Pioneer mostrati in Fig., con una telecamera ed un bumper per dire quando il robot ha urtato qualche cosa. In entrambi i casi, il robot ha un semplice gripper. Si presume che il robot può dire se il gripper è vuoto o pieno. Un modo per fare questo è mettere un sensore a IR attraverso la mascella del gripper. Quando l'IR ritorna uno short range, il gripper è pieno e si può immediatamente chiudere, con un riflesso di presa. Un problema con i grippers è che non sono efficienti come una mano umana. Così, c'è sempre la possibilità che la lattina scivoli o cada fuori del gripper. Il robot dovrebbe però rispondere adeguatamente se mentre sta 81 portando una lattina o della immondizia la perde. L'ambiente in questo esempio è visualmente semplice, e ci sono ovvie affordances. Le lattine di Coca-cola sono gli unici oggetti rossi nell'ambiente, e i bidoni di immondizia sono gli unici oggetti blu. Estrarre perciò visualmente macchie rosse e blu dovrebbe essere sufficiente. Tutti gli oggetti sono sul pavimento, così il robot si deve preoccupare solamente di dove sono gli oggetti sull'asse x. Uno scenario di base per il robot è cominciare a vagare nella stanza alla ricerca di macchie rosse. Dovrebbe tirare diritto verso il centro della macchia rossa più grande finché non vede la lattina. Poi dovrebbe tentare tre volte di afferrare la lattina, e, se ci riesce, dovrebbe cominciare a vagare cercando una macchia blu. Ci dovrebbe essere solamente una macchia blu alla volta nell'immagine perché i due bidoni di immondizia sono messi in angoli opposti della stanza. Non appena vede una macchia blu, il robot deve muoversi diritto al centro della macchia finché la macchia diventa di una certa grandezza nell'immagine (potendo essere vista anche da lontano). 82 Il robot allora dovrebbe fermarsi, lasciare cadere la lattina, rivolgersi in una nuova direzione casuale e riprendere il ciclo. Il robot dovrebbe evitare ostacoli, ma muovendosi verso una macchia rossa o blu dovrebbe avere un'azione di riferimento prefissata, altrimenti immediatamente il robot dimentica dove stava andando. La tavola dei behavior è: 83 Le chiamate di funzione nella tavola mostrano per brevità solo gli argomenti rilevanti. Il behavior AVOID è interessante. Il robot quando urta qualche cosa indietreggia o a destra o a sinistra (usando un NaT). Può urtare un muro dell’ambiente in diverse posizioni, allora si muoverà in wander in una qualunque direzione. Se il robot urta una lattina (invece di afferrarla con il suo gripper), indietreggiando ha una seconda opportunità. Questa tavola mostra che il progetto conta sul gripper per sapere a che punto della sequenza nominale si trova il robot. Un gripper vuoto vuole dire che il robot dovrebbe essere nella fase di raccolta dell’immondizia, oppure sta cercando una lattina o si sta muovendo attorno ad essa. Un gripper pieno vuole dire che il robot è nella fase di deposito. Il releaser significativo estrae la taglia della regione blu in pixels e la paragona ad una taglia N prefissata. Se la regione è maggiore o uguale a N allora il robot è abbastanza vicino al 84 bidone e può gettare la lattina Ci sono due problemi con la tavola dei behavior. Il primo è che essa non mostra la sequenza o il flusso di controllo chiaramente. Il secondo è come fa il progettista a mettere giù questi behavior? Qui è dove un FSA può essere particolarmente utile. Esso permette al progettista di saldare le varie sequenze e rappresentare il progetto dei behavior graficamente. In fig. è mostrato un FSA equivalente alla tabella 85 86 L’FSA permette di esprimere la sequenza dei behavior. Questo avviene al prezzo di non poter mostrare con precisione come la sequenza vada implementata, incoraggiando così il progettista a creare stati interni. Nel caso in esame il programmatore dovrebbe implementare due behavior di wander, ciascuno istanziato da releasers differenti, e due move-to-goal. Molti progettisti disegnano e interpretano gli FSA come estrattori di releasers. Per esempio la transizione corretta da GRAB TRASH a WANDER FOR TRASH CAN (cerca il bidone per le lattine) è FULL AND NO_BLUE, ma un progettista potrebbe essere tentato di etichettare le frecce solo come NO_BLUE perchè per raggiungere quello stato il gripper deve essere FULL. Questo è un errore molto pericoloso poichè presume che l’implementazione terrà conto in quale stato interno sia il robot (inizializzando una variabile), invece di permettere che attributi direttamente percepibili dal mondo informino il robot in quale stato egli 87 si trovi. Il concetto di stato interno è incompatibile con la reattività. Il FSA nasconde anche il ruolo del behavior di AVOID. L' AVOID behavior sta sempre funzionando, mentre gli altri behavior sono instanziati e de-instanziati asincronamente. È difficile con un FSA mostrare behavior concorrenti. Altre tecniche, in particolare le reti di Petri sono usate in ingegneria del software ma non sono usate comunemente in robotica. L' AVOID behavior non è un problema in questo caso. Esso è sempre attivo e l’output del vettore di campo potenziale dell'AVOID può essere sommato con l’output di un altro qualunque behavior attivo. 88 Esempi di realizzazione In una implementazione in termini di schema-theory, la logica degli FSA può vedersi da due punti di vista. Se l’unico compito del robot è riciclare scatole di coca cola, la logica di controllo potrebbe essere messa nel programma principale. Se il robot avesse molti compiti da fare, la capacità di riciclare immondizia sarebbe un behavior astratto, chiamato dal programma principale ogni qualvolta il robot ha bisogno di riciclare immondizia. In questo caso, la logica del FSA sarebbe messa nello slot del programma di controllo coordinato dello schema behavior. Sebbene la discussione corrente è su dove va messo il FSA, è utile guardare un momento la realizzazione complessiva. Mentre i behavior di wander-to-goal e di move_to_goal possono essere implementati facilmente con una metodologia a campi potenziale, drop-trash non lo può. 89 Drop-trash in realtà non è un behavior di navigazione. Esso è però riconducibile ad un behavior rappresentato in termini di schema theory: ha ovviamente uno schema motore (apri il gripper, gira le ruote), ha uno schema Percettivo (leggi gli encoders del gripper, e delle ruote), ha un programma di controllo coordinato (apri THEN gira), ed un releaser (il bidone delle lattine). Mentre le implementazioni in termini di schema-theory usano metodologie a campo di potenziali e vettori somma per il controllo dell’effettore, non ogni behavior genererà un vettore basato su un campo potenziale. 90 Un vantaggio degli FSA è che sono astratti, e possono essere implementato in diversi modi. La tavola di behavior ha mostrato un modo con cui il FSA potrebbe essere implementato con un meccanismo di schema-theory. La Fig. mostra una modo con cui potrebbe essere implementato invece tramite la sussunzione. Questo esempio mostra il potere dell'inibizione e soppressione che non sono ben rappresentate dai diagrammi di stato degli FSA. 91 Nell'idea della modularità e delle aggiunte incrementali di behaviors, il sistema parte con un behavior esplicito di AVOID che gira sopra il Livello 0 (non mostrato). Al livello successivo il robot vaga finché vede il rosso. Poi move_to_trash sopprime wander e sostituisce l’heading con la direzione verso l'immondizia. Il behavior di move_to_trash continua finché la lattina è nel gripper. Una volta che il gripper è pieno, il gripper si chiude ed stringe l'immondizia. Solo ora il behavior di move_to_trash è inibito. Questo impedisce a move_to_trash di fornire alcuna direzione, e quindi l’output è di nuovo la direzione di wandering. 92 Il successivo livello di competenza è depositare l’immondizia nel bidone delle lattine. Quando vede bidone delle lattine blu, move_to_trash sopprime wander e dirige il robot verso il bidone delle lattine. Se il gripper è vuoto, l’output di move_to_trash è inibito. Il robot sta cercando simultaneamente macchie rosse e blu, ma finché il gripper è vuoto, risponde solamente a macchie rosse. Anche drop_trash viene eseguito continuamente. Se al robot accade di passare vicino ad un bidone blu, segnalerà di lasciare cadere l’immondizia e ci girerà attorno. La nuova direzione sopprime ogni altra direzione proveniente da move_to_trash can. Ma il robot non aprirà il suo gripper e non girerà attorno se il gripper è vuoto, perché empty inibisce l’intera linea. L'esempio con la sussunzione produce un sistema meno complesso di quello fatto con un FSA. 93 Behavior astratti Gli automi a stati finiti sono uno strumento utile per scrivere un programma di controllo coordinato di un behavior astratto e quindi diventano uno buono strumento di programmazione per i behavior astratti stessi. In primo luogo in molti casi, l'assemblaggio di behavior rappresenta, una sequenza prototipica di eventi che dovrebbero essere adattati facilmente a situazioni diverse, in pratica, un template o behavior astratto. Nel caso della gara Raccogli l’Immondizia, riciclare le lattine di Coca cola era solo una parte del compito; si supponeva che i robot trovassero anche tazze bianche e le depositassero in bidoni di immondizia gialli. I behavior rappresentati dal FSA possono allora essere raccolti in un behavior astratto: pick-up-the-trash (trash-color, trash-can-color, 94 size-trash-can). In secondo luogo, i templates hanno bisogno di gestire condizioni di inizializzazione diverse. L’inizializzazione non è un grande problema per Pic-up-the-trash, ma lo può essere per le altre applicazioni. Per esempio, il behavior emergente del robot descritto precedentemente per la competizione di Unmanned Ground Vehicle potrebbe essere descritto come un behavior astratto di "follow-path". Si ricordi che il programma del robot presumeva che esso partisse con la telecamera rivolta verso la linea bianca. Per gestire una più ampia gamma di condizioni iniziali sarebbe necessario un general purpose behavior di follow-path riutilizzabile come ad esempio partire di fronte ad una balla di fieno o non essere perfettamente allineato alla linea bianca. 95 Un altro behavior comune usato per l’inizializzazione è l’imprinting, dove al robot è presentato un oggetto e esso si ricorda il colore percepito (o qualche altro attributo dell'oggetto) per usarlo con un behavior nominale. Nella competizione del Pick up the Trash, molte squadre letteralmente mostrarono al robot la lattina di Coca cola per consentirgli di determinare i migliori valori di "rosso" nelle condizioni di illuminazione correnti. Analogamente, alcuni behavior astratti avrebbero bisogno di speciali behavior di terminazione. Nel caso della gare del UGR, i behavior di terminazione erano NULL, ma sarebbero potuti essere la danza della vittoria. 96 In terzo luogo, delle volte i robot falliscono nel loro compito; questi eventi spesso sono chiamati eccezioni. Un'eccezione potrebbe essere quando il robot non raccoglie la lattina di coca cola entro 10 minuti. Allora può intervenire un altro behavior (fai una scansione raster piuttosto che un wander casuale) o usa un set alternativo di parametri (l'uso di valori diversi per il rosso). 97 Gli script I Behavior astratti spesso usano script o una struttura analoga chiamata skills, per creare template di assemblaggi di behavior generici. Gli script offrono un modo diverso di generare la logica per un assemblaggio di behavior. Essi incoraggiano il progettista a pensare al robot e al suo compito letteralmente in termini di una sceneggiatura. Gli script sono stati usati originariamente nella elaborazione del linguaggio naturale (NLP) per aiutare il pubblico (un computer) a capire gli attori (persone che parlano col computer o scrivono sommari di quello che fanno). Nel caso dei robot, gli script possono essere usati più letteralmente, dove gli attori sono robot che leggono lo script. Lo script ha più spazio per l’improvvisazione. Se il robot incontra una condizione inaspettata (un'eccezione), allora il 98 robot comincia a seguire un sub-script. La Fig. mostra un raffronto tra gli elementi dello script per un attore e quelli di uno script per un robot. La sequenza principale di eventi è chiamata una catena causale. La catena causale è critica, perché incarna il programma logico di controllo coordinato così come avviene in un FSA. Può essere implementato nello stesso modo. In NLP, gli script permettono al computer di tenere conto di una conversazione che può essere abbreviata. 99 Per esempio, si consideri un computer che tenta di leggere e tradurre un libro dove i protagonisti principali si sono fermati in un ristorante. I buoni scrittori spesso eliminano tutti i dettagli di un evento per concentrarsi su quelli significativi. Questa informazione mancante, ma implicita, è facile da estrarre. Supponiamo che il libro cominci con "John ordinò un’aragosta." Questo è un indizio che serve come un indice rispetto all'evento corrente o rilevante dello script (mangiare al ristorante), ignorando gli eventi passati (John è arrivato al ristorante, John ha chiesto un menu, ecc.). Gli script concentrano inoltre l'attenzione del sistema sul prossimo evento più probabile (cerca una frase che indica che John ha fatto una ordinazione), così il computer può instanziare la funzione che cerca questo evento. Se la prossima frase è "Armand servì l'aragosta e versò di nuovo il vino bianco", il computer può inferire che Armand è il cameriere e che John prima aveva ordinato ed aveva ricevuto del vino bianco, senza che questo fosse stato detto esplicitamente. 100 Nel programmare un robot, le persone spesso preferiscono abbreviare le parti delle routine di controllo e si concentrano sulla rappresentazione e il debug della sequenza di eventi più importanti. Gli automi a stati finiti costringono il progettista a considerare ed enumerare ogni possibile transizione, mentre gli script semplificano la specifica. I concetti di indexing e focalizzazione dell’attenzione sono estremamente preziosi per coordinare i behavior nei robot in una maniera efficiente ed intuitiva. Le realizzazioni effettive richiedono processi asincroni, ma l’implementazione di questi processi è oltre lo scopo di questo corso. 101 Per esempio, immaginiamo che un robot per la raccolta della spazzatura parta. La prima azione nella catena causale è di cercare le lattine di Coca cola. Il progettista comprende che questo behavior potrebbe generare una direzione casuale e muovere il robot, perdendo una lattina che sta giusto di fronte a lui. Perciò, il progettista vuole che un codice che permette al robot di ignorare la ricerca nello spazio circostante, non appena vede una lattina di Coca cola, e che cominci a raccogliere la lattina senza chiamare il behavior di wander-for-goal(red). Il progettista sa anche che il prossimo releaser dopo che grab-trash si attiva per guardare se è blu, perché l'indicazione per muoversi verso il bidone dell'immondizia e lasciare cadere la lattina è il colore blu. La scrittura risultante per un behavior astratto che porti a termine un task è di solito la stessa di quella della programmazione logica dedotta da un FSA. Nel caso della Raccolta dell’immondizia, lo script apparirebbe102come segue: Per ogni aggiornamento \\ look for props and cues first: cans, trash cans, gripper rStatus=extract_color(red, rcx, rSize); \\ ignore rSize if (rStatus==TRUE) \\ stato del rosso SEE_RED=TRUE; else SEE_RED=FALSE; bStatus=extract_color(blue, bcx, bSize); if (bStatus==TRUE){ SEE_BLUE=TRUE; NO_BLUE=FALSE; \\ stato del blue } else { SEE_BLUE=FALSE; NO_BLUE=TRUE; } AT_BLUE=looming(size, bSize); \\ grandezza del blue gStatus=gripper_status(); \\ stato del gripper if (gStatus==TRUE) { FULL=TRUE; EMPTY=FALSE; } else { 103 FULL=FALSE; EMPTY=TRUE; } \\index chain if into the correct step in the causal (EMPTY){ if (SEE_RED){ move_to_goal(red); else wander (); } else{ grab_trash(); if (NO_BLUE) wander(); else if (AT_BLUE) drop_trash(); else if (SEE_BLUE) move_to__goal (blue) ; } 104