SlideShare a Scribd company logo
1 of 57
Download to read offline
1
Università degli Studi di Trieste
Corso di Laurea in “Ingegneria elettronica ed
informatica”
Tesi di laurea
REALIZAZZIONE DI UN CONTROLLORE
PER PIATTAFORMA ROBOTICA BASATO
SU RETE NEURALE
Laureando Relatore
Anwar Nazig prof. Eric Medvet
Anno accademico 2019/2020
2
A P.Isabella
3
Indice
Introduzione
1 Studio hardware e software della piattaforma robotica
Thymio 2.
1.1 Hardware
1.2 Software
1.3 Linguaggio
2 Tecniche di implementazione del controllore.
2.1 Approccio centralizzato
2.2 Approccio distribuito
2.3 Approccio diretto
3 Progettazione
4 Realizzazione strato software del sistema di controllo
5 Analisi e collaudo del controllore
Conclusioni
4
Introduzione
L’obiettivo della tesi è quello di realizzare uno strato software che esegua un controllore
basato su rete neurale per una piattaforma robotica.
L’architettura della rete neurale viene precedentemente fissata in funzione del numero di
sensori e dunque di ingressi del robot Thymio e dei due attuatori da pilotare per muovere il
robot mobile. Lo strato software andrà quindi a ricevere i valori di ingresso dai sensori e dai
pesi della rete neurale già precedentemente allenata in un ambiente simulato, a questo punto
la rete neurale calcola i valori di uscita opportunamente processati in modo tale che sia
possibile controllare i due motori a nostra disposizione.
La richiesta definisce che nella prima fase, i dati dei pesi vengano forniti manualmente
dall’utente all’interno del codice, ossia che sia necessario inserire una matrice dei pesi
relativi alla forza della connessione tra i neuroni nel codice.
In una seconda fase invece, attraverso una connessione wireless, bisogna inviare queste
informazioni dalla workstation al robot, dunque è richiesto lo sviluppo di un sottosistema
per la comunicazione wireless ed elaborazione dei dati, sia sul robot che sulla workstation.
Il software sviluppato verrà utilizzato dal laboratorio ERALLAB del Dipartimento di
Ingegneria e Architettura dell’Università degli studi di Trieste durante la fase di studio sul
divario tra il comportamento nella realtà simulata dei nostri agenti e in quella fisica.
5
Quadro generale
Il controllore verrà realizzato per i robot Thymio 2 nel contesto di seguito illustrato.
Abbiamo a disposizione un’arena dove i nostri robot interagiscono con l’ambiente
circostante e tra di essi tramite i sensori e gli attuatori. Il laboratorio dispone di una
videocamera posta in posizione tale da osservare il progresso dell’esperimento e da tracciare
il comportamento dei singoli agenti, attraverso un marcatore posto su ognuno dei nostri
robot.
La videocamera invia i dati alla workstation che si occupa di memorizzare i dati
dell’esperimento e comunicare con i robot via wireless. L’esigenza è dunque quella di poter
eseguire un esperimento dall’inizio alla fine senza che sia necessario l’intervento
dell’operatore umano, in quanto la sperimentazione può richiedere lunghi tempi senza
interruzioni.
Il tirocinio si è concentrato in una prima fase sullo studio del robot Thymio e del suo
funzionamento, ossia l’analisi dei suoi componenti hardware e software al fine di
individuare le modalità possibili per lo sviluppo del controllore, tenendo conto delle
richieste sopra elencate. In una seconda fase è stato portato avanti concentrandosi sulla
ricerca delle metodologie per la progettazione del controllore. La terza fase si è invece
focalizzata sull’andare a realizzare un sistema di controllo software sul robot Thymio che,
dati i pesi delle connessioni della nostra rete neurale e i valori di ingresso dei sensori, generi
in uscita valori in grado di controllare gli attuatori del robot Thymio 2.
6
PRIMO CAPITOLO
Studio hardware e software della piattaforma robotica
Thymio
1.1 Hardware
La piattaforma robotica utilizzata è Thymio 2, un piccolo robot open source programmato
utilizzando il linguaggio di programmazione C, progettato per l’uso didattico e dotato di
una moltitudine di sensori e attuatori. Il dispositivo non offre la possibilità di definire i suoi
comportamenti direttamente con linguaggi di programmazione ad alto livello, come ad
esempio Java, Python o C.
Il sistema robotico si può modellare in 4 sottosistemi: il sistema meccanico, di attuazione,
di misura e di controllo. La prima parte del tirocinio, come spiegato in precedenza, si è
focalizzata nell’individuare le caratteristiche dei sensori a disposizione, degli attuatori e
soprattutto nel capire come controllare tali sistemi. Dunque ci si è concentrati
prevalentemente sul quarto sistema.
7
Sistema di attuatori
sistema di attuatori
Gli attuatori del Thymio sono molteplici e sono controllabili tramite semplici istruzioni
descritte in un linguaggio di scripting.
I principali attuatori oggetto del nostro studio sono i due motori di Thymio, posti uno a
destra e uno a sinistra del robot.
Attraverso le variabili motor.right.target e motor.left.target si è in grado di definire la
velocità alla quale le ruote rispettivamente di destra e di sinistra devono girare, il dominio
dei valori assunto dalle variabile è l’insieme degli interi appartenenti all’intervallo
[-500,500], dove 500 è associato ad una velocita di 20cm/s.
Le altre variabili disponibili per i nostri due motori sono motor.right.speed, motor.left.speed
che misurano la velocità della rotazione delle ruote e motor.right.pwm, motor.left.pwm che
rileva la velocità di rotazione, attraverso l’invio di un segnale digitale avente un certo Duty
Cycle.
Durante l’analisi del funzionamento dei motori si è osservato che anche se si imposta
motor.right.target = 500 e ci si aspetterebbe dunque un valore della variabile
8
motor.right.speed = 500, generalmente questo non accade a causa della limitata precisione
dei sensori a nostra disposizione.
I valori che le nostre variabili assumono sono soggetti a piccole variazioni nell’ordine di
circa 20 rispetto al valore nominale. Per esempio definendo motor.right.target = 500 si
possono ottenere valori di motor.right.speed nell’intorno di 480 e 520.
Si tiene a precisare che anche se i valori possono essere controllati ad una velocità massima
di 20cm/s, è possibile che la variabile motor.right.speed possa assumere velocità superiori
a quelle del dominio di appartenenza, per esempio se il robot viene spinto con la mano.
Gli altri attuatori sono: una serie di led disposti nel robot ognuno relativo ad una specifica
funzione e un altoparlante se si ha la necessità di generare o utilizzare suoni.
Per ulteriori dettagli sul funzionamento e le caratteristiche di questi sensori si rimanda alla
documentazione ufficiale1
.
1
http://wiki.thymio.org/en:thymioapi
Attuatori del robot Thymio
9
Sistema dei sensori
I sensori del thymio sono molteplici, dotati di una discreta precisione per elementari
applicazioni e sono controllabili tramite semplici istruzioni di codice.
I principali sensori analizzati durante lo studio sono: i sensori di prossimità, di terra, di
accelerazione sui tre assi dello spazio ed infine la misura della velocità dei motori
precedentemente discussa.
I sensori di prossimità sono in grado di rilevare la presenza di oggetti nelle immediate
vicinanze. Thymio dispone di sensori di prossimità ottici per i quali il funzionamento si basa
sulla riflessione di un fascio luminoso da parte dell'entità rilevata.
Generalmente per i sensori ottici viene usato un fascio di raggi infrarossi, in quanto questo
tipo di radiazione è facilmente distinguibile dai disturbi generati da fonti luminose
ambientali.
Sensori del robot Thymio
10
Nella figura sottostante si osserva quale sia il rapporto che intercorre tra la distanza in cm e
la risposta dei sensori di prossimità, la calibrazione2
è stata effettuata su un normale foglio
A4.
I sensori di prossimità sono disposti sia sulla parte anteriore sia su quella posteriore. In
particolare ve ne sono cinque davanti, tra di loro distanziati omogeneamente e due sul retro.
2
https://cyberbotics.com/doc/guide/thymio2#proximity-sensor-response-versus-distance
Sensori del robot Thymio
11
I valori assunti dalle variabili relative ai sensori di prossimità sono memorizzati su un
vettore di dimensione sette, chiamato prox.horizontal dove l’i-esimo elemento corrisponde
ad uno specifico sensore. Partendo dalla posizione zero troviamo quello relativo alla parte
anteriore destra e così via fino al quarto elemento corrispondente al rilevatore di sinistra, ed
infine i due posteriori occupano la posizione 5 e 6 del nostro vettore.
I sensori di prossimità vengono aggiornati automaticamente alla frequenza di 10Hz,
l’intervallo dei valori è approssimativamente [0-5000] dove 0 indica che nessuno oggetto
viene rilevato e 5000 l’impatto del robot con un oggetto. Si osservi che il valore 5000 è un
limite teorico secondo ottenuto dalla lettura della documentazione ufficiale, ma nella realtà
risulta essere un valore irraggiungibile.
I sensori di ground hanno un comportamento simile a quelli di prossimità, Thymio ne ha a
disposizione due e sono posizionati nella zona inferiore anteriore come illustrato nella figura
sopra illustrata. Tali sensori emettono luce infrarossa e possono sfruttare la quantità di luce
riflessa per determinare la presenza oppure l’assenza del terreno.
In linea di massima, superfici nere assorbono quasi tutta la luce infrarossa. Supponiamo di
ottenere un valore di prox.ground.reflected = 0, allora siamo in presenza di una superficie
nera sulla quale sarà possibile che il robot si muova o meno in funzione del controllo che
applica il programmatore. Per esempio possiamo definire che in presenza di tale condizione,
sia comandato al robot di muoversi e posizionando un nastro sul terreno di colore nero si
vedrà Thymio seguirne la traiettoria.
Possiamo determinare anche l’intensità di luce presente nell’ambiente circostante con questi
sensori tramite la variabile prox.ground.ambient.
12
L’ultima variabile analizzata è prox.ground.delta, che calcola la differenza tra la luce
riflessa e quella dell’ambiente. Durante lo studio si è osservato una maggiore convenienza
nell’utilizzare l’ultima variabile rispetto alle altre due e quindi durante la progettazione del
controllore in sede si ha una preferenza nel suo utilizzo.
L’accelerometro effettua il calcolo della forza rilevata rispetto alla massa di Thymio ed
opera sui tre assi cartesiani. I valori vengono memorizzati su un vettore di dimensione tre
chiamato acc e le misure in questo vettore appartengono all’intervallo [-32,32] dove il
numero 23 corrisponde ad un accelerazione pari a quella di gravità (1g). Si ha una frequenza
di aggiornamento dei pesi pari a 16Hz. Questo sensore è utile quindi a rilevare accelerazioni
improvvise oppure un impatto con un oggetto. Acc[0] rappresenta un accelerazione
sull’asse x, Acc[1] invece descrive l’asse y ed infine Acc[2] è relativa all’asse z.
1.2 Software
Thymio utilizza Aseba, un’architettura basata su eventi3
, distribuita e modulare, si tratta di
una rete di calcolatori nei quali la comunicazione è asincrona. Tutti i nodi inviano eventi e
reagiscono a quelli ricevuti.
Un evento consiste in un identificatore e un pacchetto dati, ossia il Payload.
Spesso i nodi sono microcontrollori per i robot di piccole dimensioni; nel nostro caso,
invece, sono i robot Thymio stessi a fungere da nodi.
3
ASEBA: A Modular Architecture for Event-Based Control of Complex Robots, St´ephane Magnenat, Student Member, IEEE, Philippe
R´etornaz, Michael Bonani, Valentin Longchamp, Francesco Mondada, Member, IEEE.)
13
Lo strato di comunicazione può essere un qualunque bus provvisto di una logica multi-
master. Nel robot Thymio viene impiegato il CAN BUS 4
anche se in aggiunta,
opzionalmente, il robot può al suo interno possedere un calcolatore centrale, tipicamente
con un sistema operativo Linux. Questo permette allo sviluppatore di utilizzare un ambiente
di sviluppo dal suo computer.
Il non sincronismo degli eventi permette ai microcontrollori di trasmettere i dati quando lo
desiderano. Un comportamento di base non richiede un’unità centrale di controllo per la
gestione della trasmissione delle informazioni. Proprio per questo un sensore, tipicamente,
emette un evento solamente quando riceve parti di informazioni rilevanti. Ad esempio, il
sensore di distanza potrebbe emettere un evento qualora un ostacolo si avvicini ad una certa
soglia e solo quando questa transazione avvenga.
La scelta di quale evento inviare dipende dal comportamento del robot, pertanto un robot
coinvolto nell’evitare gli ostacoli non ha la necessità di utilizzare gli eventi di un robot che
segue un oggetto. In Aseba la flessibilità è implementata separando il codice del
microcontrollore in due parti:
In primo luogo, la lettura di sensori, attuatori e lo strato di comunicazione sono implementati
in codice nativo nel microcontrollore; su Thymio viene utilizzato il linguaggio C.
Secondariamente, le applicazioni specifiche del programma che controlla l’emissione di
eventi e le politiche di ricezione sono eseguite all’interno della macchina virtuale nei
microcontrollori. I programmi sono realizzati in un semplice linguaggio di Scripting che
permette allo sviluppatore di implementare comportamenti basati su eventi, lavorando su
4
https://it.wikipedia.org/wiki/Controller_Area_Network
14
un livello di astrazione superiore e permettendo di non preoccuparsi della gestione della
memoria o di lavorare a basso livello.
1.3 Linguaggio
In Aseba descriviamo il comportamento e le politiche di invio e ricezione in un linguaggio
di Scripting. La ricezione di un evento provoca l’esecuzione di una parte precisa dello script.
L’associazione del codice con gli eventi permette al programmatore di liberarsi dalla
gestione dei momenti di esecuzione del codice.
Sintatticamente il linguaggio Aseba è somigliante a quello di MATLAB, semanticamente è
un semplice linguaggio imperativo con vettori di interi a 16 bit comprendenti il bit di segno
e questo è l’unico tipo di dato permesso, questa caratteristica andrà a rilevarsi molto
vincolante per le nostre applicazioni durante la progettazione.
In addizione all’usuale condizione IF, Aseba dispone della condizione WHEN che risulta
essere vera quando il confronto della condizione è vero, questo permette dunque di avviare
15
uno specifico comportamento in maniera ciclica fino a quando lo stato della condizione non
cambia.
Il linguaggio fornisce la possibilità di utilizzare le subroutine, che possono essere chiamate
da una qualunque porzione del codice, anche questa caratteristica risulta vincolante per i
nostri scopi in quanto non è previsto il concetto di funzione oppure di utilizzare funzioni
ricorsive.
Per effettuare calcoli più complessi come la manipolazione di un segnale, i microcontrollori
sono dotati di funzioni native implementate in linguaggio C oppure in Assembler. Le
funzioni native standard previste sono relative alle operazioni vettoriali e trigonometriche
di base.
Alcune caratteristiche principali e vincoli del linguaggio Aseba:
le costanti non possono essere dichiarate direttamente nel codice, ma devono essere
esplicitate attraverso l’utilizzo del pannello delle costanti nell’ambiente di sviluppo Aseba
Studio.
Gli eventi possono essere emessi dall’interno del nodo come per esempio dai sensori,
oppure possono essere esterni ossia inviati da un altro nodo Aseba.
Esempio di codice basato su eventi:
var run = 0
onevent start
run = 1
onevent stop
run = 0
16
L’invio di eventi esterni avviene tramite la parola riservata emit, seguita dal nome
dell’evento e il nome della variabile da inviare. E’ necessario non dimenticarsi di tenere
conto della struttura dei dati e rispettarne le caratteristiche.
Di seguito si ha un esempio di codice per invio di eventi esterni.5
onevent ir_sensors
emit sensors_values proximity_sensors_values
Limiti importanti da tenere in considerazione:
• L’unico tipo di dato numerico ammesso è l’insieme degli interi dove si hanno a
disposizione solamente 16 bit con segno, in altre parole un range [-32768,32767].
• I vettori non possono avere come argomento variabili, ma solamente costanti, il
che limita di un certo grado la flessibilità dello sviluppo del controllore.
Var x = 10
Var vettore[x]
Questa sintassi non è valida;
• Non è previsto il concetto di funzione inteso come nei linguaggi ad alto livello. Vige
infatti la necessità di utilizzare in alternativa le subroutine per aggirare il problema.
• Una divisione ha come risultato un arrotondamento per difetto e non per eccesso,
questo porta alla propagazione di un certo errore nelle operazioni matematiche.
5
http://wiki.thymio.org/en:asebalanguage
17
• Le costanti non vengono dichiarate in linguaggio testuale ma attraverso l’ambiente
di sviluppo.
• Non sono previste matrici. Realizzeremo pertanto una matrice come insieme di due
o più vettori.
Esempio di codice Aseba per Thymio 2: Thymio segue un oggetto, ad esempio la mano.
# reset outputs
call sound.system(-1)
call leds.top(0,0,0)
call leds.bottom.left(0,0,0)
call leds.bottom.right(0,0,0)
call leds.circle(0,0,0,0,0,0,0,0)
onevent prox
when prox.horizontal[2] >= 2000 do
motor.left.target = 350
motor.right.target = 350
end
when prox.horizontal[0] >= 2000 do
motor.left.target = 0
motor.right.target = 500
end
when prox.horizontal[4] >= 2000 do
motor.left.target = 500
18
motor.right.target = 0
end
when (prox.horizontal[0] <= 1000 and prox.horizontal[1] <=
1000 and prox.horizontal[2] <= 1000 and prox.horizontal[3] <=
1000 and prox.horizontal[4] <= 1000) do
motor.left.target = 0
motor.right.target = 0
end
19
Secondo Capitolo
Tecniche di implementazione del controllore
2.1 Approccio centralizzato
Un primo approccio alla realizzazione del controllore è quello di sviluppare il controllore
in un linguaggio ad alto livello come, per esempio, il Python oppure C.
Questa metodologia richiede la realizzazione di un canale di comunicazione e della gestione
delle comunicazioni tra il linguaggio Python ed i nodi della rete Aseba.
Il canale fisico può essere il filo Usb in dotazione del robot Thymio oppure la
comunicazione può avvenire attraverso la rete wireless. Per i nostri scopi si privilegia una
comunicazione senza fili.
Il canale deve prevedere dei protocolli di comunicazione, difatti Aseba dispone della
possibilità di utilizzare un bus dati DBUS6
in aggiunta ad un utility a riga di comando
Asebamedulla7
che consente l’accesso ad una rete Aseba.
Medulla è un software hub che consente a qualunque software Linux di accedere agli eventi
e ai dati di un microcontrollore tramite D-BUS. Al momento il suddetto software è
supportato solamente sui sistemi operativi Linux.
Per controllare Thymio utilizzando il software Medulla è necessario in prima battuta andare
sulla console del sistema operativo Linux e digitare:
asebamedulla "ser:name=Thymio-II"
6
https://it.wikipedia.org/wiki/D-Bus
7
ASEBA Meets D-Bus: From the Depths of a Low-Level Event-Based Architecture into the Middleware
Realm Stephane Magnenat and Francesco Mondada
20
La sintassi del comando è di seguito illustrata.
Per ottenere maggiori informazioni sul comando Asebamedulla si esegue il seguente
comando.
In questo modo abbiamo connesso Medulla al nostro robot. E’ da sottolineare che ciò
avviene come descritto solo nell’ipotesi che il nostro dispositivo Thymio sia identificato
con il nome Thymio-II.
Ora è possibile scrivere software in grado di inviare e ricevere comandi utilizzando la
libreria DBus. Il passo successivo, dunque, consiste nel creare il nostro controllore nel
linguaggio desiderato. Per esempio in Python una realizzazione di un controllore basato
sui veicoli di Braitenberg8
è la seguente:
import dbus
import dbus.mainloop.glib
import gobject
from optparse import OptionParser
8
https://en.wikipedia.org/wiki/Braitenberg_vehicle
21
proxSensorsVal=[0,0,0,0,0]
def Braitenberg():
#get the values of the sensors
network.GetVariable("thymio-II",
"prox.horizontal",reply_handler=get_variables_reply,error_ha
ndler=get_variables_error)
#print the proximity sensors value in the terminal
Print(proxSensorsVal[0],proxSensorsVal[1],proxSensorsVal[2],
proxSensorsVal[3],proxSensorsVal[4])
#Parameters of the Braitenberg, to give weight to each wheels
leftWheel=[-0.01,-0.005,-0.0001,0.006,0.015]
rightWheel=[0.012,+0.007,-0.0002,-0.0055,-0.011]
#Braitenberg algorithm
totalLeft=0
totalRight=0
for i in range(5):
totalLeft=totalLeft+(proxSensorsVal[i]*leftWheel[i])
totalRight=totalRight+(proxSensorsVal[i]*rightWheel[i])
22
#add a constant speed to each wheels so the robot moves always
forward
totalRight=totalRight+50
totalLeft=totalLeft+50
#print in terminal the values that is sent to each motor
print "totalLeft"
print totalLeft
print "totalRight"
print totalRight
#send motor value to the robot
network.SetVariable("thymio-II","motor.left.target",
[totalLeft])
network.SetVariable("thymio-II","motor.right.target",
[totalRight])
return True
def get_variables_reply(r):
global proxSensorsVal
proxSensorsVal=r
def get_variables_error(e):
print 'error:'
print str(e)
loop.quit()
23
if __name__ == '__main__':
parser = OptionParser()
parser.add_option("-s", "--system", action="store_true",
dest="system", default=False,help="use the system bus instead
of the session bus")
(options, args) = parser.parse_args()
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
if options.system:
bus = dbus.SystemBus()
else:
bus = dbus.SessionBus()
#Create Aseba network
network =
dbus.Interface(bus.get_object('ch.epfl.mobots.Aseba','/'),
dbus_interface='ch.epfl.mobots.AsebaNetwork')
#print in the terminal the name of each Aseba NOde
print network.GetNodesList()
#GObject loop
print 'starting loop'
loop = gobject.MainLoop()
#call the callback of Braitenberg algorithm
24
handle = gobject.timeout_add (100, Braitenberg) #every 0.1
sec
loop.run()
Gli elementi di maggiore importanza in questo esempio, che permettono il controllo del
nostro dispositivo attraverso il linguaggio Python, sono di seguito elencati e descritti.
Import dbus: importa la libreria per la comunicazione tra la nostra applicazione e il
robot Thymio.
le applicazioni che utilizzano il D-bus si connettono al demone del bus, che inoltra i
messaggi tra le applicazioni. Per utilizzare il D-bus bisogna creare un oggetto Bus che
rappresenti la connessione al demone9
del bus.
bus = dbus.SessionBus(): crea una connessione al demone del bus e genera una
sessione.
network = dbus.Interface(bus.get_object('ch.epfl.mobots.Aseba',
'/'), dbus_interface= 'ch.epfl.mobots.AsebaNetwork'): crea una rete di
nodi Aseba.
network.GetVariable("thymio-II", "prox.horizontal"): dalla rete di
nodi ottiene i valori dei sensori di prossimità orizzontali.
Il vantaggio principale di questo primo metodo è l’utilizzo di linguaggi di programmazione
sia ad alto livello che a basso livello, ossia sviluppo di un controllore con ampi gradi di
libertà e ricchezza di funzionalità offerte dai linguaggi.
9
https://it.wikipedia.org/wiki/Demone_(informatica)
25
Uno svantaggio invece è rappresentato dall’utilizzo di un’unità centrale che elabori i dati
in ingresso e si occupi dell’invio dei dati in uscita. Si avranno dunque dei tempi di invio e
ricezione dei dati non in tempo reale.
Oltre allo svantaggio descritto uno dei requisiti del tirocinio e della tesi è che l’elaborazione
dei dati avvenga su ogni singolo robot indipendentemente dalla workstation.
2.2 approccio distribuito
Un secondo approccio è simile al primo metodo ma con l’aggiunta della separazione
dell’esecuzione del controllore da un'unica unità centrale in modo da provvedere alla
risoluzione del problema generato dal primo metodo.
Ci si chiede ora come si possa realizzare tale soluzione. L’idea di base consiste nell’aggiunta
di un modulo Hardware su ogni singolo dispositivo robotico Thymio.
Ogni robot viene connesso tramite cavo Usb in dotazione a un dispositivo Raspberry oppure
Arduino (si precisa che un supporto su Arduino ancora non è stato realizzato) ed
alimentando il modulo con una batteria. In questo modo possiamo controllare Thymio
semplicemente attraverso il Raspberry, che acquisisce i valori di ingresso dei sensori e che
attraverso il controllore basato su una rete neurale calcola i valori di uscita dei motori del
robot.
26
Fotografia del thymio con modulo Raspberry PI 4
Successivamente all’aggiunta della nostra unità si procede come è stato illustrato nel primo
approccio, ossia si esegue l’istruzione:
asebamedulla "ser:device=/dev/ttyACM0"
supposto che il dispositivo Thymio sia identificato da /dev/ttyACM0".
In conclusione, il vantaggio principale che si ottiene è quello di rendere indipendente il
controllo da un unità di elaborazione centrale, ma uno svantaggio sorge immediatamente,
non di tipo tecnico ma a livello di costi, in quanto sono necessari tanti moduli e batterie
quanti sono i robot Thymio da controllare, il che porta a costi eccessivi salendo di numero
unità in uso.
Anche per soli 5 robot i costi di realizzazione iniziano ad avere un certo peso economico.
Il costo di un modulo Raspberry pi 4 dotato di 4GB di Ram è di circa 110 euro, la batteria
invece ha un costo che si aggira tra i 15 e i 30 euro, in conclusione per 5 moduli la spesa
totale diventa all’incirca 700 euro.
27
2.3 Approccio diretto
Il terzo approccio consiste nell’utilizzare il linguaggio di Scripting di Aseba e sviluppare il
controllore attraverso approssimazioni e ovviando ai limiti imposti dal linguaggio.
La parte di progettazione e di realizzazione del controllore è oggetto esclusivo della parte
di tesi triennale del candidato, che avviene in concomitanza con il tirocinio.
I passaggi fondamentali della terza fase sono riassunti di seguito:
• Normalizzazione dei dati di ingresso.
• Creazione di un’architettura di rete neurale Feedforward (che viene
precedentemente concordata).
• Implementazione attraverso dovute approssimazioni della funzione di uscita del
singolo percettrone.
• Normalizzazione dei valori di uscita per pilotare i motori.
I vantaggi di tale approccio sono l’assenza di costi aggiuntivi per lo sviluppo e l’esecuzione
diretta del controllore sul robot Thymio senza i ritardi di comunicazione con dispositivi
esterni. Lo svantaggio invece è dovuto ai limiti imposti dal linguaggio a disposizioni e la
moltitudine di approssimazioni che generano inevitabilmente una propagazione dell’errore
sui nostri valori rispetto a quelli attesi.
28
TERZO CAPITOLO
Progettazione
Schema architettura della rete neurale
l’architettura della rete neurale per il robot Thymio è costituita da uno strato di ingresso
W, uno strato nascosto H, contenente un numero di neuroni pari al 65% del numero degli
ingressi ed infine uno strato di uscità Y.
Lo strato di ingresso è realizzato tramite un vettore di valori ottenuti dai sensori
opportunamente selezionati per il robot Thymio. Il primo gruppo di sensori utlizzati sono
quelli di prossimità, ossia cinque rilevatori sulla parte anteriore e due sul posteriore; i primi
dati sono memorizzati nel vettore horizontalSensor[], i valori dei due sensori di terra invece
sono immagazzinati nel vettore deltaSensor[]. Importanti sono anche i sensori di
29
accelerazione identificati dalla variabili vettoriale accSensor[], ed infine utilizziamo i
sensori che stabiliscono la velocità dei motori, rappresentati da motorSpeed[].
Si precisa che la scelta di quali sensori utilizzare come ingressi della nostra rete neurale è
definita nelle prime fasi della progettazione in maniera arbitraria, ed è stabilita dai
comportamenti che si vuole ottenere o studiare.
Lo strato di ingresso ha come vincolo di progetto di possedere un numero massimo di 16
neuroni.
Il linguaggio Aseba consente di utilizzare variabili intere nell’intervallo di valori [-32768 :
32767], tenendo conto di questo vincolo, si è deciso di far sì che il singolo percettrone di
ingresso possa assumere un valore intero dell’intervallo [0:128], di conseguenza i pesi della
rete neurale sono limitati al dominio dei valori [-16,16].
Dunque il massimo valore teorico assumibile dai percettroni dello strato nascosto della rete
neurale, durante il calcolo della combinazione lineare è pari al prodotto 128 ∙ 16 ∙ 16 =
32768 ; si osserva che tale valore supera il limite superiore imposto dal vincolo di progetto.
Dato che 32768 è una cifra puramente teorica, la quale non può avere alcun riscontro nella
realtà, si è comunque deciso di operare con gli intervalli precedentemente stabiliti.
Infatti il valore 32768 è praticamente irraggiungibile, in quanto sarebbe necessario che ogni
sensore assuma un valore pari al suo limite superiore, tale evento è irrealizzabile a causa
della natura dei nostri rilevatori.
Alcuni sensori del Thymio non si avvicinano mai al massimo valore assumibile anche in
condizioni nelle quali ci si aspetta che tali valori vengano assunti.
30
Si precisa che durante la realizzazione del controllore si è tenuto conto di solamente 14
sensori, questa scelta è giustificata dal fatto di volere ottenere in fase di collaudo del
controllore un comportamento semplice, come quello di evitare gli ostacoli durante la
marcia.
Lo strato intermedio ossia quello nascosto “H” prevede l’utilizzo di un numero di neuroni
pari al 65% del numero di neuroni di ingresso, con arrotondamenti per eccesso.
In definitiva sono ammessi un numero di neuroni massimo di undici neuroni intermedi,
mentre in questa tesi si va ad utilizzare un numero pari a dieci, in quanto i nodi di ingresso
sono pari a quattordici.
I valori calcolati dai percettroni dello stato intermedio prima di essere utilizzati dallo strato
successivo, vengono normalizzati secondo una certa logica che verrà in seguito.
Lo Strato di uscita contiene 2 neuroni, che rappresentano i valori di controllo dei nostri
attuatori, valori che verranno rappresentati nel nostro codice tramite il vettore motor[].
Si tiene a precisare che il numero dei neuroni di uscita è facilmente modificabile nei limiti
dei vincoli già elencati nei capitolo precedenti. Per esempio se si desidera avere un certo
comportamento logico dei led del robot, basterebbe l’aggiunta di un ciclo nella subroutine
compute_output.
In questa sede si è stabilito di affrontare la realizzazione dello strato software secondo 2
criteri qualitativi: in primo luogo, il codice deve essere scritto in maniera più semplice
possibile per la lettura, secondariamente, il codice deve essere facilmente modificabile ed
adattabile a seconda delle esigenze.
31
Si è ritenuto che questi due criteri siano primari rispetto al proposito di realizzare un codice
con la massima efficienza di esecuzione possibile.
Schema normalizzazione dei valori di ingresso .
I valori di ingresso del vettore V sono generalmente compresi tra -500 e 5000, più sì ha che
il dominio dei sensori di prossimità sono compresi nell’intorno [0 : 5000], i valori dei due
sensori di Ground tra [0 : 1024], mentre quelli di accelerazione appartengono all’intervallo
compreso [32 : 32], ed infine i valori dei sensori di velocità dei due motori operano in un
intervallo [-500 : 500].
Il nostro vettore V necessità che l’insieme dei suoi elementi siano normalizzati, come si
osserva dalla figura soprastante, affinché si ottenga un vettore di valori appartenenti
all’intervallo [0,128]. I valori normalizzati vengono memorizzati nel nuovo vettore W,
rappresentato nel nostro codice tramite sensorsNormalized [].
32
Schema semplificato sul calcolo della prima variabile di uscita
Nei neuroni dello strato intermedio, lo strato software calcola il prodotto scalare tra il
vettore di ingresso normalizzato W e il vettore dei pesi P rappresentanti la forza della
singola connessione con il neurone dello strato nascosto. Questa operazione avviene per
ogni singolo neurone dello strato intermedio.
Il risultato della combinazione lineare prevede un massimo valore di 32767, il calcolo è
fatto con l’ipotesi implicita che il valore del Bias sia nullo, mentre se è diverso da zero
allora ne va tenuto conto e dunque fare le dovute modifiche allo schema dell’architettura
della rete neurale e della parte di codice che stabilisce il risultato della sommatoria.
Il valore della somma algebrica entra successivamente nel blocco chiamato funzione di
attivazione che ha come dominio valori da -32768 a 32767, a questo punto in base alla
funzione di attivazione implementata si avrà un codominio specifico.
33
In questa tesi si utilizza la tangente iperbolica, che viene inizialmente approssimata e
successivamente adattata attraverso una dilatazione della funzione, in quanto nel
linguaggio Aseba la tangente iperbolica non appartiene all’insieme delle funzioni native
previste e l’impossibilita di utilizzare i numeri decimali ma solamente interi vincolati
all’intervallo precedentemente discusso nella tesi.
I valori d’uscita per la tangente iperbolica appartengono a [-8192,8192].
Blocco di Normalizzazione di ingresso
Esempio di normalizzazione di ingresso. V è il vettore di ingresso, W è il vettore di ingresso Normalizzato.
Nel blocco di normalizzazione di ingresso idealmente si andrebbe a calcolare i valori del
vettore di ingresso normalizzato mediante la seguente formula: Wi = 128
Vi−Vmini
Vmaxi
−Vmini
Piu precisamente sia dato il vettore degli ingressi
34
𝑉 = (V1, V2, … , V𝑛),
Siano inoltre dati rispettivamente i vettori di minimo e di massimo della la nostra rete
neurale, relativi ai singoli sensori considerati e definiti come:
Vmin = (Vmin1
, Vmin2
, … , Vmin 𝑛
),
Vmax = (Vmax1
, Vmax2
, … , Vmax 𝑛
),
Si definisce il vettore di ingresso normalizzato W, il vettore ottenuto normalizzando gli
ingressi di V come:
W = (V1, V2, … , V𝑛)
Tale che
Wi = 128
Vi − Vmini
Vmaxi
− Vmini
Si tiene a precisare che i valori che possono assumere i sensori del Thymio sono soggetti
a disturbi e può darsi talvolta i valori siano superiori o inferiori ai limiti teorici previsti,
difatti si andrà a tenere conto di questi eccessi, attraverso un controllo condizionale.
Ossia se i valori sono minori dell’estremo inferiore previsto per il singolo sensore, si andrà
a forzare il sensore a rilevare un pari al valore minimo teorico previsto e viceversa se i
valori sono superiori al limite superiore si andrà ad imporre alla variabile il massimo
previsto.
Ad esempio se il nostro Thymio durante la marcia rileva una velocità di marcia pari a 520,
il valore che andrà ad essere normalizzato è 500 che rappresenta la massima velocità di
rotazione dei motori.
35
Blocco funzione di attivazione.
Ogni funzione di attivazione implementata è soggetta a qualche forma di adattamento e di
approssimazione a causa dei vincoli limitanti del nostro linguaggio. Di seguito si andrà a
vedere la logica attraverso la quale in questa tesi si approssima la funzione tangente
iperbolica.
La tangente Iperbolica è una funzione avente come dominio tutti i valori della retta reale
e come codominio, valori compresi tra meno uno ed uno come nella figura sottostante.
Tangente iperbolica.
In prima battuta si cerca una trasformazione espressa tramite una funzione razionale, che
abbia un andamento simile alla tangente iperbolica nell’intervallo [-4,4], ossia una
funzione in grado di approssimare la tanh(x).
Questo requisito è realizzabile tramite la relazione biunivoca :
y =
27x + x3
27 + 9x2
36
Funzione che approssima la tangente iperbolica.
Si osservi che la funzione approssimazione per x che tende all’infinito, questa non sia
limitata ma tenda ad infinito al contrario della tangente iperbolica. Un altro punto da tenere
conto è che le 2 funzioni sono circa identiche al valore intero x uguale a quattro, per poi
successivamente, la differenza tra le due funzioni tende a divergere.
lim
x→+∞
27x + x3
27 + 9x2
= +∞
lim
x→+∞
tanh (𝑥) = 1
A questo punto si procede con una dilatazione della funzione ottenuta.
Ossia sapendo che il massimo risultato ottenibile dalla combinazione lineare è 32767 e
che il numero uno per la tangente iperbolica si ottiene per x uguale a quattro, allora sì
imposta come coefficiente di dilatazione Il rapporto 𝑐 =
32767
4
≅ 8192.
La cifra come risultato del rapporto rappresenta il massimo valore della nostra funzione
approssimata ed elaborata, ossia al valore 32767 corrisponde la costante c. lo stesso
discorso vale per la parte negativa della funzione. In conclusione si definisce la nuova
applicazione che approssima la nostra tangente iperbolica opportunamente approssimata
come:
37
𝑦 =
27
𝑥
𝑐
+ (
𝑥
𝑐
)3
27 + 9(
𝑥
𝑐
)2
≈ 𝑐𝑡𝑎𝑛ℎ(
𝑥
𝑐
)
Approssimazione della tangente iperbolica soggetta ad adattamento.
38
Blocco di Normalizzazione intermedio
Schema sulla normalizzazione dello strati di uscita.
Nel blocco di normalizzazione intermedio si vuole andare mappare ogni valore uscente
dai neuroni dello strato nascosto appartenente a [-8192,8192] ad un valore del intervallo
compreso tra -128 e 128, in quanto siamo sempre difronte ai vincoli di progetto
inizialmente discussi.
La scelta in sede di normalizzare su questo intervallo è standard per tutti neuroni dello
strato nascosto e i successivi strati, affinché si possa mantenere una certa omogeneità nella
rete neurale. La normalizzazione può essere scelta anche in maniera arbitraria, però
necessita di ulteriori studi sulle sue conseguenze e di fare attenzioni ai vincoli software
ogni volta che si va a ridefinire l’architettura della rete neurale. Dunque è preferibile
39
mantenere queste impostazioni per evitare errori non previsti durante l’esecuzione del
programma.
La formula utilizzata per la normalizzazione è: 𝑂𝑖𝑛 =
𝑂 𝑖𝑛
64
Si tiene a precisare che nello schema della figura sopra, troviamo scritto 𝑂𝑖 = 𝑐 𝑡𝑎𝑛ℎ( 𝑆𝑖
𝑐
),
mentre nella partica si utilizza la formula approssimativa 𝑂𝑖 =
27
𝑆 𝑖
𝑐 +(
𝑆 𝑖
𝑐 )
3
27+9(
𝑆 𝑖
𝑐 )
2 .
Blocco di Normalizzazione di uscita:
Schema sulla normalizzazione di uscita
L’esigenza di avere una normalizzazione di uscita è dettata dal fatto che i motori del
Thymio, possono essere controllati con valori compresi tra -500 e 500, mentre i valori
40
derivanti dai neuroni di uscita sono compresi in un intervallo più ampio di quello
necessario [-8192,8192].
La formula di risoluzione è:
𝑈𝑖𝑛 =
500∗𝑈𝑖
8192
Schema finale.
41
CAPITOLO QUARTO
Realizzazione dello strato software del sistema di controllo
Nel seguente capitolo si andrà a discutere e spiegare delle principale componenti del
codice.
Normalizzazione di ingresso
Inizialmente vengono dichiarate le variabili che andranno a contenere i valori ricevuti dai
sensori.
var horizontalSensor[7]
var deltaSensor[2]
var accSensor[3]
var motorSpeed[2]
Successivamente si crea un vettore contenente tutti i sensori che verranno impiegati.
var sensors[14]
Infine sarà necessario avere un vettore che dovrà contenere i valori di ingresso normalizzati.
var sensorsNormalized[14]
Si osservi come aggiungendo o togliendo qualunque sensore vige la necessità di andare a
cambiare il numero di elementi nelle variabili sensors e sensorsNormalized, cosi onde
evitare spiacevoli errori durante la compilazione o comportamenti inattesi.
Ora per far sì che il Thymio operi finché si desidera, si crea un ciclo che viene eseguito
finché non viene premuto il tasto centrale del Thymio, durante questo loop si andrà ad
aggiornare i valori dei sensori Periodicamente.
while (button.center==0) do
42
call leds.top(255,0,0)
#vetttori sensori
horizontalSensor=[prox.horizontal[0],prox.horizontal[1],prox
.horizontal[2],
prox.horizontal[3],prox.horizontal[4],prox.horizontal[5],pro
x.horizontal[6]]
deltaSensor= [prox.ground.delta[0],prox.ground.delta[1]]
accSensor=[acc[0],acc[1],acc[2]]
motorSpeed = [motor.left.speed,motor.right.speed]
sensors = [horizontalSensor,deltaSensor,accSensor,motorSpeed]
elaborazione dati ingresso
si richiede ora di inserire i valori dei sensori in una variabile da elaborare di nome inSensor
e si andrà a chiamare la subroutine di normalizzazione dei valori di ingresso.
Successivamente l’elemento i-esimo viene memorizzato nel vettore riguardante i sensori
normalizzati.
#elaborazione dati ingresso
for i in 0:13 do
inSensor = sensors[i]
#modifiche in corso
if (i<=6) then
min =0
max =5000
end
if (i>=7 and i<=8) then
min =0
max =1024
end
43
if (i>=9 and i<=11) then
min =-32
max =32
end
if (i>=12) then
min =-500
max =500
end
callsub normalize1
sensorsNormalized[i] = inSensorNorm
end
Nella subroutine di normalizzazione di ingresso , il primo passo è quello di controllare che
se abbiamo valori maggiori del massimo allora impostiamo il valore della variabile inSensor
uguale al valore massimo, se invece il valore è inferiore al minimo si assegna ad inSensor
il valore del minimo. Utilizzando la funzione nativa math.muldiv si va ad utilizzare la
formula.
Wi = 128
Vi − Vmini
Vmaxi
− Vmini
La funzione nativa ha la seguente sintassi:
math.muldiv (variabile risultato, primo fattore, secondo fattore, divisore).
sub normalize1
if inSensor>max then inSensor = max
end
if inSensor<min then inSensor = min
end
call math.muldiv(inSensorNorm,128,inSensor-min,max-min)
Alla fine del ciclo di normalizzazione si chiama la funzione che si occupa di svolgere le
operazioni della rete neurale, che a sua volta immediatamente chiama un'altra subroutine
che si occupa di calcolare i valori di uscita dei neuroni nascosti.
44
Ossia callsub compute_output è la prima funzione che chiama la subroutine tramite
l’istruzione callsub calcoloCentrale.
La seguente subroutine è implementata come segue :
for i in 0:13 do
coeff = sensorsNormalized[i]*pesineurone1[i]
a = a + coeff
end
callsub tanhx
output1[0]=y
a=0
Questo ciclo for viene riscritto per un numero di volte pari ai neuroni dello strato intermedio.
La Subroutine calcoloCentrale svolge l’operazione di combinazione lineare tra i pesi e i
valori di ingresso e successivamente applicare a tale risultato la funzione approssimata
tangente iperbolica. Si osservi che pesineurone1 è riferita ai pesi tra gli ingressi e il primo
neurone dello stato intermedio. La variabile output1 si riferisce al uscita del primo neurone.
La subroutine tanhx è realizzata come segue :
sub tanhx
input=a
if (input>0) then
call math.muldiv(funx1,27,input,8192)
call math.muldiv(funx2,1,input,8192)
call math.muldiv(funx2,(funx2+1),(funx2+1)*(funx2+1),1)
45
call math.muldiv(funx3,1,input,8192)
call math.muldiv(funx3,9,(funx3+1)*(funx3+1),1)
call math.muldiv(funx,8192,funx1+funx2,funx3+27)
end
if (input<0) then
call math.muldiv(funx1,27,input,8192)
call math.muldiv(funx2,1,input,8192)
call math.muldiv(funx2,(funx2-1),(funx2-1)*(funx2-1),1)
call math.muldiv(funx3,1,input,8192)
call math.muldiv(funx3,9,(funx3-1)*(funx3-1),1)
call math.muldiv(funx,8192,funx1+funx2,funx3+27)
end
y=funx
si osservi che nel codice in funzione se l’input è positivo o negativo si aggiunge 1 o si sottrae
uno, questa scelta permette una maggiore precisione dell’approssimazione ed evitando
valori nulli quando in realtà sono compresi tra 0 e 1.
Ora, calcolati i valori di uscita dei neuroni intermedi, si va a svolgere le stesse operazioni
con qualche modifica per i le due uscite che pilotano i motori. Le due uscite sono
memorizzate nel vettore motor[] avente una dimensione pari a 2.
46
for i in 0:9 do
input2 = output1[i]
callsub normalize_output
hiddenNeurons[i] = output2
end
callsub neuromotor_compute
for i in 0:1 do
input2 = motor_output[i]
callsub normalize_motors
motor[i] = output2
end
La normalizzare dell’output di un neurone della rete neurale viene svolta come segue:
sub normalize_output
call math.muldiv(output2,1,input2,64)
Terminata l’esecuzione della subroutine compute_output si va a controllare i nostri attuatori
tramite le istruzioni:
motor.left.target = motor[0]
motor.right.target = motor[1].
47
Di sopra si è fornito una panoramica sulle funzioni di base del codice realizzato dal
candidato, il codice come si può osservare è stato scritto con il criterio di essere facilmente
modificabile e adattabile a seconda delle esigenze, si precisa che l’aggiunta o l’eliminazione
di fonti di ingresso al nostro controllore prevedono l’aggiunta o l’eliminazione di righe di
codice in maniera manuale e anche il cambiamento dei valori nei cicli e le dimensioni dei
vettori, la realizzazione è tale che se si sbaglia le dimensioni di un vettore, il compilatore
andrà a segnalare tale inconsistenza.
Un'altra possibilità è quella di poter aggiungere nuove funzioni di attivazione come
subroutine e andare a richiamarle facilmente, ossia sostituendo il nome della subroutine per
i singoli neuroni.
Il codice completo del controllore è fornito assieme alla seguente relazione, accompagnata
da un video illustrativo su una delle possibili applicazioni del controllore dopo avere fornito
dei pesi ragionevoli alla rete neurale.
48
CAPITOLO QUINTO
Analisi e collaudo del controllore
Per effettuare il collaudo del nostro controllore si è stabilito arbitrariamente l’esperimento
da effettuare. Ossia sono stati definiti i comportamenti che il Thymio deve realizzare.
L’esperimento si effettua con Thymio, il cui obiettivo è quello di muoversi all’interno di un
percorso, evitando gli ostacoli durante il suo cammino.
Il fine della sperimentazione è la raccolta dei dati e una sua successiva analisi, necessaria
per valutare quale sia la differenza tra i risultati attesi e quelli della realtà.
Simulare il robot con in esso implementato il controllore realizzato dal candidato, definisce
i risultati attesi, mentre testando Thymio nella realtà si definiscono i risultati cosiddetti reali.
L’assenza di un simulatore virtuale del Thymio diventa un vincolo sulle modalità di
realizzazione del collaudo e dell’analisi del nostro controllore. Dunque si è optato per
realizzare un programma in linguaggio Python, capace di simulare il funzionamento del
controllore realizzato.
Lo pseudo-simulatore del sistema di controllo del robot è in grado, inoltre, sia di raccogliere
i dati relativi agli ingressi del Thymio, sia di effettuare una loro analisi, che consiste nel
valutare quale sia la differenza tra i valori di uscita calcolati da Thymio nella realtà e i valori
calcolati dallo pseudo-simulatore.
In questo capitolo si andrà a spiegare come sono stati raggiunti gli obbiettivi prefissati nella
premessa di sopra.
49
In primo luogo ai fini dell’esperimento, i pesi della rete neurale sono stati scelti affinché
fossero operativi soltanto i sensori di prossimità anteriori e la velocità di rotazione dei
motori di destra e sinistra.
Si ricorda che la rete neurale non è mai stata allenata e non è mai stato definito per essa un
obbiettivo da raggiungere.
Le fasi principali per il collaudo sono le seguenti:
Il primo passo è quello di effettuare la raccolta e la memorizzazione in un file di testo o
preferibilmente in formato CSV dei dati relativi ai sensori di ingresso del Thymio durante
la marcia. Allo strato software realizzato si definisce la variabile vettoriale collection1[16]
che dovrà contenere i valori dei sensori utilizzati dal controllore della rete neurale e i due
valori di uscita calcolati.
Successivamente si crea una variabile globale, di nome data1 aventi 16 parametri,
direttamente dall’editor Aseba come nell’immagine di sotto.
Schermata degli eventi globali nell'editor Aseba
50
A questo punto si utilizza durante il ciclo di esecuzione del robot l’istruzione emit data1
collection1, che invia dal Thymio ad Aseba Studio la variabile globale data1 avente come
parametri i 16 definiti precedentemente.
Prima di eseguire Thymio si clicca con il tasto destro del mouse su data1 negli eventi globali
e infine su grafico data1. Ora comparirà una finestra grafico nell’editor come nella seguente
immagine.
Nell’istante in qui si andrà ad avviare l’esperimento il programma inizierà a registrare e
plottare i valori stabiliti.
Schermata del plotter di grafici in Aseba Studio
51
Schermata grafico di Aseba Studio durante la marcia di Thymio.
Cliccando su salva con nome si ottiene un file di testo avente nella prima colonna il
Timetamp e nelle restanti colonne, invece, i valori di ingresso rilevati dai sensori e i due
valori di uscita calcolati.
52
Esempio di File di CSV con i valori memorizzati durante la marcia del Thymio.
Un’ ulteriore elaborazione con Excel o altri strumenti a scelta, permette di adattare il file al
simulatore. Nel nostro caso viene eliminata la riga di Timestamp prima di avviare il
programma dello pseudo-simulatore.
Ora avendo raccolto i dati ed adattati allo scopo sì va a realizzare lo pseudo-simulatore del
nostro controllore in linguaggio Python.
Il programma legge i dati del file CSV, riga per riga e considera le prime 14 colonne
riguardanti i sensori, ossia simula di operare nelle stesse condizioni dell’esperimento.
A questo punto, il controllore calcola i valori di uscita e li memorizza all’interno di 2 liste,
una relativa al motore di destro e l’altra per quello sinistro.
Il codice del seguente software verrà fornito in allegato insieme alla tesi.
53
Bisogna poi aggiungere delle funzionalità di analisi dei nostri dati, ossia si va in primo
luogo a calcolare la differenza in valore assoluto tra i valori ottenuti con la simulazione e i
valori ottenuti da Thymio.
Secondariamente, si effettua un plot della lista delle differenze dei risultati del motore destro
e del motore sinistro.
Si tiene a precisare che i conti realizzati dal controllore simulato non sono soggetti a forti
approssimazioni come per il controllore realizzato sul Thymio, questo è dovuto al fatto
che nel simulatore si possono operare con numeri decimali, inoltre gli arrotondamenti
sono fatti sia per eccesso che per difetto, invece che solo per difetto come nel Thymio e in
ultima analisi la tangente iperbolica nel simulatore non è stata approssimata come per il
controllore a nostra disposizione.
Durante la fase di collaudo si è fatto percorrere al Thymio un certo cammino con ostacoli,
si sono quindi salvati i dati in un file di testo e adattati al programma di simulazione. A
questo punto, si esegue il simulatore che estrae i dati dal file CSV e si ottengono i seguenti
risultati:
54
Grafici della velocità di rotazione della ruota destra. In verde risultati teorici o attesi, in blu i valori reali ottenuti.
Grafico relativo alla differenza tra la velocità di rotazione del motore destro reale e il valore atteso tutto in valor
assoluto.
Nella maggior parte degli esperimenti effettuati si è osservato un andamento del
discostamento medio tra i valori d’uscita reali e quelli attesi appartenente all’incirca
all’intorno del valore 7.
55
La Seconda osservazione come si evince dal grafico è che mentre la velocità di rotazione
dei motori per i valori teorici muta in maniera piuttosto regolare, nella realtà si è riscontrato
la velocità muta in modo repentino e ha un insieme di valori ben definito.
56
CONCLUSIONI
Il presente studio si è posto l’obbiettivo di studiare la tecnologia a nostra disposizione al
fine di progettare e realizzare un controllore per piattaforma robotica basato su rete neurale,
il quale in seguito è stato, in seguito, collaudato.
Gli studi effettuati hanno portato a considerare un’architettura di una rete neurale avente
quattordici ingressi, uno strato nascosto avente un numero pari al 65% del numero di neuroni
di ingresso ed infine due percettroni di uscita.
Si è scelto inoltre di considerare soltanto pesi facenti parte dell’intervallo [-16,16] e di
utilizzare come funzione di attivazione un’approssimazione della tangente iperbolica.
Tali scelte sono giustificato dai limiti tecnologici ai quali si è subito dovuto far fronte; il
principale limite è stato il fatto che si potessero utilizzare soltanto numeri interi definiti su
un intervallo limitato [-32768,32767].
Con la ricerca svolta è stato possibile raggiungere l’obbiettivo di realizzare il controllore, in
particolare ci si è concentrati sulla normalizzazione dei valori all’ingresso dei percettroni
affinché non venissero superati i vincoli tecnologici stabiliti come premessa dello studio.
Nell’ultima fase dell’analisi effettuata si è cercato di individuare quale fosse il divario tra i
risultati ottenuti durante la sperimentazione del controllore e i risultati della simulazione,
concludendo grazie ai nostri esperimenti che tale divario in media risulta relativamente
basso.
57
Sebbene lo scopo della tesi sia stato raggiunto, i risultati qui ottenuti ed illustrati possono
ancora fornire molti spunti per studi futuri. Ad esempio il controllore potrebbe essere
utilizzato come supporto per la fase di allenamento della rete neurale.

More Related Content

Similar to Realizzazione di un controllore basato su piattaforma robotica Thymio 2.

Realizzazione di un controllore basato su piattaforma robotica Thymio 2.
Realizzazione di un controllore basato su piattaforma robotica Thymio 2.Realizzazione di un controllore basato su piattaforma robotica Thymio 2.
Realizzazione di un controllore basato su piattaforma robotica Thymio 2.anwarNazik
 
Realizzazione di una base di dati per la memorizzazione di dati provenienti d...
Realizzazione di una base di dati per la memorizzazione di dati provenienti d...Realizzazione di una base di dati per la memorizzazione di dati provenienti d...
Realizzazione di una base di dati per la memorizzazione di dati provenienti d...mfurlanetto
 
06 Stima Costi E Componenti
06 Stima Costi E Componenti06 Stima Costi E Componenti
06 Stima Costi E Componentiklide
 
06 Stima Costi E Componenti
06   Stima Costi E Componenti06   Stima Costi E Componenti
06 Stima Costi E Componentikamal82
 
Sistemi con telecamera per macchine mobili
Sistemi con telecamera per macchine mobiliSistemi con telecamera per macchine mobili
Sistemi con telecamera per macchine mobiliifm electronic gmbh
 
Extended Summary of "Engineered Self-Organization for Resilient Robot Self-As...
Extended Summary of "Engineered Self-Organization for Resilient Robot Self-As...Extended Summary of "Engineered Self-Organization for Resilient Robot Self-As...
Extended Summary of "Engineered Self-Organization for Resilient Robot Self-As...SergioMilo1
 
Alessandro Dionisi Thesis Presentation
Alessandro Dionisi Thesis PresentationAlessandro Dionisi Thesis Presentation
Alessandro Dionisi Thesis PresentationAlessandro Dionisi
 
Sogei Premio PA Sostenibile 2018
Sogei Premio PA Sostenibile 2018Sogei Premio PA Sostenibile 2018
Sogei Premio PA Sostenibile 2018leorob
 
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIOREALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIObasix86
 
Porte aperte nelle app android scoperta diagnosi e valutazione di sicurezza ...
Porte aperte nelle app android scoperta diagnosi e valutazione di sicurezza  ...Porte aperte nelle app android scoperta diagnosi e valutazione di sicurezza  ...
Porte aperte nelle app android scoperta diagnosi e valutazione di sicurezza ...Massimiliano Cristarella
 
Recognizing Hand Gestures using WebCams
Recognizing Hand Gestures using WebCams Recognizing Hand Gestures using WebCams
Recognizing Hand Gestures using WebCams graphitech
 
Sviluppo e implementazione su microcontrollore di un’applicazione web server ...
Sviluppo e implementazione su microcontrollore di un’applicazione web server ...Sviluppo e implementazione su microcontrollore di un’applicazione web server ...
Sviluppo e implementazione su microcontrollore di un’applicazione web server ...pma77
 
Supsi dti abstract_informatica_2012
Supsi dti abstract_informatica_2012Supsi dti abstract_informatica_2012
Supsi dti abstract_informatica_2012L Dr
 
2000 fm pb_easyscan_emission_maps_sim_vs_measure (1)
2000 fm pb_easyscan_emission_maps_sim_vs_measure (1)2000 fm pb_easyscan_emission_maps_sim_vs_measure (1)
2000 fm pb_easyscan_emission_maps_sim_vs_measure (1)Piero Belforte
 
Extended Summary of “Open for hire: attack trends and misconfiguration pitfal...
Extended Summary of “Open for hire: attack trends and misconfiguration pitfal...Extended Summary of “Open for hire: attack trends and misconfiguration pitfal...
Extended Summary of “Open for hire: attack trends and misconfiguration pitfal...GiovanniCoronica
 
Design and Implementation of a Software Simulator for MANET Networks Analysis
Design and Implementation of a Software Simulator for MANET Networks AnalysisDesign and Implementation of a Software Simulator for MANET Networks Analysis
Design and Implementation of a Software Simulator for MANET Networks AnalysisGiancarlo Romeo
 
Valutazione preliminare di un sistema per il rilevamento delle cadute
Valutazione preliminare di un sistema per il rilevamento delle caduteValutazione preliminare di un sistema per il rilevamento delle cadute
Valutazione preliminare di un sistema per il rilevamento delle cadutemarcocatto1
 
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO - Tesi
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO - TesiREALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO - Tesi
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO - Tesibasix86
 

Similar to Realizzazione di un controllore basato su piattaforma robotica Thymio 2. (20)

Realizzazione di un controllore basato su piattaforma robotica Thymio 2.
Realizzazione di un controllore basato su piattaforma robotica Thymio 2.Realizzazione di un controllore basato su piattaforma robotica Thymio 2.
Realizzazione di un controllore basato su piattaforma robotica Thymio 2.
 
Realizzazione di una base di dati per la memorizzazione di dati provenienti d...
Realizzazione di una base di dati per la memorizzazione di dati provenienti d...Realizzazione di una base di dati per la memorizzazione di dati provenienti d...
Realizzazione di una base di dati per la memorizzazione di dati provenienti d...
 
06 Stima Costi E Componenti
06 Stima Costi E Componenti06 Stima Costi E Componenti
06 Stima Costi E Componenti
 
06 Stima Costi E Componenti
06   Stima Costi E Componenti06   Stima Costi E Componenti
06 Stima Costi E Componenti
 
Car accident detector
Car accident detectorCar accident detector
Car accident detector
 
Sistemi con telecamera per macchine mobili
Sistemi con telecamera per macchine mobiliSistemi con telecamera per macchine mobili
Sistemi con telecamera per macchine mobili
 
Extended Summary of "Engineered Self-Organization for Resilient Robot Self-As...
Extended Summary of "Engineered Self-Organization for Resilient Robot Self-As...Extended Summary of "Engineered Self-Organization for Resilient Robot Self-As...
Extended Summary of "Engineered Self-Organization for Resilient Robot Self-As...
 
Alessandro Dionisi Thesis Presentation
Alessandro Dionisi Thesis PresentationAlessandro Dionisi Thesis Presentation
Alessandro Dionisi Thesis Presentation
 
BlackBoard Team - Motion Tracking Platform
BlackBoard Team - Motion Tracking PlatformBlackBoard Team - Motion Tracking Platform
BlackBoard Team - Motion Tracking Platform
 
Sogei Premio PA Sostenibile 2018
Sogei Premio PA Sostenibile 2018Sogei Premio PA Sostenibile 2018
Sogei Premio PA Sostenibile 2018
 
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIOREALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO
 
Porte aperte nelle app android scoperta diagnosi e valutazione di sicurezza ...
Porte aperte nelle app android scoperta diagnosi e valutazione di sicurezza  ...Porte aperte nelle app android scoperta diagnosi e valutazione di sicurezza  ...
Porte aperte nelle app android scoperta diagnosi e valutazione di sicurezza ...
 
Recognizing Hand Gestures using WebCams
Recognizing Hand Gestures using WebCams Recognizing Hand Gestures using WebCams
Recognizing Hand Gestures using WebCams
 
Sviluppo e implementazione su microcontrollore di un’applicazione web server ...
Sviluppo e implementazione su microcontrollore di un’applicazione web server ...Sviluppo e implementazione su microcontrollore di un’applicazione web server ...
Sviluppo e implementazione su microcontrollore di un’applicazione web server ...
 
Supsi dti abstract_informatica_2012
Supsi dti abstract_informatica_2012Supsi dti abstract_informatica_2012
Supsi dti abstract_informatica_2012
 
2000 fm pb_easyscan_emission_maps_sim_vs_measure (1)
2000 fm pb_easyscan_emission_maps_sim_vs_measure (1)2000 fm pb_easyscan_emission_maps_sim_vs_measure (1)
2000 fm pb_easyscan_emission_maps_sim_vs_measure (1)
 
Extended Summary of “Open for hire: attack trends and misconfiguration pitfal...
Extended Summary of “Open for hire: attack trends and misconfiguration pitfal...Extended Summary of “Open for hire: attack trends and misconfiguration pitfal...
Extended Summary of “Open for hire: attack trends and misconfiguration pitfal...
 
Design and Implementation of a Software Simulator for MANET Networks Analysis
Design and Implementation of a Software Simulator for MANET Networks AnalysisDesign and Implementation of a Software Simulator for MANET Networks Analysis
Design and Implementation of a Software Simulator for MANET Networks Analysis
 
Valutazione preliminare di un sistema per il rilevamento delle cadute
Valutazione preliminare di un sistema per il rilevamento delle caduteValutazione preliminare di un sistema per il rilevamento delle cadute
Valutazione preliminare di un sistema per il rilevamento delle cadute
 
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO - Tesi
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO - TesiREALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO - Tesi
REALIZZAZIONE HARDWARE E SOFTWARE DI UN ROBOT MOBILE DI SERVIZIO - Tesi
 

Recently uploaded

Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO AntonioGiornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO AntonioServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA GiorgioGiornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA GiorgioServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO SimoneGiornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO SimoneServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI GiovanniGiornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI GiovanniServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI DanieleGiornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI DanieleServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' DavideGiornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' DavideServizi a rete
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO AndreaGiornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO AndreaServizi a rete
 

Recently uploaded (7)

Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO AntonioGiornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA GiorgioGiornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | SERRA Giorgio
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO SimoneGiornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DI DOMENICO Simone
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI GiovanniGiornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI DanieleGiornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | RENZI Daniele
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' DavideGiornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ROMANO' Davide
 
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO AndreaGiornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
 

Realizzazione di un controllore basato su piattaforma robotica Thymio 2.

  • 1. 1 Università degli Studi di Trieste Corso di Laurea in “Ingegneria elettronica ed informatica” Tesi di laurea REALIZAZZIONE DI UN CONTROLLORE PER PIATTAFORMA ROBOTICA BASATO SU RETE NEURALE Laureando Relatore Anwar Nazig prof. Eric Medvet Anno accademico 2019/2020
  • 3. 3 Indice Introduzione 1 Studio hardware e software della piattaforma robotica Thymio 2. 1.1 Hardware 1.2 Software 1.3 Linguaggio 2 Tecniche di implementazione del controllore. 2.1 Approccio centralizzato 2.2 Approccio distribuito 2.3 Approccio diretto 3 Progettazione 4 Realizzazione strato software del sistema di controllo 5 Analisi e collaudo del controllore Conclusioni
  • 4. 4 Introduzione L’obiettivo della tesi è quello di realizzare uno strato software che esegua un controllore basato su rete neurale per una piattaforma robotica. L’architettura della rete neurale viene precedentemente fissata in funzione del numero di sensori e dunque di ingressi del robot Thymio e dei due attuatori da pilotare per muovere il robot mobile. Lo strato software andrà quindi a ricevere i valori di ingresso dai sensori e dai pesi della rete neurale già precedentemente allenata in un ambiente simulato, a questo punto la rete neurale calcola i valori di uscita opportunamente processati in modo tale che sia possibile controllare i due motori a nostra disposizione. La richiesta definisce che nella prima fase, i dati dei pesi vengano forniti manualmente dall’utente all’interno del codice, ossia che sia necessario inserire una matrice dei pesi relativi alla forza della connessione tra i neuroni nel codice. In una seconda fase invece, attraverso una connessione wireless, bisogna inviare queste informazioni dalla workstation al robot, dunque è richiesto lo sviluppo di un sottosistema per la comunicazione wireless ed elaborazione dei dati, sia sul robot che sulla workstation. Il software sviluppato verrà utilizzato dal laboratorio ERALLAB del Dipartimento di Ingegneria e Architettura dell’Università degli studi di Trieste durante la fase di studio sul divario tra il comportamento nella realtà simulata dei nostri agenti e in quella fisica.
  • 5. 5 Quadro generale Il controllore verrà realizzato per i robot Thymio 2 nel contesto di seguito illustrato. Abbiamo a disposizione un’arena dove i nostri robot interagiscono con l’ambiente circostante e tra di essi tramite i sensori e gli attuatori. Il laboratorio dispone di una videocamera posta in posizione tale da osservare il progresso dell’esperimento e da tracciare il comportamento dei singoli agenti, attraverso un marcatore posto su ognuno dei nostri robot. La videocamera invia i dati alla workstation che si occupa di memorizzare i dati dell’esperimento e comunicare con i robot via wireless. L’esigenza è dunque quella di poter eseguire un esperimento dall’inizio alla fine senza che sia necessario l’intervento dell’operatore umano, in quanto la sperimentazione può richiedere lunghi tempi senza interruzioni. Il tirocinio si è concentrato in una prima fase sullo studio del robot Thymio e del suo funzionamento, ossia l’analisi dei suoi componenti hardware e software al fine di individuare le modalità possibili per lo sviluppo del controllore, tenendo conto delle richieste sopra elencate. In una seconda fase è stato portato avanti concentrandosi sulla ricerca delle metodologie per la progettazione del controllore. La terza fase si è invece focalizzata sull’andare a realizzare un sistema di controllo software sul robot Thymio che, dati i pesi delle connessioni della nostra rete neurale e i valori di ingresso dei sensori, generi in uscita valori in grado di controllare gli attuatori del robot Thymio 2.
  • 6. 6 PRIMO CAPITOLO Studio hardware e software della piattaforma robotica Thymio 1.1 Hardware La piattaforma robotica utilizzata è Thymio 2, un piccolo robot open source programmato utilizzando il linguaggio di programmazione C, progettato per l’uso didattico e dotato di una moltitudine di sensori e attuatori. Il dispositivo non offre la possibilità di definire i suoi comportamenti direttamente con linguaggi di programmazione ad alto livello, come ad esempio Java, Python o C. Il sistema robotico si può modellare in 4 sottosistemi: il sistema meccanico, di attuazione, di misura e di controllo. La prima parte del tirocinio, come spiegato in precedenza, si è focalizzata nell’individuare le caratteristiche dei sensori a disposizione, degli attuatori e soprattutto nel capire come controllare tali sistemi. Dunque ci si è concentrati prevalentemente sul quarto sistema.
  • 7. 7 Sistema di attuatori sistema di attuatori Gli attuatori del Thymio sono molteplici e sono controllabili tramite semplici istruzioni descritte in un linguaggio di scripting. I principali attuatori oggetto del nostro studio sono i due motori di Thymio, posti uno a destra e uno a sinistra del robot. Attraverso le variabili motor.right.target e motor.left.target si è in grado di definire la velocità alla quale le ruote rispettivamente di destra e di sinistra devono girare, il dominio dei valori assunto dalle variabile è l’insieme degli interi appartenenti all’intervallo [-500,500], dove 500 è associato ad una velocita di 20cm/s. Le altre variabili disponibili per i nostri due motori sono motor.right.speed, motor.left.speed che misurano la velocità della rotazione delle ruote e motor.right.pwm, motor.left.pwm che rileva la velocità di rotazione, attraverso l’invio di un segnale digitale avente un certo Duty Cycle. Durante l’analisi del funzionamento dei motori si è osservato che anche se si imposta motor.right.target = 500 e ci si aspetterebbe dunque un valore della variabile
  • 8. 8 motor.right.speed = 500, generalmente questo non accade a causa della limitata precisione dei sensori a nostra disposizione. I valori che le nostre variabili assumono sono soggetti a piccole variazioni nell’ordine di circa 20 rispetto al valore nominale. Per esempio definendo motor.right.target = 500 si possono ottenere valori di motor.right.speed nell’intorno di 480 e 520. Si tiene a precisare che anche se i valori possono essere controllati ad una velocità massima di 20cm/s, è possibile che la variabile motor.right.speed possa assumere velocità superiori a quelle del dominio di appartenenza, per esempio se il robot viene spinto con la mano. Gli altri attuatori sono: una serie di led disposti nel robot ognuno relativo ad una specifica funzione e un altoparlante se si ha la necessità di generare o utilizzare suoni. Per ulteriori dettagli sul funzionamento e le caratteristiche di questi sensori si rimanda alla documentazione ufficiale1 . 1 http://wiki.thymio.org/en:thymioapi Attuatori del robot Thymio
  • 9. 9 Sistema dei sensori I sensori del thymio sono molteplici, dotati di una discreta precisione per elementari applicazioni e sono controllabili tramite semplici istruzioni di codice. I principali sensori analizzati durante lo studio sono: i sensori di prossimità, di terra, di accelerazione sui tre assi dello spazio ed infine la misura della velocità dei motori precedentemente discussa. I sensori di prossimità sono in grado di rilevare la presenza di oggetti nelle immediate vicinanze. Thymio dispone di sensori di prossimità ottici per i quali il funzionamento si basa sulla riflessione di un fascio luminoso da parte dell'entità rilevata. Generalmente per i sensori ottici viene usato un fascio di raggi infrarossi, in quanto questo tipo di radiazione è facilmente distinguibile dai disturbi generati da fonti luminose ambientali. Sensori del robot Thymio
  • 10. 10 Nella figura sottostante si osserva quale sia il rapporto che intercorre tra la distanza in cm e la risposta dei sensori di prossimità, la calibrazione2 è stata effettuata su un normale foglio A4. I sensori di prossimità sono disposti sia sulla parte anteriore sia su quella posteriore. In particolare ve ne sono cinque davanti, tra di loro distanziati omogeneamente e due sul retro. 2 https://cyberbotics.com/doc/guide/thymio2#proximity-sensor-response-versus-distance Sensori del robot Thymio
  • 11. 11 I valori assunti dalle variabili relative ai sensori di prossimità sono memorizzati su un vettore di dimensione sette, chiamato prox.horizontal dove l’i-esimo elemento corrisponde ad uno specifico sensore. Partendo dalla posizione zero troviamo quello relativo alla parte anteriore destra e così via fino al quarto elemento corrispondente al rilevatore di sinistra, ed infine i due posteriori occupano la posizione 5 e 6 del nostro vettore. I sensori di prossimità vengono aggiornati automaticamente alla frequenza di 10Hz, l’intervallo dei valori è approssimativamente [0-5000] dove 0 indica che nessuno oggetto viene rilevato e 5000 l’impatto del robot con un oggetto. Si osservi che il valore 5000 è un limite teorico secondo ottenuto dalla lettura della documentazione ufficiale, ma nella realtà risulta essere un valore irraggiungibile. I sensori di ground hanno un comportamento simile a quelli di prossimità, Thymio ne ha a disposizione due e sono posizionati nella zona inferiore anteriore come illustrato nella figura sopra illustrata. Tali sensori emettono luce infrarossa e possono sfruttare la quantità di luce riflessa per determinare la presenza oppure l’assenza del terreno. In linea di massima, superfici nere assorbono quasi tutta la luce infrarossa. Supponiamo di ottenere un valore di prox.ground.reflected = 0, allora siamo in presenza di una superficie nera sulla quale sarà possibile che il robot si muova o meno in funzione del controllo che applica il programmatore. Per esempio possiamo definire che in presenza di tale condizione, sia comandato al robot di muoversi e posizionando un nastro sul terreno di colore nero si vedrà Thymio seguirne la traiettoria. Possiamo determinare anche l’intensità di luce presente nell’ambiente circostante con questi sensori tramite la variabile prox.ground.ambient.
  • 12. 12 L’ultima variabile analizzata è prox.ground.delta, che calcola la differenza tra la luce riflessa e quella dell’ambiente. Durante lo studio si è osservato una maggiore convenienza nell’utilizzare l’ultima variabile rispetto alle altre due e quindi durante la progettazione del controllore in sede si ha una preferenza nel suo utilizzo. L’accelerometro effettua il calcolo della forza rilevata rispetto alla massa di Thymio ed opera sui tre assi cartesiani. I valori vengono memorizzati su un vettore di dimensione tre chiamato acc e le misure in questo vettore appartengono all’intervallo [-32,32] dove il numero 23 corrisponde ad un accelerazione pari a quella di gravità (1g). Si ha una frequenza di aggiornamento dei pesi pari a 16Hz. Questo sensore è utile quindi a rilevare accelerazioni improvvise oppure un impatto con un oggetto. Acc[0] rappresenta un accelerazione sull’asse x, Acc[1] invece descrive l’asse y ed infine Acc[2] è relativa all’asse z. 1.2 Software Thymio utilizza Aseba, un’architettura basata su eventi3 , distribuita e modulare, si tratta di una rete di calcolatori nei quali la comunicazione è asincrona. Tutti i nodi inviano eventi e reagiscono a quelli ricevuti. Un evento consiste in un identificatore e un pacchetto dati, ossia il Payload. Spesso i nodi sono microcontrollori per i robot di piccole dimensioni; nel nostro caso, invece, sono i robot Thymio stessi a fungere da nodi. 3 ASEBA: A Modular Architecture for Event-Based Control of Complex Robots, St´ephane Magnenat, Student Member, IEEE, Philippe R´etornaz, Michael Bonani, Valentin Longchamp, Francesco Mondada, Member, IEEE.)
  • 13. 13 Lo strato di comunicazione può essere un qualunque bus provvisto di una logica multi- master. Nel robot Thymio viene impiegato il CAN BUS 4 anche se in aggiunta, opzionalmente, il robot può al suo interno possedere un calcolatore centrale, tipicamente con un sistema operativo Linux. Questo permette allo sviluppatore di utilizzare un ambiente di sviluppo dal suo computer. Il non sincronismo degli eventi permette ai microcontrollori di trasmettere i dati quando lo desiderano. Un comportamento di base non richiede un’unità centrale di controllo per la gestione della trasmissione delle informazioni. Proprio per questo un sensore, tipicamente, emette un evento solamente quando riceve parti di informazioni rilevanti. Ad esempio, il sensore di distanza potrebbe emettere un evento qualora un ostacolo si avvicini ad una certa soglia e solo quando questa transazione avvenga. La scelta di quale evento inviare dipende dal comportamento del robot, pertanto un robot coinvolto nell’evitare gli ostacoli non ha la necessità di utilizzare gli eventi di un robot che segue un oggetto. In Aseba la flessibilità è implementata separando il codice del microcontrollore in due parti: In primo luogo, la lettura di sensori, attuatori e lo strato di comunicazione sono implementati in codice nativo nel microcontrollore; su Thymio viene utilizzato il linguaggio C. Secondariamente, le applicazioni specifiche del programma che controlla l’emissione di eventi e le politiche di ricezione sono eseguite all’interno della macchina virtuale nei microcontrollori. I programmi sono realizzati in un semplice linguaggio di Scripting che permette allo sviluppatore di implementare comportamenti basati su eventi, lavorando su 4 https://it.wikipedia.org/wiki/Controller_Area_Network
  • 14. 14 un livello di astrazione superiore e permettendo di non preoccuparsi della gestione della memoria o di lavorare a basso livello. 1.3 Linguaggio In Aseba descriviamo il comportamento e le politiche di invio e ricezione in un linguaggio di Scripting. La ricezione di un evento provoca l’esecuzione di una parte precisa dello script. L’associazione del codice con gli eventi permette al programmatore di liberarsi dalla gestione dei momenti di esecuzione del codice. Sintatticamente il linguaggio Aseba è somigliante a quello di MATLAB, semanticamente è un semplice linguaggio imperativo con vettori di interi a 16 bit comprendenti il bit di segno e questo è l’unico tipo di dato permesso, questa caratteristica andrà a rilevarsi molto vincolante per le nostre applicazioni durante la progettazione. In addizione all’usuale condizione IF, Aseba dispone della condizione WHEN che risulta essere vera quando il confronto della condizione è vero, questo permette dunque di avviare
  • 15. 15 uno specifico comportamento in maniera ciclica fino a quando lo stato della condizione non cambia. Il linguaggio fornisce la possibilità di utilizzare le subroutine, che possono essere chiamate da una qualunque porzione del codice, anche questa caratteristica risulta vincolante per i nostri scopi in quanto non è previsto il concetto di funzione oppure di utilizzare funzioni ricorsive. Per effettuare calcoli più complessi come la manipolazione di un segnale, i microcontrollori sono dotati di funzioni native implementate in linguaggio C oppure in Assembler. Le funzioni native standard previste sono relative alle operazioni vettoriali e trigonometriche di base. Alcune caratteristiche principali e vincoli del linguaggio Aseba: le costanti non possono essere dichiarate direttamente nel codice, ma devono essere esplicitate attraverso l’utilizzo del pannello delle costanti nell’ambiente di sviluppo Aseba Studio. Gli eventi possono essere emessi dall’interno del nodo come per esempio dai sensori, oppure possono essere esterni ossia inviati da un altro nodo Aseba. Esempio di codice basato su eventi: var run = 0 onevent start run = 1 onevent stop run = 0
  • 16. 16 L’invio di eventi esterni avviene tramite la parola riservata emit, seguita dal nome dell’evento e il nome della variabile da inviare. E’ necessario non dimenticarsi di tenere conto della struttura dei dati e rispettarne le caratteristiche. Di seguito si ha un esempio di codice per invio di eventi esterni.5 onevent ir_sensors emit sensors_values proximity_sensors_values Limiti importanti da tenere in considerazione: • L’unico tipo di dato numerico ammesso è l’insieme degli interi dove si hanno a disposizione solamente 16 bit con segno, in altre parole un range [-32768,32767]. • I vettori non possono avere come argomento variabili, ma solamente costanti, il che limita di un certo grado la flessibilità dello sviluppo del controllore. Var x = 10 Var vettore[x] Questa sintassi non è valida; • Non è previsto il concetto di funzione inteso come nei linguaggi ad alto livello. Vige infatti la necessità di utilizzare in alternativa le subroutine per aggirare il problema. • Una divisione ha come risultato un arrotondamento per difetto e non per eccesso, questo porta alla propagazione di un certo errore nelle operazioni matematiche. 5 http://wiki.thymio.org/en:asebalanguage
  • 17. 17 • Le costanti non vengono dichiarate in linguaggio testuale ma attraverso l’ambiente di sviluppo. • Non sono previste matrici. Realizzeremo pertanto una matrice come insieme di due o più vettori. Esempio di codice Aseba per Thymio 2: Thymio segue un oggetto, ad esempio la mano. # reset outputs call sound.system(-1) call leds.top(0,0,0) call leds.bottom.left(0,0,0) call leds.bottom.right(0,0,0) call leds.circle(0,0,0,0,0,0,0,0) onevent prox when prox.horizontal[2] >= 2000 do motor.left.target = 350 motor.right.target = 350 end when prox.horizontal[0] >= 2000 do motor.left.target = 0 motor.right.target = 500 end when prox.horizontal[4] >= 2000 do motor.left.target = 500
  • 18. 18 motor.right.target = 0 end when (prox.horizontal[0] <= 1000 and prox.horizontal[1] <= 1000 and prox.horizontal[2] <= 1000 and prox.horizontal[3] <= 1000 and prox.horizontal[4] <= 1000) do motor.left.target = 0 motor.right.target = 0 end
  • 19. 19 Secondo Capitolo Tecniche di implementazione del controllore 2.1 Approccio centralizzato Un primo approccio alla realizzazione del controllore è quello di sviluppare il controllore in un linguaggio ad alto livello come, per esempio, il Python oppure C. Questa metodologia richiede la realizzazione di un canale di comunicazione e della gestione delle comunicazioni tra il linguaggio Python ed i nodi della rete Aseba. Il canale fisico può essere il filo Usb in dotazione del robot Thymio oppure la comunicazione può avvenire attraverso la rete wireless. Per i nostri scopi si privilegia una comunicazione senza fili. Il canale deve prevedere dei protocolli di comunicazione, difatti Aseba dispone della possibilità di utilizzare un bus dati DBUS6 in aggiunta ad un utility a riga di comando Asebamedulla7 che consente l’accesso ad una rete Aseba. Medulla è un software hub che consente a qualunque software Linux di accedere agli eventi e ai dati di un microcontrollore tramite D-BUS. Al momento il suddetto software è supportato solamente sui sistemi operativi Linux. Per controllare Thymio utilizzando il software Medulla è necessario in prima battuta andare sulla console del sistema operativo Linux e digitare: asebamedulla "ser:name=Thymio-II" 6 https://it.wikipedia.org/wiki/D-Bus 7 ASEBA Meets D-Bus: From the Depths of a Low-Level Event-Based Architecture into the Middleware Realm Stephane Magnenat and Francesco Mondada
  • 20. 20 La sintassi del comando è di seguito illustrata. Per ottenere maggiori informazioni sul comando Asebamedulla si esegue il seguente comando. In questo modo abbiamo connesso Medulla al nostro robot. E’ da sottolineare che ciò avviene come descritto solo nell’ipotesi che il nostro dispositivo Thymio sia identificato con il nome Thymio-II. Ora è possibile scrivere software in grado di inviare e ricevere comandi utilizzando la libreria DBus. Il passo successivo, dunque, consiste nel creare il nostro controllore nel linguaggio desiderato. Per esempio in Python una realizzazione di un controllore basato sui veicoli di Braitenberg8 è la seguente: import dbus import dbus.mainloop.glib import gobject from optparse import OptionParser 8 https://en.wikipedia.org/wiki/Braitenberg_vehicle
  • 21. 21 proxSensorsVal=[0,0,0,0,0] def Braitenberg(): #get the values of the sensors network.GetVariable("thymio-II", "prox.horizontal",reply_handler=get_variables_reply,error_ha ndler=get_variables_error) #print the proximity sensors value in the terminal Print(proxSensorsVal[0],proxSensorsVal[1],proxSensorsVal[2], proxSensorsVal[3],proxSensorsVal[4]) #Parameters of the Braitenberg, to give weight to each wheels leftWheel=[-0.01,-0.005,-0.0001,0.006,0.015] rightWheel=[0.012,+0.007,-0.0002,-0.0055,-0.011] #Braitenberg algorithm totalLeft=0 totalRight=0 for i in range(5): totalLeft=totalLeft+(proxSensorsVal[i]*leftWheel[i]) totalRight=totalRight+(proxSensorsVal[i]*rightWheel[i])
  • 22. 22 #add a constant speed to each wheels so the robot moves always forward totalRight=totalRight+50 totalLeft=totalLeft+50 #print in terminal the values that is sent to each motor print "totalLeft" print totalLeft print "totalRight" print totalRight #send motor value to the robot network.SetVariable("thymio-II","motor.left.target", [totalLeft]) network.SetVariable("thymio-II","motor.right.target", [totalRight]) return True def get_variables_reply(r): global proxSensorsVal proxSensorsVal=r def get_variables_error(e): print 'error:' print str(e) loop.quit()
  • 23. 23 if __name__ == '__main__': parser = OptionParser() parser.add_option("-s", "--system", action="store_true", dest="system", default=False,help="use the system bus instead of the session bus") (options, args) = parser.parse_args() dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) if options.system: bus = dbus.SystemBus() else: bus = dbus.SessionBus() #Create Aseba network network = dbus.Interface(bus.get_object('ch.epfl.mobots.Aseba','/'), dbus_interface='ch.epfl.mobots.AsebaNetwork') #print in the terminal the name of each Aseba NOde print network.GetNodesList() #GObject loop print 'starting loop' loop = gobject.MainLoop() #call the callback of Braitenberg algorithm
  • 24. 24 handle = gobject.timeout_add (100, Braitenberg) #every 0.1 sec loop.run() Gli elementi di maggiore importanza in questo esempio, che permettono il controllo del nostro dispositivo attraverso il linguaggio Python, sono di seguito elencati e descritti. Import dbus: importa la libreria per la comunicazione tra la nostra applicazione e il robot Thymio. le applicazioni che utilizzano il D-bus si connettono al demone del bus, che inoltra i messaggi tra le applicazioni. Per utilizzare il D-bus bisogna creare un oggetto Bus che rappresenti la connessione al demone9 del bus. bus = dbus.SessionBus(): crea una connessione al demone del bus e genera una sessione. network = dbus.Interface(bus.get_object('ch.epfl.mobots.Aseba', '/'), dbus_interface= 'ch.epfl.mobots.AsebaNetwork'): crea una rete di nodi Aseba. network.GetVariable("thymio-II", "prox.horizontal"): dalla rete di nodi ottiene i valori dei sensori di prossimità orizzontali. Il vantaggio principale di questo primo metodo è l’utilizzo di linguaggi di programmazione sia ad alto livello che a basso livello, ossia sviluppo di un controllore con ampi gradi di libertà e ricchezza di funzionalità offerte dai linguaggi. 9 https://it.wikipedia.org/wiki/Demone_(informatica)
  • 25. 25 Uno svantaggio invece è rappresentato dall’utilizzo di un’unità centrale che elabori i dati in ingresso e si occupi dell’invio dei dati in uscita. Si avranno dunque dei tempi di invio e ricezione dei dati non in tempo reale. Oltre allo svantaggio descritto uno dei requisiti del tirocinio e della tesi è che l’elaborazione dei dati avvenga su ogni singolo robot indipendentemente dalla workstation. 2.2 approccio distribuito Un secondo approccio è simile al primo metodo ma con l’aggiunta della separazione dell’esecuzione del controllore da un'unica unità centrale in modo da provvedere alla risoluzione del problema generato dal primo metodo. Ci si chiede ora come si possa realizzare tale soluzione. L’idea di base consiste nell’aggiunta di un modulo Hardware su ogni singolo dispositivo robotico Thymio. Ogni robot viene connesso tramite cavo Usb in dotazione a un dispositivo Raspberry oppure Arduino (si precisa che un supporto su Arduino ancora non è stato realizzato) ed alimentando il modulo con una batteria. In questo modo possiamo controllare Thymio semplicemente attraverso il Raspberry, che acquisisce i valori di ingresso dei sensori e che attraverso il controllore basato su una rete neurale calcola i valori di uscita dei motori del robot.
  • 26. 26 Fotografia del thymio con modulo Raspberry PI 4 Successivamente all’aggiunta della nostra unità si procede come è stato illustrato nel primo approccio, ossia si esegue l’istruzione: asebamedulla "ser:device=/dev/ttyACM0" supposto che il dispositivo Thymio sia identificato da /dev/ttyACM0". In conclusione, il vantaggio principale che si ottiene è quello di rendere indipendente il controllo da un unità di elaborazione centrale, ma uno svantaggio sorge immediatamente, non di tipo tecnico ma a livello di costi, in quanto sono necessari tanti moduli e batterie quanti sono i robot Thymio da controllare, il che porta a costi eccessivi salendo di numero unità in uso. Anche per soli 5 robot i costi di realizzazione iniziano ad avere un certo peso economico. Il costo di un modulo Raspberry pi 4 dotato di 4GB di Ram è di circa 110 euro, la batteria invece ha un costo che si aggira tra i 15 e i 30 euro, in conclusione per 5 moduli la spesa totale diventa all’incirca 700 euro.
  • 27. 27 2.3 Approccio diretto Il terzo approccio consiste nell’utilizzare il linguaggio di Scripting di Aseba e sviluppare il controllore attraverso approssimazioni e ovviando ai limiti imposti dal linguaggio. La parte di progettazione e di realizzazione del controllore è oggetto esclusivo della parte di tesi triennale del candidato, che avviene in concomitanza con il tirocinio. I passaggi fondamentali della terza fase sono riassunti di seguito: • Normalizzazione dei dati di ingresso. • Creazione di un’architettura di rete neurale Feedforward (che viene precedentemente concordata). • Implementazione attraverso dovute approssimazioni della funzione di uscita del singolo percettrone. • Normalizzazione dei valori di uscita per pilotare i motori. I vantaggi di tale approccio sono l’assenza di costi aggiuntivi per lo sviluppo e l’esecuzione diretta del controllore sul robot Thymio senza i ritardi di comunicazione con dispositivi esterni. Lo svantaggio invece è dovuto ai limiti imposti dal linguaggio a disposizioni e la moltitudine di approssimazioni che generano inevitabilmente una propagazione dell’errore sui nostri valori rispetto a quelli attesi.
  • 28. 28 TERZO CAPITOLO Progettazione Schema architettura della rete neurale l’architettura della rete neurale per il robot Thymio è costituita da uno strato di ingresso W, uno strato nascosto H, contenente un numero di neuroni pari al 65% del numero degli ingressi ed infine uno strato di uscità Y. Lo strato di ingresso è realizzato tramite un vettore di valori ottenuti dai sensori opportunamente selezionati per il robot Thymio. Il primo gruppo di sensori utlizzati sono quelli di prossimità, ossia cinque rilevatori sulla parte anteriore e due sul posteriore; i primi dati sono memorizzati nel vettore horizontalSensor[], i valori dei due sensori di terra invece sono immagazzinati nel vettore deltaSensor[]. Importanti sono anche i sensori di
  • 29. 29 accelerazione identificati dalla variabili vettoriale accSensor[], ed infine utilizziamo i sensori che stabiliscono la velocità dei motori, rappresentati da motorSpeed[]. Si precisa che la scelta di quali sensori utilizzare come ingressi della nostra rete neurale è definita nelle prime fasi della progettazione in maniera arbitraria, ed è stabilita dai comportamenti che si vuole ottenere o studiare. Lo strato di ingresso ha come vincolo di progetto di possedere un numero massimo di 16 neuroni. Il linguaggio Aseba consente di utilizzare variabili intere nell’intervallo di valori [-32768 : 32767], tenendo conto di questo vincolo, si è deciso di far sì che il singolo percettrone di ingresso possa assumere un valore intero dell’intervallo [0:128], di conseguenza i pesi della rete neurale sono limitati al dominio dei valori [-16,16]. Dunque il massimo valore teorico assumibile dai percettroni dello strato nascosto della rete neurale, durante il calcolo della combinazione lineare è pari al prodotto 128 ∙ 16 ∙ 16 = 32768 ; si osserva che tale valore supera il limite superiore imposto dal vincolo di progetto. Dato che 32768 è una cifra puramente teorica, la quale non può avere alcun riscontro nella realtà, si è comunque deciso di operare con gli intervalli precedentemente stabiliti. Infatti il valore 32768 è praticamente irraggiungibile, in quanto sarebbe necessario che ogni sensore assuma un valore pari al suo limite superiore, tale evento è irrealizzabile a causa della natura dei nostri rilevatori. Alcuni sensori del Thymio non si avvicinano mai al massimo valore assumibile anche in condizioni nelle quali ci si aspetta che tali valori vengano assunti.
  • 30. 30 Si precisa che durante la realizzazione del controllore si è tenuto conto di solamente 14 sensori, questa scelta è giustificata dal fatto di volere ottenere in fase di collaudo del controllore un comportamento semplice, come quello di evitare gli ostacoli durante la marcia. Lo strato intermedio ossia quello nascosto “H” prevede l’utilizzo di un numero di neuroni pari al 65% del numero di neuroni di ingresso, con arrotondamenti per eccesso. In definitiva sono ammessi un numero di neuroni massimo di undici neuroni intermedi, mentre in questa tesi si va ad utilizzare un numero pari a dieci, in quanto i nodi di ingresso sono pari a quattordici. I valori calcolati dai percettroni dello stato intermedio prima di essere utilizzati dallo strato successivo, vengono normalizzati secondo una certa logica che verrà in seguito. Lo Strato di uscita contiene 2 neuroni, che rappresentano i valori di controllo dei nostri attuatori, valori che verranno rappresentati nel nostro codice tramite il vettore motor[]. Si tiene a precisare che il numero dei neuroni di uscita è facilmente modificabile nei limiti dei vincoli già elencati nei capitolo precedenti. Per esempio se si desidera avere un certo comportamento logico dei led del robot, basterebbe l’aggiunta di un ciclo nella subroutine compute_output. In questa sede si è stabilito di affrontare la realizzazione dello strato software secondo 2 criteri qualitativi: in primo luogo, il codice deve essere scritto in maniera più semplice possibile per la lettura, secondariamente, il codice deve essere facilmente modificabile ed adattabile a seconda delle esigenze.
  • 31. 31 Si è ritenuto che questi due criteri siano primari rispetto al proposito di realizzare un codice con la massima efficienza di esecuzione possibile. Schema normalizzazione dei valori di ingresso . I valori di ingresso del vettore V sono generalmente compresi tra -500 e 5000, più sì ha che il dominio dei sensori di prossimità sono compresi nell’intorno [0 : 5000], i valori dei due sensori di Ground tra [0 : 1024], mentre quelli di accelerazione appartengono all’intervallo compreso [32 : 32], ed infine i valori dei sensori di velocità dei due motori operano in un intervallo [-500 : 500]. Il nostro vettore V necessità che l’insieme dei suoi elementi siano normalizzati, come si osserva dalla figura soprastante, affinché si ottenga un vettore di valori appartenenti all’intervallo [0,128]. I valori normalizzati vengono memorizzati nel nuovo vettore W, rappresentato nel nostro codice tramite sensorsNormalized [].
  • 32. 32 Schema semplificato sul calcolo della prima variabile di uscita Nei neuroni dello strato intermedio, lo strato software calcola il prodotto scalare tra il vettore di ingresso normalizzato W e il vettore dei pesi P rappresentanti la forza della singola connessione con il neurone dello strato nascosto. Questa operazione avviene per ogni singolo neurone dello strato intermedio. Il risultato della combinazione lineare prevede un massimo valore di 32767, il calcolo è fatto con l’ipotesi implicita che il valore del Bias sia nullo, mentre se è diverso da zero allora ne va tenuto conto e dunque fare le dovute modifiche allo schema dell’architettura della rete neurale e della parte di codice che stabilisce il risultato della sommatoria. Il valore della somma algebrica entra successivamente nel blocco chiamato funzione di attivazione che ha come dominio valori da -32768 a 32767, a questo punto in base alla funzione di attivazione implementata si avrà un codominio specifico.
  • 33. 33 In questa tesi si utilizza la tangente iperbolica, che viene inizialmente approssimata e successivamente adattata attraverso una dilatazione della funzione, in quanto nel linguaggio Aseba la tangente iperbolica non appartiene all’insieme delle funzioni native previste e l’impossibilita di utilizzare i numeri decimali ma solamente interi vincolati all’intervallo precedentemente discusso nella tesi. I valori d’uscita per la tangente iperbolica appartengono a [-8192,8192]. Blocco di Normalizzazione di ingresso Esempio di normalizzazione di ingresso. V è il vettore di ingresso, W è il vettore di ingresso Normalizzato. Nel blocco di normalizzazione di ingresso idealmente si andrebbe a calcolare i valori del vettore di ingresso normalizzato mediante la seguente formula: Wi = 128 Vi−Vmini Vmaxi −Vmini Piu precisamente sia dato il vettore degli ingressi
  • 34. 34 𝑉 = (V1, V2, … , V𝑛), Siano inoltre dati rispettivamente i vettori di minimo e di massimo della la nostra rete neurale, relativi ai singoli sensori considerati e definiti come: Vmin = (Vmin1 , Vmin2 , … , Vmin 𝑛 ), Vmax = (Vmax1 , Vmax2 , … , Vmax 𝑛 ), Si definisce il vettore di ingresso normalizzato W, il vettore ottenuto normalizzando gli ingressi di V come: W = (V1, V2, … , V𝑛) Tale che Wi = 128 Vi − Vmini Vmaxi − Vmini Si tiene a precisare che i valori che possono assumere i sensori del Thymio sono soggetti a disturbi e può darsi talvolta i valori siano superiori o inferiori ai limiti teorici previsti, difatti si andrà a tenere conto di questi eccessi, attraverso un controllo condizionale. Ossia se i valori sono minori dell’estremo inferiore previsto per il singolo sensore, si andrà a forzare il sensore a rilevare un pari al valore minimo teorico previsto e viceversa se i valori sono superiori al limite superiore si andrà ad imporre alla variabile il massimo previsto. Ad esempio se il nostro Thymio durante la marcia rileva una velocità di marcia pari a 520, il valore che andrà ad essere normalizzato è 500 che rappresenta la massima velocità di rotazione dei motori.
  • 35. 35 Blocco funzione di attivazione. Ogni funzione di attivazione implementata è soggetta a qualche forma di adattamento e di approssimazione a causa dei vincoli limitanti del nostro linguaggio. Di seguito si andrà a vedere la logica attraverso la quale in questa tesi si approssima la funzione tangente iperbolica. La tangente Iperbolica è una funzione avente come dominio tutti i valori della retta reale e come codominio, valori compresi tra meno uno ed uno come nella figura sottostante. Tangente iperbolica. In prima battuta si cerca una trasformazione espressa tramite una funzione razionale, che abbia un andamento simile alla tangente iperbolica nell’intervallo [-4,4], ossia una funzione in grado di approssimare la tanh(x). Questo requisito è realizzabile tramite la relazione biunivoca : y = 27x + x3 27 + 9x2
  • 36. 36 Funzione che approssima la tangente iperbolica. Si osservi che la funzione approssimazione per x che tende all’infinito, questa non sia limitata ma tenda ad infinito al contrario della tangente iperbolica. Un altro punto da tenere conto è che le 2 funzioni sono circa identiche al valore intero x uguale a quattro, per poi successivamente, la differenza tra le due funzioni tende a divergere. lim x→+∞ 27x + x3 27 + 9x2 = +∞ lim x→+∞ tanh (𝑥) = 1 A questo punto si procede con una dilatazione della funzione ottenuta. Ossia sapendo che il massimo risultato ottenibile dalla combinazione lineare è 32767 e che il numero uno per la tangente iperbolica si ottiene per x uguale a quattro, allora sì imposta come coefficiente di dilatazione Il rapporto 𝑐 = 32767 4 ≅ 8192. La cifra come risultato del rapporto rappresenta il massimo valore della nostra funzione approssimata ed elaborata, ossia al valore 32767 corrisponde la costante c. lo stesso discorso vale per la parte negativa della funzione. In conclusione si definisce la nuova applicazione che approssima la nostra tangente iperbolica opportunamente approssimata come:
  • 37. 37 𝑦 = 27 𝑥 𝑐 + ( 𝑥 𝑐 )3 27 + 9( 𝑥 𝑐 )2 ≈ 𝑐𝑡𝑎𝑛ℎ( 𝑥 𝑐 ) Approssimazione della tangente iperbolica soggetta ad adattamento.
  • 38. 38 Blocco di Normalizzazione intermedio Schema sulla normalizzazione dello strati di uscita. Nel blocco di normalizzazione intermedio si vuole andare mappare ogni valore uscente dai neuroni dello strato nascosto appartenente a [-8192,8192] ad un valore del intervallo compreso tra -128 e 128, in quanto siamo sempre difronte ai vincoli di progetto inizialmente discussi. La scelta in sede di normalizzare su questo intervallo è standard per tutti neuroni dello strato nascosto e i successivi strati, affinché si possa mantenere una certa omogeneità nella rete neurale. La normalizzazione può essere scelta anche in maniera arbitraria, però necessita di ulteriori studi sulle sue conseguenze e di fare attenzioni ai vincoli software ogni volta che si va a ridefinire l’architettura della rete neurale. Dunque è preferibile
  • 39. 39 mantenere queste impostazioni per evitare errori non previsti durante l’esecuzione del programma. La formula utilizzata per la normalizzazione è: 𝑂𝑖𝑛 = 𝑂 𝑖𝑛 64 Si tiene a precisare che nello schema della figura sopra, troviamo scritto 𝑂𝑖 = 𝑐 𝑡𝑎𝑛ℎ( 𝑆𝑖 𝑐 ), mentre nella partica si utilizza la formula approssimativa 𝑂𝑖 = 27 𝑆 𝑖 𝑐 +( 𝑆 𝑖 𝑐 ) 3 27+9( 𝑆 𝑖 𝑐 ) 2 . Blocco di Normalizzazione di uscita: Schema sulla normalizzazione di uscita L’esigenza di avere una normalizzazione di uscita è dettata dal fatto che i motori del Thymio, possono essere controllati con valori compresi tra -500 e 500, mentre i valori
  • 40. 40 derivanti dai neuroni di uscita sono compresi in un intervallo più ampio di quello necessario [-8192,8192]. La formula di risoluzione è: 𝑈𝑖𝑛 = 500∗𝑈𝑖 8192 Schema finale.
  • 41. 41 CAPITOLO QUARTO Realizzazione dello strato software del sistema di controllo Nel seguente capitolo si andrà a discutere e spiegare delle principale componenti del codice. Normalizzazione di ingresso Inizialmente vengono dichiarate le variabili che andranno a contenere i valori ricevuti dai sensori. var horizontalSensor[7] var deltaSensor[2] var accSensor[3] var motorSpeed[2] Successivamente si crea un vettore contenente tutti i sensori che verranno impiegati. var sensors[14] Infine sarà necessario avere un vettore che dovrà contenere i valori di ingresso normalizzati. var sensorsNormalized[14] Si osservi come aggiungendo o togliendo qualunque sensore vige la necessità di andare a cambiare il numero di elementi nelle variabili sensors e sensorsNormalized, cosi onde evitare spiacevoli errori durante la compilazione o comportamenti inattesi. Ora per far sì che il Thymio operi finché si desidera, si crea un ciclo che viene eseguito finché non viene premuto il tasto centrale del Thymio, durante questo loop si andrà ad aggiornare i valori dei sensori Periodicamente. while (button.center==0) do
  • 42. 42 call leds.top(255,0,0) #vetttori sensori horizontalSensor=[prox.horizontal[0],prox.horizontal[1],prox .horizontal[2], prox.horizontal[3],prox.horizontal[4],prox.horizontal[5],pro x.horizontal[6]] deltaSensor= [prox.ground.delta[0],prox.ground.delta[1]] accSensor=[acc[0],acc[1],acc[2]] motorSpeed = [motor.left.speed,motor.right.speed] sensors = [horizontalSensor,deltaSensor,accSensor,motorSpeed] elaborazione dati ingresso si richiede ora di inserire i valori dei sensori in una variabile da elaborare di nome inSensor e si andrà a chiamare la subroutine di normalizzazione dei valori di ingresso. Successivamente l’elemento i-esimo viene memorizzato nel vettore riguardante i sensori normalizzati. #elaborazione dati ingresso for i in 0:13 do inSensor = sensors[i] #modifiche in corso if (i<=6) then min =0 max =5000 end if (i>=7 and i<=8) then min =0 max =1024 end
  • 43. 43 if (i>=9 and i<=11) then min =-32 max =32 end if (i>=12) then min =-500 max =500 end callsub normalize1 sensorsNormalized[i] = inSensorNorm end Nella subroutine di normalizzazione di ingresso , il primo passo è quello di controllare che se abbiamo valori maggiori del massimo allora impostiamo il valore della variabile inSensor uguale al valore massimo, se invece il valore è inferiore al minimo si assegna ad inSensor il valore del minimo. Utilizzando la funzione nativa math.muldiv si va ad utilizzare la formula. Wi = 128 Vi − Vmini Vmaxi − Vmini La funzione nativa ha la seguente sintassi: math.muldiv (variabile risultato, primo fattore, secondo fattore, divisore). sub normalize1 if inSensor>max then inSensor = max end if inSensor<min then inSensor = min end call math.muldiv(inSensorNorm,128,inSensor-min,max-min) Alla fine del ciclo di normalizzazione si chiama la funzione che si occupa di svolgere le operazioni della rete neurale, che a sua volta immediatamente chiama un'altra subroutine che si occupa di calcolare i valori di uscita dei neuroni nascosti.
  • 44. 44 Ossia callsub compute_output è la prima funzione che chiama la subroutine tramite l’istruzione callsub calcoloCentrale. La seguente subroutine è implementata come segue : for i in 0:13 do coeff = sensorsNormalized[i]*pesineurone1[i] a = a + coeff end callsub tanhx output1[0]=y a=0 Questo ciclo for viene riscritto per un numero di volte pari ai neuroni dello strato intermedio. La Subroutine calcoloCentrale svolge l’operazione di combinazione lineare tra i pesi e i valori di ingresso e successivamente applicare a tale risultato la funzione approssimata tangente iperbolica. Si osservi che pesineurone1 è riferita ai pesi tra gli ingressi e il primo neurone dello stato intermedio. La variabile output1 si riferisce al uscita del primo neurone. La subroutine tanhx è realizzata come segue : sub tanhx input=a if (input>0) then call math.muldiv(funx1,27,input,8192) call math.muldiv(funx2,1,input,8192) call math.muldiv(funx2,(funx2+1),(funx2+1)*(funx2+1),1)
  • 45. 45 call math.muldiv(funx3,1,input,8192) call math.muldiv(funx3,9,(funx3+1)*(funx3+1),1) call math.muldiv(funx,8192,funx1+funx2,funx3+27) end if (input<0) then call math.muldiv(funx1,27,input,8192) call math.muldiv(funx2,1,input,8192) call math.muldiv(funx2,(funx2-1),(funx2-1)*(funx2-1),1) call math.muldiv(funx3,1,input,8192) call math.muldiv(funx3,9,(funx3-1)*(funx3-1),1) call math.muldiv(funx,8192,funx1+funx2,funx3+27) end y=funx si osservi che nel codice in funzione se l’input è positivo o negativo si aggiunge 1 o si sottrae uno, questa scelta permette una maggiore precisione dell’approssimazione ed evitando valori nulli quando in realtà sono compresi tra 0 e 1. Ora, calcolati i valori di uscita dei neuroni intermedi, si va a svolgere le stesse operazioni con qualche modifica per i le due uscite che pilotano i motori. Le due uscite sono memorizzate nel vettore motor[] avente una dimensione pari a 2.
  • 46. 46 for i in 0:9 do input2 = output1[i] callsub normalize_output hiddenNeurons[i] = output2 end callsub neuromotor_compute for i in 0:1 do input2 = motor_output[i] callsub normalize_motors motor[i] = output2 end La normalizzare dell’output di un neurone della rete neurale viene svolta come segue: sub normalize_output call math.muldiv(output2,1,input2,64) Terminata l’esecuzione della subroutine compute_output si va a controllare i nostri attuatori tramite le istruzioni: motor.left.target = motor[0] motor.right.target = motor[1].
  • 47. 47 Di sopra si è fornito una panoramica sulle funzioni di base del codice realizzato dal candidato, il codice come si può osservare è stato scritto con il criterio di essere facilmente modificabile e adattabile a seconda delle esigenze, si precisa che l’aggiunta o l’eliminazione di fonti di ingresso al nostro controllore prevedono l’aggiunta o l’eliminazione di righe di codice in maniera manuale e anche il cambiamento dei valori nei cicli e le dimensioni dei vettori, la realizzazione è tale che se si sbaglia le dimensioni di un vettore, il compilatore andrà a segnalare tale inconsistenza. Un'altra possibilità è quella di poter aggiungere nuove funzioni di attivazione come subroutine e andare a richiamarle facilmente, ossia sostituendo il nome della subroutine per i singoli neuroni. Il codice completo del controllore è fornito assieme alla seguente relazione, accompagnata da un video illustrativo su una delle possibili applicazioni del controllore dopo avere fornito dei pesi ragionevoli alla rete neurale.
  • 48. 48 CAPITOLO QUINTO Analisi e collaudo del controllore Per effettuare il collaudo del nostro controllore si è stabilito arbitrariamente l’esperimento da effettuare. Ossia sono stati definiti i comportamenti che il Thymio deve realizzare. L’esperimento si effettua con Thymio, il cui obiettivo è quello di muoversi all’interno di un percorso, evitando gli ostacoli durante il suo cammino. Il fine della sperimentazione è la raccolta dei dati e una sua successiva analisi, necessaria per valutare quale sia la differenza tra i risultati attesi e quelli della realtà. Simulare il robot con in esso implementato il controllore realizzato dal candidato, definisce i risultati attesi, mentre testando Thymio nella realtà si definiscono i risultati cosiddetti reali. L’assenza di un simulatore virtuale del Thymio diventa un vincolo sulle modalità di realizzazione del collaudo e dell’analisi del nostro controllore. Dunque si è optato per realizzare un programma in linguaggio Python, capace di simulare il funzionamento del controllore realizzato. Lo pseudo-simulatore del sistema di controllo del robot è in grado, inoltre, sia di raccogliere i dati relativi agli ingressi del Thymio, sia di effettuare una loro analisi, che consiste nel valutare quale sia la differenza tra i valori di uscita calcolati da Thymio nella realtà e i valori calcolati dallo pseudo-simulatore. In questo capitolo si andrà a spiegare come sono stati raggiunti gli obbiettivi prefissati nella premessa di sopra.
  • 49. 49 In primo luogo ai fini dell’esperimento, i pesi della rete neurale sono stati scelti affinché fossero operativi soltanto i sensori di prossimità anteriori e la velocità di rotazione dei motori di destra e sinistra. Si ricorda che la rete neurale non è mai stata allenata e non è mai stato definito per essa un obbiettivo da raggiungere. Le fasi principali per il collaudo sono le seguenti: Il primo passo è quello di effettuare la raccolta e la memorizzazione in un file di testo o preferibilmente in formato CSV dei dati relativi ai sensori di ingresso del Thymio durante la marcia. Allo strato software realizzato si definisce la variabile vettoriale collection1[16] che dovrà contenere i valori dei sensori utilizzati dal controllore della rete neurale e i due valori di uscita calcolati. Successivamente si crea una variabile globale, di nome data1 aventi 16 parametri, direttamente dall’editor Aseba come nell’immagine di sotto. Schermata degli eventi globali nell'editor Aseba
  • 50. 50 A questo punto si utilizza durante il ciclo di esecuzione del robot l’istruzione emit data1 collection1, che invia dal Thymio ad Aseba Studio la variabile globale data1 avente come parametri i 16 definiti precedentemente. Prima di eseguire Thymio si clicca con il tasto destro del mouse su data1 negli eventi globali e infine su grafico data1. Ora comparirà una finestra grafico nell’editor come nella seguente immagine. Nell’istante in qui si andrà ad avviare l’esperimento il programma inizierà a registrare e plottare i valori stabiliti. Schermata del plotter di grafici in Aseba Studio
  • 51. 51 Schermata grafico di Aseba Studio durante la marcia di Thymio. Cliccando su salva con nome si ottiene un file di testo avente nella prima colonna il Timetamp e nelle restanti colonne, invece, i valori di ingresso rilevati dai sensori e i due valori di uscita calcolati.
  • 52. 52 Esempio di File di CSV con i valori memorizzati durante la marcia del Thymio. Un’ ulteriore elaborazione con Excel o altri strumenti a scelta, permette di adattare il file al simulatore. Nel nostro caso viene eliminata la riga di Timestamp prima di avviare il programma dello pseudo-simulatore. Ora avendo raccolto i dati ed adattati allo scopo sì va a realizzare lo pseudo-simulatore del nostro controllore in linguaggio Python. Il programma legge i dati del file CSV, riga per riga e considera le prime 14 colonne riguardanti i sensori, ossia simula di operare nelle stesse condizioni dell’esperimento. A questo punto, il controllore calcola i valori di uscita e li memorizza all’interno di 2 liste, una relativa al motore di destro e l’altra per quello sinistro. Il codice del seguente software verrà fornito in allegato insieme alla tesi.
  • 53. 53 Bisogna poi aggiungere delle funzionalità di analisi dei nostri dati, ossia si va in primo luogo a calcolare la differenza in valore assoluto tra i valori ottenuti con la simulazione e i valori ottenuti da Thymio. Secondariamente, si effettua un plot della lista delle differenze dei risultati del motore destro e del motore sinistro. Si tiene a precisare che i conti realizzati dal controllore simulato non sono soggetti a forti approssimazioni come per il controllore realizzato sul Thymio, questo è dovuto al fatto che nel simulatore si possono operare con numeri decimali, inoltre gli arrotondamenti sono fatti sia per eccesso che per difetto, invece che solo per difetto come nel Thymio e in ultima analisi la tangente iperbolica nel simulatore non è stata approssimata come per il controllore a nostra disposizione. Durante la fase di collaudo si è fatto percorrere al Thymio un certo cammino con ostacoli, si sono quindi salvati i dati in un file di testo e adattati al programma di simulazione. A questo punto, si esegue il simulatore che estrae i dati dal file CSV e si ottengono i seguenti risultati:
  • 54. 54 Grafici della velocità di rotazione della ruota destra. In verde risultati teorici o attesi, in blu i valori reali ottenuti. Grafico relativo alla differenza tra la velocità di rotazione del motore destro reale e il valore atteso tutto in valor assoluto. Nella maggior parte degli esperimenti effettuati si è osservato un andamento del discostamento medio tra i valori d’uscita reali e quelli attesi appartenente all’incirca all’intorno del valore 7.
  • 55. 55 La Seconda osservazione come si evince dal grafico è che mentre la velocità di rotazione dei motori per i valori teorici muta in maniera piuttosto regolare, nella realtà si è riscontrato la velocità muta in modo repentino e ha un insieme di valori ben definito.
  • 56. 56 CONCLUSIONI Il presente studio si è posto l’obbiettivo di studiare la tecnologia a nostra disposizione al fine di progettare e realizzare un controllore per piattaforma robotica basato su rete neurale, il quale in seguito è stato, in seguito, collaudato. Gli studi effettuati hanno portato a considerare un’architettura di una rete neurale avente quattordici ingressi, uno strato nascosto avente un numero pari al 65% del numero di neuroni di ingresso ed infine due percettroni di uscita. Si è scelto inoltre di considerare soltanto pesi facenti parte dell’intervallo [-16,16] e di utilizzare come funzione di attivazione un’approssimazione della tangente iperbolica. Tali scelte sono giustificato dai limiti tecnologici ai quali si è subito dovuto far fronte; il principale limite è stato il fatto che si potessero utilizzare soltanto numeri interi definiti su un intervallo limitato [-32768,32767]. Con la ricerca svolta è stato possibile raggiungere l’obbiettivo di realizzare il controllore, in particolare ci si è concentrati sulla normalizzazione dei valori all’ingresso dei percettroni affinché non venissero superati i vincoli tecnologici stabiliti come premessa dello studio. Nell’ultima fase dell’analisi effettuata si è cercato di individuare quale fosse il divario tra i risultati ottenuti durante la sperimentazione del controllore e i risultati della simulazione, concludendo grazie ai nostri esperimenti che tale divario in media risulta relativamente basso.
  • 57. 57 Sebbene lo scopo della tesi sia stato raggiunto, i risultati qui ottenuti ed illustrati possono ancora fornire molti spunti per studi futuri. Ad esempio il controllore potrebbe essere utilizzato come supporto per la fase di allenamento della rete neurale.