HomeCoding secondariaCome programmare un robot dotato di A.I.

Come programmare un robot dotato di A.I.

In questa seconda lezione dedicata alla creazione di un robot Do It Yourself (fai da te) dotato di intelligenza artificiale (A.I.) ne analizzeremo il codice.

Ricordiamo che il progetto cui facciamo riferimento è HBRT, un robot diy realizzato per un progetto europeo, che si ispira ad un animale domestico da addestrare.

Il robot è dotato di 3 comportamenti di base:

  1. Comportamento di caccia (hunter): il robot insegue la preda;

  2. Comportamento di fuga (prey): il robot fugge dallo stimolo rilevato ;

  3. Comportamento di disinteresse (spacelove): il robot si muove dove trova uno spazio aperto.

Il robot, avvisando con un suono, decide autonomamente di cambiare comportamento ogni 5 secondi. Il giocatore può dare un rinforzo al comportamento che gradisce, premendo il pulsante sul dorso. All’inizio, quando il robot viene acceso, la probabilità che si manifestino i tre comportamenti è la stessa, in base ad un meccanismo casuale; rinforzandone uno, con la ricompensa del pulsante premuto, il robot lo farà prevalere, grazie al meccanismo dell’apprendimento con rinforzo.

Abbiamo, inoltre, inserito un meccanismo di oblio: se non vogliamo più rinforzare un certo comportamento, possiamo rinforzare gli altri due comportamenti oppure possiamo ignorare il robot, attivando, così, il meccanismo di oblio con il quale a poco a poco la percentuale più alta (quella del comportamento precedentemente rinforzato) inizia a decadere.

 

Per approfondimenti sul progetto, rimandiamo al post precedente (Il robot apprende da solo: cenni di A.I.).

Siamo all’interno di Arduino IDE.

Per semplicità analizzeremo solo la parte di codice che riguarda il loop (quello che si ripete continuamente e che fa via via riferimento ad alcune funzioni create ad hoc).

 

Importazione librerie

La prima parte del codice contiene le istruzioni per l’importazione di librerie; nel nostro caso abbiamo la libreria per la gestione dei servomotori e quella per la gestione del sensore ad ultrasuoni.

Dichiarazione delle variabili

Poi troviamo la dichiarazione delle variabili:

  1. Variabili che riguardano i sensori;

  2. Variabili che riguardano i servomotori e il buzzer;

  3. Variabili che riguardano i comportamenti.

  4. In questo codice abbiamo usato molto le variabili di tipo byte (e non di tipo intero) per risparmiare memoria e perché ci serviva come tipo di dato (1 byte = 8 bit).

    Il byte è utile per esprimere numeri da 0 a 127, permette di fare operazioni con la numerazione binaria e consente di passare informazioni a livello di bit (ad esempio esprimere in che stato sono i vari bit da destra a sinistra).

     

    Setup

    Entrando nel setup, vediamo che c’è l’apertura della porta seriale usata in fase di programmazione per inviare alcuni messaggi utili per il debug sulla porta seriale stessa e l’attach dei servomotori.

    Interessante è la funzione motor-control: è una funzione creata da noi, ci sono dei parametri (1 1 0), serve per far partire il robot con i motori in stop (lo stato di stop è solo formale perché quando accendiamo il robot entra subito in funzione un comportamento, se esso per esempio è quello di spacelover, il robot si muove).

    Osservando la funzione dall’interno, notiamo che i parametri significano:

    • direzione del motore sinistra temporanea (1);

    • direzione del motore destra temporanea (1);

    • on/off (0), quindi vale l’off e i motori non partono.

    • Vediamo come funzionano i servomotori a 360°. La funzione per far muovere i motori è myservoL.write e myservoR.write, nelle parentesi inseriamo l’angolo (start_position, che è una variabile e ha il valore di 89). I servomotori stanno fermi quando la posizione è 90°, via via che ci si distanzia da 90°, girano con maggiore velocità in un senso o nell’altro (fino ad un limite strutturale del robot). Abbiamo scritto 89°, anziché 90°, per una compensazione software, perché i motori durante il montaggio possono perdere un po’ di calibrazione (regolabile anche manualmente).

       

      Loop

      Entriamo nel loop. Esso inizia con tre funzioni, viene preso il valore proveniente dai tre sensori e si lavora sul filtraggio dei dati in ingresso. Il filtraggio avviene con il ciclo generale di filtraggio a 4 giri: prendiamo 4 campioni, se tutti e 4 i campionamenti sono coerenti, allora prendiamo quel dato come buono (ad esempio: se il rilevamento dell’ostacolo avviene per 4 cicli del programma, allora effettivamente c’è un ostacolo e il robot reagirà in base al comportamento che si manifesta in quel momento).

    Abbiamo poi un clock che misura il tempo in assoluto e fa emettere un click con un cicalino ogni 1000 ms (=1 sec) e ogni 5000 ms(=5 sec) fa un click di durata maggiore.

     

    C’è poi il condizionale if, che serve nel caso in cui si prema il pulsante (il buttonState varia tra 0 e 1). C’è anche il renforcement learning: se si preme il pulsante, c’è una melodia di conferma e c’è il codice che fa aumentare la probabilità di comportamento a quello appena manifestato (a seconda che sia spacelover, prey e hunter). Inoltre ci sono le probabilità dell’oblio.

    C’è poi il codice riferito all’antirimbalzo per il pulsante, per evitare il click ripetuto (oldButtonState=ButtonState).

    Meccanismo di oblio: quando il clock supera i 5 secondi il programma verifica se la soglia di attivazione dell’oblio (in questo caso=2) è stata superata (cioè se un comportamento che era stato rinforzato precedentemente, non lo è più più per due volte) e, in caso positivo, attiva una riduzione della probabilità del comportamento prima rinforzato.

C’è la parte in cui viene “tirato il dado” (dice) per la scelta dei tre comportamenti.

Ci sono poi istruzioni relative alla chiamata in causa di pezzi di codice contenuti nelle funzioni.

Il loop finisce, una volta scelto il comportamento, memorizzati i nuovi valori delle variabili (cioè la probabilità che esca fuori un comportamento, la probabilità dell’oblio, ecc…), con il movimento (funzione motorCTRL).

Con questa funzione viene letta la variabile motorState a livello di bit (1 0 2).

Alla fine di tutto c’è il Delay (si trova nella libreria Arduino) e serve per la stabilità e per evitare di catturare segnali di disturbo.

Per approfondire questo argomento, guarda la video lezione

Il robot apprende sa solo: cenni di A.I. (Corso Robotica per la scuola secondaria).

 

Vuoi certificare la tua formazione? Visita il nostro shop!

Share:

You May Also Like

Lezione 1/4 del modulo didattico “Coding per creare videogiochi con Scratch” incluso in alcuni dei nostri corsi… 👇 https://www.paleos.it/product-page/certificazione-coding-primaria https://www.paleos.it/product-page/certificazione-coding-secondaria...
Con la crescente distribuzione della tecnologia e dell’informatica in tutti i suoi aspetti, anche in Italia si è iniziato a...
In un’epoca in cui il mondo del digitale sta diventando preponderante, la scuola e i programmi didattici si stanno aggiornando...
Domande? Chiedici
0