MokaByte Numero  36  - Dicembre 99
 
VLAB
Un simulatore Java 
per sistemi multirobot
di 
Stefano Carpin
 


In questo articolo viene presentato VLAB (Virtual LABoratory), un simulatore per sistemi multirobot scritto completamente in Java. VLAB realizza un laboratorio virtuale situato sul web in cui gli utenti possono  istanziare degli agenti autonomi, definendone le abilita  (percettive ed attuative) ed i moduli di controllo, ed osservarne il comportamento. Il server VLAB provvede a simulare azioni, percezioni e ad inviare agli utenti una scena VRML che illustra l'evoluzione del sistema


Introduzione

Un sistema  multirobot e' costituito da un insieme di robot automi situati in un ambiente con il compito di perseguire un predeterminato obiettivo. Ogni robot  e' dotato di sensori per acquisire informazioni sull'ambiente, di attuatori per alterare lo stato dello stesso e di un software di decisione che elabora i dati acquisiti e delibera le azioni da intraprendere. Tali sistemi, attualmente oggetto di numerose ricerche ed iniziative, sono piuttosto costosi e le simulazioni vengono spesso utilizzate nel primo  stadio di sviluppo per testare la bonta' delle soluzioni adottate. VLAB e' un simulatore per sistemi multirobot, con la particolarita' di essere scritto in Java, linguaggio tradizionalmente snobbato nell'ambito delle simulazioni in quanto ritenuto scarsamente performante;  il rendering tridimensionale dei risultati ottenuti si  basa su VRML 2.0. Il laboratorio "virtuale" creato risiede sul web e diversi utenti-sperimentatori possono contemporaneamente, e da qualunque postazione collega alla rete, accedere, osservare quanto accade, ed inserire i propri agenti robotici. La scelta di utilizzare Java proviene dalle positive esperienze  maturate nell' interfacciamento tra Java e VRML, dalla natura  distribuita dell'ambiente che si intende sviluppare e dalle possibilita' offerte dall'API Java3D recentemente rilasciata da Sun.
 

 

Architettura del sistema
VLAB e' una applicazione client-server. Il server VLAB costituisce un nucleo di basso livello su cui costruire di volta in volta ambienti di simulazione ad hoc, sfruttando le possibilita' offerte dall'approccio object-oriented proprio di Java. Il client e' invece un applet che consente all'utente di visitare il laboratorio utilizzando un browser in grado di operare con VRML. Il server VLAB e' una applicazione che opera secondo la nota modalita' multithread serving; dopo una fase di inizializzazione  questa si pone in ascolto su di un port TCP  e quando rileva una connessione crea ed avvia un thread cui affida la gestione della comunicazione con l'utente appena entrato nel laboratorio.  Le classi dei package java.net e java.io rendono estremamente rapido lo  sviluppo secondo questo approccio, peraltro oramai diffuso.
La connessione avviene quando un utente visita la pagina HTML del laboratorio. 
L'applet Client, dopo aver aperto un socket di comunicazion con il server ha due compiti: spedizione dei comandi impartiti da client e gestione delle informazioni ricevute dal server. Tali informazioni possono essere stringhe di comunicazione da visualizzare sullo schermo o particolari comandi di visualizzazione che l'applet, dopo averle opportunamente  formattate, passa al plug-in di gesione di VRML per l'aggiornamento della  scena. 
Il cuore di VLAB e' comunque la gestione della simulazione vera e propria; l'aggiornamento dell'ambiente comporta la modifica della posizione degli  elementi presenti, nel rispetto delle leggi della fisica. Il modulo
Environment e' un thread che si occupa di tutto cio'; Environment ciclicamente analizza posizioni, velocita', accelerazioni ed effettua gli aggiornamenti necessari, avendo cura di mantenere una rappresentazione coerente del modello. E' quindi necessario controllare che due robot non si compenetrino andanto ad occupare lo stesso spazio fisico, o aggiornare le velocita' in seguito ad urti, ecc. In questo contesto si possono testare gli algoritmi sviluppati di recente per questi scopi.
Per la gestione del modello si e' rivelato particolarmente utile il package javax.vecmath facente parte dell'estensione standard  Java3D. 
Tale package  dispone di una libreria estremamente fornita di oggetti matematici per la gestione di oggetti posizionati nello spazio tridimensionale. Esistono classi che definiscono punti, vettori, quaternioni,
matrici e matrici di trasformazione, ognuna delle quali e' dotata di  metodi che permettono di realizzare efficientemente operazioni come traslazioni, rotazioni attorno ad un asse, prodotti vettoriali, ecc.

 
 

Java3D e VRML
Java3D e' stata utilizzata anche per la simulazione dell'input proveniente dalle telecamere. I robot mobili sono infatti sempre piu' spesso dotati di hardware dedicato all'acquisizione di immagini ed il simulatore VLAB permette di modellare questa possibilita'. La simulazione in questione si basa sull'uso congiunto di VRML e Java3D; gli oggetti che devono essere inseriti nell'ambiente vengono definiti come modelli VRML (semplici file testo) e successivamente vengono caricati ed istanziati all'interno delle strutture dati di Java3D (detta scene-graph).  Il passaggio da VRML a Java3D e' estremamente semplice,  e comunque esistono delle librerie che possono essere utilizzate allo scopo (si veda ad esempio http://www.vrml.org/WorkingGroups/vrml-java3d/); successivamente e' possibile richiedere a Java3D di effettuare il rendering della scena definendo il punto di osservazione da utilizzare. In VLAB questo e' stato fatto sfruttando le funzioni di compatibilita' di Java3D che mettono a disposizione delle primitive simili a quelle che si trovano in OpenGL e che permettono di specificare le caratteristiche ottiche del dispositivo utilizzato  per osservare la scena, quali l'apertura, la risoluzione, l'orientazione, ed altro. Java3D dispone comunque di un view-model piu' sofisticato, ma il suo impiego esula dall'utilizzo previsto in VLAB. 
Le immagini prodotte da Java3D possono successivamente essere utilizzate dalle routine di controllo dei robot per estrarre informazioni sull'ambiente in cui operano; un aspetto operativo importante e' costituito dal fatto  che tali immagini sono delle istanze della classe BufferedImage del package java.awt.image e quindi l'utente-sperimentatore puo' elaborarle utilizzando tutti gli strumenti per l'elaborazione delle immagini
messi a disposizione da Java. La figura 1 riporta un esempio di cio' che vede un robot all'interno dell'ambiente; sono visibili un disco rosso sul pavimento ed un altro robot in alto a destra.

 

