Programmazione‎ > ‎

RoboThree

RoboThree è un ambiente di simulazione robotica leggero, pensato per essere usato come campo di sperimentazione didattica. È realizzato completamente in JavaScript. Il lato client, con grafica 3D basata su Three.js e modellazione fisica su Phisijs / Bullet Physics, ospita l'ambiente di simulazione vero e proprio. Il lato server, gestito con Node.js, è invece usato per simulare il controller del robot, con uno strato di emulazione del microcontrollore Espruino.

Tutto il software è rilasciato con licenza MIT su GitHub, dove è presente anche un wiki con informazioni sull'installazione e la documentazione del codice sorgente.

RoboThree: simulated robot RoboThree: real robot with Espruino microcontroller


Di seguito sono descritte alcune delle attività didattiche che potrebbero essere realizzate.

Possibili attività didattiche basate su RoboThree

L'ambiente di simulazione RoboThree è stato concepito come una sorta di framework che possa costituire una base di partenza per attività legate alla didattica della programmazione, attivabili a diversi livelli e in molteplici campi. Di seguito verranno indicate alcune idee di possibili attività che possono essere svolte utilizzando il framework così com'è oppure estendendolo e/o personalizzandolo.

Comandi diretti e configurazione di base

Il framework può essere utilizzato per fare pilotare in maniera interattiva uno o più robot presenti sulla scena, la quale potrebbe essere costruita in maniera tale da avere degli ostacoli e degli obiettivi da raggiungere, come in una sorta di videogioco. Il passo successivo potrebbe essere di coinvolgere gli studenti in attività di personalizzazione della scena (dove porre ostacoli e obiettivi, quali forme essi dovrebbero avere, dove collocare i robot all'inizio dell'attività, come sistemare le luci e la videocamera, ecc.), agendo sul file di configurazione.

Abilità:

  • manovrare un robot posto sulla scena per raggiungere determinati traguardi;
  • rispettare le regole formali con cui si deve impostare il file JSON di configurazione;
  • gestire le coordinate spaziali degli oggetti posti sulla scena.

Attivazione di sensori di movimento

Sul lato server, le classi *Controller possono essere personalizzate al fine di evitare urti contro gli ostacoli presenti sulla scena. Potrebbe essere chiesto agli studenti di modificare il codice per utilizzare i dati forniti dai sonar bloccando o rallentando l'avanzamento del robot nel caso di avvicinamento ad un ostacolo.

Abilità:

  • leggere ed interpretare il codice fornito come base;
  • apportare piccole modifiche a delle funzioni in modo da ottenere i cambiamenti desiderati nel comportamento del robot.

Cambiamento del comportamento

Partendo dall'esempio di controller fornito (vai avanti; se trovi un ostacolo indietreggia, ruota di un po' e poi riprendi ad andare avanti), si potrebbero chiedere modifiche via via più complesse da implementare (dal semplice accendere / spegnere i led all'emettere suoni in qualche modo legati alle distanze lette dai sonar, all'usare i dispositivi virtuali per fare delle operazioni sul mondo o per recuperare informazioni dallo stesso e memorizzarle in un proprio archivio).

Abilità:

  • apportare modifiche alle funzioni presenti;
  • aggiungere funzioni;
  • gestire operazioni in maniera asincrona, con l'uso di setTimeOut() e setInterval();
  • leggere, intepretare ed utilizzare i dati forniti dai dispositivi virtuali.

Modifica di componenti

Le componenti presenti nel robot costruito fisicamente e nella sua rappresentazione vogliono essere solo degli esempi, suscettibili di integrazione e di modifica. Ad esempio, a partire dalla telecamera virtuale presente nel robot, si potrebbe chiedere agli studenti di modificare il codice per far sì che la telecamera possa essere pilotata (spostata e ruotata) agendo sul telecomando virtuale. Oppure si potrebbe chiedere di aggiungere dei sensori, prendendo a modello quello già presente, per "leggere" il colore dei pixel del pavimento in più punti, al fine di poter implementare un semplice algoritmo di line following.

Abilità:

  • coordinare la parte di programmazione relativa al comportamento del robot con quella relativa alla sua rappresentazione;
  • adattare il codice JavaScript presente a necessità diverse rispetto a quelle degli esempi forniti;
  • leggere la documentazione in lingua inglese relativa alla libreria ThreeJS;
  • capire come funziona il meccanismo di aggiornamento dei dati e di comunicazione degli stessi durante la fase di aggiornamento.

