Zero Robotics

Da Wikipedia, l'enciclopedia libera.
Jump to navigation Jump to search

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 http://zerorobotics.mit.edu/, 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[modifica | modifica wikitesto]

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 20 anni. Il torneo si svolge ogni autunno fra settembre e dicembre. Questo è un evento a livello internazionale aperto a tutte le squadre provenienti da tutto il mondo anche se, ad oggi, la maggior parte delle squadre provengono dagli Stati Uniti e dall'Europa.
Campionato Italiano
Gareggiata fra studenti di età compresa fra i 14 e i 20 anni. Il torneo si svolge ogni autunno fra ottobre e febbraio. Questo è un evento a livello nazionale aperto a tutte le squadre provenienti esclusivamente dall'Italia. Si noti che l'Italia è l'unica nazione al mondo che ha un suo campionato nazionale, grazie all'elevato numero di squadre che ogni anno si iscrivono.
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.

Obiettivi dei tornei[modifica | modifica wikitesto]

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[2][modifica | modifica wikitesto]

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[3][modifica | modifica wikitesto]

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.

Strategia[modifica | modifica wikitesto]

Elemento molto importante, talvolta il principale, sono le scelte strategiche che una squadra deve effettuare per ottenere il meglio dal proprio codice e vincere in modo efficace la sfida contro l'avversario. Le scelte strategiche, talvolta controintuitive, derivano da attente analisi matematiche, fisiche, operative, che stimolano l'utilizzo approfondito delle conoscenze apprese in varie materie.

Metodi init / loop[modifica | modifica wikitesto]

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 inizializzare 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 pre-assegnate fuori da questo metodo: devono 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à automaticamente, ogni secondo, 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 degli SPHERE.

APIs[3][4][modifica | modifica wikitesto]

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] ));
}

Verrà istanziata una variabile di nome myState e di tipo ZRState, e verrà scritta tramite api.getMyZRState( myState ) che restituisce le coordinate e le velocita' dello SPHERE. Il risultato sarà che verrà continuamente mostrata a video (tramite DEBUG()) 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[modifica | modifica wikitesto]

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)[5][6][modifica | modifica wikitesto]

Anno Alleanza Vincitrice 2º posto 3º posto 4º posto
2011 - Campionato Europeo Sperimentale 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 - Campionato Europeo 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

Liceo Scientifico F. Cecioni (Livorno)

Ramiro de Maeztu (Madrid, ES)

Escuela de Pensamiento Matematico Miguel de Guzman (Torrelodones, Madrid, ES)

IIS Vallauri (Fossano, CN) Berufskolleg fuer Wirtschaft und Verwaltung Aachen (Aachen, DE) IIS Giulio Natta (Rivoli, TO)
2013 - Campionato Europeo 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

2013 - Campionato Italiano
2014- Campionato Mondiale Team LakeElevenVADARS:
  • Team Lake (United States)
  • Corà's Eleven (Liceo Scientifico G.B.Brocchi, Bassano del Grappa, Italy)
  • VADARS (United States)
Team BACON Zanneio BRRobotics:
  • BACON (United States)
  • Zanneio Stardust (Greece)
  • Big Red Robotics (United States)
Team CrabTachyonsMontaVista:
  • Crab Nebula (Liceo Scientifico F. Cecioni, Livorno, Italy)
  • Tachyons (United States)
  • MV Zero (United States)
Team NullPointerO.L.E.Ohms:
  • NullPointerException (United States)
  • O.L.E (Spain)
  • The Ohms (United States)
2014- Campionato Italiano LSA Robotics Team #2 (Liceo Scientifico Avogadro, Vercelli) The Fermi Floating Team (Liceo Scientifico "E.Fermi", Padova) Dominoes (Liceo Scientifico F. Vercelli, Asti) Zero Satellite (Liceo Scientifico F. Vercelli, Asti)
2015- Campionato Mondiale EX-AEQUO
  • Team CrabNebulaMVZeroVADARS:
    • Crab Nebula (Liceo Cecioni, Livorno)
    • MV Zero (United States)
    • VADARS (United States)
  • Team TheFermiFloatingTeamTachyonsJuggler:
    • TheFermiFloatingTeam (Liceo E.Fermi, Padova)
    • Tachyons (United States)
    • Juggler (I.I.S.S. G. B. Vaccarini, Catania)
