` DEGLI STUDI DI PARMA UNIVERSITA Facolt`a di Ingegneria Corso di Laurea in Ingegneria Informatica REALIZZAZIONE DI UN’ARCHITETTURA DI CONTROLLO PER IL ROBOT PIONEER BASATA SUL FRAMEWORK YARA Relatore: Chiar.mo Prof. STEFANO CASELLI Correlatore: Ing. FRANCESCO MONICA Tesi di Laurea di: GABRIELE CAMELLINI ANNO ACCADEMICO 2005-2006 Alla mia famiglia, per la fiducia e l’affetto. Indice Indice i 1 Introduzione 1.1 Scopo della tesi . . . . . . 1.2 Stato dell’arte . . . . . . . 1.2.1 Shapira . . . . . . 1.2.2 Player/Stage . . . 1.3 Organizzazione dei capitoli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 2 3 4 5 2 Il Pioneer 2.1 Il robot . . . . . . . . . . . . . . . . . . . . 2.1.1 Documentazione . . . . . . . . . . . 2.2 Caratteristiche tecniche . . . . . . . . . . . . 2.2.1 Struttura . . . . . . . . . . . . . . . 2.2.2 Dimensioni . . . . . . . . . . . . . . 2.2.3 Movimento . . . . . . . . . . . . . . 2.2.4 Sensorialit`a . . . . . . . . . . . . . . 2.2.5 La scheda di controllo . . . . . . . . 2.3 PSOS - Pioneer Server Operating System . . 2.4 Protocollo di comunicazione . . . . . . . . . 2.4.1 Livello fisico . . . . . . . . . . . . . . 2.4.2 Livello data link . . . . . . . . . . . . 2.4.3 Communication Packet Protocol . . . 2.4.4 Interazione client/server . . . . . . . 2.4.5 Client Commands . . . . . . . . . . . 2.4.6 Server Information Packets . . . . . . 2.4.7 Apertura e chiusura della connessione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7 8 8 9 9 10 11 12 14 14 15 15 17 17 19 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Aggiornamento del Pioneer 22 3.1 Motivazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2 Scelte progettuali . . . . . . . . . . . . . . . . . . . . . . . . . 23 i INDICE 3.3 3.4 ii Aggiornamento fisico del robot . . . . . . . . . . . . . . . . . . 23 Realizzazione del PC di bordo . . . . . . . . . . . . . . . . . . 24 4 Progettazione e sviluppo 4.1 YARA . . . . . . . . . . . . . . . . . . 4.2 Fasi di sviluppo . . . . . . . . . . . . . 4.3 Driver P2OS di Player . . . . . . . . . 4.4 Realizzazione delle funzionalit`a di base 4.5 Integrazione nel framework YARA. . . 4.5.1 Implementazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 28 29 30 31 33 35 5 Sperimentazione 37 5.1 Taratura dei sonar . . . . . . . . . . . . . . . . . . . . . . . . 37 5.2 Realizzazione di un comportamento . . . . . . . . . . . . . . . 41 6 Conclusioni A Procedure tecniche A.1 Installazione del PC di bordo . . . . . . . . . A.2 Installazione dello scanner laser Sick LMS 200 A.3 Ricarica delle batterie . . . . . . . . . . . . . A.3.1 Batterie al piombo . . . . . . . . . . . A.3.2 Batterie al NiMh . . . . . . . . . . . . 44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 46 48 50 50 51 B Listato dell’applicazione Stay In The Middle 53 B.1 Behaviour per il robot . . . . . . . . . . . . . . . . . . . . . . 53 B.2 Main program . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 C Tabella comandi PSOS 57 Bibliografia 59 Ringraziamenti 60 Capitolo 1 Introduzione Il Pioneer `e un versatile robot mobile, che appartiene alla flotta di robot disponibili presso il laboratorio RIMLab[1], del Dipartimento di Ingegneria Informatica dell’Universit`a di Parma. Il Pioneer `e un robot di ridotte dimensioni, prodotto dall’ActivMedia[2], dotato di due ruote motrici e di un sistema sensoriale costituito da 7 sonar (pi` u altre tipologie di sensori), utilizzato a scopo didattico dagli studenti del corso di Robotica della Laurea Specialistica. L’utilizzo prettamente didattico non toglie la possibilit`a di utilizzarlo anche a scopo di ricerca, ma vista la relativa rapidit`a nell’apprenderne il funzionamento `e il robot ideale per sviluppare applicazioni di robotica mobile nel breve periodo di un corso universitario. Solitamente, al termine del suddetto corso viene indetta una ”Competition” nella quale gli studenti mettono a confronto i propri programmi di controllo del robot, per compiere una prova nel miglior modo/tempo possibile. Fino a questo momento l’utilizzo del Pioneer e’ stato fortemente limitato a causa della modalit`a di controllo remoto realizzato mediante una coppia di radio-modem seriali, uno presente sul robot e l’altro collegato ad un PC fisso. Questa caratteristica limitava il raggio di azione e soprattutto non permetteva l’espansione delle capacit`a sensoriali mediante l’utilizzo di moderni sensori quali telecamere digitali e scanner laser. Dal lato software, il controllo del robot avviene tramite il framework Player Stage[3], un potente strumento che si interpone tra il robot e l’applicazione di controllo realizzata dall’utente. Nel controllo del Pioneer si sfruttano tuttavia soltanto pochissime delle funzionalit`a offerte dal framework che, pur non essendo un software computazionalmente pesante, risulta fortemente sottoutilizzato. 1 CAPITOLO 1. INTRODUZIONE 1.1 2 Scopo della tesi L’obbiettivo che questa tesi vuole perseguire consiste nello sviluppo di una nuova architettura di controllo per il robot Pioneer basata sul framework YARA[4], sviluppato dall’Ing. Francesco Monica presso l’Universit` a di Parma, che permetta un controllo affidabile ed efficiente del robot. Per superare i limiti funzionali, ai quali si `e accennato nella sezione precedente, si `e deciso di procedere ad un aggiornamento hardware del robot mediante l’installazione a bordo di un completo PC. Ci`o consente di rendere il robot autonomo e permette l’utilizzo di una ampia gamma di sensori per espandere le capacit`a sensoriali. Successivamente si `e passati allo sviluppo software che, sostanzialmente, deve portare alla creazione di un modulo da inserire nel framework YARA per il controllo del Pioneer. 1.2 Stato dell’arte Nel gergo comune, parlando di un robot, lo si associa quasi esclusivamente alla struttura hardware e spesso lo si immagina con una forma antropomorfa. Nella realt`a la parte pi` u importante di un robot `e il software di controllo che permette di renderlo autonomo determinandone il comportamento. Il controllo del robot Pioneer pu`o avvenire in due modalit`a: - standalone - client/server La prima modalit`a consiste nello sviluppo di un programma che viene poi eseguito direttamente sul microcontrollore a bordo del robot. Siccome il microcontrollore ha capacit`a di elaborazione molto limitate, questa possibilit`a di controllo non `e stata mai praticamente utilizzata. Nella modalit`a client/server il robot viene gestito in remoto da un PC. Sul microcontrollore a bordo del robot `e in esecuzione il server, costituito dal PSOS, e sul PC il software client riceve i dati sensoriali e invia i comandi di moto. PSOS (Pioneer Server Operating System) `e un sistema operativo creato dall’ActivMedia per gestire le funzionalit`a di una vasta famiglia di robot mobili. Per il software client, nel corso della storia del Pioneer, sono state utilizzate due differenti piattaforme per il controllo del robot con interfaccia via radio-modem o mediante cavo seriale. Esse sono: - Shapira CAPITOLO 1. INTRODUZIONE 3 - Player/Stage 1.2.1 Shapira Inizialmente nel controllo del Pioneer veniva utilizzato Shapira, una libreria per lo sviluppo di software, lato client, per interfacciarsi con il PSOS installato sul robot. La libreria `e stata sviluppata dalla ActivMedia come software proprietario, quindi non aperta a modifiche e a studi approfonditi sul funzionamento. Inizialmente era disponibile solo per DOS, poi ne `e stata rilasciata una versione per Linux. Nella libreria `e disponibile una serie di funzioni per realizzare la comunicazione client/server e controllare il robot con comandi di alto e basso livello. Il pacchetto di sviluppo Shapira, oltre alle funzioni per la programmazione in linguaggio C del robot, contiene il Colbert Robot Programming Language e il Behavior Compiler. Il primo `e un linguaggio stile C che permette di controllare direttamente il Robot in modo interattivo, il secondo `e un linguaggio molto semplice per generare in modo automatico il codice C relativo. La libreria Shapira `e costituita da due parti: - la System Architecture - il Robot Control Architecture La prima, di pi` u basso livello, `e costituita dalle funzioni per la comunicazione e il controllo del robot attraverso il PC host. La seconda permette di gestire i comportamenti pi` u complessi quali il riconoscimento di ostacoli e la pianificazione del moto. Le due componenti della libreria vengono gestite da task eseguiti con temporizzazioni diverse: tempi brevi per la prima, pi` u alti per la seconda. Di seguito vengono elencati i principali difetti della libreria Shapira: - offrendo delle funzioni per il linguaggio C non `e orientata alla programmazione ad oggetti; - essendo sviluppata per essere eseguita su sistemi non multitasking, se eseguita su questi, assorbe molte risorse inutilmente; - non essendovi implementate delle politiche per il controllo dell’esecuzione dei task, non pu`o essere definita realtime. CAPITOLO 1. INTRODUZIONE 1.2.2 4 Player/Stage Player/Stage[3] `e un framework per la robotica mobile nato dalla collaborazione dello Stanford AI Lab, del Robotics Research Lab della University of Southern California, con il Simon Fraser Autonomy Lab [5]. Il framework Player/Stage `e uno tra i pi` u utilizzati a livello mondiale nel controllo dei robot mobili e nella gestione della sensoristica ad essi collegata. ` stato sviluppato per piattaforme UNIX e permette il controllo di decine E di modelli di robot mobili e di varie tipologie di sensori (dalle telecamere digitali, ai sonar, passando per gli scanner laser). La principale caratteristica, che ne ha decretato il successo, risiede nell’utilizzo di socket TCP per gestire la comunicazione fra le varie parti del sistema. Questo aspetto presenta indubbi vantaggi: l’utilizzo delle socket `e molto semplice, esse permettono di separare la gestione dell’hardware del robot dal programma di controllo, non dipendono dal linguaggio di programmazione utilizzato, introducono una modularit`a nello sviluppo del software che facilita il costante aggiornamento senza intaccare la compatibilit`a. Un altro motivo di successo di Player/Stage `e la disponibilit`a di un ambiente per la simulazione del robot: mantenendo inalterata l’applicazione utente `e possibile interfacciarsi sia con il robot reale che con la sua simulazione. Il framework `e composto da vari componenti. Player. Player `e un robot device interface costituito da un server per il controllo dell’hardware reale o simulato di robot mobili tramite scambio di messaggi TCP con i vari client. Il server offre al client una serie di servizi remoti, che permettono il controllo dei movimenti del robot e la lettura delle misure sensoriali. Player implementa un hardware abstraction layer (HAL) per piattaforme robotiche permettendo l’accesso in modo standard ad una vasta gamma di robot, sollevando cos`ı lo sviluppatore dalla conoscenza delle modalit`a di controllo di ogni modello. Si pu`o dire che Player si interpone tra sviluppatore e robot, come il sistema operativo si interpone tra il programmatore e l’elaboratore hardware. ` la libreria che fornisce un insieme di proxy locali C++ Client Library. E che semplificano l’accesso ai servizi remoti occupandosi anche dei formati per la comunicazione. Per controllare un robot il programmatore ha a disposizione, per esempio, un proxy per il controllo del movimento, un’altro per la lettura dei sonar, un’altro ancora per la lettura dello scanner laser e in modo analogo, altri proxy per i vari dispositivi hardware. Indipendentemente dalla tipologia di robot, ogni applicazione CAPITOLO 1. INTRODUZIONE 5 client deve avere un proxy di tipo PlayerClient che instaura la connessione e si occupa della sincronizzazione del client con il server. Oltre alla implementazione in C++ nel pacchetto ufficiale sono presenti quelle per C e Java. Stage. Si tratta del simulatore per ambiente bidimensionale ricostruito a partire da una mappa fornita come immagine PNM o PNG. Stage quindi simula l’interazione tra gli oggetti virtuali controllati da Player. Inizialmente distribuito come applicazione autonoma da Player, nelle nuove versioni si presenta come suo plugin. 1.3 Organizzazione dei capitoli La tesi `e organizzata nel modo seguente. Capitolo 2. Descrizione delle caratteristiche hardware del robot e del protocollo di comunicazione. Capitolo 3. Aggiornamento fisico del robot. Capitolo 4. Progettazione e sviluppo dell’architettura di controllo. Capitolo 5. Sperimentazione e testing del software realizzato. Capitolo 6. Conclusioni Capitolo 2 Il Pioneer Nel presente capitolo verr`a brevemente descritto il robot Pioneer 1 analizzandone le caratteristiche hardware e soprattutto andando ad esaminare il protocollo di comunicazione che permette il controllo del robot mediante l’interfaccia seriale. Figura 2.1: Il robot Pioneer 1 2.1 Il robot Il termine Pioneer identifica una famiglia di robot mobili, prodotti dalla ActivMedia, utilizzati soprattutto a scopi didattici e di ricerca nelle universit`a di tutto il mondo. La famiglia di robot `e composta da tre modelli: Pioneer 1,AT prodotto a met`a degli anni 90; `e il capostipite. 6 CAPITOLO 2. IL PIONEER 7 Pioneer 2 arrivato sul mercato nel 1999; `e una evoluzione del modello precedente, del quale sono state riviste la struttura portante, l’apparato locomotore e soprattutto sono state ampliate le capacit`a sensoriali aumentando il numero di sonar e introducendo una ampia base di appoggio superiore, sulla quale possono facilmente essere dislocati vari tipi di sensori, come per esempio scanner laser, GPS, ecc.. La caratteristica pi` u interessante `e la possibilit`a di integrare all’interno del robot un PC compatibile. Pioneer 3 ulteriore evoluzione del Pioneer 2 nel quale `e stato sostituito il microcontrollore di bordo, senza introdurre molte modifiche strutturali. Inoltre `e stato aggiornato il tool software a corredo Per ogni modello sono state realizzate due versioni: quella DX, caratterizzata da due ruote motrici e un ruotino posteriore pivottante di sostegno, adatta ad operare in ambienti interni su superfici regolari, e la versione AT caratterizzata da 4 potenti ruote motrici che permettono di operare anche all’aperto su terreni impervi. Il robot disponibile presso il laboratorio RIMLab `e un Pioneer 1 acquistato nella seconda met`a degli anni 90 ed `e stato utilizzato sia a scopi didattici sia per sperimentazione a scopo di ricerca. Nel corso degli anni il Pioneer 1 `e stato oggetto di varie tesi e tesine: - Simone Monica (a.a. 97/98): Integrazione sul Pioneer di un sistema di visione a basso costo costituito da un sensore CCD lineare 64x1 pixel B/N. - Alessandro Scrivani (a.a. 97/98): Integrazione sul Pioneer di un sistema olfattivo per l’individuazione di fughe di gas. - Dario Faccini (a.a. 99/00): Ricerca del massimo comportamento reattivo ottenibile con il robot mobile Pioneer 1. - Matteo Mantovani, Emanuele Tiso, Antonio Valdessalici (a.a. 01/02): Realizzazione di un sistema di Visione con Telecamera 32x32 della F.B.C. per Robot Mobile Pioneer 1. 2.1.1 Documentazione Sul sito della ActivMedia[2] `e possibile reperire la documentazione ufficiale, cercando fra i vari manuali nella sezione Support: http://robots.mobilerobots. com/. Per poter scaricare i manuali occorre autenticarsi mediante utente e password che sono stati forniti al momento dell’acquisto del robot. Per comodit`a qui di seguito ho riportato i dati di accesso: CAPITOLO 2. IL PIONEER 8 userid: parmasci password: Sp*3r/m9W I documenti che mi sono stati pi` u utili nella stesura della tesi sono i seguenti: - Pioneer 1/AT Operations Manual, Ed. 2[6]: il manuale operativo del robot che riporta tutte le caratteristiche e spiega le modalit`a di funzionamento e controllo. - PSOS Notes: una serie di tabelle nelle quali vengono illustrate la struttura dei pacchetti scambiati tra client e PSOS e i comandi disponibili per controllare il robot. - Ricerca del massimo comportamento reattivo ottenibile con il robot mobile Pioneer 1.[7]: una tesina di Dario Faccini nella quale viene analizzata molto dettagliatamente la struttura del Pioneer 1. 2.2 2.2.1 Caratteristiche tecniche Struttura Il Pioneer 1 `e un robot mobile di ridotte dimensioni, caratterizzato da una ` dotato di due ruote motrici anteriori che permettono forma quasi circolare. E il moto roto-transazionale del robot e un ruotino posteriore di appoggio che ruota liberamente in funzione dei movimenti impressi dalla ruote motrici. Il Pioneer 1 `e suddivisibile in quattro sezioni principali: la console, il deck, il body e il nose. Le sezioni sono facilmente individuabili nella figura 2.2. ` posta sul deck in posizione frontale e ospita, Console: `e la testa del robot. E al suo interno, la scheda di controllo con il microcontrollore e il radiomodem. Sulla parte superiore sono posizionati tutti i controlli e gli indicatori necessari per l’utilizzo del robot. Nella parte frontale sono ospitati i 7 sensori sonar Polaroid. ` una superficie di appoggio piana che consente di Deck: `e il dorso del robot. E ospitare periferiche aggiuntive per il robot, come ad esempio la bussola magnetica. Body: `e la parte pi` u grande del robot che alloggia la batteria e i motori. Presenta sufficiente spazio per poter inserire batterie aggiuntive. CAPITOLO 2. IL PIONEER 9 Figura 2.2: Struttura del Pioneer 1 Nose: `e la parte inferiore frontale alla quale possono essere collegati vari tipi di attuatori e sensori, come per esempio, pinze motorizzate o sensori ottici. 2.2.2 Dimensioni Il Pioneer 1 si pu`o inserire nella famiglia di robot mobili medio-piccoli. Le sue dimensioni sono 45cm di lunghezza, 36cm di larghezza e 22cm di altez` realizzato in alluminio laminato di vari spessori ed `e completamente za. E assemblato utilizzando bulloni a brugola, senza saldature, cosa che rende molto semplice la manutenzione. Nella figura 2.3 vengono riportati i dettagli dimensionali del Pioneer 1. Come si pu`o osservare, la forma del robot `e approssimativamente circolare, e questo pu`o aiutare molto nella realizzazione degli algoritmi di navigazione. In particolare, il robot pu`o ruotare su se stesso in un cerchio di raggio 30cm. 2.2.3 Movimento Il robot viene mosso da due motori elettrici in corrente continua collegati, mediante riduttori ad ingranaggi, alle due ruote motrici poste sui fianchi sinistro e destro. Le caratteristiche dei motori e dell’apparato di movimento sono le seguenti: Raggio ruote: 12.5cm CAPITOLO 2. IL PIONEER 10 Figura 2.3: Dimensioni del Pioneer 1 Rapporto di riduzione: 19.7:1 Forza di spinta: 2Kg Velocit` a massima transazionale: 0.6m/s Velocit` a massima rotazionale: 150◦ /s Su ogni motore `e montato un encoder di posizione per avere un feed-back che consente di dosare la potenza fornita ai motori in base alla sforzo richiesto per il movimento ad una determinata velocit`a. L’alimentazione viene fornita da una batteria al piombo da 12V con una capacit`a di 7Ah che garantisce al robot circa 2 ore di autonomia. 2.2.4 Sensorialit` a A bordo del Pioneer 1 sono installati i seguenti sensori: 2 encoder di posizione: sono montati su ognuno dei due motori e permettono al PSOS, in esecuzione sul microcontrollore di bordo, di controllare la velocit`a dei motori, adattando la potenza fornita in funzione delle condizioni di moto. Ciascun encoder ha una risoluzione di 100 impulsi per giro, e utilizzati in coppia consentono di tenere traccia della posizione del robot mediante il calcolo dell’odometria. Questa funzione CAPITOLO 2. IL PIONEER 11 risulterebbe particolarmente utile, ma dai test `e emerso che le misure fornite (effettuate mediante calcolo integrale dal PSOS ) sono poco precise e non hanno utilit`a concreta. 1 bussola magnetica: `e montata sul deck del robot ed ha una risoluzione di 2◦ . Sarebbe uno strumento molto utile ma, sfortunatamente, nell’utilizzo in ambienti chiusi risulta fortemente influenzata dai campi magnetici generati dai dispositivi elettrici. 7 sonar: si tratta di 7 sensori sonar Polaroid gestiti in multiplexing, montati 2 sui fianchi del robot e i restanti 5 sul pannello frontale orientati con intervalli di 15◦ uno dall’altro. Forniscono una misura abbastanza precisa della distanza di ostacoli compresi fra 20cm e 5m in condizioni statiche, ma devono essere utilizzati con appositi accorgimenti software quando il robot `e in movimento, perch`e le misure fornite sono molto rumorose. Il firing rate dei sonar `e di 25Hz e via software `e possibile controllare la sequenza di fire dei 7 sonar e quali attivare. 2.2.5 La scheda di controllo Come accennato nelle sezioni precedenti, il controllo del Pioneer `e affidato al PSOS esegutio sul microcontrollore di bordo. Questo `e un Motorola MC68HC11F1 che funziona alla frequenza di bus di 4MHz generata da un quarzo esterno a 16MHz. Il microcontrollore `e alloggiato su una scheda montata nella console del robot. Dalla scheda partono tutte le connessioni per controllare i dispositivi di bordo quali i sonar, i motori, la bussola e le porte di collegamento con l’esterno. In particolare sulla scheda sono presenti le seguenti porte di espansione: - 1 connettore per collegare il radio-modem seriale; - 1 connettore DB9 femmina per il collegamento ad un PC client mediante un cavo di prolunga; il protocollo utilizzato `e un RS-232 standard con velocit`a di 9600 o 19200 bps, 8 bit di dati, uno stop bit, no parit`a e nessun controllo di handshaking; - 1 alimentazione ausiliaria a 12V con interruttore per poter alimentare qualche dispositivo periferico; - 4 linee a 5V che possono essere utilizzate per realizzare piccoli circuiti di controllo da collegare alle porte di I/O; - 8 ingressi digitali; CAPITOLO 2. IL PIONEER 12 Figura 2.4: La scheda di controllo - 8 uscite digitali; - 1 ingresso analogico che fa capo ad un A/D converter (convertitore analogico/digitale) con risoluzione di 8 bit; - 1 timer digitale in ingresso; - 1 timer digitale in uscita, utile per controllare eventuali servomotori con i quali azionare piccoli dispositivi meccanici installati sul robot. Sulla scheda sono anche presenti tutti i dispositivi necessari per interagire con il robot, come i pulsanti, gli interruttori di alimentazione, il display LCD, il connettore DB9 per la porta RS232, il connettore di ricarica della batteria, ecc. Tutti questi elementi sono resi disponibili all’esterno mediante una frontalino di alluminio, illustrato nella figura 2.5, che costituisce la parte superiore della console. 2.3 PSOS - Pioneer Server Operating System Nella modalit`a di controllo client/server, il software server a bordo del Pioneer 1 si occupa di gestire tutti i dettagli di basso livello del robot, come la gestione del moto, il firing dei sonar e la raccolta degli eco ricevuti e le restanti funzioni, compresa la comunicazione con l’applicazione client. Sul Pioneer 1 come software server `e installato il Pioneer Server Operating System o, pi` u CAPITOLO 2. IL PIONEER 13 Figura 2.5: Pannello di controllo brevemente, PSOS. Il PSOS `e stato sviluppato dall’ActivMedia per gestire tutti i modelli di robot mobili della famiglia Pioneer da essa prodotti. Sul Pioneer 1 `e installata la versione 4.9, che `e l’ultima versione rilasciata per questo modello di robot. Nella figura 2.6 `e riportato lo schema a blocchi del PSOS. All’interno dei due riquadri della figura 2.6sono elencate le varie attivit`a svolte per la gestione del robot. La gestione dei motori con il controllo sulla potenza, il fire dei sonar e la lettura dell’eco di ritorno, il controllo degli I/O, sono rappresentati nel riquadro di sinistra e vengono effettuati grazie ad un veloce ciclo di interrupt eseguito alla frequenza di qualche KHz. Ad un livello pi` u alto, nel riquadro di destra, il server implementa le funzioni di servizio quali il calcolo delle velocit`a, il calcolo integrale della posizione, la gestione della sequenza di fire dei sonar e, molto importante, la comunicazione con l’applicazione client che avviene a una frequenza di 10Hz. Questo valore non `e molto elevato ma, considerando le basse velocit`a di movimento del robot, `e sufficiente per un controllo efficace del suo comportamento. Il PSOS `e memorizzato all’interno di una memoria FLASH da 32Kb e in aggiunta viene utilizzata una memoria EEPROM nella quale, mediante un apposito software, si possono impostare i vari parametri che caratterizzano il robot e il suo comportamento: Serial Number per identificare univocamente il robot, Modello, Baud Rate della linea seriale, ecc.. Per una loro descrizione CAPITOLO 2. IL PIONEER 14 Figura 2.6: Architettura del PSOS dettagliata si faccia riferimento al manuale del robot[6]. 2.4 Protocollo di comunicazione Un protocollo `e un insieme di regole che definisce il formato dei messaggi e che consente a due entit`a di comunicare e di comprendere il significato dell’informazioni scambiate. Nello sviluppo software del progetto gran parte del lavoro ha riguardato l’implementazione su un PC client del protocollo di comunicazione con il robot. Quindi, per la sua importanza, al Protocollo di comunicazione client/server `e dedicata la presente sezione. Il Pioneer, o meglio il server PSOS, comunica con l’applicazione client attraverso un protocollo a pacchetti bidirezionale. In questa sezione vengono analizzate tutte le caratteristiche di questo protocollo. Volendo far riferimento al modello OSI si possono chiaramente individuare il livello fisico e il livello data link, mentre i livelli superiori sono inglobati in un unico protocollo detto Communication Packet Protocol. 2.4.1 Livello fisico La comunicazione pu`o avvenire via cavo o via etere. Via cavo vengono seguite le specifiche per la comunicazione RS-232. In particolare `e necessario utilizzare un collegamento a 3 poli (1 per la massa GND, 1 per la trasmissione TX, 1 per la ricezione RX); i livelli di tensione ` consigliato l’utilizzo di un sono -12V per la codifica dell’1 e +12V per lo 0. E cavo con conduttori intrecciati e si possono raggiungere i 30m di lunghezza. CAPITOLO 2. IL PIONEER 15 Via etere vengono utilizzati una coppia di radio-modem operanti a 2.4GHz che possono essere collegati uno alla porta seriale RS-232 di un PC e l’altro al connettore apposito presente sulla scheda di controllo a bordo del robot. 2.4.2 Livello data link Viene utilizzato un protocollo RS-232 compatibile con le seguenti caratteristiche: - Baud rate: 9600 o 19200 bps - Dimensione dato: 8 bit - Bit di stop: 1 - Controllo di parit`a: nessuno - Handshaking hardware: nessuno Questo protocollo `e molto utilizzato nella comunicazione tra PC e dispositivi gestiti a microcontrollore, perch`e non richiede hardware aggiuntivo ed `e semplice da gestire. Per contro, per`o, non presenta una elevata velocit`a di trasmissione e non viene effettuato nessun controllo sull’integrit`a dei dati ricevuti. L’individuazione di errori nei dati trasmessi deve quindi essere effettuata al livello superiore della comunicazione. 2.4.3 Communication Packet Protocol La comunicazione tra client e server avviene attraverso lo scambio bidirezionale di pacchetti dati costituiti da: un header, un contatore, un campo dati e un valore di checksum. Nella tabella 2.1viene riportata la struttura dettagliata del pacchetto. L’header `e formato da due caratteri sempre uguali, scelti in modo tale che la loro successione sia poco probabile ritrovarla all’interno del resto del pacchetto. Questo permette di riconoscere l’inizio di un nuovo pacchetto nel caso in cui la comunicazione subisca delle interruzioni oppure nel momento iniziale quando il client deve sincronizzarsi con il server per ricevere correttamente i pacchetti. La dimensione dei pacchetti non `e fissa ma varia in funzione del tipo e dalla quantit`a di dati trasportati nel pacchetto. Per questo motivo si rende necessario l’utilizzo di un contatore per poter ricevere correttamente l’intero pacchetto. Il contatore ha dimensione un byte e il suo valore rappresenta la lunghezza del campo dati alla quale viene sommato il valore 2 che `e la CAPITOLO 2. IL PIONEER Componente Header Contatore N. byte 2 1 Dati N Checksum 2 16 Valore 0xFA, 0xFB N + 2 Descrizione Intestazione Numero di byte di dati pi` u i 2 byte di controllo Comandi dal cliente o informazioni dal server Da calcolare Valore per il controllo della integrit`a del pacchetto Tabella 2.1: Struttura di un pacchetto dati del PSOS. lunghezza del campo checksum. La dimensione del pacchetto deve essere minore di 200 caratteri esclusi l’header e il contatore. Il contenuto del campo dati varia a seconda che si tratti di un pacchetto inviato dal client al server o viceversa. Nel primo caso si parla di Client Commands e nel secondo si parla di Server Information Packets. L’analisi dettagliata viene descritta nelle prossime sezioni. I tipi di dati che possono essere utilizzati sono illustrati nella tabella 2.2. Tipo Integer Word String String N. byte Ordine byte 2 b0 low byte; b1 high byte 4 b0 low byte; b3 high byte fino a 200, b0 lunghezza della stringa lunghezza prefissata b1 primo carattere della stringa illimitata, terminata b0 primo carattere della stringa con il carattere nullo 0 (null) ultimo byte Tabella 2.2: Tipi di dati. Per i valori numerici non viene specificata una convenzione per i segni, ma spetta al ricevente interpretare correttamente i valori ricevuti sulla base del contenuto dei dati. Il valore di checksum permette di verificare l’integrit`a del pacchetto ricevuto. Se il valore del checksum trasmesso `e diverso da quello ricalcolato dal ricevitore, significa che il pacchetto contiene degli errori e in tal caso viene scartato. I rigidi tempi di comunicazione scelti nel protocollo, e la natura realtime dell’interazione client/server, non permette la ritrasmissione dei pacchetti errati, che vengono scartati utilizzando i successivi. Per il calcolo del checksum bisogna sommare successivamente, a coppie di due, tutti i byte del pacchetto scartando il segno e il resto; se il numero di byte CAPITOLO 2. IL PIONEER 17 `e dispari, l’ultimo byte viene messo a XOR con la parte meno significativa del checksum gi`a calcolata. Per meglio comprendere il procedimento si esamini il listato di codice 2.1. 1 2 3 4 5 int CalcChkSum(unsigned char packet[]) { unsigned char *buffer = &packet[3]; int c = 0; int n = size - 5; 6 while (n > 1) { c += (*(buffer)<<8) | *(buffer+1); c = c & 0xffff; n -= 2; buffer += 2; } if (n > 0) { c = c^ (int)*(buffer++); } return c; 7 8 9 10 11 12 13 14 15 16 17 18 19 } Listato 2.1: Calcolo del checksum del pacchetto. 2.4.4 Interazione client/server Un concetto molto importante, nell’architettura di controllo del Pioneer, `e la modalit`a di scambio di informazioni tra il client e il server: il client `e un’entit`a che invia comandi, ad esempio per impostare una velocit`a, mentre il server `e un’entit`a che invia informazioni sullo stato del robot e sulle misure sensoriali. Per ogni pacchetto scambiato non `e previsto un messaggio di acknowledgment e l’unica possibilit`a che il client ha di verificare l’esecuzione dei comandi inviati sta nel controllare, tramite le informazioni pervenute dal server, se i valori che avrebbero dovuto subire una modifica sono cambiati o meno. 2.4.5 Client Commands Il client, per interagire con il robot, invia dei pacchetti contenenti i comandi che verranno interpretati ed eseguiti dal server. I comandi possono essere CAPITOLO 2. IL PIONEER 18 inviati al massimo uno ogni 100ms, cio`e con frequenza 10Hz, ed `e necessario che venga inviato un comando almeno ogni 2s. Se questo limite viene superato, il server interrompe l’alimentazione ai motori di bordo, fermando il robot. Grazie a ci`o si implementa un meccanismo di sicurezza che blocca il robot nel caso il client si sia bloccato, oppure sia fuori portata, impedendo di causare danni a persone o cose nelle vicinanze del robot, o al robot stesso. La struttura di un pacchetto di comando `e illustrata nella tabella 2.3. Componente Header Contatore N. byte 2 1 N. Comando Tipo arg. (opzionale) 1 1 Argomento (opzionale) Checksum N - 4 2 Valore 0xFA, 0xFB N + 2 Descrizione Intestazione Numero di byte di dati pi` u i 2 byte di controllo 0 - 255 Numero comando Tipo di dato dell’argomento: 0x3B intero positivo 0x1B intero negativo o valore assoluto 0x2B stringa terminata con null dato Argomento del comando, intero o stringa Da calcolare Controllo dell’integrit`a Tabella 2.3: Pacchetto di comando. Oltre a quelli standard, il pacchetto di comando contiene i seguenti campi: N. Comando: ogni comando per il PSOS `e identificato da un numero. L’elenco completo dei comandi `e illustrato nella tabella presente in appendice C. Tipo arg.: rappresenta il tipo dell’argomento del comando. Permette di valutare correttamente il contenuto dei byte successivi, distinguendo tra numeri positivi, negativi e stringhe. Particolare attenzione va posta per i numeri negativi che vengono trasmessi in valore assoluto e vanno successivamente moltiplicati per -1. Argomento: `e il valore associato al comando. Le stringhe vanno trasmesse terminate con il carattere ’0’ (null) e per i numeri bisogna mettere prima il byte meno significativo. Andare ad analizzare singolarmente i vari comandi disponibili, sarebbe superfluo ai fini di questa tesi. Nel seguito vengono presi in considerazione CAPITOLO 2. IL PIONEER 19 i principali comandi che sono poi stati praticamente utilizzati nella stesura del software. SYNC0, SYNC1, SYNC2 utilizzati per la sincronizzazione e per l’apertura della connessione tra client e robot. OPEN apre e attiva il controller dei motori, fornendo alimentazione agli stessi e attivando anche il modulo che si occupa di gestire i sonar. CLOSE chiude la connessione, toglie alimentazione ai motori e spegne i sonar. PULSE comando neutro: serve soltanto per indicare al server che il client `e ancora collegato e, quindi, non bisogna interrompere i movimenti in atto. VEL permette di impostare la velocit`a transazionale del robot. La velocit`a deve essere passata come argomento e ha come unit`a i mm/s. RVEL permette di impostare la velocit`a rotazionale del robot. La velocit`a deve essere passata come argomento e ha come unit`a i deg/s. 2.4.6 Server Information Packets Il server invia automaticamente ogni 100ms, ovvero a 10Hz, un Server Information Packet, che contiene lo stato del robot e le misure restituite dai vari sensori. Nella figura 2.7 `e illustrato il contenuto del pacchetto. Il numero di campi `e variabile perch`e nel pacchetto non sono contenute le letture di tutti i sonar, ma solamente quelle dei valori che sono stati aggiornati. Tra le varie informazioni disponibili, le pi` u significative al fine del progetto sono quelle legate ai sonar (Sonar readings). Il valore restituito da queste informazioni deve essere moltiplicato per un’opportuno valore di conversione, valutato sperimentalmente, per convertirle in metri (vedere la sezione 5.1). 2.4.7 Apertura e chiusura della connessione Prima di poter inviare i comandi, il client deve instaurare la connessione con il server. Infatti, quando il Pioneer viene accesso, entra in uno stato di wait ed `e necessario eseguire la seguente procedura di sincronizzazione per poter far entrare il robot in stato di ready. Il client deve inviare in sequenza i tre comandi SYNC0, SYNC1, SYNC2 e deve controllare che per ciascuno di essi, il server risponda con lo stesso CAPITOLO 2. IL PIONEER 20 comando. Al terzo pacchetto restituito dal server con il comando SYNC2 vengono aggiunte in coda tre stringhe che descrivono il nome, la classe e la sub-classe del robot contattato. Queste informazioni sono molto utili nel caso si abbia a che fare con una flotta di robot ed occorra identificarli univocamente. Successivamente il client invia il comando di OPEN e, come accennato precedentemente, il robot fornisce alimentazione ai motori e attiva i sonar. Per chiudere la connessione con il robot, `e sufficiente che il client invii il comando di CLOSE. CAPITOLO 2. IL PIONEER Figura 2.7: PSOS Server Information Packets. 21 Capitolo 3 Aggiornamento del Pioneer In questo capitolo verranno analizzati gli aggiornamenti hardware che hanno interessato il Pioneer per permettere l’installazione di un PC di bordo e per consentire l’utilizzo di nuove tipologie di sensori. 3.1 Motivazioni Il Pioneer 1 `e un robot progettato e realizzato a met`a degli anni 90. Da allora la robotica si `e molto evoluta. Dal lato software le richieste di risorse computazionali sono cresciute per permettere l’esecuzione di nuovi e sofisticati algoritmi di controllo, di pianificazione, di elaborazione. Contemporaneamente `e aumentata la disponibilit`a di sensori sempre pi` u evoluti. Il principale limite del Pioneer sta nel controllo che viene realizzato in remoto da un PC fisso collegato mediante una coppia di radio-modem seriali. Questo limita fortemente le possibilit`a di utilizzo sia per quanto riguarda il raggio di azione che per l’impossibilit`a di installare nuove periferiche per ampliare le capacit`a sensoriali. Per superare questi limiti occorre soddisfare i seguenti requisiti. - Dotare il robot di un elaboratore on-board che permetta l’esecuzione dei programmi di controllo senza la necessit`a di un collegamento remoto. - Ampliare le capacit`a sensoriali, fornendo il supporto a periferiche quali: scanner laser, telecamere digitali fireware, webcam USB, ricevitori GPS, ecc. - In particolare, bisogna consentire l’installazione dello scanner laser Sick LMS 200 a bordo del robot. Viste le notevoli dimensioni del dispositivo occorre prevedere un adeguato supporto per il fissaggio. 22 CAPITOLO 3. AGGIORNAMENTO DEL PIONEER 23 - Fornire un collegamento remoto per consentire di monitorare il robot mediante la rete wireless WiFi disponibile presso il Dipartimento in cui sono condotte le sperimentazioni con il Pioneer. 3.2 Scelte progettuali Per l’aggiornamento, pertanto, si `e scelto di installare a bordo un PC dotato di adeguati dispositivi di interfacciamento per il collegamento al robot e alle altre, eventuali, periferiche sensoriali. Il PC deve avere: - capacit`a di elaborazione sufficiente per l’esecuzione delle moderne applicazioni robotiche; - 2 porte seriali: una per il controllo del Pioneer e l’altra per lo scanner laser Sick LMS 200; - 1 collegamento di rete wireless WiFi ; - 1 o pi` u porte firewire per il collegamento di telecamere digitali; - 2 o pi` u porte USB per il collegamento di webcam e altri tipi di periferiche; - l’alimentazione ricavata dai 12V disponibili a bordo del robot. Inoltre per l’alimentazione del PC `e necessario potenziare la capacit`a della batteria di bordo. Bisogna poi realizzare un supporto meccanico per l’installazione dello scanner laser Sick LMS 200 e provvedere alla sua alimentazione a 24V. 3.3 Aggiornamento fisico del robot Come prima operazione `e stata fatta una pulizia del robot andando a rimuovere una serie di unit`a e sensori che ormai non venivano pi` u utilizzati da anni. In particolare sono stati rimossi il sensore olfattivo per i gas e il sensore ottico a matrice 32x32 pixel con annessa unit`a di controllo. Successivamente `e stato aperto il corpo del robot ed `e stata installata, fissandola opportunamente, una batteria al piombo da 12V e 7Ah oltre a quella gi`a presente. In seguito sono stati realizzati i cablaggi per collegare le due batterie in parallelo e per portare all’esterno i connettori necessari alla CAPITOLO 3. AGGIORNAMENTO DEL PIONEER 24 ricarica e all’alimentazione del PC. Lo scanner laser Sick LMS 200 `e stato installato realizzando un apposito supporto in alluminio collocato sulla console del Pioneer. Per fissare il laser al supporto sono state utilizzate due maniglie a ripresa, che permettono una facile rimozione del dispositivo al fine di poterlo utilizzare separatamente o su altri robot. Per la procedura dettagliata di installazione del laser a bordo del robot fare riferimento alla sezione A.2. Figura 3.1: Il laser Sick LMS 200 installato sul robot. L’alimentazione a 24V necessaria per il laser viene fornita da due pacchi batterie da 12V collegati in serie e composti ciascuno da 10 batterie ricaricabili al NiMh che consentono il contenimento di peso e di ingombri. Per la ricarica dei pacchi batterie e delle batterie di bordo del robot, fare riferimento alle procedure descritte nella sezione A.3. 3.4 Realizzazione del PC di bordo Per installare un PC a bordo del robot erano possibili due alternative: utilizzare un notebook oppure realizzare un PC dedicato assemblando i componenti necessari reperibili sul mercato. CAPITOLO 3. AGGIORNAMENTO DEL PIONEER 25 Dopo un’attenta analisi l’utilizzo di un notebook `e stato scartato per una serie di motivi quali: il costo elevato, la difficolt`a di trovarne uno con dimensioni veramente compatte, l’adeguatezza delle porte di interfacciamento offerte, la necessit`a di un’alimentatore aggiuntivo per la ricarica oltre a quello gi`a utilizzato per il robot. La scelta `e ricaduta sull’utilizzo di un PC dedicato anche se la sua realizzazione ha richiesto una notevole quantit`a di lavoro per ottenere un elaboratore compatto, adatto alle specifiche richieste. Per contenere le dimensioni `e stata adottata una scheda madre in formato MiniITX prodotta dalla VIA. Il modello scelto `e il VIA Epia SP13000 LVDS che offre un processore VIA C3 1.3 GHz ed un elevato numero di porte di interfacciamento. Per il collegamento alla rete wireless `e stato utilizzato un adattatore da installare su porta USB 2. Figura 3.2: Main board e hard disk del PC di bordo. Un PC da installare su un robot mobile deve essere molto robusto per resistere alle sollecitazioni meccaniche che si incontrano durante l’utilizzo. Per ospitare tutti i componenti (scheda madre, hard disk, alimentatore, adattatore WiFi) `e stato realizzato un compatto case in alluminio. Per costruirlo si `e partiti da un box in alluminio per uso automobilistico e, successivamente, mediante lavorazioni al trapano e alla fresa, sono state realizzate le aperture per i connettori dei vari componenti, i supporti per fissarli e sono state riportate all’esterno le spie LED e i pulsanti necessari all’utilizzo del computer. Per la procedura dettagliata di installazione del PC a bordo del robot fare riferimento alla sezione A.1. CAPITOLO 3. AGGIORNAMENTO DEL PIONEER Figura 3.3: Il PC di bordo completato. Figura 3.4: Il nuovo Pioneer al termine dell’aggiornamento. 26 Capitolo 4 Progettazione e sviluppo Come accennato nell’introduzione, lo scopo principale di questa tesi consiste nello sviluppo di una architettura di controllo per il robot Pioneer che permetta di gestirne il comportamento attraverso la lettura dei dati sensoriali e l’invio di comandi di moto. Lo sviluppo di un’architettura di controllo software, partendo da zero, `e un’attivit`a assai complessa che richiede un lungo lavoro di progettazione e una conoscenza approfondita del sistema operativo sul quale il software stesso viene eseguito. Occorre inoltre considerare le complicazioni che si introducono se si vuole realizzare un’architettura con caratteristiche real-time. Per questi e altri motivi, lo sviluppo del software per applicazione robotiche, (ma anche in altri ambiti) di solito avviene a vari livelli di astrazione. Per realizzare un’architettura di controllo si sceglie un framework gi`a esistente sul quale si costruiscono i vari componenti necessari per farlo operare sulla piattaforma desiderata. Un framework `e definito come una struttura di supporto a partire da cui `e possibile organizzare e realizzare un’applicazione software. Un framework pu`o includere il programma di gestione, le librerie di codice, un linguaggio di scripting e altro materiale in grado di aiutare gli sviluppatori ad unire tutti i componenti per ottenere il software finale. Nell’ambito della robotica un framework, spesso, mette a disposizione una serie di funzioni e moduli che sollevano il programmatore dalla necessit`a di occuparsi dei problemi legati alla schedulazione delle attivit`a e alle modalit`a di comunicazione tra i vari componenti. Nello sviluppo dell’architettura per il Pioneer `e stato scelto di appoggiarsi sul framework YARA [4]. 27 CAPITOLO 4. PROGETTAZIONE E SVILUPPO 4.1 28 YARA YARA[4] `e l’acronimo di Yet Another Robotics Architecture ed `e un framework per la robotica mobile sviluppato presso il Laboratorio di Robotica del Dipartimento di Ingegneria Informatica dell’Universit` a di Parma. La caratteristica che lo contraddistingue rispetto ad altre architetture `e l’introduzione di scheduling real-time avanzato per garantire il rispetto di vincoli temporali. Sensor Module Behaviour Module Activity: sense,T1 Activity: react,T2 Sender: sensor Receiver: sensor Actuator Module Activity: act,T3 Requester: move Information Performer: move Command Figura 4.1: Schema di un’applicazione YARA. La struttura di un’applicazione YARA `e schematizzata in figura 4.1, dove `e rappresentato un esempio di sistema di controllo. Nello schema sono illustrati i componenti fondamentali descritti di seguito. Moduli. Il modulo `e il componente fondamentale di YARA e rappresenta una attivit`a autonoma che si occupa, per esempio, di implementare un comportamento oppure di interfacciarsi con l’hardware del robot. Un modulo viene implementato con la classe astratta C++ Module. Per permettere lo scheduling real-time, il modulo possiede una serie di task che lo scheduler del framework si incarica di porre in esecuzione sfruttando un set di thread prelevate da una coda comune a tutti i moduli. Le attivit`a di scheduling sono completamente invisibili al programmatore essendo implementate mediante l’utilizzo di algoritmi e strutture dati privati. Attivit` a. Le attivit`a sono implementate dalla classe template Activity e rappresentano i task associati a ciascun modulo. La esecuzione di una attivit`a pu`o essere periodica o aperiodica nel caso venga attivata da un CAPITOLO 4. PROGETTAZIONE E SVILUPPO 29 evento esterno al modulo. All’atto della dichiarazione di una attivit`a occorre specificare un parametro temporale, che nel primo caso rappresenta il periodo di attivazione mentre nel secondo `e il tempo minimo che deve intercorrere tra due rilasci consecutivi. Tale parametro ha anche il significato di deadline. Comunicazione. Le attivit`a all’interno dello stesso modulo condividono dati ed algoritmi e attraverso questi possono agevolmente scambiarsi le informazioni. Per la comunicazione tra moduli sono disponibili alcuni pattern. Il primo di questi `e Information che rende possibili l’invio e la ricezione di dati attraverso due oggetti data member, Sender e Receiver. Un altro pattern `e Command, che `e dedicato all’invio di comandi da un Requester ad un Performer su un altro modulo. Scheduling real-time. L’esecuzione del codice di una Activity `e gestito da TODS (Timed Object for Distributed Systems) [8], un framework ad oggetti per la schedulazione real-time realizzato anch’esso presso il Dipartimento di Ingegneria Informatica. TODS schedula i task del sistema secondo una politica EDF (Earliest Deadline First), ma `e possibile introdurre facilmente anche altri algoritmi. Nella presente descrizione non si `e entrati nei dettagli dei vari componenti, perch`e YARA `e tuttora in fase di evoluzione, fornendo sempre nuove funzionalit`a e qualche componente potrebbe subire delle modifiche. 4.2 Fasi di sviluppo Nello sviluppo del software si sono seguiti i seguenti passi. Studio del protocollo. Gi`a descritto nella sezione 2.4, ha permesso, successivamente, di implementare correttamente la comunicazione con il server rispettando le regole sintattiche e le successioni di comandi necessarie. Studio del driver P2OS di Player. Per evitare di dover implementare il protocollo di comunicazione partendo da zero, `e stato analizzato il driver che permette a Player di interfacciarsi con i robot della ActivMedia. Sviluppo di una classe C++ per la comunicazione con il robot. Il primo obbiettivo di sviluppo software `e stato la creazione di una classe che permettesse di instaurare una connessione con il robot, e successivamente visualizzasse i dati sensoriali ricevuti dal robot. CAPITOLO 4. PROGETTAZIONE E SVILUPPO 30 Integrazione nel framework YARA. In questa fase, alla classe creata precedentemente sono stati aggiunti i dati e i metodi necessari per trasformarla in un modulo conforme alle specifiche del framework YARA. Realizzazione di un comportamento. Per testare il funzionamento del modulo realizzato, `e stata sviluppata una semplice applicazione che consiste in un comportamento di navigazione stay in the middle basato sulle letture sensoriali dei sonar. 4.3 Driver P2OS di Player Per consentire allo sviluppatore l’accesso in modo standard alle varie piattaforme robotiche, Player 1.2.2 `e organizzato su due livelli: - le interfacce; - i driver. Il programmatore che vuole controllare un robot utilizza i proxy, messi a disposizione dalla C++ client library, per connettersi alle interfacce che forniscono i dati sensoriali e accettano i comandi di moto. Esistono interfacce per il controllo dei motori (motor ), per la lettura dei sonar (sonar ), e tante altre per ogni componente necessario all’utilizzo di un robot. La grande potenzialit`a di Player sta nel fatto che con un’unica interfaccia `e possibile controllare il corrispondente elemento di molti modelli diversi di robot mobili. Ad un livello pi` u basso, i driver si occupano di tradurre i comandi standard arrivati alle interfacce nei comandi specifici per un determinato robot mobile o, viceversa, tradurre i dati provenienti dal robot nel formato standard dell’interfaccia relativa a un certo tipo di sensore. Per ogni modello, o famiglia, di robot esiste un apposito driver che si occupa della traduzione nelle due direzioni. Andando ad analizzare i file sorgenti del server Player, si trova una directory denominata p2os. Questa contiene i seguenti file: - Makefile.am, Makefile.in necessari alla compilazione delle classi. - p2os.cc, p2os.h che contengono la classe principale con la quale `e possibile interagire con il sistema operativo p2os a bordo dei robot. - packet.cc, packet.h contengono una classe (P2OSpacket) che permette la gestione dei pacchetti scambiati con il robot su una linea seriale, fornendo dei metodi per costruire, inviare e ricevere un pacchetto. CAPITOLO 4. PROGETTAZIONE E SVILUPPO 31 - robot params.cc, robot params.h contengono un lungo elenco di parametri che caratterizzano i vari robot prodotti dalla ActivMedia. Tra i vari valori presenti si possono facilmente individuare quelli relativi alle dimensioni e geometria del robot, oppure quelli sulla dotazione sensoriale. - sip.cc, sip.h contengono una classe che permette il parsing e la memorizzazione dei dati provenienti dal robot. Il driver p2os permette di controllare tutta la famiglia di robot prodotti dalla ActivMedia sui quali `e eseguito il sistema operativo p2os. Sul Pioneer `e installato il psos 4.9 che rappresenta la prima versione del sistema operativo antecedente al p2os. Per questo motivo l’utilizzo dell’intero driver p2os per la realizzazione del modulo sarebbe assai superfluo perch`e esso prevede tutta una serie di funzionalit`a non supportate del robot Pioneer 1. La parte che `e risultata pi` u utile per lo svolgimento della tesi `e la classe P2OSpacket. Dopo alcune modifiche questa classe `e stata inserita all’interno del progetto. 4.4 Realizzazione delle funzionalit` a di base Nel progetto e nella realizzazione dell’architettura di controllo si `e mirato a realizzare un’applicazione che potesse essere integrata nel framework YARA, cercando, allo stesso tempo, di mantenere un sufficiente grado di generalit`a per consentire il riutilizzo del codice su altri framework oppure all’interno di applicazioni stand-alone legate all’utilizzo del Pioneer. Per soddisfare questa esigenza, si `e deciso di dividere le parti del programma che interessano la comunicazione tra il PC client e il server sul robot dalle parti riguardanti l’interazione con il framework YARA. In questa prima fase di sviluppo, si `e quindi realizzato la classe C++ principale, denominata Pioneer, che implementa le varie funzioni necessarie alla comunicazione con il robot, permettendo di inizializzare correttamente la connessione con il PSOS a bordo del Pioneer e, successivamente, di ricevere ed inviare le informazioni per il controllo. Per cercare di rendere l’utilizzo della classe il pi` u semplice possibile si `e seguito il pattern RAII [Resource Acquisition Is Initialization] instaurando automaticamente la connessione nel momento in cui l’oggetto della classe Pioneer viene creato, e rilasciandola quando l’oggetto viene distrutto. Il contenuto dalla classe Pioneer `e rappresentato nel diagramma UML in figura 4.2. L’unico parametro che `e necessario passare al costruttore consiste nel nome del file associato al device della porta seriale utilizza per il collega- CAPITOLO 4. PROGETTAZIONE E SVILUPPO 32 Figura 4.2: Diagramma UML della classe Pioneer. mento con il robot. Il PC a bordo del Pioneer `e dotato di due interfacce seriali; una di queste `e stata dedicata esclusivamente per le comunicazioni con il robot ma, nonostante questo, si `e deciso di implementare la possibilit`a di specificare la porta seriale, in previsione di possibili utilizzi su piattaforme diverse. Tutte le operazioni necessarie per instaurare la connessione vengono eseguite dal costruttore della classe richiamando i metodi opportuni. Per lo scambio di pacchetti tra il PC client e il robot `e stata sviluppata una classe apposita che permette la gestione di un singolo pacchetto. La struttura della classe PSOSPacket `e presentata in figura 4.3. Figura 4.3: Diagramma UML della classe PSOSPacket. Ogni oggetto della classe PSOSPacket `e un contenitore per un pacchetto. Mediante i metodi Send e Receive si pu`o inviare o ricevere un pacchetto passando come argomento il file descriptor del device da utilizzare per la comunicazione. Il contenuto del pacchetto pu`o essere letto o modificato mediante la variabile packet. Se si vogliono caricare dei dati in un pacchetto `e anche possibile utilizzare il metodo Build che si prende carico di inserire i dati, passati come argomento, nel pacchetto aggiungendo in automatico l’intestazione e il checksum. La classe Pioneer, utilizzando degli oggetti della classe PSOSPacket, `e in grado di comunicare con il robot. L’inizio dello scambio di informazioni CAPITOLO 4. PROGETTAZIONE E SVILUPPO 33 e comandi fra PC e robot avviene tramite una procedura di handshaking (stretta di mano). Questa operazione viene eseguita dalla funzione synchronization() che si occupa di inviare i pacchetti di sincronizzazione e attende le risposte dal robot (si veda la sezione 2.4.7). La stessa funzione si occupa anche dell’eventuale reset del robot, nel caso una connessione precendente si sia interrotta senza aver eseguito la sequenza di chiusura. Il metodo receiveServerData permette la ricezione di un pacchetto di informazioni dal robot passandolo poi alla funzione parser che si occupa di estrarre i singoli dati e memorizzarli nei relativi attributi della classe. La funzione setVelocity permette di inviare i comandi per il movimento del robot impostando separatamente le velocit`a transazionale e rotazionale. Ultimata la realizzazione della classe `e stato possibile testarla realizzando un semplice programma che permette il controllo del robot mediante la tastiera del PC, stampando a video le letture dei dati sensoriali. Con questo programma si `e riusciti a testare la corretta implementazione del protocollo di comunicazione e a provare il comportamento dinamico del robot, valutando la correttezza delle informazioni sensoriali restituite. 4.5 Integrazione nel framework YARA. Nella sezione precedente si `e illustrata la struttura della classe Pioneer analizzandone le funzioni membro che permettono di gestire la comunicazione verso il robot. Il passo successivo nella realizzazione dell’architettura di controllo del Pioneer consiste nell’integrazione della classe appena creata all’interno del framework YARA. L’elemento fondamentale per l’utilizzo del framework `e il Modulo, inteso come componente attivo e autonomo che opera all’interno dell’architettura: il controllo del robot avviene mediante l’esecuzione di pi` u moduli che svolgono attivit`a indipendenti e cooperano tra loro attraverso lo scambio di comandi e informazioni. Non i singoli moduli, ma la loro interazione all’interno del framework consente di determinare il comportamento del robot. Ogni modulo svolge una serie di compiti elementari determinati da un insieme di algoritmi eseguiti sui dati ricevuti, producendo un risultato inviato agli altri moduli oppure inviato all’hardware del robot. Per esempio, i compiti di un singolo modulo potrebbero essere: la gestione dei motori, la gestione dei bumber oppure l’implementazione di un behaviour (comportamento). L’architettura di controllo del Pioneer deve consentire l’interazione con il robot attraverso l’invio di comandi ai motori e la ricezione delle letture dei sonar. Il funzionamento del framework suggerirebbe di implementare queste CAPITOLO 4. PROGETTAZIONE E SVILUPPO 34 funzionalit`a ricorrendo a due moduli: un modulo Sonar che fornisce le misure rilevate dai sonar e un modulo Motor per il controllo dei motori sulla base dei comandi ricevuti dagli altri moduli. Questa impostazione dei moduli tuttavia non `e risultata adatta per il controllo del Pioneer : la comunicazione con il robot avviene mediante un’unica linea seriale, sulla quale viaggiano sia i comandi per i motori che le letture sensoriali e, quindi, risulterebbe complicato e poco efficiente la condivisione del canale di comunicazione da parte dei due moduli. Per ovviare a questa limitazione si `e deciso di affidare il controllo della linea seriale ad un unico modulo. Questo modulo `e stato chiamato Pioneer ed offre sia le funzioni per gestire i sonar, sia quelle per i motori. Per lo scambio di informazioni e comandi tra i moduli il framework prevederebbe tre pattern di comunicazione: Information. Consente di inviare e ricevere dati di tipo generale, che serviranno per lo pi` u a rappresentare misure sensoriali rilevate dal robot. L’invio dei dati avviene secondo lo schema uno a molti. Command. Consente di realizzare un meccanismo di comunicazione duale al precedente, permettendo l’invio di comandi da pi` u moduli verso uno unico che si occupa del controllo di un attuatore hardware. Query. Permette di effettuare la richiesta esplicita di informazioni a un modulo che le fornisce in risposta. Per lo scambio delle misure effettuate dai sonar si ricorre al pattern Information e per la gestione dei motori il pi` u adatto sarebbe il pattern Command, ma nella attuale versione del framework questo pattern non `e ancora disponibile. Provvisoriamente si `e quindi utilizzato il pattern Information anche per il controllo dei motori che, pur limitando il campo di utilizzo dell’architettura, `e risultato adeguato allo sviluppo di applicazioni che implementano semplici comportamenti (si ricorda che la comunicazione con questo pattern avviene da uno a molti). Lo svolgimento dei compiti di un modulo, implementati nel codice delle sue funzioni membro, avviene attraverso delle attivit` a che si occupano di mettere in esecuzione le singole funzioni. Nel modulo Pioneer sono necessarie due attivit`a : una con schedulazione periodica, per la ricezione dei Server Information Packets (vedi sezione 2.4.6) inviati dal robot contenenti le letture dei sonar, e un’altra aperiodica, controllata dal sistema di comunicazione del framework, eseguita nel momento in cui si rende necessario l’invio di comandi per il controllo dei motori. CAPITOLO 4. PROGETTAZIONE E SVILUPPO 4.5.1 35 Implementazione La libreria del framework YARA permette di realizzare un modulo dell’applicazione attraverso la sua implementazione in una classe C++ derivata dalla classe astratta Module. La classe Pioneer, realizzata nella sezione 4.4, `e stata trasformata in un modulo del framework. Per prima cosa si `e modificata l’interfaccia della classe stessa, per dichiarare che questa deriva dalla classe astratta Module. Per fornire le misure di distanza rilevate dai sonar, agli altri moduli del sistema, viene utilizzato il pattern di comunicazione Information: la classe Pioneer definisce perci`o, al suo interno, un oggetto Sender che invia dati aventi il nome simbolico sonar. I sonar installati a bordo del Pioneer sono 7, quindi, per consentire di aggiornare singolarmente le misure rilevate, viene sfruttata la struttura dati multiple messa a disposizione dalla libreria del framework. Il dato inviato dall’oggetto Sender viene definito come segue: typedef YARA::multiple <double, 7> SonarData; . All’interno del Server Information Packets inviato dal robot, le misure dei sonar sono restituite sotto forma di numeri interi con valori compresi tra 0 e 30000. Questi valori vengono convertiti in metri prima di essere invitati ai moduli richiedenti permettendo un uso pi` u razionale dell’architettura di controllo (si veda la sezione 5.1). Il modulo Pioneer per ricevere i comandi di moto da inviare al robot, utilizza un oggetto Receiver che accetta dati con il nome simbolico motor, constituti da informazioni di tipo MotorCommand definito nel seguente modo: struct MotorCommand { double trasl; double rotat}; . Questa struttura permette di definire contemporaneamente sia la velocit`a di traslazione (in m/s) che quella di rotazione (in rad/s) da imporre al robot. Per la gestione della comunicazione con il robot, l’invio dei dati dei sonar e la ricezione dei comandi per i motori dagli altri moduli, vengono utilizzate due attivit`a gestite mediante due oggetti Activity definiti all’interno della classe Pioneer. Il primo oggetto Activity di nome sendReceive permette l’esecuzione periodica ogni 100ms della funzione membro receiveServerData che si occupa di ricevere il Server Information Packet inviato dal robot, estrarne il contenuto, inviarne i dati dei sonar agli altri moduli e comunicare al robot i comandi per gestire i motori. Il secondo oggetto Activity, di nome setVe- CAPITOLO 4. PROGETTAZIONE E SVILUPPO 36 locity, `e un’attivit`a aperiodica che si occupa di attivare la funzione setVel() nel momento in cui altri moduli rendono disponibili dei comandi di moto per il robot. setVel memorizza, nelle variabili private della classe, i valori di velocit`a ricevuti, utilizzati poi per inviare comandi al robot. Il framework consente il controllo dell’inizio e della fine della schedulazione delle Activity mediante l’utilizzo di un oggetto Unit da passare al costruttore di ogni modulo integrato nel framework. Questo oggetto si occupa di richiamare i metodi start() e stop(), implementati in tutti i moduli, che attivano e disattivando l’esecuzione periodica o aperiodica (su disponibilit`a dei dati) delle Activity. La struttura semplificata del modulo Pioneer `e riportata nel listato 4.1 (vengono omessi i metodi e gli attributi non strettamente legati all’integrazione della classe nel framework) . 1 2 3 4 5 class Pioneer : public YARA::Module { public: Pioneer(YARA::Unit& u, const std::string& ttyName_); ~Pioneer() throw(); 6 7 8 9 10 11 private: void start(); void stop(); void receiveServerData(); void setVel(); 12 YARA::Activity<void,void> sendReceive; YARA::Activity<void,void> setVelocity; YARA::Sender< SonarData > sonar; YARA::Receiver< MotorCommand > motor; 13 14 15 16 17 double translationVel; double rotationalVel; double sonars[7]; 18 19 20 21 }; Listato 4.1: Struttura base del modulo Pioneer. Capitolo 5 Sperimentazione Le fasi di progettazione e di sviluppo del modulo Pioneer da integrare nel framework YARA, illustrate nel capitolo precedente, sono state affiancate da una serie di prove sperimentali per verificare il corretto funzionamento del codice sviluppato nei vari passi e per consentire l’implementazione di alcune parti del modulo strettamente legate alla gestione dell’hardware del robot. In particolare sono state svolte prove per la verifica dell’esecuzione dei comandi inviati al robot per il controllo dei motori e per tarare le letture dei sonar. Nel presente capitolo si analizza il lavoro svolto sui sonar del robot e si descrive come, sfruttando le funzionalit`a messe a disposizione dall’architettura di controllo, sono stati sviluppati alcuni semplici behaviour per permettere il controllo del comportamento del robot. 5.1 Taratura dei sonar I 7 sonar installati sul Pioneer permettono la misura della distanza degli ostacoli presenti di fronte e di fianco al robot. Tale misura viene utilizzata nel controllo del comportamento del robot. Questa tipologia di sensori viene adotatta su molti modelli di robot mobili per uso indoor, quale miglior compromesso tra costo e prestazioni. Il principio di funzionamento dei sonar si basa sull’emissione di un’onda acustica, ad una determinata frequenza, e sulla misura del tempo di attesa dell’eco riflesso. Il tempo di attesa viene detto tempo di volo T (tempo di andata e ritorno) ed `e legato alla distanza d dalla velocit`a del suono in aria c (344 m/s alla temperatura di 22◦ C) secondo la relazione d = c ∗ T /2 La velocit`a del suono `e variabile in dipendenza delle condizioni atmosferiche, come temperatura, pressione, umidit`a e vento. Questa sensibilit`a 37 CAPITOLO 5. SPERIMENTAZIONE 38 Figura 5.1: I 5 sonar frontali del Pioneer rappresenta un limite all’utilizzo dei sonar in ambienti aperti, ma non crea problemi in ambienti chiusi dove le condizioni climatiche non subiscono grosse variazioni. Il PSOS, a bordo Pioneer, si occupa della gestione dei sonar e attraverso l’invio dei pacchetti al PC fornisce all’applicazione di controllo un valore della distanza misurata dai singoli sonar. Sfortunatamente questo valore non `e rappresentato in unit`a temporali o di distanza note ma bens`ı con un numero intero, compre tra 0 e 30000. Il manuale operativo del robot consiglia la valutazione sperimentale per il calcolo della funzione di trasferimento da applicare al valore restituito per poterlo convertire in metri di distanza. Nel seguito della presente sezione verr`a descritto il procedimento adottato per trovare la funzione di conversione delle misure dei sonar. Passo 1 Per ognuno dei 7 sonar sono state raccolte una serie di misure effettuate ponendo un ostacolo, costituito da una scatola di cartone, a varie distanze dai sonar stessi (vedere figura 5.2). Le misure sono state effettuate a 10cm, 20cm, 30cm, 40cm, 50cm, 60cm di distanza da ogni sonar e il valore ottenuto riportato in una tabella. Ogni singola misura veniva effettuate nel seguente modo: - Posizionamento del sonar esattamente di fronte all’ostacolo ad una determinata distanza. - Mediante un apposito software eseguito sul PC collegato al robot si calcola il valore misurato dal sonar facendo la media sui campioni restituiti in 10s di misura. - Trascrizione del valore nella tabella. Nella tabella 5.1 sono riportati i valori raccolti. CAPITOLO 5. SPERIMENTAZIONE 39 Figura 5.2: Dislocazione del Pioneer e dell’ostacolo per la taratura dei sonar. Figura 5.3: Sonar Sonar Sonar Sonar Sonar Sonar Sonar Rappresentazione dall’alto della console del Pioneer con la dislocazione dei sonar. 0 1 2 3 4 5 6 10 cm 20 cm 30 cm 40 cm 50 cm 60 cm 1230 1370 1932 2508 3097 3652 1190 1376 1958 2506 3108 3651 1198 1371 1945 2517 3089 3663 1223 1366 1943 2520 3082 3660 1174 1377 1937 2509 3103 3674 1180 1373 1944 2532 3103 3662 1227 1372 1936 2518 3084 3648 Tabella 5.1: Misure dei sonar. CAPITOLO 5. SPERIMENTAZIONE 40 Passo 2 I valori raccolti nella tabella sono stati tracciati nel grafico presente in figura 5.4. Figura 5.4: Grafico dei valori raccolti dai sonar. Dal grafico si vede molto chiaramente che le misure ottenute dai sonar, come ci si aspettava, sono direttamente proporzionali alla distanza dell’ostacolo ad eccezzione della lettura a 10cm. I grafici corrispondenti ai 7 sonar rispecchiano tutti lo stesso andamento permettendo di concludere che tutti i sensori funzionano correttamente. Le misure effettuate a 10cm non sono in proporzione con le altre perch`e si tratta di una distanza troppo bassa alla quale i sonar Polaroid non permettono la corretta valutazione del tempo di volo. Passo 3 Per individuare la funzione di trasferimento che lega le misure dei sonar alla distanza in metri dell’ostacolo, si sono calcolate le medie dei valori alle singole distanze e successivamente si sono calcolate le differenze tra un valore e il successivo (5.2). 20 cm 30 cm 40 cm 50 cm 60 cm Media 1372 1942 2515 3095 3659 Diff. 570 573 579 563 Tabella 5.2: Misure dei sonar. CAPITOLO 5. SPERIMENTAZIONE 41 Dalla tabella si `e ricavata la seguente funzione lineare che lega la misura effettuata dai sonar (val) alla distanza in metri (dist). dist = (val − 229)/5720 Questa funzione `e stata successivamente implementata all’interno del metodo, del modulo Pioneer, che si occupa della gestione e dell’invio delle misure sensoriali ai vari moduli dell’architettura. Ulteriori rilevazioni di distanze di ostacoli hanno permesso di valutare un errore massimo del 2% su misure comprese nel range di funzionamento dei sensori, cio`e tra i 17cm e i 5,20m. 5.2 Realizzazione di un comportamento Per mostrare un utilizzo concreto e per valutare il corretto funzionamento dell’architettura di controllo realizzata, sono stati sfruttati il framework YARA e il modulo Pioneer per progettare una semplice applicazione che consenta al robot di percorrere, in autonomia, un corridoio stando allineato al centro e, in presenza di ostacoli troppo vicini, di fermarsi per evitare possibili collisioni. In figura 5.5 viene rappresentato lo schema del sistema preso in considerazione. distR e distL rappresentano rispettivamente le distanze destra e sinistra tra il robot e le pareti del corridoio, v `e la velocit`a transazionale e w la velocit`a rotazionale. La realizzazione dell’applicazione richiede l’implementazione di un behaviour di Collision Avoidance, per il controllo della velocit`a di translazione, e di un behaviour di Stay In The Middle, per controllare la velocit`a di rotazione. Il behaviour di Collision Avoidance si occupa di tenere sotto controllo le misure dei sonar e impone lo stop del movimento del robot nel caso venga rilevato un ostacolo a distanza minore di una soglia di sicurezza. Se nessun ostacolo `e rilevato viene mantenuta una veloci`a di translazione costante pari a 20 cm/s. Il behaviour di Stay In The Middle controlla le misure dei sonar laterali e, sulla base di queste, corregge la direzione di moto del robot cercando di mantenerlo al centro delle due pareti laterali. Per controllare dinamicamente il corretto posizionamento del robot viene realizzato un semplice controllo in retroazione schematizzato in figura 5.6. L’anello di retroazione permette la regolazione della posizione diff del robot rispetto al centro del corridoio impostando una velocit`a rotazionale w proporzionale alla differenza tra la posizione desiderata diff* e quella cal- CAPITOLO 5. SPERIMENTAZIONE 42 Figura 5.5: Modello del sistema. Figura 5.6: Regolatore della posizione del robot. colata diff = distL - distR. Imponendo un valore del set-point diff* pari a 0 il robot dovrebbe procedere mantenendosi al centro del corridoio. Il controllore proporzionale, con guadagno K, imposta la velocit`a rotazionale w che dovrebbe assicurare la convergenza verso il posizionamento corretto del robot grazie al comportamento integrale del sistema. Dopo una serie di prove `e stato individuato il valore di K che consente l’avanzamento del robot senza eccessive oscillazioni attorno alla traiettoria ideale. I due behaviour di Collision Avoidance e Stay In The Middle sono stati implementati in un unico modulo denominato Behaviour che rappresenta il controllore del sistema robot. Il listati del modulo realizzato e del main program necessario all’esecuzione dell’applicazione sono illustrati nella sezione CAPITOLO 5. SPERIMENTAZIONE 43 B. Il modulo si registra come receiver di dati sonar permettendo l’esecuzione della funzione perform() nel momento in cui vengono resi disponibili nuovi dati dal modulo Pioneer. Le letture dei sonar vengono pubblicate con una frequenza pari a 10 Hz, pertanto anche il controllo del comportamento mediante la funzione perform() avviene a tale frequenza. All’interno di questa funzione `e stato implementato il controllore illustrato nella figura 5.7 costituito da due blocchi che si occupano della gestione dei singoli Behaviour. Figura 5.7: Controllore. La divisione in blocchi `e stata rispettata anche nella stesura del codice. Dopo aver eseguito le letture dei valori dei sonar, questi vengono confrontati con la costante MIN DIST OBJECT per stabilire la presenza di ostacoli troppi vicini al robot. Successivamente viene implementato il controllore proporzionale per il calcolo della velocit`a di rotazione e viene inviato il comando ai motori. Una serie di test svolti negli ambienti intorno al laboratorio ha mostrato il corretto funzionamento del sistema realizzato. Il robot percorre i corridoi mantenendosi al centro ed adattandosi a cambiamenti delle pareti superando correttamente le colonne portanti che sporgono da esse e riallineandosi nel caso di un cambiamento della larghezza del corridoio. Il controllore realizzato `e molto semplice; infatti mostra i suo limiti quando il robot incontra un curva molto stretta nel corridoio. In questa circostanza il robot continua ad avvicinarsi alla parete che ha di fronte, fermandosi quando raggiunge la soglia di sicurezza, imposta dal comportamento di Collision Avoidance, senza riuscire ad adattarsi al cambiamento di direzione. Capitolo 6 Conclusioni In questo progetto di tesi `e stata sviluppata un’architettura di controllo per il robot mobile Pioneer che consenta la lettura dei dati sensoriali e l’invio di comandi motori, permettendo la realizzazione di architetture robotiche di tipo reattivo. Dopo una prima fase durante la quale si sono analizzati la struttura e i principi di funzionamento del robot, si `e deciso di procedere ad un aggiornamento fisico del robot stesso che ha portato all’installazione a bordo di un PC e alla possibilit`a di espandere le capacit`a sensoriali, mediante l’utilizzo di moderni sensori quali sistemi di visione digitali e scanner laser. Le risorse computazionali, fornite dal PC di bordo e adeguate alle moderne applicazioni robotiche, hanno permesso una migliore versatilit`a di utilizzo del robot data, soprattutto, dalla possibilit`a di operare in completa autonomia senza essere vincolato ad un postazione fissa per l’elaborazione. Per lo sviluppo dell’architettura di controllo `e stato sfruttato il framework YARA che consente la creazione di applicazioni robotiche, composte da una serie di moduli indipendenti, mettendo a disposizione gli strumenti per realizzare i moduli stessi, per la loro schedulazione real-time e per lo scambio di informazioni e comandi tra essi. Il componente principale dell’architettura di controllo, consiste nel modulo Pioneer che si occupa della completa gestione del robot: comunicazione seriale, pubblicazione dei dati sensoriali e invio dei comandi di moto. Per come `e strutturato, il modulo solleva lo sviluppatore che lo utilizza dall’occuparsi delle operazioni di basso livello facilitando l’interazione con il robot, permettendo di concentrarsi sullo sviluppo degli algoritmi che realizzano il comportamento. Nella stesura del codice dell’architettura di controllo si `e cercato di mantenere, quanto pi` u possibile, separate la parte legata alla comunicazione con il robot dalla parte legata all’integrazione del modulo all’interno del frame44 CAPITOLO 6. CONCLUSIONI 45 work. Questo aspetto `e molto importante in previsione di un futuro riutilizzo, del codice realizzato, all’interno di altri framework oppure in applicazioni stand-alone. Terminato lo sviluppo del modulo Pioneer si `e sviluppato qualche semplice modulo comportamentale per verificare il corretto funzionamento dell’architettura di controllo. In particolare sono stati creati un modulo per il test dei sonar del robot e dei moduli behaviour per semplici applicazioni di navigazione che hanno permesso di testare l’utilizzo dell’architettura per il controllo del comportamento dinamico del robot. Inoltre, la creazione di questi moduli ha mostrato la relativa semplicit`a con la quale si possono realizzare applicazioni robotiche basate sull’architettura di controllo sviluppata. I possibili sviluppi futuri di questo progetto di tesi sono i seguenti: - Modificare l’attuale modulo Pioneer per una sua integrazione all’interno di future versioni del framework YARA nelle quali sia disponibile il pattern di comunicazione Command, per permettere lo sviluppo di applicazioni robotiche pi` u complesse. - Sviluppare un modulo per il framework YARA che consenta l’utilizzo dello scanner laser Sick LMS 200 installato a bordo del Pioneer. - Implementare un controllo pi` u completo dei sensori sonar, attraverso la gestione della sequenza di firing e permettendo lo spegnimento degli stessi nel caso non fossero necessari. - Installare, a bordo del Pioneer, un sistema di visione digitale per ampliare le possibilit`a di utilizzo del robot. Appendice A Procedure tecniche Nelle sezioni della presente appendice vengono illustrate le procedure tecniche da seguire per l’utilizzo del robot Pioneer e dello scanner laser Sick LMS 200 ponendo particolare attenzione alle operazioni necessarie per la corretta ricarica delle batterie al piombo e delle batterie al NiMh. A.1 Installazione del PC di bordo Normalmente, il PC dedicato viene sempre lasciato montato a bordo del Pioneer. Nel caso non sia presente, seguire le seguenti operazioni per una corretta installazione del PC sul robot. Hardware richiesto: - Il Pioneer 1. - Il PC dedicato, normalmente riposto nell’apposita scatola di cartone. - 2 ghiere di fissaggio, normalmente avvitate alla barre filettate di ottone presenti sul Deck del robot. Procedura di installazione: - Posizionare il Pioneer 1 su un adeguato piano di appoggio. - Estrarre il PC dalla scatola di cartone nel quale `e riposto. - Svitare le 2 ghiere di fissaggio avvitate alla barre filettate sul Deck del robot. 46 Appendice 47 - Collocare il PC sul Deck del robot facendo attenzione che le barre filettate si vadano ad infilare negli appositi fori presenti nella parte anteriore del case del PC. - Avvitare le 2 ghiere di fissaggio alle barre filettate fino a fondo corsa in modo tale che il PC non sia libero di muoversi. - Collegare il plug di alimentazione, fissato sul cavo che esce dalla Console del robot, nell’apposito connettore presente nella parte posteriore sinistra del case del PC. Figura A.1: Particolare del PC nel quale si pu`o notare il dado di fissaggio, il plug di alimentazione e l’interruttore. - Collegare il connettore DB9 presente sul cavo piatto grigio, che esce dalla parte destra del case, al relativo connettore presente sulla Console del robot. - Terminate queste operazioni, `e possibile collocare il robot sul pavimento nell’ambiente dove verr`a utilizzato. - Accendere il robot agendo sull’apposito interruttore a slitta posizionato sulla parte superiore della Console. Controllare che il led rosso power di fianco all’interruttore si accenda. - Controllare che la tensione visualizzata a destra sulla riga inferiore del display LCD, presente sulla Console, sia superiore a 12,0V. In caso contrario, si consiglia di mettere sotto carica le batterie del robot prima di un suo utilizzo. Appendice 48 - Fornire alimentazione al PC agendo sull’interruttore posizionato nella parte posteriore sinistra del case. Controllare che il led giallo, presente sulla parte superiore del case, si accenda. - Premere brevemente il pulsante presente sul case in corrispondenza del led verde per avviare la fase di boot del PC. Controllare l’accensione fissa del led verde. - Terminata la fase di boot del sistema operativo installato nel PC `e possibile utilizzare il robot. Figura A.2: Il PC installato correttamente a bordo del robot. A.2 Installazione dello scanner laser Sick LMS 200 Le seguenti operazioni permettono l’installazione dello scanner laser Sick LMS 200 sul Pioneer per consentirne l’utilizzo mediante il PC di bordo. Hardware richiesto: Appendice 49 - Il Pioneer 1 dotato del PC di bordo. - Lo scanner laser Sick LMS 200. - 2 maniglie a ripresa, normalmente avvitate sul retro dello scanner laser. - 2 pacchi batterie composti ciascuno da 10 batterie ricaricabili al NiMh. - 1 cavetto adattatore per il collegamento in serie dei due pacchi batterie. Procedura di installazione: - Se presenti, svitare le due maniglie a ripresa dal retro dello scanner laser. - Posizionare lo scanner laser sull’apposito supporto presente sulla Console del robot. - Fissare lo scanner laser al supporto utilizzando le due maniglie a ripresa (vedi figura A.3). Figura A.3: Fissaggio del laser mediante le maniglie a ripresa. - Collegare il cavo dati seriale dello scanner laser al connettore della porta seriale presente sul PC. - Collocare i due pacchi batterie ai lati della bussola del robot (il cubo nero presente sul Deck ) fissandoli con un elastico. - Collegare i due pacchi batterie in serie mediante l’apposito cavo adattatore visibile in figura A.4. Appendice 50 Figura A.4: Pacchi batterie al NiMh e cavo adattatore. - Collegare l’altro capo dell’adattatore (il connettore pi` u grande) al cavo di alimentazione dello scanner laser. - Dopo 15-20 secondi, controllare l’accensione del led verde situato sulla parte superiore dello scanner laser. Se il led verde lampeggia significa che i pacchi batterie sono scarichi ed `e necessario ricaricarli. - Lo scanner laser `e pronto per essere utilizzato (figura 3.1). A.3 Ricarica delle batterie Quando si lavora nel campo della robotica mobile, e dei dispositivi ad essa collegati, si ha sempre a che fare con la gestione della ricarica delle batterie. Le principali tipologie di batterie ricaricabili utilizzate sono quelle al piombo e quelle al NiMh [Nickel-Metal Hydride]. In questa sezione vengono analizzati i procedimenti necessari per una corretta ricarica delle due tipologie di batterie. A.3.1 Batterie al piombo Il Pioneer ha al suo interno due batterie al piombo da 12V e 7 Ah. Per la loro ricarica seguire i seguenti passi: - Procurarsi il caricabatterie MiniTRON con apposito cavo adattatore. Questo deve avere da un capo un connettore bipolare, da collegare a Appendice 51 quello presente sul cavo del caricabatterie, e dall’altro un plug nero per il collegamento al robot. - Collegare la spina di alimentazione del caricabatterie ad una presa di rete elettrica. - Collegare il plug nero nell’apposito connettore presente sulla parte posteriore della Console del robot. Anche se non strettamente necessario si consiglia di effetture la ricarica delle batterie al piombo solo dopo aver spento il robot e il PC di bordo. - Controllare l’accensione fissa del LED rosso sul caricabatterie che indica la fase di ricarica delle batterie. - Quando si accende il led verde la fase di ricarica `e completata e si pu`o scollegare il robot per utilizzarlo. Se non si scollega il robot non si verifica nessun danno ma, semplicemente, alle batterie viene fornita una tensione costante di mantenimento per evitare il fenomeno dell’autoscarica. - Scollegare il robot dal caricabatterie per poterlo utilizzare. A.3.2 Batterie al NiMh Rispetto alle batterie al piombo, la ricarica di quelle al NiMh `e un’operazione da compiere con maggiore attenzione se si vuole garantire una lunga durata di vita alle batterie stesse. La ricarica delle batterie al NiMh `e vivamente consigliata eseguirla partendo da batterie completamente scariche. I pacchi batterie utilizzati per alimentare il laser Sick LMS 200 sono formati , ciascuno, da 10 elementi che, messi in serie, forniscono una tensione nominale di 12V (1, 2 ∗ 10 = 12) e si possono considerare scarichi nel momento in cui la tensione scende sotto gli 11,8V circa. Quando i due pacchi batterie sono collegati al laser bisogna utilizzarli fino a quando il laser stesso segnala, attraverso il lampeggio del LED verde, il livello basso della tensione di alimentazione e, di conseguenza, la scarica delle batterie. Per la ricarica di un singolo pacco batterie da 10 elementi procedere come segue. - Procurarsi un caricabatterie Ansmann ACS410P con apposito cavo adattatore per consentirne il collegamento al connettore presente sul pacco batteria. Appendice 52 - Collegare la spina di alimentazione del caricabatterie ad una presa di rete elettrica. - Collegare il connettore del carica batteria a quello del pacco batterie. - Se non si `e sicuri della completa scarica delle batterie, premere il pulsante giallo sul carica batterie per avviare il processo di scarica automatico. - Attendere, dopo qualche ora, l’accessione del LED verde che indica il raggiungimento dell’85% di carica delle batterie. Il pacco batterie pu`o gi`a essere utilizzato. Se si vuole una ricarica completa, si consiglia di lasciare le batterie sotto carica per almeno 8-10 ore. In ogni caso non superare le 24 ore di ricarica. - Scollegare il pacco batterie pronto per l’uso. Appendice B Listato dell’applicazione Stay In The Middle In questa appendice viene illustrato il codice sorgente del modulo che implementa il comportamento realizzato per testare la funzionalit`a dell’architettura di controllo. Per la descrizione degli algoritmi si veda il capitolo 5.2. Il listato B.3 rappresenta il programma principale dell’applicazione nel quale si pu`o facilmente individuare la fase di creazione del modulo Pioneer e del modulo Behaviour che implementa il comportamento. Successivamente mediante l’istruzione u.start() si avviano l’esecuzione delle Activity dei moduli. B.1 Behaviour per il robot Listato B.1: Interfaccia della classe che implementa il modulo Behaviour. 1 2 const double MIN_DIST_OBJECT = 0.30; const double K = 0.5; 3 4 5 6 7 8 class Behaviour : public YARA::Module { public: // Costruttore Behaviour(YARA::Unit& u); 9 10 11 12 13 private: void perform(); // Implementa il comportamento void start(); void stop(); 14 53 Appendice 54 // Oggetti YARA YARA::Activity<void,void> check; YARA::Receiver< SonarData > sonar; YARA::Sender< MotorCommand > motor; 15 16 17 18 19 MotorCommand vel; 20 21 }; Listato B.2: Implementazione della classe Behaviour. 1 #include "Behaviour.h" 2 3 4 5 6 7 8 9 10 11 Behaviour::Behaviour(YARA::Unit& u) : Module( u, "Behavior" ), check( this, &Behaviour::perform, 0.05 ), sonar( this, "sonar" ), motor( this, "motor" ) { vel.trasl = 0; vel.rotat = 0; } 12 13 14 15 16 void Behaviour::start() { sonar.setListener( check,6 ); } 17 18 19 20 21 void Behavior::stop() { sonar.clearListener(); } 22 23 24 25 26 27 28 void Behaviour:: perform() { try { double val[7], lSonar,rSonar,diff; bool object = false; 29 30 31 32 33 // Lettura dei valori dei sonar for (int i = 0; i < 7; i++) { val[i] = sonar.get(i); Appendice 55 // Controllo della presenza di ostacoli if (!object) { object = (val[i] < MIN_DIST_OBJECT); } 34 35 36 37 38 } 39 40 // Implementazione del controllore per il behaviour Stay In The Middle rSonar = val[0]; lSonar = val[6]; diff = rSonar - lSonar; vel.rotat = diff * K; 41 42 43 44 45 46 if (object) { std::cout << "Ostacolo" << std::endl; vel.trasl = 0; vel.rotat = 0; } else { std::cout << "Via libera" << std::endl; vel.trasl = 0.2; } std::cout << ", velicita’: Trasl = " << vel.trasl << " Rotat = " << vel.rotat << std::endl; 47 48 49 50 51 52 53 54 55 56 57 58 59 // Invio delle velocita’ per i motori motor.update(vel); 60 61 } catch ( EmptySlot e ) { } 62 63 64 65 66 } Appendice B.2 56 Main program Listato B.3: Main program dell’applicazione. 1 2 3 #include "Unit.h" #include "Pioneer.h" #include "Behavioru.h" 4 5 6 7 8 9 int main() { try { Unit u; 10 Pioneer pioneer(u,"/dev/ttyS1"); 11 12 Behaviour behaviour(u); 13 14 u.start(); 15 16 std::cin.get(); 17 18 u.stop(); 19 } catch (PioneerException& err) { std::cout << err.what() << std::endl; } 20 21 22 23 24 25 return 0; 26 27 } Appendice C Tabella comandi PSOS Nella figura C.1 della pagina seguente sono elencati tutti i comandi supportati dal sistema operativo PSOS (eseguito a bordo del Pioneer ). Questi comandi vengono inviati dal software client, eseguito su un PC remoto, al robot mediante una linea seriale RS-232 e permettono il controllo del robot stesso attraverso la gestione della comunicazione e dei dispositivi a bordo del robot. 57 Appendice 58 Figura C.1: Comandi del PSOS. Bibliografia [1] RIMLab, robotics and intelligent machines laboratory. http://rimlab. ce.unipr.it/. [2] ActivMedia, mobile robots & robotics software. mobilerobots.com/. http://www. [3] Player/Stage. http://playerstage.sourceforge.net. [4] F. Monica. Progettazione di una Architettura Modulare, Aperta ed in Tempo Reale per un Robot Mobile. Tesi di Laurea in Ingegneria Informatica, Universit`a degli Studi di Parma, 2003. [5] D. Lodi Rizzini. Introduzione a Player-Stage. Corso di robotica, 2005. [6] ActivMedia. Pioneer 1/AT operations manual, ed. 2, 1998. [7] D. Faccini. Ricerca del massimo comportamento reattivo ottenibile con il robot mobile pioneer 1. Tesina del corso di robotica, 1999. [8] D. Pallastrelli. Studio e Realizzazione di un Framework Orientato agli Oggetti per Applicazioni Real-time. Tesi di Laurea in Ingegneria Informatica, Universit`a degli Studi di Parma, 2002. 59 Ringraziamenti Ed eccomi giunto all’ultima pagina di questa tesi. Ripercorrendo questi ultimi mesi sono tante le persone che dovrei ringraziare per avermi aiutato o, semplicemente, tenuto compagnia nei momenti di ”relax”. Se sono qui a scrivere `e anche merito della lunga serie di eventi che hanno caratterizzato la mia vita. Ricordare e ringraziare tutte le persone che sono state determinanti per arrivare a questo importante traguardo non `e semplice, in ogni caso i miei pi` u grandi ringraziamenti vanno a tutte loro e a tutti voi che state leggendo queste parole. Il primo ringraziamento ufficiale al Prof. Caselli, il mio relatore, per avermi dato la possibilit`a di svolgere questa tesi e per il grande aiuto durante la scrittura di questo elaborato, che ha rappresentato il momento pi` u impegnativo di tutto il lavoro svolto. Un altro importante ringraziamento va all’Ing. Francesco Monica per i numerosi e preziosi consigli ricevuti durante tutto lo svolgimento della tesi e per avermi aiutato in quei momenti quando il suo intervento risolveva velocemente tutti i problemi. Il ringraziamento diventa un amichevole ”grazie” nel momento in cui mi rivolgo all’amico Francesco e con lui a Dario, Jacopo, Monica, Massimo, Michele, Eleonora, Rosa, Chiara, Bruno e a tutte le persone che ho conosciuto all’interno del Laboratorio di Robotica e della Palazzina 1. Ringrazio tutti i compagni di corso conosciuti in questi tre splendidi anni; grazie a Daniele, Andrea e Pietro per le lunghe chiacchierate fatte durante i tragitti di spola tra Reggio Emilia e Parma. Grazie a Enrico, Fabio, Mattia, Stefano e Fabio per aver condiviso felicemente gli anni delle superiori e dell’universit`a. Grazie a tutti gli amici che ho conosciuto dall’asilo nido fino ad oggi, in particolare grazie a Francesco e Andrea per essere sempre stati presenti in questi anni. Grazie a tutti gli amici della compagnia di San Prospero soprattutto per le ultime vacanze estive che hanno permesso di prendermi un periodo di pausa durante questo impegnativo lavoro. 60 Ringraziamenti 61 Grazie ai miei Genitori, e con loro alla mia ”sorellina” Susanna, per avermi sempre dato fiducia, amore, affetto e aiuto in ogni occasione, per non aver mai dubitato nelle mie capacit`a. Ringrazio tutti i componenti della mia famiglia partendo dai Nonni, arrivando agli Zii e ai Cugini. GRAZIE A TUTTI!
© Copyright 2024