# Iniziare ad usare Aseba

Queste pagine inesgnano come incominciare ad utilizzare Aseba anche se non si ha un robot fisico. Se avete Thymio II, si rimanda alla pagina specifica.

# Per iniziare, lanciare challenge

Aseba challenge (immagine a destra) è un modno simulato dove i robot controllati da Aseba competono per il cibo. Potete utilizzarlo come terreno di gioco per esplorare la scrittura di script Aseba o come un gioco educativo per imparare ed insegnare la programmazione.

Per iniziare dovete lanciare Aseba challenge. Se Aseba non è ancora installato, seguite le istruzioni di installazione. Una volta che challenge è partito, dovete fare click su "Aggiungi un nuovo robot", e scegliere un nome. Se siete un gruppo potete aggiungere un robot per ciascun giocatore. Potete rimuovere tutti i robot facendo click su "rimuovi tutti i robot". Potete nascondere i bottoni selezionando "Auto nascondi"': i bottoni verranno mostrati solo quando il puntatore del mouse sarà nelle vicinanze. Potete fare in modo che la telecamera si muova automaticamente selezionando "Auto camera". Se muovete la telecamera manualmente i controlli sono i seguenti:

- ctrl + pulsante di sinistra del mouse: ruota la vista
- ctrl + shift + pulsante di sinistra del mouse: sposta la vista sugli assi x/y
- ctrl + shift + pulsante di destra del mouse: sposta la vista sull'asse z

Challenge mostra il punteggio di ciascun robot su un tabellone traslucido appeso sull'arena. L'obiettivo è rimanere vivi raccogliendo energia. Per tanto che un robot è vivo, il suo punteggio aumenta; quando muore viene dimezzato. Quattro soregenti di colore blu forniscono energia ai robot che si avvicinano. quando la sorgente è esaurita, diventa rossa e non fornisce più energia. Ogni tanto la sorgente sparisce nel terreno e i robots non possono più utilizzarla fintanto che non riappaia.

Una volta che Aseba challenge è in esecuzione, dovete avviare Aseba studio per programmare i robot. Per ciascun robot dovete eseguire una istanza di studio, che può essere eseguita su qualsiasi computer. All'avvio studio propone di connettersi ad un target Aseba (Immagine a destra). Se avete lanciato challenge sul vostro computer e aggiunto un robot, se non diversamente specificato e quindi per difetto studio si collegherà a questo. Se challenge è in esecuzione su un altro computer o vi sono più robot nell'arena, specificare il computer in host e il robot in port. Uno schermo traslucido al di sopra dell'arena in challenge mostra le porte corrispondenti ai vari robot.

# Il vostro primo programma di controllo per robot

Una volta che studio sia in esecuzione (immagine a destra), potete modificare il programma del robot nell'area centrale di studio. In quest'area vi è un editor di programma che verifica e compila in tempo reale il codice, verificando se la sintassi del codice è corretta o no. Potete apprendere di più su studio selezionando la voce di menu `Help->Studio`. La voce di menu `Help->Language` fornisce una documentazione dettagliata del linguaggio di programmazione Aseba.

Per programmare un robot prima di tutto dovete comprendere come funziona. Un robot interagisce con il mondo eseguendo un loop: percepisce lo stato del mondo circostante attraverso i suoi sensori, prende delle decisioni per mezzo del computer che vi è a bordo ed esegue delle azioni attraverso gli attuatori; queste azioni modificano lo stato del mondo e il robot percepisce questo nuovo stato quando legge nuovamente i sensori.

In challenge, programmate un robot e-puck simulato. Questo robot ha 8 sensori di prossimità intorno al suo corpo e una semplice telecamera di 3 pixels puntata in avanti, con un angolo di apertura di 20° gradi per pixel. Potete leggere questi valori e anche sceglier la velocità delle ruote:

file svg originale, vista di e-puck

Ora scriviamo il vostro primo programma di controllo per robot. Nell'editor di testo al centro della finestra di studio scrivete le seguenti linee:

    wheel_left_speed = 5
    wheel_right_speed = -5

Fare click su "Load" e quindi su "Run". Dovreste vedere il vostro robot girare su se stesso. Questo codice fissa la velocità delle ruote in termini di cm/s quando parte e quindi non fa più nulla. Per avere un comportamento migliore, dobbiamo consentire al robot di percepire l'ambiente, per esempio gli ostacoli, e prendere delle decisioni, ad esempio evitare gli ostacoli.

Per interagire con il mondo circostante con continuità, il robot deve eseguire uno script periodicamente. Questo si ottiene con la direttiva `onevent timer`. Per esempio usando un sensore di prossimità frontale possiamo fissare la velocità delle ruote rispetto alla distanza dell'oggetto di fronte al robot:

    onevent timer
    wheel_left_speed = dist[0] - 6
    wheel_right_speed = dist[0] - 6

