Zero Robotics

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Zero Robotics è una competizione internazionale di programmazione di robotica aerospaziale, che si basa sulla programmazione di speciali robot denominati SPHERES, ovvero satelliti artificiali simil-sferici (in realtà a 18 facce), realizzati dal MIT, situati all'interno della Stazione Spaziale Internazionale.[1]

La competizione inizia online, sul sito web zerorobotics.org, dove le persone si possono registrare per far poi parte di una squadra (Team), capitanata da Capi Squadra (Mentors). Le squadre che si vengono a formare possono così partecipare ad una gara che si ripete annualmente.[1]

I partecipanti alla gara possono creare, modificare, condividere, simulare, e presentare il proprio codice, attraverso il proprio browser web. Dopo varie fasi di svariate competizioni virtuali secondarie, si selezionano i finalisti per competere dal vivo in un campionato a bordo della ISS. Un astronauta condurrà la competizione finale in una situazione di microgravità attraverso un canale di comunicazione in diretta.

Tornei

La competizione Zero Robotics si divide in tre tipi di torneo.

  • "High School Tournament". Gareggiata fra studenti di età compresa fra i 14 e i 18 anni. Il torneo prende posto ogni autunno fra Settembre e Dicembre. Questo è un evento a livello nazionale aperto a tutte le squadre provenienti dagli Stati Uniti e dall'Europa.
  • "Middle School Summer Program". È dedicato agli studenti più giovani. È un programma di cinque settimane in cui gli studenti imparano a programmare attraverso una interfaccia grafica semplificata rispetto al normale ambiente di programmazione testuale. Il programma si svolgerà in luoghi "da definire" in base a dove vi è la più forte presenza geografica dei componenti della squadra.
  • "Open Challenges". Sono aperti a tutti, da tutto il mondo, tra cui professionisti, educatori, studenti universitari, e molti altri. Si può partecipare singolarmente, o facendo parte di una squadra. Queste competizioni di solito comportano un'intensa produzione di codice e di algoritmi complessi, che aiuteranno le future missioni di volo spaziale.

Obbiettivi dei tornei

I partecipanti competono tutti insieme per vincere un gioco tecnicamente impegnativo, motivato da un problema di attuale interesse per il DARPA, la NASA e per il MIT. A seconda della sfida da affrontare, gli studenti devono programmare i loro satelliti per completare alcuni obbiettivi (evitare ostacoli, raccogliere oggetti virtuali, distruggere obbiettivi, etc.) preservando le risorse primarie (carburante, cariche di energia, etc.) e completare la sfida all'interno di determinati limiti di tempo e di spazio per la scrittura del codice. Il software degli studenti deve poter controllare fattori quali la velocità del satellite, la rotazione, la direzione di marcia, e molti altri, per poter trovare l'algoritmo perfetto per raggiungere lo scopo e vincere le sfide nel minor tempo possibile rispetto agli avversari.

La difficoltà sta anche nel fatto che i programmi sono "autonomi", nel senso che nel momento in cui vengono eseguiti essi durano per l'intera durata della sfida e non è possibile controllarne o modificarne l'esecuzione. È da notare in aggiunta che la memoria programmabile dello SPHERE ha un limite, il che porta a forzare all'uso di uno stile di programmazione pulito e senza sprechi di risorse.

Fisica

I partecipanti a Zero Robotics sono spinti a imparare e/o migliorare le proprie conoscenze inerenti alla fisica di base, in quanto la situazione ideale della gara consiste nel trovare l'ottimale algoritmo di spostamento in assenza di gravità, imponendo forze, e/o velocità al satellite. È comunque possibile ottenere discreti risultati lavorando esclusivamente tramite imposizione di coordinate al satellite.

Programmazione

I partecipanti alla sfida Zero Robotics imparano a programmare in un linguaggio simil-C/C++, in cui si possono usare diverse APIs per imporre i parametri principali dei movimenti del satellite. L'ambiente di sviluppo per scrivere il codice si trova online sul sito ufficiale della competizione, ed è chiamato IDE.

Metodi init / loop

La programmazione del satellite è solitamente familiare a coloro che hanno avuto esperienze con Arduino. Per comandare il satellite vi sono infatti due metodi che saranno sempre presenti nel codice: Si tratta di init e loop.

  • init è necessario per istanziare le variabili all'inizio dell'esecuzione. Questo perché init viene eseguito una sola volta all'avvio del satellite. In aggiunta bisogna notare che le variabili non possono essere istanziate e pre-assegnate fuori da questo metodo: Possono essere istanziate in maniera globale all'esterno di init, ma non possono essere pre-assegnate se non al suo interno.
  • loop è il metodo di esecuzione. Dopo che init termina l'esecuzione, il satellite inizierà ad eseguire tutto ciò che si trova all'interno nel metodo loop, e lo farà all'infinito (o comunque fino a che non scadrà il tempo massimo di esecuzione che varia di gara in gara).

