# Zero Robotics

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.
La competizione inizia online, sul sito web della competizione, 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.
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 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

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 SPHERES 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.

## Strategia

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

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 SPHERES.

### API

Per spostare il satellite è necessario utilizzare alcuni metodi presenti nell'ambiente, appartenenti alla classe informatica api. Ecco le alcune funzioni 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:
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 SPHERES. 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 SPHERES 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 SPHERES 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 SPHERES 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 SPHERES 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.
Dal codice si denota come il satellite, all'infinito, tenterà di andare alle coordinate X Y Z = {0.5, 0.3, -0.4}.

## Vincitori High school tournament

Le squadre che hanno vinto l'High school tournament sono le seguenti:
| Anno | Alleanza Vincitrice | 2º posto | 3º posto | 4º posto |
| 2011 - Campionato Europeo Sperimentale | CyberAvo: I.T.I.S. Amedeo Avogadro, 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 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) | 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) | 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 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) | 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) |
| 2018 - Campionato Mondiale | Team Naughty Dark Spaghetti: The Dark Team of LSA (IIS Avogadro - Liceo Scientifico, Vercelli) Stuy-Naught (United States) Spaghetti Code (United States) | TeamHit or Miss: Proof Robotics (United States) Crab Nebula (Liceo Cecioni, Livorno) Rock Rovers (United States) | Tutte le altre squadre sono ex aequo "partecipanti" NON sono state definite graduatorie oltre il 2º posto. | Tutte le altre squadre sono ex aequo "partecipanti" NON sono state definite graduatorie oltre il 2º posto. |
| 2019 - Campionato Italiano | LSA Spoleto A. Volta (Liceo scientifico A. Volta, Spoleto) | Spaghetti Programmers (Lss Galileo Ferraris, Torino) | Made in Heaven Technologies (IIS Giulio Natta, Rivoli (TO) + Liceo Juvarra, Venaria Reale (TO)) | Fermi4Tech (Liceo S.S. “E.Fermi”, Padova) |