Fare click su "Load" e quindi su "Run". Poichè i sensori di prossimità misurano una distanza tra 0 e 12 cm (se l'oggetto è più distante restituiscono comunque 12), la velocità del robot sarà -6 cm/s quando il robot è vicino, 0 cm/s quando l'oggetto è lontano 6 cm e 6 cm/s quando l'oggetto è lontno 12 cm o più. Il robot tenderà quindi a rimanere a 6 cm di distanza dagli oggetti che ha di fronte.

# Un programma di controllo più elaborato

Mantenere una distanza di sicurezza da un oggetto che vi sta davanti è una buona norma, ma ora il robot non si muove più in nessun modo. Per far sì che il robot se ne vada a spasso nell'arena, dobbiamo comprendere come si muove.

Il robot e-puck simulato in challenge è un esempio di robot con ruote differenziali. Questo tipo di robot modifica la propria direzione variando in modo differente la velocità delle ruote destra e sinistra. Se ciascuna ruota ha la stessa velocità in avanti, il robot va dritto, altrimenti sterza dal lato della ruota che gira più adagio. Se le ruote girano in direzione opposta con la stessa velocità il robot gira su se stesso. I caterpillar industriali usano la stessa modalità di movimento, utlizzando dei cingoli.

Scriviamo ora un breve pezzo di codice che fa in modo che il robot eviti gli ostacoli e poi prosegua avanti:

    onevent timer
    wheel_left_speed = dist[1] - 6
    wheel_right_speed = dist[6] - 6

Questo codice verifica i sensori di prossimità anteriori di destra e di sinistra. Finchè non ci sono ostacoli sia `dist[1]` che `dist[6]` riportano 12 e quindi il robot va avanti dritto alla velocità di 6 cm/s. Quando c'è un ostacolo da un lato, il valore del corrispondente sensore diminuisce. Per esempio se vi è un ostacolo sulla sinistra, `dist[6]` (che corrisponde alla lettura del sensore di sinistra) può essere 10 mentre `dist[1]` (che corrisponde alla lettura del sensore di destra) rimane a 12; quindi `wheel_left_speed` rimarrà a 6 cm/s ma `wheel_right_speed` scenderà a 4, facendo in modo che il robot giri a destra quindi evitando l'ostacolo sulla sinistra.

# Prendere decisioni

I programmi di controllo che abbiamo visto finora collegano direttamente il valore del sensore alla velocità delle ruote attraverso espressioni matematiche, ma non fa delle scelte di tipo "if, then". CIò in certi casi è necessario; per esempio se vogliamo che il robot o vada dritto o giri sul posto, ma non faccia traiettorie curve, possiamo scrivere:

    onevent timer
    var dists = dist[6] + dist[7] + dist[0] + dist[1]
    if dists < 48 then
        wheel_left_speed = 5
        wheel_right_speed = -5
    else
        wheel_left_speed = 5
        wheel_right_speed = 5
    end

Questo programma somma le distanze dei 4 sensori di prossimità frontali e se questa somma è inferiore a 48 cm, che significa che almeno uno dei sensori è in vista di un ostacolo, il robot gira sul posto, altrimenti va avanti dritto.
Il linguaggio di programmazione fornisce altri interessanti costrutti, come il loop `while`, che esegue un blocco di codice ripetutamente per tutto il tempo che la condizione specificata è vera, o il loop `for`, che esegue un blocco di codice un certo numero di volte e modifica il valore di una variabile incrementandola ad ogni giro. Il menu `Help->Language` da accesso a una pagina che elenca tutti i costrutti disponibili insieme con esempi; può essere utile dargli un'occhiata.

# Tocca a Voi

Sperimentate per un po' con l'evitamento degli ostacoli per ottenere una buona comprensione dei sensori, attuatori e le dinamiche del robot. Sentitevi liberi di fare delle prove ed esplorare: il robot è simulato e non rischia di essere danneggiato.

Una volta che vi sentiate confidenti, cercate di fare in modo che il robot si diriga alle sorgenti di cipo quando sono blue (0,0, 100) (in R, G, B), ed evitarle quando sono rosse (100, 0, 0). Il colore dello sfondo è grigio (50, 50, 50). Provate a giocare con i vostri amici e creare il miglior programma ronotico di controllo. Potete cambiare il colore del vostro robot (modificando le variabili `color_red`, `color_green` e `color_blue`), e quindi cercare di spacciarsi per una sorgente di cibo. Se qualcuno cerca di ingannare in questo modo, verificare la variabile dell'energia; se non aumenta il valore mentre vede blu, sei stato ingannato.

L'obiettivo di challenge è imparare la robotica, la programmazione e Aseba, mentre ci si diverte.

# Cosa leggere ora?

Potreste essere interessati a leggere:

- Descrizione dei concetti di base usati in Aseba
- Documentazione sull'ambiente integrato di sviluppo Aseba Studio
- Descrizione del linguaggio Aseba
- Descrizione della libreria standard delle funzioni native