È importante rimarcare che loop viene ripetuto all'infinito. Prendere atto di ciò è alla base della programmazione dello SPHERE.

APIs

Per spostare il satellite è necessario utilizzare alcuni metodi presenti nell'ambiente, appartenenti alla classe informatica api. Ecco le funzioni più importanti appartenenti a questa classe:

  • api.getMyZRState( ZRState myState )
ZRState è una definizione che corrisponde ad un vettore di 12 elementi a virgola mobile (float). api.getMyZRState( ZRState myState ) popola una variabile di tipo ZRState con informazioni necessarie per capire dove si è nel piano, con che velocità ci si sta spostando, e altre. Precisamente le informazioni sono indicizzate con quest'ordine:
    • myState[0] (oppure myState[POS_X]): Posizione sul piano rispetto all'asse X.
    • myState[1] (oppure myState[POS_Y]): Posizione sul piano rispetto all'asse Y.
    • myState[2] (oppure myState[POS_Z]): Posizione sul piano rispetto all'asse Z.
    • myState[3] (oppure myState[VEL_X]): Velocità di spostamento sull'asse X.
    • myState[4] (oppure myState[VEL_Y]): Velocità di spostamento sull'asse Y.
    • myState[5] (oppure myState[VEL_Z]): Velocità di spostamento sull'asse Z.
    • myState[6]: X del vettore di puntamento.
    • myState[7]: Y del vettore di puntamento.
    • myState[8]: Z del vettore di puntamento.
    • myState[9]: Rotazione sull'asse X.
    • myState[10]: Rotazione sull'asse Y.
    • myState[11]: Rotazione sull'asse Z.

Esempi di utilizzo:

/**
 * Il codice utilizza l'API: api.getMyZRState( ZRState myState );
 * Il codice utilizza il metodo DEBUG(()) per mostrare a video quale sia la posizione del satellite.
 */
void init() {

}
void loop() {
 ZRState myState;
 api.getMyZRState( myState ); // Ora myState è popolato
 DEBUG(("Il satellite si trova in X: %f Y: %f Z: %f \n", myState[ 0 ], myState[ 1 ], myState[2] ));
}

All'infinito verrà istanziata una variabile di nome myState e di tipo ZRState, e verrà popolata tramite api.getMyZRState( myState ). Il risultato sarà che verrà continuamente mostrata a video la posizione del satellite (in X, Y, Z, rispettivamente indicizzati in 0, 1 e 2 nel vettore myState, seguendo l'elenco riportato in alto).

Nel codice è utilizzato un metodo speciale: DEBUG(()). Esso va utilizzato con le doppie parentesi tonde, come riportato dalla documentazione ufficiale. DEBUG si comporta in modo analogo a printf.

  • api.setPositionTarget( float[3] positionTarget )
Questo metodo lavora con una logica a obbiettivo (target). Dandogli in input le coordinate di un obbiettivo, lo SPHERE tenterà di raggiungerlo, ad ogni esecuzione del comando. Non lo raggiungerà immediatamente, ma lo raggiungerà automaticamente. Starà poi al programmatore fare determinati controlli (utilizzando il metodo api.getMyZRState( ZRState myState )) per capire se si è effettivamente giunti sull'obbiettivo.
  • api.setVelocityTarget( float[3] velocityTarget )
Questo metodo lavora con una logica ad obbiettivo (target). Dandogli in input un vettore di velocità, lo SPHERE tenterà di raggiungerla, ad ogni esecuzione del comando. Non raggiungerà quelle velocità immediatamente, ma le raggiungerà automaticamente.
  • api.setAttitudeTarget( float[3] attitudeTarget )