Possibilita' offerte da VLAB
Vediamo ora come si svolge una tipica sessione di sperimentazione in VLAB, assumendo che sia attivo un server VLAB che gestisce una estensione  per la simulazione di un determinato task per sistemi multirobot. L'utente decide come saranno strutturati gli agenti che intende inserire nel simulatore, ovvero quali sensori ed attuatori avranno. Tali specifiche vanno scritte su di un file ASCII secondo una sintassi stabilita da VLAB. Successivamente viene scritto il software che controlla il robot, che e' necessariamente una estensione della classe VLAB.agent. In tale modulo tipicamente vengono richiesti degli input dai sensori, vengono elaborate tali informazioni e vengono inviati dei dati agli attuatori.  Dopo aver compilato tale classe l'utente puo' connettersi con un browser al server VLAB ed entrare nel laboratorio; a questo punto si possono  spedire i due file prodotti in precedenza (il bytecode ed il file ASCII che definisce la morfologia) al server VLAB e richiedere una simulazione. 
VLAB legge il file che specifica la struttura del robot ed istanzia il robot corrispondente nell'ambiente; successivamente carica il bytecode e lo manda in esecuzione permettendogli di controllare  l'agente inserito. Quando il modulo di controllo richiede dei dati in  ingresso (ad esempio una immagine dalla telecamera, o una stima di prossimita' di eventuali ostacoli) VLAB provvede produrre tali informazioni
ed a fornirgliele; analogo comportamento si manifesta quando il  software impartisce al robot ordini del tipo "ruota di due gradi a destra" o "chiudi la prima delle due pinze". In background viene eseguito un
thread che periodicamente invia delle informazioni all'applet client per aggiornare la scena VRML che si presenta nel browser dell'utente. Ovviamente e' possibile istanziare piu' di un robot contemporaneamente, 
aventi tutti lo stesso modulo di controllo e la stessa morfologia, oppure inserire in sequenza piu' agenti diversi tra di loro. Se durante una simulazione un sencondo utente entra nel laboratorio, il server VLAB fornisce all'applet Client tutte le informazioni necessarie per inziare un rendering della scena a partire dallo stato attuale della simulazione; il nuovo utilizzatore puo' a sua volta inserire i propri agenti ed osservarne il comportamento. I diversi utenti presenti possono inoltre comunicare tra di loro, immettendo del testo nell'applet, che lo invia al server VLAB, il quale lo rispedisce in modalita' broadcast.
 
 
 
 
 
Figura 1

 
 

Sistema ed implementazioni utilizzate
Il server VLAB viene normalemente eseguito su di un biprocessore Pentium III a 450 MHz che utilizza il sistema operativo Linux. VLAB e' stato scritto utilizzando JDK 1.2 per Linux e Java3D 1.1.1. Un problema che tuttora permane e' la mancanza di una release stabile di JDK 1.2 per Linux; quella che viene attualmente utilizzata e' una pre-release che in alcune situazioni presenta dei comportamenti anomali. Se si opta per un utilizzo basato su green-thread e JIT disabilitato si ottiene comunque un comportamento piu' che buono, anche se non ottimale.
I sistemi su cui sono stati eseguiti i client sono stati PC con sistema operativo MS-WIN, Machintosh e workstations Silicon Graphics. 
Per quanto riguarda VRML si e' utilizzata la versione conforme alla specifica 2.0.
 
 
Figura 2

 
 

Conclusioni e prospettive
Il lavoro presentato costituisce un banco di prova insolito per il  linguaggio Java ma i risultati ottenuti premiano la scelta fatta.  Lo sviluppo dell'applicazione e' stato rapido e ci si e' potuti  concentrare sugli aspetti inerenti alla simulazione senza dover dedicare troppo tempo ai dettagli di basso livello, che vengono gestiti agilmente basandosi sulle classi standard di Java. L'aspetto forse piu' eclatante e' la facilita' con cui in Java si riesce ad avviare e gestire un sistema mutlithreading con una dozzina di thread che cooperano o concorrono per l'utilizzo di risorse condivise. L'utilizzo di Java3D congiuntamente a  VRML si e' dimostrato potente e di facile impostazione. Nel prossimo futuro si sviluppera' una libreria estesa di sensori ed attuatori
per equipaggiare i robot mobili inseriti e si provvederà ad integrare in VLAB le varie tecnologie che si stanno rendendo disponibili per rendere piu' performanti le applicazioni Java.
VLAB fa parte del progetto "Sviluppo di sistemi per la simulazione e la restituzione in grafica 3D e Realta' Virtuale di robot autonomi e di sistemi flessibili per l'automazione industriale", nell'ambito della convenzione tra ENEA, LADSEB (Istituto di Sistemistica e Bioingegneria -  Consiglio Nazionale delle Ricerche) e DEI (Dipartimento di Elettronica ed Informatica) dell'Universita' di Padova, relativa all'accordo di programma ENEA-MURST, Legge 95/1995, settore "Calcolo Parallelo con Applicazioni alla Robotica".
Un particolare ringraziamento va a Stefano Tognon, che ha sviluppato l'applet Client.

 


MokaByte rivista web su Java

MokaByte ricerca nuovi collaboratori
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it