EX-AEQUO
  • Team Winning Alliance of Totally Esoteric Routines:
    • Zero Work Ethic (United States)
    • Sunday Programmers (Liceo E.Fermi, Padova)
    • SetFermiForce (Liceo E.Fermi, Padova)
  • Team Echelon:
    • ZRighi (I.T.I. Augusto Righi, Napoli)
    • Robodogs (United States)
    • MSJ AP Coffee (United States)
2015- Campionato Italiano TeamOre (Istituto Tecnico F. Marchi, Pescia) ArtoBotics (ITIS A. Artom, Asti) Schrödinger's Dead Cat (Liceo Leonardo da Vinci, Firenze) Kalypso (IIS Europa Unita, Chivasso (TO))
2016- Campionato Mondiale Team SpaceLinguine:
  • ZRighi (Istituto Tecnico Industriale "A. Righi", Napoli, Italy)
  • OverExtendedProgramming(OEP) (United States)
  • LSA Robotics Team (Liceo Scientifico "A. Avogadro", Vercelli, Italy)
Team FlyingFalconsTheQuarkCharmCode::Space:
  • Flying Falcons (Australia)
  • The Quark Charm (United States)
  • Code::Space (Romania)
EX-AEQUO
  • P.R.O.:
    • Proxima Centauri (Liceo Statale "F. Cecioni", Livorno, Italy)
    • Rock Rovers (United States)
    • @Override (France)
  • CosmicSparTech:
    • Cosmic Vikings (United States)
    • Spartar (Australia)
    • DevilTech (United States)
2016- Campionato Italiano Millennium Falcon (Liceo Scientifico Cecioni, Livorno) ZeRo LSA Robotics Team (IIS Avogadro - Liceo Scientifico, Vercelli) Pablitis (I.T.I "R. Elia" , Castellammare di Stabia) JvNeumann_POLLENZA (I.I.S.S. "J von Neumann", Roma)
2017- Campionato Mondiale EX-AEQUO
  • Team BeachPin1701:
    • Beachbotics (United States)
    • ZeroZeroPinin (ITIS G.B. Pininfarina, Moncalieri (TO))
    • ENTERPRISE (ITIS "G. Galilei", Livorno)
  • Team Naughty Prions and Lions:
    • Space Lions (L.S.S Leonardo Da Vinci, Treviso)
    • Stuy-Naught (United States)
    • PR1SM5 (United States)
EX-AEQUO
  • COLA (Catchers Of Life Alliance):
    • SetFermiForce (Liceo Scientifico Statale "E.Fermi", Padova, Italy)
    • Westlake ZRHS (United States)
    • Major-Antlia (IISS Ettore Majorana, Seriate (BG), Italy)
  • ZanneioTeamRocketint(roverts):
    • Zanneio Stardust (Greece)
    • Team Rocket (United States)
    • int(roverts) (Australia)
2017- Campionato Italiano Puma-Zero (ITI L. Da Vinci, Trapani) Pinguini Tattici Nucleari (IIS "Avogadro" - Liceo Scientifico, Vercelli) GRAVITA' ZERO (I.T.I "R. Elia", Castellammare di Stabia ) EX-AEQUO
  • Drilly (IIS "Avogadro" - Liceo Scientifico, Vercelli)
  • LSA Spoleto A. Volta (Liceo scientifico A. Volta, Spoleto (TR))

Curiosità[modifica | modifica wikitesto]

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.

Note[modifica | modifica wikitesto]

  1. ^ a b (EN) About Zero Robotics, su zerorobotics.mit.edu. URL consultato il 10 aprile 2014.
  2. ^ European Space Agency, ESA, Zero Robotics Lezione 1: Ottimizzazione delle traiettorie nello spazio, 5 novembre 2012. URL consultato il 30 gennaio 2017.
  3. ^ a b Tutorials, su zerorobotics.mit.edu. URL consultato il 30 gennaio 2017.
  4. ^ http://static.zerorobotics.mit.edu/docs/tutorials/ZR_user_API.pdf
  5. ^ (EN) Tournaments, su zerorobotics.org. URL consultato il 10 aprile 2014.
  6. ^ Zero Robotics, su zerorobotics.mit.edu. URL consultato il 30 gennaio 2017.

Collegamenti esterni[modifica | modifica wikitesto]

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