Questo metodo lavora con una logica ad obbiettivo (target). Dandogli in input le coordinate di un obbiettivo, lo SPHERE effettuerà una rotazione globale per muovere la faccia del satellite caratterizzata dal velcro (posizionato sull'asse -X) e puntarla verso quell'obbiettivo. Non punterà immediatamente verso quell'obbiettivo, ma lo farà automaticamente.
  • api.setForces( float[3] forces )
Questo è un comando di imposizione. Si definisce una forza da fargli applicare su ogni asse, che verrà applicata ad ogni esecuzione del comando. Tuttavia lo SPHERE ha un'accelerazione massima ben definita, per cui si può applicare un limitato intervallo di forze.
  • api.setTorques( float[3] torques )
Questo è un comando di imposizione. Si definisce una rotazione da fargli applicare per ogni asse, che verrà applicata ad ogni esecuzione del comando. Tuttavia lo SPHERE ha un'accelerazione di rotazione massima ben definita, per cui si può applicare un limitato intervallo di velocità di rotazione.

Esempi di codice

Il codice sorgente di un programma tipico dell'ambiente IDE di Zero Robotics può essere il seguente.

/**
 * Il codice fa spostare il satellite alle coordinate X Y Z {0.5, 0.3, -0.4}
 * Il codice per spostarsi usa l'API: setPositionTarget( [3] );
 * Il codice utilizza DEBUG(()) per stampare il tempo di esecuzione
 * Il tempo di esecuzione è salvato in una variabile globale 'time'.
 */
int time;

void init() {
 time = 0;
}

void loop() {
 float obbiettivo[3] = {0.5, 0.3, -0.4};
 api.setPositionTarget( obbiettivo );
 DEBUG(("Tempo di esecuzione: %d \n", time));
 time++;
}

Dal codice si denota come il satellite, all'infinito, tenterà di andare alle coordinate X Y Z = {0.5, 0.3, -0.4}.

Albo d'oro High School Tournament (EU)[2]

Anno Alleanza Vincitrice Altra Finalista
2011 CyberAvo:

I.T.I.S. Amedeo Avogrado, Torino.     

Kaethe Kollwitz Oberschule, Berlino    

Heinrich Hertz Gymnasium, Berlino    

L.S.S. Enrico Fermi, Padova

Berufskollegs für Wirtschaft und Verwaltung, Aquisgrana
I.I.S. C. Olivetti,  Torino

2012 Team "B.E.E.R."

Kaethe Kollwitz Oberschule, Berlino         

L.S.S Enrico Fermi, Padova               

Herder-Gymnasium, Berlino  

Liceo Democrito, Roma

Heinrich-Hertz-Gymnasium, Berlino
I.T.I.S. Pininfarina, Moncalieri

2013 Team "C.O.F.F.E.E."

L.S.S. Enrico Fermi Padova                     

Colegio Retamar, Pozuelo de Alarcón               

American School Of Paris, Parigi          

I.T.I.S. G. Ferraris, Napoli

N.C.C.S. Tudor Vianu, Bucarest

I.T.I Renato Elia, Castellamare di Stabia

Curiosità

La sfida è resa interessante anche per la logica hacker con cui è possibile superare gli avversari, sfruttando a proprio favore eventuali bug se scoperti prima che vengano risolti o proibiti. In numerose occasioni sono stati scoperti bug all'interno dell'ambiente di simulazione delle sfide dei satelliti: Un esempio è il baco del "brute-force di scioglimento del ghiaccio", scoperto da un ragazzo del team CyberAvo di Torino nel 2011, che permetteva al loro satellite di distruggere un obbiettivo previsto nella sfida in tempi nettamente minori del previsto (semplicemente ripetendo un gran numero di volte un metodo per lo scioglimento del ghiaccio, cosa che secondo il manuale ufficiale del tempo era impossibile). Un altro esempio è il bug di "unlimited ghost-code through DEBUG(())", così catalogato dal team AvoTeam nel 2012, e che permetteva di far eseguire del codice nello SPHERE tramite il metodo di DEBUG(()) in modo che non venisse effettivamente "contato" nel calcolo totale della memoria occupata dall'intero programma (questo perché è risultato che il metodo di DEBUG(()) appunto era l'unico che non veniva effettivamente contato nella somma totale di risorse consumate durante la programmazione del codice): Il tutto rendeva perciò effettivamente possibile eseguire del codice intrinsecamente più complesso degli avversari e utilizzare maggiori risorse di memoria programmabile di quelle concesse dalle regole.

Stato attuale dei bug noti

bug brute-force di scioglimento del ghiaccio
Risolto.
bug unlimited ghost-code through DEBUG(())
Tuttora non risolto. È stato soltanto proibito il suo utilizzo in modo ufficiale.

Note

  1. ^ a b (EN) About Zero Robotics, su zerorobotics.org. URL consultato il 10 aprile 2014.
  2. ^ (EN) Tournaments, su zerorobotics.org. URL consultato il 10 aprile 2014.

Collegamenti esterni

  Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica