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.
Possibili attività didattiche basate su RoboThreeL'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 baseIl 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à:
Attivazione di sensori di movimentoSul 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à:
Cambiamento del comportamentoPartendo 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à:
Modifica di componentiLe 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à:
Aggiunta di componentiIspirandosi 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à:
API alternativeNel 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à:
Programmazione di alto livelloRendere 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.
Sfide di programmazione in tempo realeSi 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à:
Robotizzazione di telecamere e luciLe 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à:
Approfondimento su comunicazioni e interfacceIl 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à:
Approfondimento sulla grafica 3D e Three.jsIl 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à:
Gestione della telecamera virtualeLe 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à:
Altri microcontrolloriPotrebbe 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à:
|
Programmazione >