Aggiunta di componenti

Ispirandosi agli innumerevoli tutorial presenti in rete, si potrebbe chiedere agli studenti di implementare nuove funzionalità con componenti aggiuntivi: ad esempio, potrebbe essere chiesto di installare e configurare un display a cristalli liquidi sul robot e di creare il corrispettivo display con il codice della rappresentazione, oppure di gestire comunicazioni utilizzando un modulo Bluetooth.

Abilità:

  • leggere la documentazione in lingua inglese relativa alla gestione dell'hardware di Espruino e del componente da gestire;
  • creare dei piccoli casi di test per verificare il funzionamento del componente;
  • recuperare on-line esempi relativi alla rappresentazione di oggetti con l'utilizzo di ThreeJS e adattarli alle proprie esigenze.

API alternative

Nel mondo della programmazione applicata alla robotica, esistono delle librerie standard piuttosto diffuse, quali Johnny-Five e CylonJs, alle quali ci si può ispirare per la definizione delle interfacce di programmazione predisposte. Uno studio delle API altrui può insegnare molto in termini di capacità di organizzare il codice in maniera pulita e ottimizzata. Un esercizio che potrebbe essere assegnato è di far sì che il codice predisposto per un componente aggiuntivo sia compatibile, a livello di interfaccia (con particolare riferimento alla firma delle funzioni) con quello presente nei repository delle librerie citate.

Abilità:

  • comprendere i motivi che possono aver portato a definire le firme di alcune funzioni in un modo o in un altro;
  • analizzare punti di forza e di debolezza di soluzioni alternative;
  • uniformarsi a standard definiti in modo da garantire una più elevata interoperabilità delle soluzioni predisposte.

Programmazione di alto livello

Rendere possibile la programmazione di alto livello di un robot a cui impartire comandi come "avanza di 30 centimetri" oppure "ruota di 90 gradi in senso orario" può risultare particolarmente difficile per diversi motivi. Innanzitutto, non è detto che il mondo fisico (reale o simulato) consenta che l'azione possa essere effettivamente compiuta (che cosa succede se è presente un ostacolo?) e in alcuni casi potrebbe non essere dato sapere quanto sarà il tempo necessario per portarla a compimento (l'avanzamento potrebbe comportare lo spingere un oggetto davanti a sé). In secondo luogo, va considerato che i tempi di risposta, soprattutto nell'ambito della simulazione, possono non essere adeguati: una rotazione per un angolo preciso è difficile da ottenere, considerato che la bussola virtuale può inviare informazioni relative allo stato corrente solo ad ogni aggiornamento, ed è quindi altamente probabile che ci si accorga di aver raggiunto l'angolazione desiderata troppo tardi (il fermo motori avviene comunque al fotogramma successivo e nella simulazione esiste un po' di inerzia che fa continuare il movimento anche a ruote ferme). Infine, va considerato che spostamenti e rotazioni potrebbero essere influenzati anche da fattori esterni (ad esempio, da azioni di un altro robot presente sulla scena). Come va considerata una rotazione di 90° in senso orario se il robot riceve delle spinte che gli fanno superare abbondantemente il target? Affrontare questo genere di problemi potrebbe essere una sfida interessante e, anche se non si dovesse riuscire a risolverli tutti, farebbe aprire gli occhi sulla complessità delle cose quando si ha a che fare con il mondo reale.

  • predisporre semplici programmi di alto livello da utilizzare come test;
  • stabilire quali devono essere i comandi da impartire all'inizio dell'esecuzione dell'istruzione di alto livello e come deve essere gestito il controllo della condizione di uscita / termine;
  • stabilire un protocollo di comunicazione tra le componenti software coinvolte.

Sfide di programmazione in tempo reale

Si potrebbero mettere in scena più robot che, programmati da squadre di studenti, competono per una risorsa, per ottenere la quale si debbono mettere in azione strategie particolari che dipendono dall'analisi dell'ambiente e sono tradotte in codice operativo. Il programma realizzato può essere aggiustato in tempo reale durante la competizione.

Abilità:

  • lavorare sotto stress;
  • implementare soluzioni complesse.

Robotizzazione di telecamere e luci

Le telecamere e le luci presenti sulla scena simulata possono essere facilmente spostate e ruotate. Perché non immaginarsi un sistema di controllo remoto di questi oggetti simile a quello utilizzato per i robot? Si tratterebbe di stimolare gli studenti a implementare una soluzione software completa per, ad esempio, gestire con il telecomando la telecamera principali e le luci, in maniera interattiva, oppure in maniera programmata (movimenti di macchina, effetti con le luci, ecc.).

Abilità:

  • predisporre un'interfaccia per la gestione di alcune risorse;
  • utilizzare in maniera adeguata la terminologia tecnica del mondo della cinema;
  • mettere a frutto la propria creatività.

Approfondimento su comunicazioni e interfacce

Il sistema presentato si basa su semplici POST di dati in formato JSON ad ogni aggiornamento. Un'implementazione diversa potrebbe essere basata sul Representational State Transfer [Fielding 2000], con la definizione di risorse presenti nel robot e con un'interfaccia uniforme per l'accesso alle stesse, mediante l'uso dei metodi HTTP GET, POST, PUT, DELETE e PATCH appropriati. Inoltre, potrebbe essere interessante integrare il sistema di controllo remoto dei robot con l'uso di API avanzate per lavorare con l'orientamento dei dispositivi mobili o sperimentare, per la comunicazione tra simulatore e robot, o tra robot, l'uso degli standard WebRTC (Web-based Real-Time Communication) o un sistema di messaggistica basato sull'AMQP (Advanced Message Queuing Protocol).

Abilità:

  • definire e implementare servizi RESTful;
  • sviluppare applicazioni per dispositivi mobili che sfruttano i sensori degli stessi;
  • far interagire le applicazioni utilizzando tecnologie avanzate.

Approfondimento sulla grafica 3D e Three.js

Il mondo presentato nella simulazione è abbastanza semplice, e non permette di apprezzare la ricchezza delle possibilità offerte da Three.js per ottenere effetti visuali di grande valore nella finestra del browser. Gli studenti potrebbero essere invitati ad arricchire la scena con altri oggetti, basandosi sui molti esempi reperibili in rete (a partire dall'ottima raccolta curata da Lee Stemkoski). Inoltre, potrebbe essere interessante realizzare un videogioco basato sulle attività robotiche, oppure esplorare altri motori di simulazione fisica (ad esempio Cannon.js), implementarne parzialmente uno proprio, o simulare un mondo statico (a parte il movimento dei robot sulla scena).

Ulteriori possibilità sono date dalla costruzione visuale di oggetti da porre sulla scena (o del robot stesso, con la definizione dei suoi componenti costitutivi), partendo dall'editor visuale di Three.js oppure utilizzando una metodologia basata su blocchi sovrapponibili ed incastrabili, come nell'esempio di Whiteneck.

Abilità:

  • padroneggiare i diversi oggetti e metodi messi a disposizione da Three.js;
  • gestire aspetti quali l'importazione di dati da file prodotti in software di modellazione 3D, funzioni di post-processing, ecc.;
  • modificare il codice per adattarlo all'uso di librerie diverse.

Gestione della telecamera virtuale

Le immagini catturate dalla telecamera virtuale del robot simulato possono essere utilizzate per ottenere informazioni sull'ambiente in cui esso si muove. Three.js consente di utilizzare l'immagine del renderer, a tutti gli effetti un elemento appartenente al DOM del browser, per successive elaborazioni. Essa quindi potrebbe essere inviata al server web per successive elaborazioni e/o analisi.

Abilità:

  • gestire l'esportazione dei dati dell'immagine e la trasmissione degli stessi al server web del gestore di robot;
  • gestire una sequenza di fotogrammi in ingresso;
  • elaborare le immagini in ingresso per dedurne informazioni sull'ambiente, da integrare con quelle provenienti da altri sensori.

Altri microcontrollori

Potrebbe essere interessante valutare la differenza nelle modalità di programmazione di robot basati su altri tipi di microcontrollori molto usati per attività didattiche, come ad esempio Arduino [Warren et al. 2011, Bayle 2013]. La parte di rappresentazione e di simulazione potrebbero rimanere sostanzialmente inalterate, mentre lato server dovrebbe essere implementata la possibilità di simulare il comportamento del microcontrollore e di integrarvi un server web per permetterne la comunicazione con il server web.

Abilità:

  • programmare in C e/o C++ e predisporre gli sketch per Arduino;
  • predisporre un ambiente emulato che consenta di eseguire gli sketch su un calcolatore normale;
  • integrare un server web in un'applicazione C++.
Comments