Progettazione, realizzazione ed implementazione del sistema di

annuncio pubblicitario
UNIVERSITÀ DEGLI STUDI DI ROMA
“TOR VERGATA”
FACOLTÀ DI INGEGNERIA
CORSO DI LAUREA IN INGEGNERIA
DELL’AUTOMAZIONE
A.A. 2009/2010
Tesi di Laurea
PROGETTAZIONE, REALIZZAZIONE ED
IMPLEMENTAZIONE DEL SISTEMA DI CONTROLLO
ED AUTOLOCALIZZAZIONE DI UN MICROMOUSE
RELATORE
CANDIDATO
Ing. Daniele Carnevale
Giuseppe Bernieri
CORRELATORE
Ing. Francesco Martinelli
A mio padre.
Indice
Ringraziamenti
1
Introduzione
2
1 Robot LineFollower
6
1.1
L’idea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.2
Descrizione struttura . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
1.3
Motori in corrente continua CC . . . . . . . . . . . . . . . . . . . . .
7
1.4
Ponte H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.5
PWM e duty cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
1.6
Sign-Magnitude PWM e Locked Anti-phase PWM . . . . . . . . . . .
12
1.7
Sensori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
1.8
Encoder Ottici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
1.9
Arduino Mega . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
1.10 Alimentazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
1.11 Implementazione della legge di controllo . . . . . . . . . . . . . . . .
21
2 Robot micromouse
25
2.1
Robot Rover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
2.2
Descrizione struttura . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
INDICE
I
INDICE
2.3
Motori passo-passo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
2.3.1
Dimensionamento motori . . . . . . . . . . . . . . . . . . . . .
28
2.3.2
Micro-relè e libreria stepper.h . . . . . . . . . . . . . . . . . .
32
2.4
Scheda sensori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.5
Scheda di potenza, controllo e comunicazione . . . . . . . . . . . . . .
38
2.6
Arduino Nano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
2.7
Modulo wireless: XBee . . . . . . . . . . . . . . . . . . . . . . . . . .
40
2.8
Alimentazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
3 Filtro di Kalman Esteso
42
3.1
Introduzione al filtro . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
3.2
Modello cinematico . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
3.2.1
Determinazione sperimentale delle incertezze del moto . . . .
45
3.3
Modello di misura . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
3.4
Implementazione del filtro . . . . . . . . . . . . . . . . . . . . . . . .
51
3.5
Simulazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
4 Conclusioni e sviluppi futuri
55
Appendice A - Schemi ed immagini
58
Appendice B - Listati dei programmi
63
Elenco delle figure
81
Bibliografia
82
INDICE
II
Ringraziamenti
Desidero innanzitutto ringraziare l’Ing. Daniele Carnevale per la sua disponibilità
ed il prezioso supporto sia didattico che morale. Inoltre ringrazio l’Ing. Francesco
Martinelli che, con i suoi consigli, mi ha aiutato a dirimere i dubbi sul mio lavoro.
Grazie ai colleghi ed ai compagni di laboratorio che in questi anni hanno condiviso
con me l’esperienza universitaria.
Vorrei esprimere la mia sincera gratitudine ai miei genitori per l’affetto ed il supporto:
grazie a papà, correlatore aggiunto, a mamma ed a mia sorella Iaia per il prezioso
contributo grafico.
Grazie a tutti gli amici ma soprattutto a chi in questi anni, anche nei momenti difficili,
è sempre stato al mio fianco, in particolare Mauro ed Eros. Infine un ringraziamento
speciale va ad Elena.
Introduzione
1
Introduzione
Nel corso degli ultimi decenni la tecnologia si è evoluta esponenzialmente, permettendo
all’uomo di raggiungere traguardi sempre più sorprendenti. L’abbattimento dei costi
di produzione ha permesso alla tecnologia di essere alla portata di tutti, ed è grazie
a queste condizioni che la robotica, scienza giovane, è riuscita a svilupparsi anche in
campi diversi da quello naturale di elezione, ovvero il campo industriale di alto livello.
La robotica è definita come la scienza che, studiando il comportamento degli esseri
intelligenti, cerca di emulare, in maniera automatizzata, quei compiti che potrebbero
risultare troppo difficili o inadatti all’operatore umano. Grazie alla sua natura globale,
la robotica trova applicazioni in molti campi di utilizzo: dall’industria alle applicazioni
domestiche, dall’arte alla biologia, dalla medicina all’intrattenimento. Tra tali campi,
seppur molteplici, è bene tener presente che talvolta non esiste una vera linea di
confine.
La realizzazione di un robot spesso nasce da una semplice idea e viene generalmente
affrontata su due piani distinti:
ˆ lo studio, la progettazione e la realizzazione elettromeccanica del robot;
ˆ l’analisi e l’implementazione della logica di controllo.
Per la realizzazione elettromeccanica del robot è necessario un progetto dettagliato
dei cinematismi e degli azionamenti necessari alla sua movimentazione. Il progetto e
Introduzione
2
Introduzione
la realizzazione del sistema di controllo, invece, richiedono l’analisi del modello matematico che descrive la dinamica del robot in relazione agli obiettivi da raggiungere.
Entrambe le fasi, poi, devono convergere nella realizzazione di un meccanismo in grado di rispondere correttamente alle istruzioni fornite dalla logica di controllo, al fine
di ottenere il risultato pratico desiderato. Anche questo lavoro di tesi affronta la realizzazione dei robot proposti (robot linefollower e robot rover) con tale approccio. Gli
esemplari di robot progettati e realizzati verranno descritti sia nella parte puramente
elettronica e meccanica sia nella parte relativa al controllo, che rappresenta in effetti il
cuore scientifico del lavoro. Entrambe le parti vengono trattate in maniera sinergica e
coordinata, in modo da realizzare il dispositivo richiesto in maniera efficiente e rispondente alle specifiche fissate. Le soluzioni di controllo impiegate prevedono l’utilizzo
di sistemi di prototipazione microprogrammabili della famiglia Arduino. Tali sistemi,
molto economici ma contemporaneamente molto versatili e dotati di prestazioni di
tutto rispetto, sono attualmente di grande interesse per gli sviluppatori di soluzioni di
controllo a basso costo grazie anche alla semplicità di realizzazione delle applicazioni
ed alla flessibilità di utilizzo.
Questo lavoro di tesi può essere collocato in tre contesti applicativi: la robotica
industriale, la domotica e l’intrattenimento. Per quanto riguarda la robotica industriale, visto l’evolversi e la diffusione sempre maggiore di strumenti di automazione
e controllo all’interno dei moderni complessi industriali, lo studio svolto sui robot
linefollower, sui robot rover e sui sensori di cui essi sono dotati ricalca le esigenze e
le linee di ricerca e sviluppo di molte realtà industriali moderne. Per lo stesso motivo, anche se con fini diversi, le esperienze sperimentali condotte con tale tipologia
di robot nelle applicazioni per uso domestico, la cosiddetta domotica, hanno fatto
emergere ed esaltato gli utilizzi di tali dispositivi, e della robotica in generale, per
Introduzione
3
Introduzione
facilities casalinghe, quali, ad esempio, i robot-spazzini. Infine, grazie alla versatilità
ed alle ridotte dimensioni dei robot presi in esame, le loro applicazioni rientrano anche
nel campo dell’intrattenimento; in tale contesto, ad esempio, possono essere considerate le micromouse competitions, competizioni di livello internazionale, riconosciute
dall’IEEE, dove piccoli robot rover, dotati di attuatori, sensori e di microcontrollore,
devono risolvere autonomamente un labirinto nel minor tempo possibile.
Per una più agevole lettura, nel seguito è riportata la struttura del lavoro di tesi.
1. nel Capitolo 1 viene discusso l’approccio di primo livello alla robotica sperimentale affrontato nel lavoro di tesi: la realizzazione e l’implementazione di un
piccolo robot linefollower; questa tipologia di robot, grazie al microcontrollore,
ai sensori ed agli attuatori di cui è dotato, ha come unico scopo quello di seguire
una linea disegnata sul pavimento con la massima precisione possibile.
2. nel Capitolo 2 viene discussa la realizzazione pratica e l’implementazione di
un mini-robot rover, in grado di evitare gli ostacoli. La realizzazione è stata
inoltre orientata verso la realizzazione di un prototipo di micromouse. Vengono analizzati i singoli componenti della struttura, dai sensori agli attuatori,
dal microcontrollore ai circuiti elettronici integrati di pilotaggio e di potenza
utilizzati.
3. nel Capitolo 3 viene discusso il metodo di controllo scelto ed utilizzato per l’implementazione del mini-robot rover: il Filtro di Kalman Esteso. Viene analizzato
il modello matematico discreto associato all’applicazione e viene illustrata, passo dopo passo, la tecnica utilizzata per implementare tale controllo, partendo da
misure odometriche effettuate sperimentalmente per ottenere la stima necessaria
dei parametri del filtro.
Introduzione
4
Introduzione
4. nel Capitolo 4 sono brevemente riassunti i risultati conseguiti nella sperimentazione eseguita con i robot realizzati, al fine di evidenziarne le caratteristiche
salienti e le performance. Vengono discussi inoltre i possibili sviluppi futuri del
lavoro svolto.
Introduzione
5
Capitolo 1
Robot LineFollower
In questo capitolo verrà analizzata la progettazione e la realizzazione
di un Robot LineFollower.
1.1
L’idea
Alcuni dei primi veicoli con guida automatizzata sono stati i LineFollower. Come è
chiaro dal nome, l’obiettivo principale di questo tipo di robot è quello di seguire una
linea dipinta o incorporata nel pavimento. La maggior parte di questi robot adottano
un algoritmo di controllo molto semplice che ha come unico scopo quello di mantenere
la linea da seguire al centro del sistema di sensori utilizzato per il rilievo della linea
stessa, mediante una opportuna azione sui motori che ne determinano il movimento.
Un importante esempio di utilizzo di tale robot è quello riferito all’uso che se ne è
fatto per la costruzione e manutenzione del CERN di Ginevra: per spostare le grandi
apparecchiature all’interno dei lunghi tunnel del Large Hadron Collider sono stati
utilizzati dei montacarichi mobili che utilizzano la tecnologia del Linefollower al fine
di avere la massima precisione negli spostamenti in uno spazio molto ristretto.
6
Cap. 1 Robot LineFollower
§1.2 Descrizione struttura
Figura 1.1: Tunnel del LHC, a destra la linea che segue il LineFollower.
1.2
Descrizione struttura
Il prototipo allestito è costituito da una base in lega metallica alla quale è stata fissata
la struttura del doppio motoriduttore Tamiya Twin Motor Gearbox, contenente i
motori in corrente continua. Al di sopra di tale base è stata inserita una bread board
di dimensioni 82mm x 54mm con 400 punti di connessione utilizzata per la gestione
del circuito elettronico. Con l’ausilio di distanziali è stata posta al di sopra della bread
board la scheda Arduino Mega. Le ruote utilizzate, in asse con i motoriduttori, sono
in gomma, hanno un diametro di 4.5 cm ed uno spessore di 2.8 cm.
1.3
Motori in corrente continua CC
Per la movimentazione del robot sono stati utilizzati due motori in corrente continua.
I motori utilizzati sono i FA-130, capaci di ruotare, a vuoto e senza riduzione, a 13230
giri al minuto. Visti gli alti valori di velocità di rotazione, tali motori necessitano di
motoriduttori, anche al fine di incrementare la coppia prodotta. Per il robot è stato
7
Cap. 1 Robot LineFollower
§1.3 Motori in corrente continua CC
Figura 1.2: Il LineFollower realizzato.
Figura 1.3: Motore CC e Tamiya Motor Gearbox
utilizzato il doppio motoriduttore Tamiya Twin Motor Gearbox, caratterizzato da un
ingombro ridotto (7.5cm di lunghezza) e di predisposizione per accogliere entrambi i
motori utilizzati. Il moto è trasmesso alle ruote mediante due assi esagonali da 3mm.
Il motoriduttore è assemblabile con due diversi rapporti di riduzione: 58:1 o 203:1. In
entrambi i casi, i motori producono una coppia motrice sufficiente a muovere il robot.
8
Cap. 1 Robot LineFollower
1.4
§1.4 Ponte H
Ponte H
Per la gestione dei due motori in corrente continua si è scelto di utilizzare un ponte H
integrato L293DNE che permette il pilotaggio dei motori direttamente dalla scheda
Arduino. La versione utilizzata del componente comprende al suo interno anche i
diodi che permettono di evitare i problemi dovuti ad eventuali correnti di ricircolo dei
motori. Con riferimento allo schema elettronico del componente, è stata utilizzata la
configurazione Two-Phase Motor Driver. In particolare, avendo utilizzato un metodo
di controllo del tipo Locked Anti-phase (illustrato più dettagliatamente nel seguito),
ai pin 1 e 9 sono state collegate due uscite digitali della scheda Arduino per gestire
l’attivazione rispettivamente del motore di destra e di sinistra; ai pin 2,7,10 e 15 sono
state collegate le uscite PWM dell’Arduino per controllare la velocità ed il verso di
rotazione dei motori; ai pin 3 e 6 è collegato il motore di sinistra mentre ai pin 11 e
14 quello di destra; al pin 8 è collegata l’alimentazione dei motori mentre al pin 16
l’alimentazione della logica dell’integrato; infine, ai pin 4, 5, 12, 13 è collegata la massa.
Per le informazioni tecniche di utilizzo di tale integrato si rimanda al datasheet[1].
9
§1.5 PWM e duty cycle
Cap. 1 Robot LineFollower
Figura 1.4: Il ponte H.
1.5
PWM e duty cycle
Per il controllo della velocità e del verso di rotazione dei motori è stato utilizzato
un approccio che prevede l’impiego di un segnale di tipo PWM. Un segnale PWM
(Pulse Width Modulation, ovvero modulazione a variazione della larghezza d’impulso)
è assimilabile, in effetti, ad un segnale ad onda quadra con duty cycle variabile.
Nelle usuali applicazioni, mediante un segnale PWM è possibile controllare la corrente
assorbita da un carico elettrico modulando opportunamente il duty cycle. Più nel
10
§1.5 PWM e duty cycle
Cap. 1 Robot LineFollower
dettaglio, un segnale PWM è caratterizzato da:
ˆ Frequenza costante f;
ˆ Duty cycle variabile;
ˆ due possibili valori di ampiezza (nel nostro caso 0V e +5V).
Il duty cycle (D) è il rapporto percentuale tra il periodo (TON ) nel quale il segnale è
alto (+5V) e il periodo totale:
1
= TON + TOFF
f
(1.5.1)
TON
TON
· 100 =
· 100
T
TON + TOFF
(1.5.2)
T =
D=
Figura 1.5: Duty Cycle.
Con riferimento alla figura, un duty cycle del 50% corrisponde ad un’onda quadra
che assume valore alto (+5V) per il 50% del periodo, mentre un duty cycle dell’80%
corrisponde ad un’onda quadra che assume valore alto (+5V) per l’80% del periodo e
basso (0V) per il restante 20%. Tra tutti i valori intermedi, è rilevante un D del 50%
11
Cap. 1 Robot LineFollower
§1.6 Sign-Magnitude PWM e Locked Anti-phase PWM
poiché il tempo TON e quello TOFF si equivalgono, dando luogo ad una onda quadra
standard.
1.6
Sign-Magnitude PWM e Locked Anti-phase PWM
Esistono due modalità di utilizzo del segnale PWM per il pilotaggio di un ponte H: il
PWM Sign-Magnitude e il PWM Locked Anti-Phase.
Figura 1.6: Sign-Magnitude PWM.
Per il controllo SM (Sign-Magnitude) sono necessari due segnali: (a) un segnale PWM
con duty cycle variabile tra 0 e 100%, che stabilisce la velocità di rotazione del motore;
(b) un segnale logico costante che determina il verso di rotazione del motore (segnale
basso per rotazione in un verso, segnale alto per rotazione nell’altro verso).
Nello specifico, il pilotaggio SM è realizzato inviando il segnale PWM all’ingresso
di enable del ponte H e comandando la direzione di rotazione del motore tramite
i due ingressi di controllo. Tali due ingressi devono essere comandati da segnali
invertiti; utilizzando un elemento inverter aggiuntivo si evita di dover ricorrere a due
porte digitali d’uscita del microcontrollore, riducendo il numero di uscite impiegate
12
Cap. 1 Robot LineFollower
§1.6 Sign-Magnitude PWM e Locked Anti-phase PWM
ed evitando di dover implementare funzioni aggiuntive. In questo modo, il motore
presenta coppia motrice solo nel tempo TON del PWM e si ferma nel tempo TOFF ;
in realtà non è un vero e proprio arresto, in quanto il motore continua a girare per
inerzia senza ulteriore coppia motrice. Se il PWM ha un duty cycle del 100%, il motore
presenta sempre coppia motrice e ciò si traduce nella massima velocità possibile nella
direzione scelta tramite i segnali logici di controllo. Se il PWM ha un duty cycle
dello 0%, il motore non presenta coppia motrice e non si muove, a prescindere dalla
direzione selezionata mediante i segnali di controllo. I valori intermedi di duty cycle
inducono variazioni di velocità dal minimo (0%) al massimo (100%). Questa tecnica
presenta le seguenti caratteristiche:
ˆ sono necessari due segnali (PWM e segnale logico di controllo) per comandare
ogni motore;
ˆ il motore è libero di ruotare anche con D=0%, per cui partenza e arresto sono
più lenti della configurazione LAP (discussa nel seguito);
ˆ il motore non consuma da fermo.
13
Cap. 1 Robot LineFollower
§1.6 Sign-Magnitude PWM e Locked Anti-phase PWM
Figura 1.7: Locked Anti-Phase PWM.
Il controllo LAP (Locked Anti-Phase) si basa sulla stessa configurazione circuitale
del controllo SM, ma con i segnali di interesse scambiati di posto. In particolare, il
segnale PWM è posto agli ingressi di ogni lato del ponte H utilizzando un invertitore
per ottenere segnali in opposizione di fase; il segnale logico di controllo è invece
applicato agli ingressi di enable, unicamente per abilitare o disabilitare il lato del ponte
d’interesse (dal punto di vista operativo, tale segnale può anche essere mantenuto
sempre attivo).
Applicando un PWM con duty cycle del 50%, il motore gira in un verso per tutto il
periodo di ON mentre gira nell’altro per tutto il periodo di OFF; poiché la frequenza
del PWM è molto alta, l’inerzia del motore non consente di seguire istantaneamente
il moto imposto, con il risultato che il motore presenta un moto apprezzabile nullo.
Applicando un segnale PWM con duty cycle maggiore del 50%, il motore ruoterà in
un verso con velocità maggiore all’aumentare del duty cycle, raggiungendo la velocità
massima per D=100%. Applicando un segnale PWM con duty cycle minore del 50%,
il motore ruoterà nel verso opposto con velocità maggiore al diminuire del duty cycle,
raggiungendo la velocità massima per D=0%. Per il controllo LAP può quindi bastare
14
Cap. 1 Robot LineFollower
§1.6 Sign-Magnitude PWM e Locked Anti-phase PWM
anche solo un segnale di comando (l’enable può essere fissato alto se non necessario):
l’onda quadra con D variabile stabilisce sia la velocità che il verso di rotazione, come
precedentemente descritto. Questo controllo presenta le seguenti caratteristiche:
ˆ è necessario solo un segnale per poter variare la velocità e la direzione;
ˆ l’arresto del motore è immediato;
ˆ la partenza del motore è più reattiva;
ˆ il motore consuma anche da fermo;
ˆ la risoluzione per la regolazione di velocità è la metà della corrispondente ri-
soluzione del controllo SM (variazione 50-100% o 50%-0% per il controllo LAP
contro variazione 0-100% per il controllo SM).
Per la realizzazione del robot LineFollower è stato utilizzato il controllo LAP; non
sono stati però utilizzati gli elementi inverter aggiuntivi, per cui è stato necessario
programmare ed utilizzare 4 uscite PWM (a coppie invertite) del microcontrollore
invece di 2.
15
§1.7 Sensori
Cap. 1 Robot LineFollower
1.7
Sensori
Figura 1.8: Sensore QTI.
Per rilevare la linea sul pavimento sono stati utilizzati due componenti QTI1 . Essi
usano un sensore di riflettività ottica infrarossa QRD1114 che consiste in un insieme
emettitore/ricevitore capace di differenziare le superfici scure, con basso potere riflettente, da quelle chiare, con un alto potere riflettente. In base al tipo di superficie che
il sensore rileva, viene fornito un determinato valore di tensione in uscita. Il sensore
inoltre è dotato di filtro per la luce solare. Per il tipo di applicazione realizzato, i due
sensori utilizzati sono stati montati sulla parte inferiore del robot, in asse con le ruote
e posti parallelamente l’uno a l’altro ad una distanza pari alla larghezza della linea che
il robot deve seguire. Le uscite dei sensori sono state collegate a due porte analogiche
di ingresso dell’Arduino, in modo da prelevare i segnali in tensione necessari per il
funzionamento dell’algoritmo di controllo.
1
Per il datasheet si veda [2].
16
Cap. 1 Robot LineFollower
1.8
§1.8 Encoder Ottici
Encoder Ottici
Per il controllo e la stima dello spostamento (misura odometrica) attraverso il moto
dei motori si è fatto ricorso ad un sistema di encoder ottici. L’encoder ottico è un
dispositivo elettro-optomeccanico che converte la posizione o la velocità angolare del
suo asse rotante in segnali elettrici digitali. Per il robot linefollower, tali encoder,
di tipo incrementale, sono stati realizzati artigianalmente in laboratorio utilizzando
componenti di vecchi mouse.
Figura 1.9: Il prototipo di encoder realizzato.
Dopo aver disassemblato i mouse, sono stati prelevati dalla scheda elettronica i diodi
LED, che emettono luce infrarossa, ed i fotodiodi associati, cercando di mantenere
la struttura fisica e le mutue distanze per preservare la precisione dell’insieme. Tra
le due coppie di emettitori e ricevitori sono state inserite due rotelline, calettate
sull’asse di rotazione dei motori, con 6 fori disposti lungo l’arco della circonferenza
ed equidistanziati; in tal modo, l’encoder presenta una risoluzione di 6 impulsi per
ogni giro. Data la ridotta dimensione degli encoder, è stato possibile montare il tutto
nello spazio tra le ruote e la struttura del motoriduttore. Al fine di ottenere un
17
Cap. 1 Robot LineFollower
§1.8 Encoder Ottici
segnale ben definito in uscita agli encoder, è stato utilizzato l’integrato M74HC142 .
con funzione di Trigger di Schmitt. Il Trigger di Schmitt è un particolare tipo di
circuito squadratore a soglia, ovvero un circuito che consente di trasformare un segnale
analogico in ingresso variabile con continuità in un segnale in uscita che varia soltanto
tra due valori fissati di tensione, a seconda che l’ingresso superi una soglia di tensione
predefinita o sia inferiore ad una seconda soglia di tensione (più bassa) anch’essa
predefinita (funzionamento con isteresi).
Figura 1.10: Funzione del Trigger di Schmitt
La commutazione dell’uscita dovrebbe avvenire in un tempo idealmente nullo; in
pratica, è sufficiente che il tempo di commutazione sia molto minore del periodo caratteristico di variazione del segnale in ingresso. Il funzionamento degli encoder è
stato verificato attraverso analisi dei segnali all’oscilloscopio; in tal modo è stata verificata la generazione di un’onda quadra ben definita con periodo variabile in funzione
della velocità di rotazione dell’asse dei motori. La misura dello spostamento è stata
quindi realizzata inviando i due segnali in uscita dal Trigger di Schmitt a due ingressi
analogici dell’Arduino.
Nonostante la buona definizione dell’onda quadra cosı̀ ottenuta, non è stato possibile
ottenere anche l’informazione del verso di rotazione dei motori; infatti, per ottenere il
necessario sfasamento fra i segnali d’uscita utilizzabile per la determinazione del verso
di rotazione sarebbe stata necessaria una maggiore precisione nel posizionamento e
2
Per il datasheet si veda [3].
18
§1.9 Arduino Mega
Cap. 1 Robot LineFollower
Figura 1.11: Segnali in uscita dal fotodiodo (sotto) e in uscita dal Trigger di Schmitt
(sopra).
nell’allineamento mutuo degli encoder; la realizzazione artigianale del sistema, che ha
avuto soprattutto un valore didattico, non ha consentito di raggiungere anche questo
obiettivo.
1.9
Arduino Mega
Figura 1.12: Arduino Mega.
La scheda di prototipazione Arduino Mega3 utilizza il microcontrollore della Atmel Atmega1280. Essa dispone di 54 porte digitali di ingresso/uscita (14 delle quali possono
essere usate in modalità PWM), 16 ingressi analogici e di tutti i componenti elettronici
3
Per il datasheet si veda [4].
19
Cap. 1 Robot LineFollower
§1.9 Arduino Mega
che servono per la gestione del microcontrollore. In effetti, la scheda Arduino Mega è
risultata, al termine della sperimentazione, sovradimensionata per l’applicazione realizzata, ma in fase di progettazione si è seguito il principio di poter disporre di risorse
sovrabbondanti in modo da poter introdurre al momento anche soluzioni inizialmente
non previste. A conclusione, le risorse utilizzate sono state: 4 uscite PWM per pilotare i motori attraverso il ponte H, 2 ingressi analogici per acquisire i dati forniti
dai sensori QTI, 2 ingressi analogici per gli encoder di spostamento; l’alimentazione
è stata regolata a 5V anche per consentire l’alimentazione dei circuiti logici dei sensori. La programmazione della memoria Flash di 256KB del microprocessore avviene
tramite una connessione USB al Personal Computer. È presente anche una memoria
EEPROM di 4KB che può essere utilizzata per salvare i dati di funzionamento del
sistema, vista la natura della memoria che conserva l’informazione anche in assenza di
alimentazione. Nel nostro caso, la memoria EEPROM è stata utilizzata per memorizzare il numero totale degli impulsi forniti dagli encoder durante il percorso effettuato
dal robot. È importante tenere presente che il produttore assicura una vita media
della memoria EEPROM di 100.000 cicli di scrittura, mentre per la memoria Flash di
10.000 cicli di scrittura.
20
Cap. 1 Robot LineFollower
1.10
§1.10 Alimentazione
Alimentazione
Per l’alimentazione dei motori è stato utilizzato un pacco batterie composto da quattro batterie ricaricabili formato AA al NiMh, ognuna da 1.3V ed in grado di erogare
2.600 mAh, collegate in serie per una tensione totale di 5.2V. Per l’alimentazione
della scheda Arduino Mega e dei circuiti logici aggiuntivi è stata utilizzata una batteria ricaricabile 9V al NiMh da 150 mAh. Infine, l’alimentazione dei sensori è stata
prelevata direttamente dal pin 5V della scheda Arduino.
1.11
Implementazione della legge di controllo
Grazie alla soluzione costruttiva adottata, ovvero quella di utilizzare due sensori di
linea posti esternamente al bordo della linea da seguire, il controllo implementato è
semplicemente un controllo di tipo proporzionale: quando uno dei due sensori “vede”
il bordo della linea, il microcontrollore pilota i motori per una rotazione in asse che
permetta di mantenere la linea all’interno dei binari virtuali individuati dai sensori. Il
funzionamento del robot si è dimostrato robusto anche per percorsi tortuosi realizzati
con linea singola non intersecante.
Per maggiore dettaglio, in seguito è riportato il codice utilizzato. In esso si evidenzia
come il controllo sia realizzato mediante la scelta di un’opportuna soglia rispetto alla
quale confrontare le uscite dei sensori; al superamento di tale soglia il controllo attiva
le routine di pilotaggio dei motori in modo da indurre la variazione di moto necessaria
a mantenere il robot al centro della linea da seguire.
21
Cap. 1 Robot LineFollower
§1.11 Implementazione della legge di controllo
Figura 1.13: Il LineFollower nel percorso di test
22
Cap. 1 Robot LineFollower
§1.11 Implementazione della legge di controllo
Listing 1.1: Programma di controllo Linefollower
1
#define
#define
#define
#define
#define
#define
#define
#define
en1 41 //ENABLE1 ponte H
en2 37 //ENABLE2 ponte H
in1 12 //ingresso 1 ponte H
in2 13 //ingresso 2 ponte H
in3 8 //ingresso 3 ponte H
in4 10 //ingresso 4 ponte H
sensorPin1 6
sensorPin2 3
int sensorValue1 = 0;
int sensorValue2 = 0;
int i = 255;
void setup() {
Serial.begin(9600);
pinMode(en1, OUTPUT);
pinMode(en2, OUTPUT);
digitalWrite(en1, HIGH);
digitalWrite(en2, HIGH);
}
void loop() {
//legge il valore dal sensore 1
sensorValue1 = analogRead(sensorPin1);
//legge il valore dal sensore 2
sensorValue2 = analogRead(sensorPin2);
do{
sensorValue1 = analogRead(sensorPin1);
sensorValue2 = analogRead(sensorPin2);
analogWrite(in1,255);
analogWrite(in2,0);
analogWrite(in3,255);
analogWrite(in4,0);
} while(sensorValue1 < 400 && sensorValue2 < 400);
23
Cap. 1 Robot LineFollower
§1.11 Implementazione della legge di controllo
do {
sensorValue1 = analogRead(sensorPin1);
sensorValue2 = analogRead(sensorPin2);
i−−;
analogWrite(in1,0);
analogWrite(in2,i);
analogWrite(in3,i);
analogWrite(in4,0);
} while (sensorValue1 > 400 && sensorValue2 < 400 || i == 0);
do {
sensorValue1 = analogRead(sensorPin1);
sensorValue2 = analogRead(sensorPin2);
i−−;
analogWrite(in1,i);
analogWrite(in2,0);
analogWrite(in3,0);
analogWrite(in4,i);
} while (sensorValue1 < 400 && sensorValue2 > 400 || i == 0);
}
24
Capitolo 2
Robot micromouse
In questo capitolo verrà descritta la realizzazione di un robot rover
dettagliando i componenti utilizzati e l’architettura complessiva del
prototipo.
2.1
Robot Rover
Figura 2.1: Concept
L’idea alla base dello sviluppo di questo tipo di robot è quella di realizzare un sistema
semovente in grado di evitare gli ostacoli sulla base dei segnali provenienti da opportuni sensori di prossimità. Da tale obiettivo principale possono poi derivare obiettivi
25
§2.1 Robot Rover
Cap. 2 Robot micromouse
più particolari, quali, ad esempio, quello di individuare l’uscita in un labirinto (micromouse competition [5]). Per il robot rover realizzato, è stata utilizzata una versione
ridotta della scheda microprocessore Arduino, la Arduino Nano, le cui caratteristiche
e modalità di utilizzo sono illustrate nello specifico paragrafo. Per la movimentazione
del robot, sono stati utilizzati piccoli motori passo-passo di tipo amatoriale. È stata
anche sperimentata una modalità di comunicazione online fra il robot ed il Personal
Computer che fa da supervisore attraverso moduli TX/RX wireless che utilizzano il
protocollo XBee.
Figura 2.2: Il robot realizzato.
26
Cap. 2 Robot micromouse
2.2
§2.2 Descrizione struttura
Descrizione struttura
Il robot è costituito da una base portante in lega metallica di forma rettangolare, di
lati 6.5 cm x 9 cm, alla quale sono intelaiati i motori. Al di sopra della base sono stati
creati, con l’ausilio di distanziali metallici, tre livelli cosı̀ caratterizzati:
ˆ Primo livello: vano batteria, di altezza 2.5 cm;
ˆ Secondo livello: scheda sensori, di altezza 3 cm;
ˆ Terzo livello: scheda di potenza, controllo e comunicazione.
Il robot ha due ruote motrici montate direttamente sugli alberi dei motori, con diametro e spessore rispettivamente di 5.7 cm e di 1.5 cm. Gli ulteriori punti di appoggio
necessari per l’equilibrio del robot sono forniti da tre Ball Caster con sfere in plastica,
due di diametro 9.4mm posizionate frontalmente e una di diametro 12.7mm posta sul
retro. La forma geometrica del robot completamente assemblato è di un parallelepipedo rettangolo di dimensioni 11cm x 11cm x 13cm. Il peso del robot, senza pacco
batterie, è di 600 grammi.
2.3
Motori passo-passo
Per movimentazione del robot sono stati scelti due motori passo-passo unipolari gemelli. I motori passo-passo (o stepper motor) sono particolari motori nei quali il moto
è ottenuto mediante attrazione magnetica generata da una sequenza di solenoidi (fasi)
posti lungo la corona circolare del motore (statore) rispetto ad un rotore di materiale
magnetico sagomato con denti salienti. Alimentando il primo solenoide della serie, il
dente più vicino del rotore subisce un’attrazione magnetica e si allinea al solenoide,
27
Cap. 2 Robot micromouse
§2.3 Motori passo-passo
Figura 2.3: Motore passo-passo unipolare.
eseguendo un passo; diseccitando il solenoide ed eccitando quello successivo si produce
una nuova attrazione sul dente del rotore, che si sposta ulteriormente allineandosi al
secondo solenoide ed eseguendo un altro passo; ripetendo la sequenza di eccitazione in
maniera impulsiva con più solenoidi e con riferimento a più denti del rotore, il motore
ruota uniformemente con una velocità corrispondente alla frequenza degli impulsi di
eccitazione dei solenoidi. Le sequenze di impulsi di eccitazione sono prodotte generalmente mediante circuiti logici a microprocessore. Per la realizzazione del robot
rover sono stati utilizzati due motori PM42L-048-171: essi hanno 4 fasi, una risoluzione di 7.5° per passo, richiedono una tensione di alimentazione di 12V ed hanno un
assorbimento medio di corrente pari a 0.28A.
2.3.1
Dimensionamento motori
Il dimensionamento dei motori passo-passo è un punto fondamentale nella progettazione dei robot che li utilizzano. Tale dimensionamento è effettuato sulla base della
coppia motrice richiesta, che deve essere sempre soddisfatta dalla coppia erogabile
dal motore in ogni condizione di moto. Come precedentemente accennato, nel funzionamento dei motori passo-passo la regolazione della velocità avviene variando la
1
Per il datasheet si veda [6].
28
Cap. 2 Robot micromouse
§2.3 Motori passo-passo
frequenza degli impulsi di pilotaggio del motore stesso. Nel momento in cui improvvisamente, per motivi connessi al moto richiesto al sistema, aumenta la frequenza degli
impulsi di pilotaggio del motore, lo stesso tenta di adeguarsi istantaneamente alla
nuova velocità: se la coppia disponibile risulta sufficiente, vi è una brusca accelerazione, praticamente istantanea; se la coppia disponibile non basta a vincere la coppia di
carico, l’inerzia e gli attriti, il motore non riesce ad adeguarsi al nuovo regime di moto
e, semplicemente, si ferma; senza un intervento esterno, il motore non è più in grado di
ripartire: in tal caso, si dice che il motore “ha perso il passo”. Una simile reazione si ha
anche nel caso di applicazione improvvisa di una maggiore coppia resistente al motore
già in moto. Inoltre, fissato il regime di funzionamento (ovvero fissata la frequenza
degli impulsi di pilotaggio), un motore passo-passo non può rallentare: se la coppia
resistente è relativamente piccola, la velocità non cambia assolutamente; se la coppia
è troppo grande, il motore perde il passo e si ferma. Tale comportamento deriva dal
fatto che la velocità del motore è univocamente e rigidamente definita dalla logica
di funzionamento (sequenza e frequenza degli impulsi di pilotaggio) e che la corrente
assorbita è fissa ed è praticamente indipendente dalla coppia meccanica resistente.
Entrando nel dettaglio, la caratteristica di funzionamento di un motore passo-passo
è descritta mediante due curve, definite come curva di pull-in e curva di pull-out. La
curva di pull-in rappresenta graficamente i valori di coppia di carico massime che,
applicate al motore, permettono la partenza ad una data velocità, mentre la curva di
pull-out indica i valori di coppia di carico massime che, con il motore in moto ad una
data velocità, possono essere applicate senza far perdere il passo al motore. Da notare
che entrambe le curve indicano che il motore passo-passo possiede una caratteristica
inversa della coppia rispetto alla velocità: più alta è la velocità (e quindi la frequenza
degli impulsi di pilotaggio), più bassa è la coppia prodotta dal motore (similmente ai
29
Cap. 2 Robot micromouse
§2.3 Motori passo-passo
motori in corrente continua).
Figura 2.4: Curve di pull-in e pull-out.
Se il motore si trova a funzionare al di sotto della curva di pull-in (zona verde), esso
può subire cambi di velocità e inversioni di marcia senza precauzioni particolari: è
sufficiente modificare la frequenza e/o la sequenza con cui sono applicate le correnti
di eccitazione alle fasi. La zona fra le due curve (zona rossa) è chiamata zona di
slew-range: il motore può funzionare in tale zona solo a condizione di evitare bruschi
cambiamenti di velocità; il cambiamento di frequenza deve quindi essere continuo
e tanto più lento quanto più ci si allontana dalla curva di pull-in verso la curva di
pull-out. La curva di pull-out indica quale è la massima coppia resistente che può
essere applicata al motore in rotazione ad una data velocità costante senza causarne
il blocco. In pratica rappresenta le massime prestazioni del motore. Se il motore
si trova a dover funzionare al di sopra della curva di pull-out, la coppia prodotta è
insufficiente a garantire la rotazione ed il motore perde il passo. La caratteristica
coppia/velocità dipende non solo dal motore ma anche dal complesso dei dispositivi
meccanici ad esso collegati (un aumento del momento di inerzia del carico causa un
30
Cap. 2 Robot micromouse
§2.3 Motori passo-passo
restringimento dell’area di pull-in) e dal tipo di pilotaggio (una migliore gestione delle
correnti fa spostare in avanti entrambe le curve, soprattutto alle velocità più elevate).
In applicazioni critiche è possibile utilizzare un sensore di velocità per riconoscere
l’eventuale blocco del motore; tuttavia, spesso si preferisce ignorare il problema ed,
eventualmente, utilizzare motori con coppia sovrabbondante.
Nel robot realizzato, i motori passo-passo sono pilotati direttamente dalle uscite digitali dell’Arduino attraverso l’integrato ULN2004A2 . Tale integrato è costituito da
una serie di sette paia di transistor Darlington: grazie alla loro elevata potenza in
uscita ed alla piccola potenza richiesta in ingresso, ogni Darlington può pilotare direttamente una fase dei motori passo-passo a partire dalla specifica uscita digitale
dell’Arduino. Dal momento che sono necessarie otto coppie di Darlington (2 motori
e 4 fasi per ogni motore), sono stati utilizzati due integrati ULN2004A. Tali integrati
sono stati montati su zoccolo per una eventuale facile sostituzione e posti sulla scheda
di potenza, controllo e comunicazione (descritta più dettagliatamente nel seguito).
2
Per il datasheet si veda [8].
31
Cap. 2 Robot micromouse
2.3.2
§2.3 Motori passo-passo
Micro-relè e libreria stepper.h
Ovviamente, un robot rover deve poter gestire contemporaneamente ed indipendentemente i due motori e quindi far muovere le ruote in funzione del percorso individuato
mediante l’elaborazione dei segnali provenienti dai sensori di prossimità. Tuttavia,
la scheda Arduino Nano è funzionalmente costruita per eseguire sequenzialmente una
sola serie di operazioni preprogrammate alla volta (nello specifico, le funzioni di pilotaggio dei motori passo-passo tramite la libreria stepper.h disponibile proprio a tale
scopo) e quindi non può eseguire due funzioni di controllo contemporaneamente ed
indipendentemente per i due motori utilizzati. Al fine di superare tale limitazione,
è stata individuata una soluzione funzionale implementata mediante un opportuno
hardware aggiuntivo costituito da due microrelè pilotati anch’essi dalla scheda Arduino. Più dettagliatamente, si è osservato che, una volta fissato il regime di funzionamento dei motori passo-passo in termini di velocità di rotazione, per far eseguire al
robot tutti i movimenti necessari (avanti, indietro, rotazione sul proprio asse a destra, rotazione sul proprio asse a sinistra) è sufficiente pilotare unicamente il verso di
rotazione dei motori: se i motori ruotano in verso opposto, il robot procede avanti o
indietro; se ruotano nello stesso verso, il robot ruota sul proprio asse nella direzione
del motore che avanza. Inoltre, dato che il verso di rotazione di un motore passo-passo
unipolare è stabilito unicamente dalla sequenza di alimentazione delle fasi, se viene
utilizzata una tecnica di pilotaggio ad una fase per volta (wave mode), basta modificare opportunamente tale sequenza per invertire il senso di rotazione del motore.
Per comprendere meglio quest’ultima affermazione, nella figura seguente è riportata
la sequenza di alimentazione delle fasi secondo la tecnica wave mode; tale tecnica
permette la rotazione del motore per passi interi alimentando una sola fase per volta.
Come è possibile dedurre dalla figura 2.5, per ottenere la rotazione destrorsa del
32
Cap. 2 Robot micromouse
§2.3 Motori passo-passo
Figura 2.5: Pilotaggio motore passo-passo
motore è necessario alimentare in sequenza le fasi A-C-B-D, mentre per ottenere la
rotazione sinistrorsa è necessario alimentare in sequenza le fasi A-D-B-C; per cui, per
invertire il senso di rotazione del motore basta scambiare fra loro, nella sequenza di
pilotaggio, le alimentazioni delle fasi C e D. Sulla base di tali considerazioni, si è
trovata la seguente soluzione:
ˆ il controllore Arduino, attraverso quattro uscite digitali, genera le quattro se-
quenze di impulsi di pilotaggio delle fasi contemporaneamente per entrambi i
motori, mediante l’utilizzo della libreria stepper.h appositamente predisposta;
33
Cap. 2 Robot micromouse
§2.3 Motori passo-passo
tali impulsi sono collegati in parallelo agli ingressi dei due gruppi Darlington
per l’alimentazione delle fasi dei due motori;
ˆ prima di giungere alle fasi, le sequenze di impulsi di pilotaggio, già amplifica-
ti, sono inviate a due microrelè, uno per motore, i cui contatti permettono di
scambiare le alimentazioni delle fasi C e D;
ˆ l’eccitazione di ognuno dei microrelè è pilotata da due uscite logiche della scheda
Arduino, opportunamente programmate in funzione di una semplice tabella di
attivazione che dipende dal movimento in avanti o in indietro che è richiesto
al singolo motore; in tal modo, alle fasi di ogni motore giunge la sequenza di
impulsi di pilotaggio corrispondente al movimento richiesto.
Al fine di dettagliare ulteriormente la procedura messa a punto, nella pagina seguente
è riportato l’estratto di codice implementato per la funzione descritta.
34
Cap. 2 Robot micromouse
§2.3 Motori passo-passo
Listing 2.1: Programma test microrelè e stepper.h
1
#include <Stepper.h>
5
#define STEPS 48
#define RELE1 4
#define RELE2 3
7
Stepper stepper(STEPS, 12, 11, 10, 9);
3
9
11
13
void setup()
{
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
stepper.setSpeed(40);
}
15
17
19
21
void loop()
{
//FAI 100 PASSI AVANTI
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, HIGH);
delay(10);
stepper.step(100);
23
//FAI 100 PASSI A SINISTRA
digitalWrite(RELE1, LOW);
digitalWrite(RELE2, HIGH);
delay(10);
stepper.step(100);
25
27
29
//FAI 100 PASSI A DESTRA
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, LOW);
delay(10);
stepper.step(100);
31
33
35
//FAI 100 PASSI INDIETRO
digitalWrite(RELE1, LOW);
digitalWrite(RELE2, LOW);
delay(10);
stepper.step(100);
37
39
41
}
35
Cap. 2 Robot micromouse
§2.3 Motori passo-passo
Come si può notare, l’attivazione della funzione di pilotaggio dei motori passo-passo è
riferita ad un solo motore, in quanto le sequenze di impulsi sono utilizzate contemporaneamente ed in parallelo per entrambi i motori. Il codice mostra come, dopo aver
predisposto le definizioni iniziali ed il settaggio della velocità dei motori, viene ciclicamente ripetuta sempre la stessa istruzione di libreria relativa al pilotaggio dei motori
(istruzione stepper.step(100), esegui 100 passi), ma, grazie alla diverse possibili attivazioni dei microrelè, possono essere ottenuti in maniera differenziata tutti e quattro
i movimenti possibili del robot, con elevata precisione dal momento che i comandi di
pilotaggio sono sempre identici per entrambi i motori. Inoltre, per sopperire ad eventuali piccoli ritardi nell’attivazione dei microrelè (comunque del tutto trascurabili), è
stato inserito un lieve ritardo (10ms) fra l’attivazione dei microrelè e la generazione
degli impulsi di pilotaggio dei motori; tale ritardo non ha alcuna conseguenza sul
movimento sincrono dei motori. Per aumentare la risoluzione del moto, può essere
previsto un numero minore di passi da eseguire per ogni ciclo di funzionamento. Da
notare che tale soluzione è del tutto generale e può essere utilizzata in qualsiasi applicazione che richieda direzioni di moto differenti ma perfettamente sincrone fra due o
più motori passo-passo pilotati in wave mode. In Appendice A è riportato lo schema
elettrico relativo alla soluzione ideata.
36
§2.4 Scheda sensori
Cap. 2 Robot micromouse
2.4
Scheda sensori
Figura 2.6: Scheda sensori
Per il rilevamento degli ostacoli sono stati utilizzati i sensori ad infrarosso Sharp
2D120X3, in grado di rilevare ostacoli ad una distanza da 4 a 30 cm. Essi montano un
led emettitore all’infrarosso ed un ricevitore che, in base alla quantità di luce riflessa
che riceve, restituisce in uscita una tensione proporzionale alla distanza dall’ostacolo.
Sono stati montati sul robot tre sensori: uno posto parallelamente al lato frontale e
due posti parallelamente ai due lati sinistro e destro. Tale scelta permette alla logica
di controllo del robot di ottenere in maniera efficiente le indicazioni per individuare
il percorso migliore da seguire. L’uscita di ogni sensore è inviata ad un ingresso
analogico della scheda Arduino Nano; il microprocessore esegue la stima del valore
restituendo un valore numerico intero tanto più grande quanto più piccola è la distanza
dall’ostacolo. Il tempo di risposta dei sensori è di 38 ± 10ms. L’alimentazione che
deve essere fornita ai sensori deve essere compresa tra i 4.5V e i 5.5V; per tale motivo
3
Per il datasheet si veda [9].
37
Cap. 2 Robot micromouse
§2.5 Scheda di potenza, controllo e comunicazione
è stato utilizzato un regolatore di tensione integrato, modello L78S05CV4 , che, a
partire dalla tensione in ingresso di 7V generata dalla batteria, fornisce una tensione
regolata di 5V. Il consumo medio di corrente per ogni sensore è di circa 33mA, per
un totale di circa 100mA per tutto il gruppo sensori. Per motivi di ottimizzazione
dell’assemblaggio, i sensori sono stati montati su una scheda millefori posta al centro
del robot. È stato inoltre inserito un LED giallo che segnala l’attivazione dei sensori.
Complessivamente, il consumo totale della scheda dei sensori è di circa 110mA.
2.5
Scheda di potenza, controllo e comunicazione
Figura 2.7: Scheda di potenza, controllo e comunicazione.
La scheda di potenza, controllo e comunicazione accoglie il cuore funzionale del robot.
Su di essa è montata la scheda Arduino Nano, il modulo di comunicazione XBee, il
regolatore di tensione L78S05CV per l’alimentazione dei sensori, i microrelè per il
controllo del moto dei motori, le morsettiere per il cablaggio, l’interruttore di ali4
Per il datasheet si veda [10].
38
§2.6 Arduino Nano
Cap. 2 Robot micromouse
mentazione ed un led rosso di controllo. La scheda Arduino ed il modulo XBee sono
montati su zoccoli dedicati, per una veloce e pratica gestione e manutenzione.
2.6
Arduino Nano
Figura 2.8: Arduino Nano
L’Arduino Nano5 è una piccola e completa scheda di prototipazione elettronica basata
sul microcontrollore Atmega328. Le sue misure ridotte ne permettono un uso molto
pratico per progetti di mini-robotica. Essa è dotata di 14 porte di ingresso/uscita digitali, 6 delle quali PWM, e 8 porte di ingresso analogiche. Gli ingressi analogici hanno
un fondo scala di 5V, mentre le porte digitali hanno ingressi/uscite logiche a 0V/5V
e da esse è possibile assorbire corrente fino a 40mA ciascuna. Tale limite di corrente
erogabile, del tutto ovvio data la natura stessa del sistema, va tenuto adeguatamente
in considerazione, al fine di non sovraccaricare le uscite e quindi di non danneggiare
il microcontrollore. Per la realizzazione del robot rover sono state utilizzate tre porte
5
Per il datasheet si veda [11].
39
§2.7 Modulo wireless: XBee
Cap. 2 Robot micromouse
analogiche in ingresso per la lettura dei segnali provenienti dai sensori e sei porte
digitali in uscita, quattro delle quali per la generazione delle sequenze di pilotaggio
dei motori e due per il controllo dei microrelè. Per la comunicazione wireless dei dati,
le porte RX e TX di trasmissione e ricezione seriale sono state collegate alle rispettive
porte del modulo XBee. La programmazione dell’Arduino avviene tramite collegamento remoto via Mini-B USB ad un Personal Computer. L’alimentazione è fornita
direttamente dalla batteria di alimentazione utilizzata (vedi dettaglio nel seguito), in
quanto l’Arduino può lavorare con tensioni che vanno dai 7V ai 12V.
2.7
Modulo wireless: XBee
Figura 2.9: Modulo XBee
Per la comunicazione wireless con il robot rover sono stati utilizzati due moduli XBee6 .
Il primo è stato montato direttamente sul robot e collegato all’Arduino attraverso la
scheda dedicata XBee Explorer; tale scheda adatta sia il segnale di TX/RX proveniente dall’Arduino sia la tensione di alimentazione, regolando entrambi a 3.3V partendo
dal valore di 5V fornito dall’Arduino. Il secondo modulo è collegato direttamente alla
porta USB del Personal Computer al quale vanno inviati i dati trasmessi, funzionan6
Per il datasheet si veda [12].
40
§2.8 Alimentazione
Cap. 2 Robot micromouse
do in effetti come un modem wireless. I moduli XBee hanno un protocollo wireless
compatibile con lo standard ZigBee/IEEE 802.15.4 che soddisfa i requisiti necessari per realizzare un sistema di trasmissione bidirezionale a basso costo ed a basso
consumo, orientato soprattutto per l’impiego con sensori. I moduli sono semplici da
utilizzare, di limitato ingombro, richiedono pochissima energia e costituiscono una
soluzione efficace ed affidabile per la trasmissione di dati a breve raggio. Nell’applicazione realizzata, i moduli XBee si sono rivelati utili sia in fase di taratura dei sensori,
consentendo una lettura on-line sullo schermo del Personal Computer dei dati rilevati,
sia per l’implementazione della logica di controllo attraverso lo scambio bidirezionale
dei dati necessari al dimensionamento dei parametri di funzionamento.
2.8
Alimentazione
Figura 2.10: Batteria al NiMh
L’alimentazione dell’intero sistema è fornita da una batteria ricaricabile al NiMh composta da 5 celle. La batteria è in grado di erogare 1.100mA a 7V; le sue misure sono
85mm x 26mm x 15mm ed il peso è di 110 grammi.
41
Capitolo 3
Filtro di Kalman Esteso
3.1
Introduzione al filtro
Nell’analisi dei sistemi dinamici trova notevole rilievo il Filtro di Kalman. Introdotto
dallo studioso da cui prende il nome negli anni ’60, risulta essere un efficiente algoritmo ricorsivo per la stima dello stato di un sistema dinamico a partire da un insieme di
misure affette da rumore bianco (rumore a media nulla e distribuzione di tipo gaussiano). In tali condizioni, si dimostra che il Filtro di Kalman risulta essere lo stimatore
ottimo, ovvero quello in grado di fornire la migliore stima dei parametri del sistema
osservato in termini di minimizzazione dell’errore quadratico medio sia dello stato
stimato che della matrice di covarianza associata al rumore. Il Filtro di Kalman è
applicabile unicamente a sistemi lineari, per i quali sono dimostrate e verificate le sue
caratteristiche ottime. Nel caso di sistemi non lineari, il Filtro di Kalman non risulta
applicabile in maniera canonica; comunque, per non perdere le positive caratteristiche
possedute dall’algoritmo, è stato sviluppato il Filtro di Kalman Esteso. Tale versione
del filtro si applica a sistemi non lineari ma soggetti comunque a rumore gaussiano a
42
Cap. 3 Filtro di Kalman Esteso
§3.1 Introduzione al filtro
media nulla, per i quali è applicabile una linearizzazione del sistema intorno alla stima corrente (linearizzazione a tratti). In tali condizioni, la stima ottenuta dal Filtro
di Kalman Esteso è ancora valida, ma può perdere le caratteristiche di ottimalità e
di convergenza. Nel campo della robotica, il Filtro di Kalman Esteso è largamente
impiegato nei problemi di controllo della posizione e del moto dei robot nello spazio
(localizzazione o movimento asservito) sulla base delle misure ottenute dai sensori di
posizione e di movimento. Nell’applicazione al robot rover realizzata, il Filtro di Kalman, nella versione estesa, è stato utilizzato per implementare la legge di controllo per
la stima della correzione dinamica da applicare al moto del robot istante per istante.
Infatti, il robot, non essendo dotato di dispositivi per il controllo a catena chiusa e non
essendo perfettamente simmetrico nei componenti costruttivi (ruote, motori, massa
geometrica, ecc.), può essere soggetto a derive del moto reale rispetto al moto teorico.
Il filtro si è dimostrato utile per stimare la correzione da introdurre, mediante un’opportuna azione sull’algoritmo di controllo dei motori, al fine di ricondurre quanto più
possibile il moto reale a quello teorico. Per questo motivo, è stata introdotta una
opportuna modellizzazione degli errori di moto del robot ottenuta mediante misure
odometriche in condizioni di riferimento, mentre per la determinazione della deriva
effettiva del moto sono state utilizzate le misure acquisite dai sensori di prossimità di
cui il robot è dotato. Tali aspetti sono maggiormente dettagliati nel seguito.
43
§3.2 Modello cinematico
Cap. 3 Filtro di Kalman Esteso
3.2
Modello cinematico
Figura 3.1: Modello geometrico associato
Si consideri il sistema di coordinate (x,y) in figura 3.1. Il robot è localizzato nel
sistema bidimensionale con coordinate (xk ,yk ) ed orientamento ϑk . Si può definire la
posizione del robot rispetto a tale sistema utilizzando il vettore Xr di tre parametri:
Xr (k) = [x(k), y(k), ϑ(k)]′
(3.2.1)
Considerando il modello cinematico non-lineare discretizzato nel tempo, le relazioni
che governano il moto del robot sono le seguenti:
xk+1 = xk + ∆ρk · cos ϑk
(3.2.2)
yk+1 = yk + ∆ρk · sin ϑk
(3.2.3)
ϑk+1 = ϑk + ∆ϑk
(3.2.4)
44
§3.2 Modello cinematico
Cap. 3 Filtro di Kalman Esteso
dove lo spostamento ∆ρk e la rotazione ∆ϑk sono legati al moto delle ruote come
segue:
∆ρk =
∆Rk + ∆Lk
2
(3.2.5)
∆ϑk =
∆RK − ∆Lk
d
(3.2.6)
in cui d è la distanza tra i punti di contatto delle ruote col pavimento mentre ∆Rk
e ∆Lk sono gli spostamenti rispettivamente della ruota destra e della ruota sinistra,
definiti come:
∆Rk = NpassiR · l
(3.2.7)
∆Lk = NpassiL · l
(3.2.8)
essendo NpassiR e NpassiL rispettivamente il numero di passi imposti dall’algoritmo
di controllo ai motori passo-passo di destra e di sinistra, l la distanza teorica coperta
dalla ruota per un singolo passo del motore.
3.2.1
Determinazione sperimentale delle incertezze del moto
Al fine di controllare la posizione del robot, in primo luogo è necessario avere informazioni sul posizionamento reale del robot durante il moto e confrontarlo con quello
teorico. Come precedentemente sottolineato, il robot non è dotato di sistemi di misura odometrici per la determinazione della sua posizione effettiva. Tuttavia, sulla base
del modello cinematico illustrato in precedenza e mediante idonee valutazioni delle
incertezze ad esso connesse nel caso reale, è possibile pervenire ad una stima più fedele
45
§3.2 Modello cinematico
Cap. 3 Filtro di Kalman Esteso
della posizione effettiva del robot durante il suo movimento. A tal fine è stato seguito
un approccio sperimentale basato sull’analisi statistica degli scostamenti tra il moto
teorico ottenuto dal modello ed il moto reale rilevato in situazioni di riferimento. Per
tale analisi è stata considerata una distribuzione normale caratterizzata dai parametri
media µ e varianza σ 2 : N(µ; σ 2 ).
Sono state quindi effettuate tre serie di trenta esperimenti ciascuna per tre diversi
spostamenti del robot:
ˆ 100 passi −→ corrispondenti a 34.8 cm teorici;
ˆ 380 passi −→ corrispondenti a 142.3 cm teorici;
ˆ 480 passi −→ corrispondenti a 179.7 cm teorici.
Per tutti gli spostamenti, il robot è stato programmato per eseguire un percorso
rettilineo. Il rilievo del moto effettivo del robot è stato ottenuto impiegando un piano
di lavoro orizzontale opportunamente ricoperto da carta millimetrata.
Figura 3.2: Misure
46
§3.2 Modello cinematico
Cap. 3 Filtro di Kalman Esteso
Per i=1,...,n serie di esperimenti e j=1,...,m numero di esperimenti per serie è possibile
definire, con riferimento al modello cinematico, gli errori rilevati rispettivamente sullo
spostamento e sull’orientamento come segue:
Er(i,j) =
nR(i,j) + nL(i,j)
2
(3.2.9)
Eϑ(i,j) =
nR(i,j) − nL(i,j)
d
(3.2.10)
dove nR(i,j) e nL(i,j) sono gli errori di moto delle singole ruote in tutti gli esperimenti.
Risolvendo il sistema delle due equazioni (3.2.9) (3.2.10) nelle incognite nR(i,j) e nL(i,j) ,
si ottiene:
Eϑ(i,j) · d
2
Eϑ(i,j) · d
= Er(i,j) −
2
nR(i,j) = Er(i,j) +
(3.2.11)
nL(i,j)
(3.2.12)
È possibile quindi calcolarne i valori medi:
µi,R
m
1 X
= ·
nR(i,j)
n j=1
i = 1, ..., n
(3.2.13)
µi,L
m
1 X
= ·
nL(i,j)
n j=1
i = 1, ..., n
(3.2.14)
e successivamente le varianze:
2
σi,R
m
1 X
= ·
(nR(i,j) − µi,R )2
n j=1
i = 1, ..., n
(3.2.15)
2
σi,L
m
1 X
= ·
(nL(i,j) − µi,L)2
n j=1
i = 1, ..., n
(3.2.16)
47
Cap. 3 Filtro di Kalman Esteso
§3.2 Modello cinematico
Al fine di poter generalizzare il comportamento del robot anche per spostamenti diversi da quelli considerati, è possibile ipotizzare una legge di variazione lineare delle
incertezze del moto. Procedendo quindi alla interpolazione lineare riferita ai valori
2
2
medi µi,R e µi,L ed alle varianze σi,R
e σi,L
dei risultati sperimentali, vengono determi-
nati i coefficienti angolari delle rette caratteristiche delle medie (am,R e am,L ) e delle
varianze (KR e KL ) in funzione del numero dei passi di moto.
Conseguentemente, le distribuzioni normali degli errori riferiti al moto delle ruote
possono essere descritte come segue:
nR ∼ N(am,R · ∆R, KR · ∆R)
(3.2.17)
nL ∼ N(am,L · ∆L, KL · ∆L)
(3.2.18)
Al fine di poter applicare correttamente il Filtro di Kalman Esteso, è necessario ricondurre le distribuzioni (3.2.17) e (3.2.18) a distribuzioni a media nulla, modificando
opportunamente il modello cinematico. La (3.2.5) e la (3.2.6) diventano quindi:
∆ρk =
(1 + am,R ) · ∆Rk + (1 + am,L ) · ∆Lk
2
(3.2.19)
∆ϑk =
(1 + am,R ) · ∆Rk − (1 + am,L ) · ∆Lk
d
(3.2.20)
le quali sostituite nelle (3.2.2),(3.2.3) e (3.2.4) forniscono:
(1 + am,R ) · ∆Rk + (1 + am,L) · ∆Lk
· cos ϑk
2
(1 + am,R ) · ∆Rk + (1 + am,L ) · ∆Lk
= yk +
· sin ϑk
2
xk+1 = xk +
(3.2.21)
yk+1
(3.2.22)
48
§3.3 Modello di misura
Cap. 3 Filtro di Kalman Esteso
ϑk+1 = ϑk +
(1 + am,R ) · ∆RK − (1 + am,L ) · ∆Lk
d
(3.2.23)
e di conseguenza le distribuzione normali (3.2.17) e (3.2.18) diventano:
nR ∼ N(0, KR · ∆R)
(3.2.24)
nL ∼ N(0, KL · ∆L)
(3.2.25)
ovvero distribuzioni normali a media nulla per le quali è possibile applicare il filtro
di Kalman.
3.3
Modello di misura
Come precedentemente accennato, le residue incertezze connesse con la non perfetta
rispondenza del modello cinematico corretto con il moto effettivo, possono essere
compensate mediante l’utilizzo di informazioni provenienti dai sensori e relative alla
posizione reale del robot. Quest’ultimo è dotato di tre sensori di prossimità disposti
frontalmente e lateralmente, attraverso i quali il robot riceve le informazioni sulla
distanza dalle pareti del percorso. Pertanto, il modello di misura può essere definito
come segue:
Y (k) = h(Xr,k) + ω(k)
(3.3.1)
dove ω(k) indica il rumore gaussiano a media nulla, con matrice di covarianza diagonale R(k), utilizzato per modellare gli errori di misura, mentre h(Xr,k ) indica la
relazione tra la posizione del robot e il valore letto dai sensori infrarosso:


h1 (Xr,k )
h(Xr,k) = h2 (Xr,k )
h3 (Xr,k )
(3.3.2)
49
§3.3 Modello di misura
Cap. 3 Filtro di Kalman Esteso
Figura 3.3: Modello geometrico associato alle misure
hi (Xr,k) =
q
(Si,x − xp )2 + (Si,y − yp )2
(3.3.3)
dove Si,x e Si,y sono le coordinate del sensore i-esimo nel piano x-y e xp e yp sono le
coordinate del punto rilevato dal sensore sulla parete.
In base a tali definizioni, il problema dell’individuazione della corretta posizione del
robot può essere posto come l’individuazione di una funzione χ che fornisca ricorsivamente la posizione esatta del robot integrando le equazioni del modello cinematico
con il modello della misura:
Xr (k + 1) = χ(Xr (k), Y (k + 1))
(3.3.4)
50
§3.4 Implementazione del filtro
Cap. 3 Filtro di Kalman Esteso
3.4
Implementazione del filtro
L’implementazione del filtro di Kalman Esteso è realizzata mediante l’iterazione delle
fasi di predizione e stima: nella fase di predizione viene individuato, sulla base dello
stato precedente, lo stato successivo del sistema e la relativa matrice di covarianza;
nella fase di stima, sulla base delle misure effettuate, si determina l’aggiornamento
dello stato, si calcola il guadagno del filtro e si aggiorna la matrice di covarianza.
Analiticamente l’algoritmo esegue questi passi:
ˆ si consideri la stima della posizione iniziale assunta dal robot X̂r,0 e la matrice
di covarianza sulla stima iniziale P0 ;
−
ˆ inizia la fase di predizione e viene calcolato lo stato X̂r,k
:
x̂−
r,k = x̂r,k−1 + ∆ρk−1 · cos ϑk−1
(3.4.1)
−
ŷr,k
= ŷr,k−1 + ∆ρk−1 · sin ϑk−1
(3.4.2)
ϑ̂−
r,k = ϑ̂k−1 + ∆ϑk−1
(3.4.3)
e la matrice di covarianza associata pari a:
′
′
Pk− = Fk−1 · Pk−1 · Fk−1
+ Wk−1 · Qk−1 · Wk−1
(3.4.4)
dove Fk-1 è la jacobiana della dinamica rispetto allo stato, Wk-1 è la jacobiana
della dinamica rispetto al disturbo e Qk-1 è la matrice di covarianza del rumore
sulla dinamica;
ˆ inizia la fase di stima e viene calcolata l’innovazione Innovation k = Y (k) −
−
h(X̂r,k
) con riferimento a misure affidabili effettuate dai sensori infrarosso; per
misure affidabili si intendono misure coerenti con l’ambiente noto;
51
§3.5 Simulazioni
Cap. 3 Filtro di Kalman Esteso
ˆ viene calcolato il guadagno di Kalman:
Kk = Pk− · Hk′ · (Hk · Pk− · Hk′ + R)
(3.4.5)
dove Hk è la jacobiana delle misure mentre R è la matrice di covarianza dei
rumori sulle misure;
ˆ vengono calcolati lo stato e la matrice di covarianza associata:
X̂r,k = X̂k− + Kk · (Innovation k )
(3.4.6)
Pk = (I − Kk · Hk ) · Pk−
(3.4.7)
ˆ viene posto k = k+1 e viene riproposto l’algoritmo con una nuova fase di
predizione.
3.5
Simulazioni
Al fine di verificare le prestazioni del Filtro di Kalman Esteso nella correzione dinamica
del moto del robot rover realizzato, sono stati condotti alcuni test in ambiente di
simulazione Matlab su un percorso predefinito.
È stato dapprima simulato il moto del robot rover in assenza di correzione dinamica,
sulla base del modello cinematico del moto individuato nel paragrafo 3.2. La fig. 3.4
mostra a confronto il moto teorico del robot (linea blu) con il moto simulato mediante
il modello cinematico (linea rossa). Da essa è possibile trarre due considerazioni:
ˆ Il modello cinematico individuato sulla base dell’analisi statistica dell’errore di
moto risulta essere robusto anche per percorsi molto diversi da quelli utilizzati
per il calcolo dei parametri di moto;
52
§3.5 Simulazioni
Cap. 3 Filtro di Kalman Esteso
Percorso Test
70
60
50
40
30
20
10
0
−10
0
20
40
60
80
100
Figura 3.4: Simulazione percorso # 1 per la verifica del modello cinematico
ˆ L’errore di posizione risultante dal modello cinematico del moto è compatibile
con la struttura del robot e con le verifiche sperimentali realizzate in ambiente
reale sul piano di lavoro millimetrato.
I successivi test hanno riguardato la verifica delle prestazioni del filtro nella correzione
dinamica del moto; a tal fine, sono state simulate le misure di posizione fornite dai
sensori sovrapponendo al valore esatto un rumore casuale a media nulla. La figura 3.5
mostra a confronto il moto teorico del robot (linea blu) con quello ottenuto mediante
la correzione dinamica operata dal Filtro di Kalman Esteso (linea rossa). Da essa
si evince come il moto corretto sia praticamente coincidente con il moto teorico, in
quanto il filtro determina ad ogni passo la correzione da imporre al moto al passo
successivo per riportare il robot sul percorso teorico.
53
§3.5 Simulazioni
Cap. 3 Filtro di Kalman Esteso
Percorso Test
70
60
50
40
30
20
10
0
−10
0
20
40
60
80
100
Figura 3.5: Simulazione percorso # 1 con Filtro di Kalman Esteso
In Appendice B è riportato il listato del codice Matlab utilizzato per le simulazioni.
54
Capitolo 4
Conclusioni e sviluppi futuri
La tesi illustra le applicazioni delle schede di prototipazione della famiglia Arduino per
la realizzazione di robot linefollower e rover. Sono state illustrate dettagliatamente le
soluzioni meccaniche, elettroniche e di controllo che hanno consentito la realizzazione
dei prototipi delle due tipologie di robot. Al riguardo, il lavoro di tesi ha evidenziato
le ottime prestazioni possedute dalle versioni di Arduino utilizzate, unitamente alle
notevoli caratteristiche di flessibilità e di semplicità d’uso e programmazione.
Nello specifico, per la realizzazione del robot LineFollower è stata utilizzata una soluzione basata sull’impiego della scheda Arduino Mega e di motori in corrente continua,
la cui alimentazione è regolata dal microcontrollore tramite un segnale PWM opportunamente modulato. Il robot è stato dotato di sensori infrarosso per il rilievo della
linea guida e di encoder incrementali costruiti artigianalmente per la misura del percorso effettuato. Il preciso posizionamento dei sensori di linea ai lati della stessa ha
consentito di sviluppare ed implementare una legge di controllo di tipo proporzionale
semplice e molto efficiente, come dimostrato dalle prove effettuate anche su percorsi
tortuosi.
Per quanto riguarda il robot rover, è stata utilizzata la scheda Arduino Nano, caratterizzata da un ingombro estremamente ridotto ma con prestazioni di ottimo livello.
55
Cap. 4 Conclusioni e sviluppi futuri
Per la movimentazione del robot sono stati impiegati motori passo-passo, per i quali
il microcontrollore fornisce la necessaria sequenza di pilotaggio. È stata inoltre implementata una interessante soluzione hardware per la gestione del moto del robot
sulla base di una sola sequenza di pilotaggio dei motori: ciò ha consentito di superare
la limitazione funzionale del microcontrollore per la gestione contemporanea dei due
motori. Per il controllo del moto, il robot è stato dotato di sensori di prossimità
all’infrarosso, sia per individuare i limiti del tracciato da percorrere o la presenza di
eventuali ostacoli, sia per fornire le necessarie misure di posizione utilizzate dall’algoritmo di controllo basato sul Filtro di Kalman Esteso. È stata sperimentata con
successo anche una soluzione per la comunicazione wireless continua fra il robot ed il
computer di supervisione; tale soluzione, basata sull’impiego di moduli XBee, si è dimostrata particolarmente efficiente grazie all’affidabilità di questo tipo di trasmissione
a breve raggio, unitamente alle piccole dimensioni ed ai consumi ridotti dei dispositivi
utilizzati.
Nel lavoro è stato poi affrontato il problema del controllo del moto del robot rover
mediante l’impiego del Filtro di Kalman Esteso. In particolare, l’assenza di sistemi
di rilevo continuo della posizione assoluta del robot pone il problema della sua esatta
localizzazione nello spazio, a cui riferire il moto imposto dall’algoritmo di controllo.
Al fine di superare tale problema, è stato sviluppato un modello cinematico del moto
del robot basato unicamente sulla caratterizzazione statistica sperimentale degli errori rilevati per percorsi noti e predefiniti. Sfruttando poi le proprietà di predizione
e stima possedute dal Filtro di Kalman Esteso, è stato sviluppato un algoritmo di
controllo in grado di stimare con sufficiente precisione l’effettiva posizione del robot
durante il moto e, sulla base anche di misure locali effettuate dai sensori di prossimità
di cui il robot è dotato, operare una correzione dinamica al fine di ricondurre il robot
56
Cap. 4 Conclusioni e sviluppi futuri
sul percorso teorico imposto. Le prestazioni dell’algoritmo di controllo messo a punto
sono state poi verificate in ambiente di simulazione, mostrando ottime performance nella correzione dinamica del moto del robot per percorsi diversi e più complessi
rispetto a quelli utilizzati per l’individuazione del modello cinematico.
Le prospettive future legate al prosieguo del lavoro sono legate sia alla verifica sperimentale delle prestazioni del filtro di Kalman per la correzione dinamica del moto
del robot rover, sia ad una più approfondita fase di ingegnerizzazione del prototipo;
a tal riguardo, il ricorso a soluzioni SMT (Surface Mount Technology) può consentire
una notevole riduzione delle dimensioni del robot rover senza modifiche nell’architettura elettronica, consentendo di pervenire ad una realizzazione tipica per micromouse
competition. Parallelamente, la messa a punto di ulteriori soluzioni derivate da quelle
realizzate può consentire lo sviluppo di altre famiglie di robot rover. A tal proposito,
appare molto interessante e suscettibile di svariate applicazioni pratiche lo studio di
schiere di robot rover in grado di muoversi autonomamente in ambienti sconosciuti e
di comunicare in tempo reale, al fine di costruire dinamicamente la mappa dei luoghi
sulla base di rilievi effettuati con idonei sensori e mediante l’elaborazione di immagini
catturate da microtelecamere installate sui robot stessi.
57
Appendice A
Schemi ed immagini
Figura 4.1: Schema elettrico realizzato per il controllo della sequenza di alimentazione
dei motori passo-passo
58
APPENDICE A - SCHEMI ED IMMAGINI
Figura 4.2: Robot Rover, vista frontale.
59
APPENDICE A - SCHEMI ED IMMAGINI
Figura 4.3: Robot Rover, vista lato destro.
60
APPENDICE A - SCHEMI ED IMMAGINI
Figura 4.4: Robot Rover, vista lato sinistro.
61
APPENDICE A - SCHEMI ED IMMAGINI
Figura 4.5: Robot Rover, vista posteriore.
62
Appendice B
Listati dei programmi
1
2
% In questo file vengono definiti e inizializzati tutti i valori
% relativi al robot e all'ambiente necessari per gli esperimenti.
3
4
5
% clear all
% close all
6
7
DISEGNA = 1;
8
9
10
11
global numSegmenti n q RaggioCirconfRobot numSensoriLaser M
global thetaLaserHome uRe uLe KR KL
global tol infinito xMin xMax yMin yMax Dx Dy
12
13
14
tol = 0.001; % tolleranza nei confronti di uguaglianza
Infinito = 9999; % infinito pratico
15
16
17
18
19
20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
DATI
AMBIENTE
%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21
22
23
numOstacoli = 0; % numero degli ostacoli presenti nell'ambiente
% (non previsto)
24
25
% Vertici del perimetro in senso antiorario
26
27
28
29
% Coordinate x ambiente
Px(1) = 0; Px(2) = 80; Px(3) = 80; Px(4) = 20; Px(5) = 20;
Px(6) = 100; Px(7) = 100; Px(8) = 0;
30
31
32
33
% Coordinate y ambiente
Py(1) = 0; Py(2) = 0; Py(3) = 20; Py(4) = 20; Py(5) = 40;
Py(6) = 40; Py(7) = 60; Py(8) = 60;
34
63
APPENDICE B - LISTATI DEI PROGRAMMI
35
36
37
38
39
40
41
% dati mappa
xMin = min(Px);
xMax = max(Px);
yMin = min(Py);
yMax = max(Py);
Dx = xMax − xMin;
Dy = yMax − yMin;
42
43
numVertici = 8;
44
45
46
47
48
49
50
51
52
53
54
P=zeros(numVertici,2);
% matrice coordinate vertici: QUESTE VANNO RUOTATE!!
P(1,:)=[Px(1) Py(1)];
P(2,:)=[Px(2) Py(2)];
P(3,:)=[Px(3) Py(3)];
P(4,:)=[Px(4) Py(4)];
P(5,:)=[Px(5) Py(5)];
P(6,:)=[Px(6) Py(6)];
P(7,:)=[Px(7) Py(7)];
P(8,:)=[Px(8) Py(8)];
55
56
57
58
59
for indVertice = 1:numVertici,
[P(indVertice,1),P(indVertice,2)] =
ruota(P(indVertice,1),P(indVertice,2));
end
60
61
62
63
64
65
M = zeros(numVertici,4);
for indVertice = 1:numVertici−1,
M(indVertice,:) = [P(indVertice,:) P(indVertice+1,:)];
end
M(numVertici,:) = [P(numVertici,:) P(1,:)];
66
67
68
69
70
71
%
%
%
%
%
M = [P1 P2; P2 P3; P3 P4; ... P {numVertici} P1];
matrice dei lati: la riga i contiene
i due vertici del lato i del perimetro, quindi ci sono
tante righe quanti sono i lati
del perimetro esterno dell'ambiente
72
73
74
numSegmenti = numVertici;
% numero dei lati del perimetro dell'ambiente
75
76
77
78
79
80
81
82
83
84
85
% Coefficienti delle rette contenenti i lati del perimetro
n = ones (1,numSegmenti); % coefficienti angolari rette
q = ones (1,numSegmenti); % intercette rette
for lato = 1:numSegmenti,
P1x = M(lato,1);
P1y = M(lato,2);
P2x = M(lato,3);
P2y = M(lato,4);
if P1x==P2x,
n(lato) = Inf;
64
APPENDICE B - LISTATI DEI PROGRAMMI
q(lato) = P1x;
% in questo caso il coefficiente
% q ricorda la x dell'equazione x = q
86
87
88
89
else
n(lato) = (P2y−P1y)/(P2x−P1x);
% coefficiente angolare lato
q(lato) = P1y − n(lato)*P1x;
% costante lato
90
91
92
93
94
95
end
end
96
97
98
99
100
101
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
DATI
ROBOT
%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
102
103
104
105
% Caratteristiche geometriche del robot
numSensoriLaser = 3;
RaggioCirconfRobot = 5.64;
106
107
108
% angoli laser rispetto asse di movimento del robot
thetaLaserHome = zeros(numSensoriLaser,1);
109
110
111
112
%Posizionamento
thetaLaserHome = thetaLaserHome + [−pi/2 0 pi/2]';
thetaLaserHome;
113
114
115
116
117
118
119
120
121
122
% Caratteristiche dinamiche robot
anr = 1.5013e−004;
anl = 0.0012;
KR = 1.2737e−005;
KL = 4.3501e−006;
% anr = 0;
% anl = 0;
% KR = 0.01;
% KL = 0.01;
123
124
125
126
%asse ruote
a = 9.8;
RaggioVeroCirconfRobot = 5.64;
127
128
129
130
131
132
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
DATI SIMULAZIONE
%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
133
134
135
136
Npassi = 5000; % numero totale di step k della simulazione
Nstep = 100; % numero di passi tra una stima e la successiva
65
APPENDICE B - LISTATI DEI PROGRAMMI
% (maggiore di uno quando la stima viene
% fatta solo dopo un certo numero di passi)
137
138
139
140
141
142
143
144
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% GENERAZIONE MOVIMENTO
%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
145
146
147
148
% MOVIMENTO LINEARE A TRATTI
% il robot è già orientato per bene
149
150
151
152
153
154
155
156
157
% Coordinate topiche movimento robot:
% QUESTE VANNO RUOTATE!!!
Rx(1) = 90; Ry(1) = 50;
Rx(2) = 8; Ry(2) = 50;
Rx(3) = 28; Ry(3) = 10;
Rx(4) = 90; Ry(4) = 10;
Rx(5) = 90; Ry(5) = 10;
158
159
numVertR = numel(Rx);
160
161
162
163
164
165
for indVertR = 1:numVertR,
[Rx(indVertR),Ry(indVertR)] =
ruota(Rx(indVertR),Ry(indVertR));
end
166
167
168
169
170
x0 = Rx(1); % x iniziale
y0 = Ry(1); % y iniziale
theta0 = atan2(Ry(2)−Ry(1),Rx(2)−Rx(1));
% orientamento iniziale
171
172
173
174
%thetaf = atan2(Ry(3)−Ry(2),Rx(3)−Rx(2));
% orientamento finale
%theta0f = thetaf−theta0;
175
176
177
deltaRho = zeros(1,Npassi);
deltaTheta = zeros(1,Npassi);
178
179
180
181
182
d1
d2
d3
d4
=
=
=
=
sqrt((Rx(2)−Rx(1))ˆ2+(Ry(2)−Ry(1))ˆ2);
sqrt((Rx(3)−Rx(2))ˆ2+(Ry(3)−Ry(2))ˆ2);
sqrt((Rx(4)−Rx(3))ˆ2+(Ry(4)−Ry(3))ˆ2);
sqrt((Rx(5)−Rx(4))ˆ2+(Ry(5)−Ry(4))ˆ2);
183
184
dTOT = d1+d2+d3+d4;
185
186
187
passiTratto1 = round(Npassi*d1/dTOT);
passiTratto2 = round(Npassi*(d1+d2)/dTOT)−passiTratto1;
66
APPENDICE B - LISTATI DEI PROGRAMMI
188
189
190
191
passiTratto3 = round(Npassi*(d1+d2+d3)/dTOT)−
passiTratto1−passiTratto2;
passiTratto4 = Npassi − passiTratto1−passiTratto2 −
passiTratto3;
192
193
194
rhoC = 0.05*1000/Npassi;
nC = 40*Npassi/1000; % sceglierlo pari
195
196
197
198
199
200
% Primo tratto
deltaRho=d1*ones(1,passiTratto1−nC/2)/(passiTratto1);
% variazioni radiali
deltaTheta=ones(1,passiTratto1−nC/2)*0;
% angolo costante che non varia nel tempo
201
202
203
204
205
% Curva
deltaRho = [deltaRho rhoC*ones(1,nC)];
deltaTheta = [deltaTheta (pi/2)/nC*ones(1,nC)];
% rotazione di 90 gradi
206
207
208
209
210
211
212
% Secondo tratto
deltaRho=[deltaRho d2*ones(1,passiTratto2−nC)/
(passiTratto2)];
% variazioni radiali
deltaTheta=[deltaTheta ones(1,passiTratto2−nC)*0];
% angolo costante che non varia nel tempo
213
214
215
216
217
% Curva
deltaRho = [deltaRho rhoC*ones(1,nC)];
deltaTheta = [deltaTheta (pi/2)/nC*ones(1,nC)];
% rotazione di 90 gradi
218
219
220
221
222
223
% Terzo tratto
deltaRho=[deltaRho d3*ones(1,passiTratto3−nC)/
(passiTratto3)]; % variazioni radiali
deltaTheta=[deltaTheta ones(1,passiTratto3−nC)*0];
% angolo costante che non varia nel tempo
224
225
226
227
228
229
230
231
% Curva
deltaRho = [deltaRho rhoC*ones(1,nC)];
angSucc = atan2(Ry(5)−Ry(4),Rx(5)−Rx(4));
angPrec = atan2(Ry(4)−Ry(3),Rx(4)−Rx(3));
angRot = angSucc − angPrec;
deltaTheta = [deltaTheta angRot/nC*ones(1,nC)];
% rotazione di angRot gradi
232
233
234
235
236
237
% Quarto tratto
deltaRho=[deltaRho d4*ones(1,passiTratto4−nC/2)/
(passiTratto4)]; % variazioni radiali
deltaTheta=[deltaTheta ones(1,passiTratto4−nC/2)*0];
% angolo costante che non varia nel tempo
238
67
APPENDICE B - LISTATI DEI PROGRAMMI
239
240
241
242
243
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%% FINE SEZIONE GENERAZIONE MOVIMENTI%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
244
245
246
247
248
249
250
251
252
253
%%
% Definizione dei vettori x,y e theta delle coordinate
% del robot durante la simulazione:
x = zeros(1,Npassi);
y = zeros(1,Npassi);
theta = zeros(1,Npassi);
%spazio = zeros(1,Npassi);
254
255
256
257
258
259
% Assegnazione condizione iniziale assunta dal robot:
x(1)=x0;
y(1)=y0;
theta(1)=theta0;
%spazio(1)=0;
260
261
262
263
264
265
266
267
268
%% Standard deviation degli errori
%della stima della posizione iniziale
sigmaX0 = 0.01;
sigmaY0 = 0.01;
sigmaTheta0 = 0.02;
% sigmaX0 = 0;
% sigmaY0 = 0;
% sigmaTheta0 = 0;
269
270
271
272
273
%% Errore stima iniziale
DeltaX0 = sigmaX0*randn(1);
DeltaY0 = sigmaY0*randn(1);
DeltaTheta0 = sigmaTheta0*randn(1);
274
275
276
277
% DeltaX0 = 0;
% DeltaY0 = 0;
% DeltaTheta0 = 0;
278
279
280
281
x(1)=x0;
y(1)=y0;
theta(1)=theta0;
282
283
%%
284
285
286
287
%Passo simulazione
deltaR = 1;
deltaL = 1;
288
289
68
APPENDICE B - LISTATI DEI PROGRAMMI
290
291
uR = (deltaRho + (a/2)*deltaTheta);
uL = (deltaRho − (a/2)*deltaTheta);
292
293
294
295
296
297
298
299
% Assegnazione di tutte le posizioni assunte dal robot:
for k=1: (Npassi−1),
x(k+1)= x(k)+ ((deltaR*uR(k)+deltaL*uL(k))/2)*cos(theta(k));
y(k+1)= y(k)+ ((deltaR*uR(k)+deltaL*uL(k))/2)*sin(theta(k));
theta(k+1)= theta(k)+ ((deltaR*uR(k)−deltaL*uL(k))/a);
end
300
301
302
303
304
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% GENERAZIONE DISTURBI ODOMETRICI, STIMA INIZIALE E LASER %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
305
306
307
308
309
310
% Caratteristiche dinamiche robot
NiR = randn(Npassi,1)*sqrt(KR);
% sulle letture odometriche di traslazione
NiL = randn(Npassi,1)*sqrt(KL);
% sulle letture odometriche di traslazione
311
312
313
314
315
316
%% Letture odometriche corrotte
deltaRhoe = zeros(1,Npassi);
% vettore letture odometriche traslazionali
deltaThetae = zeros(1,Npassi);
% vettore letture odometriche di orientamento
317
318
319
320
321
322
323
324
325
326
327
uRe = zeros(Npassi,1);
% vettore letture odometriche ruota destra
uLe = zeros(Npassi,1);
% vettore letture odometriche ruota sinistra
for k = 1:Npassi,
uRe(k) = uR(k) + sqrt(abs(uR(k)))*NiR(k);
%letture odometriche ruota destra
uLe(k) = uL(k) + sqrt(abs(uL(k)))*NiL(k);
%letture odometriche ruota sinistra
end
328
329
330
331
332
333
334
335
for k = 1:Npassi,
deltaRhoe(k) = deltaRhoe(k) +
((uRe(k)*(1+anr)) + (uLe(k)*(1+anl)))/2;
deltaThetae(k) = deltaThetae(k) +
((uRe(k)*(1+anr)) − (uLe(k)*(1+anl)))/a;
end
336
337
338
339
340
xe = zeros(1,Npassi);
ye = zeros(1,Npassi);
69
APPENDICE B - LISTATI DEI PROGRAMMI
341
342
343
xe(1)=x0;
ye(1)=y0;
344
345
346
347
348
for k=1:Npassi,
xe(k+1)=xe(k)+deltaRhoe(k)*cos(deltaThetae(k));
ye(k+1)=xe(k)+deltaRhoe(k)*sin(deltaThetae(k));
end
349
350
351
352
353
354
355
356
357
358
% DISTURBI LASER
ZitaLaser = 0.1; % varianza su lettura laser
%(per ora uguali per tutti i laser)
laserNoise = sqrt(ZitaLaser)*
randn(numSensoriLaser,round(Npassi));
%laser Noise −> matrice in cui
%la riga i−esima contiene i disturbi
%sulle letture del laser i−esimo di tutta la simulazione
359
360
%VERIFICA
361
362
363
364
if DISEGNA,
disegnaFig
end
70
APPENDICE B - LISTATI DEI PROGRAMMI
1
2
% Simulazione modello dinamico robot (solo Predizione)
% ESEGUIRE DATI.M PRIMA DI QUESTO PROGRAMMA
3
4
5
6
7
8
9
10
% Vettori di stima
xHatEKFsgl = zeros(1,Npassi);
xHatMenoEKFsgl = zeros(1,Npassi);
yHatEKFsgl = zeros(1,Npassi);
yHatMenoEKFsgl = zeros(1,Npassi);
thetaHatEKFsgl = zeros(1,Npassi);
thetaHatMenoEKFsgl = zeros(1,Npassi);
11
12
13
14
15
% Stima della posizione iniziale assunta dal robot
xHatEKFsgl(1) = x0 + DeltaX0;
yHatEKFsgl(1) = y0 + DeltaY0;
thetaHatEKFsgl(1) = theta0 + DeltaTheta0;
16
17
18
% matrice di covarianza sulla stima iniziale
Pcov = diag([sigmaX0ˆ2, sigmaY0ˆ2, sigmaTheta0ˆ2]);
19
20
numeroStime = 0;
21
% conta il numero di volte che è stata
% effettuata la stima con la correzione
22
23
Jpepe EKFsgl = 0;
24
25
for k = 1:Npassi−1,
26
27
28
% FASE di PREDIZIONE (fatta per tutti i k)
29
30
31
32
33
34
35
xHatMenoEKFsgl(k+1) = xHatEKFsgl(k) + deltaRhoe(k)*
cos(thetaHatEKFsgl(k)); % xHat(k+1|k)
yHatMenoEKFsgl(k+1) = yHatEKFsgl(k) + deltaRhoe(k)*
sin(thetaHatEKFsgl(k)); % yHat(k+1|k)
thetaHatMenoEKFsgl(k+1) = thetaHatEKFsgl(k) + deltaThetae(k);
% thetaHat(k+1|k)
36
37
38
39
40
41
% jacobiano della dinamica rispetto allo stato
F = [1 0 −deltaRhoe(k)*sin(thetaHatEKFsgl(k));
0 1 deltaRhoe(k)*cos(thetaHatEKFsgl(k));
0 0 1];
42
43
44
45
46
% jacobiano della dinamica rispetto al disturbo
W = [sqrt(deltaRhoe(k))*cos(thetaHatEKFsgl(k)) 0;
sqrt(deltaRhoe(k))*sin(thetaHatEKFsgl(k)) 0;
0 sqrt(deltaRhoe(k))];
47
48
Q = [KR*abs(uRe(k)) 0; 0 KL*abs(uLe(k))];
49
50
% Aggiornamento matrice di covarianza
71
APPENDICE B - LISTATI DEI PROGRAMMI
51
Pmeno = F*Pcov*F' + W*Q*W';
52
53
54
55
56
xHatEKFsgl(k+1) = xHatMenoEKFsgl(k+1);
% xHat(k+1|k+1)
yHatEKFsgl(k+1) = yHatMenoEKFsgl(k+1);
% yHat(k+1|k+1)
thetaHatEKFsgl(k+1) = thetaHatMenoEKFsgl(k+1);% thetaHat(k+1|k+1)
57
58
59
% Aggiornamento matrice di covarianza
Pcov = Pmeno;
60
61
end
62
63
%end
64
65
66
67
68
if DISEGNA,
disegnaFig
plot(xHatEKFsgl,yHatEKFsgl,'r')
end
69
70
71
% prestazione normalizzata
J EKFsgl = sqrt(sum((x−xHatEKFsgl).ˆ2+(y−yHatEKFsgl).ˆ2)/Npassi) ;
72
73
74
75
if numeroStime >0,
Jpepe EKFsgl = sqrt(Jpepe EKFsgl/numeroStime);
end
72
APPENDICE B - LISTATI DEI PROGRAMMI
1
2
3
4
%
%
%
%
Riporta la stima del percorso del robot fatta con EKF dotato di
soglia sull'innovazione (scarta valori dell'innovazione troppo
grandi dovuti a spigoli o ad ostacoli imprevisti nell'ambiente
ESEGUIRE DATI.M PRIMA DI QUESTO PROGRAMMA
5
6
7
8
9
10
11
12
% Vettori di stima
xHatEKFsgl = zeros(1,Npassi);
xHatMenoEKFsgl = zeros(1,Npassi);
yHatEKFsgl = zeros(1,Npassi);
yHatMenoEKFsgl = zeros(1,Npassi);
thetaHatEKFsgl = zeros(1,Npassi);
thetaHatMenoEKFsgl = zeros(1,Npassi);
13
14
15
16
17
% Stima della posizione iniziale assunta dal robot
xHatEKFsgl(1) = x0 + DeltaX0;
yHatEKFsgl(1) = y0 + DeltaY0;
thetaHatEKFsgl(1) = theta0 + DeltaTheta0;
18
19
20
% matrice di covarianza sulla stima iniziale
Pcov = diag([sigmaX0ˆ2, sigmaY0ˆ2, sigmaTheta0ˆ2]);
21
22
23
numeroStime = 0; % conta il numero di volte che è stata effettuata
%la stima con la correzione
24
25
26
% matrice di covarianza del rumore sulla dinamica (NiRho e NiTheta)
%Q = [Krho 0; 0 Ktheta];
27
28
29
% matrice covarianza misure
R = ZitaLaser*eye(numSensoriLaser);
30
31
Jpepe EKFsgl = 0;
32
33
for k = 1:Npassi−1,
34
35
36
% FASE di PREDIZIONE (fatta per tutti i k)
37
38
39
40
41
42
43
xHatMenoEKFsgl(k+1) = xHatEKFsgl(k) + deltaRhoe(k)*
cos(thetaHatEKFsgl(k)); % xHat(k+1|k)
yHatMenoEKFsgl(k+1) = yHatEKFsgl(k) + deltaRhoe(k)*
sin(thetaHatEKFsgl(k)); % yHat(k+1|k)
thetaHatMenoEKFsgl(k+1) = thetaHatEKFsgl(k) + deltaThetae(k);
% thetaHat(k+1|k)
44
45
46
47
48
49
% jacobiano della dinamica rispetto allo stato
F = [1 0 −deltaRhoe(k)*sin(thetaHatEKFsgl(k));
0 1 deltaRhoe(k)*cos(thetaHatEKFsgl(k));
0 0 1];
50
73
APPENDICE B - LISTATI DEI PROGRAMMI
51
52
53
54
% jacobiano della dinamica rispetto al disturbo
W = [sqrt(deltaRhoe(k))*cos(thetaHatEKFsgl(k)) 0;
sqrt(deltaRhoe(k))*sin(thetaHatEKFsgl(k)) 0;
0 sqrt(deltaRhoe(k))];
55
56
Q = [KR*abs(uRe(k)) 0; 0 KL*abs(uLe(k))];
57
58
59
% Aggiornamento matrice di covarianza
Pmeno = F*Pcov*F' + W*Q*W';
60
61
62
% FASE di STIMA (fatta solo ogni Nstep passi)
63
64
if mod(k,Nstep) == 0, % va fatta la stima con Kalman Esteso
65
66
numeroStime = numeroStime + 1;
67
68
69
70
71
% distanze laser corrotte (reali)
[latiLetti,distanzeLette] = distanzeLaser(x(k+1),y(k+1),
theta(k+1));
rhoiReali = distanzeLette + laserNoise(:,k);% era numeroStime
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
% jacobiano H delle misure buone
H = zeros(numSensoriLaser,3);
ammessi = ones(numSensoriLaser,1);
[latiAttesi, rhoiAttese] = distanzeLaser(xHatMenoEKFsgl(k+1),
yHatMenoEKFsgl(k+1),thetaHatMenoEKFsgl(k+1));
% calcolo prima i rhoi e i lati con cui si intersecano i laser
if min(latiAttesi)==0, % stima fuori mappa
[latiAttesi1,rhoiAttese1,latiAttesi,rhoiAttese] =
distanzeLaserRob(xHatMenoEKFsgl(k+1),yHatMenoEKFsgl(k+1),
thetaHatMenoEKFsgl(k+1));
for laser = 1:numSensoriLaser,
if latiAttesi1(laser) == 0,
ammessi(laser)=0;
end
end
end
89
90
91
innovation = rhoiReali−rhoiAttese;
92
93
94
xLaser = xHatMenoEKFsgl(k+1);
yLaser = yHatMenoEKFsgl(k+1);
95
96
97
98
99
100
101
for laser = 1: numSensoriLaser, % per ogni laser
if latiAttesi(laser)>0 &&
abs(innovation(laser))/max([rhoiReali(laser),
rhoiAttese(laser)]) < 0.4,
% allora l'innovazione e' accettabile
nLaser = n(latiAttesi(laser));
74
APPENDICE B - LISTATI DEI PROGRAMMI
% determino il coeff. angolare del lato con
% cui si interseca il laser (ni,j nelle formule)
qLaser = q(latiAttesi(laser));
% e l'intercetta di tale lato (qi,j nelle formule)
angLaser = thetaHatMenoEKFsgl(k+1)+
thetaLaserHome(laser);
% l'angolo del raggio laser
% (theta t + theta i nelle formule)
cosLaser = cos(angLaser);% il coseno di tale angolo
sinLaser = sin(angLaser);% e il seno
if nLaser == Inf, % la retta con
%cui si interseca il laser e' verticale
if abs(cosLaser) < tol,
% il raggio Laser e' paralello al lato
H(laser,:) = [Inf 0 Inf];
else % raggio Laser NON e' parallelo al lato
H(laser,:) =
[−1/cosLaser 0 rhoiAttese(laser)*sinLaser/cosLaser];
end
else % retta obliqua (ossia non verticale)
DEN = nLaser*cosLaser−sinLaser;
if abs(DEN) < 0.0001,
% raggio laser parallelo a lato
H(laser,:) = [Inf Inf Inf];
else % il raggio Laser NON e' paralello al lato
H(laser,1) = −nLaser/DEN;
H(laser,2) = 1/DEN;
H(laser,3) =
−(nLaser*xLaser+qLaser−yLaser)*
(cosLaser + nLaser*sinLaser)/DENˆ2;
end
end
else
ammessi(laser) = 0;
end
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
end
138
139
140
141
142
143
144
ammessiLaser = sum(ammessi);
H = riduciM(H,ammessi);
innovation = riduciM(innovation,ammessi);
R = ZitaLaser*eye(ammessiLaser);
% calcolo guadagno Kalman K (MATRICE 3X16)
K = Pmeno*H'*pinv(H*Pmeno*H'+R);
145
146
147
148
149
150
151
152
% Calcolo della stima a posteriori:
xHatEKFsgl(k+1) = xHatMenoEKFsgl(k+1)
+ K(1,:)*innovation; % xHat(k+1|k+1)
yHatEKFsgl(k+1) = yHatMenoEKFsgl(k+1)
+ K(2,:)*innovation; % yHat(k+1|k+1)
thetaHatEKFsgl(k+1) = thetaHatMenoEKFsgl(k+1)
75
APPENDICE B - LISTATI DEI PROGRAMMI
+ K(3,:)*innovation; % thetaHat(k+1|k+1)
153
154
% Aggiornamento matrice di covarianza
Pcov = (eye(3) − K*H)*Pmeno;
Jpepe EKFsgl = Jpepe EKFsgl
+ (x(k+1)−xHatEKFsgl(k+1)).ˆ2+
(y(k+1)−yHatEKFsgl(k+1)).ˆ2;
155
156
157
158
159
160
else
161
162
% non si fa la stima con EKF ma si
% utilizza solo odometria
163
xHatEKFsgl(k+1) = xHatMenoEKFsgl(k+1);
% xHat(k+1|k+1)
yHatEKFsgl(k+1) = yHatMenoEKFsgl(k+1);
% yHat(k+1|k+1)
thetaHatEKFsgl(k+1) = thetaHatMenoEKFsgl(k+1);
% thetaHat(k+1|k+1)
164
165
166
167
168
169
170
% Aggiornamento matrice di covarianza
Pcov = Pmeno;
171
172
173
end
174
175
176
end
177
178
179
180
181
if DISEGNA,
disegnaFig
plot(xHatEKFsgl,yHatEKFsgl,'r')
end
182
183
184
% prestazione normalizzata
J EKFsgl = sqrt(sum((x−xHatEKFsgl).ˆ2+(y−yHatEKFsgl).ˆ2)/Npassi) ;
185
186
187
188
if numeroStime >0,
Jpepe EKFsgl = sqrt(Jpepe EKFsgl/numeroStime);
end
76
APPENDICE B - LISTATI DEI PROGRAMMI
Listing 4.1: Programma taratura diretta sensori
4
int sensorValue1 = 0; //Sensore Sinistro
int sensorValue2 = 0; //Sensore Destro
int sensorValue3 = 0; //Sensore Centrale
6
void setup() {
8
Serial.begin(9600);
2
10
}
12
void loop() {
sensorValue1 = analogRead(1);
Serial.print(sensorValue1);
Serial.print(” ”);
14
16
sensorValue3 = analogRead(3);
Serial.print(sensorValue3);
Serial.print(” ”);
18
20
sensorValue2 = analogRead(2);
Serial.println(sensorValue2);
22
24
}
77
APPENDICE B - LISTATI DEI PROGRAMMI
Listing 4.2: Programma Rover evita ostacoli
#include <Stepper.h>
#define STEPS 48
#define RELE1 4
#define RELE2 3
Stepper stepper(STEPS, 12, 11, 10, 9);
int sensorS = 0;
int sensorD = 0;
int sensorC = 0;
int n = 0;
void setup()
{
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
Serial.begin(9600);
stepper.setSpeed(40);
}
void loop()
{
n = 0;
sensorS = analogRead(1);
sensorD = analogRead(2);
sensorC = analogRead(3);
do{ //vai avanti
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, HIGH);
stepper.step(n);
sensorS = analogRead(1);
sensorD = analogRead(2);
sensorC = analogRead(3);
n++;
}while(sensorC < 250);
78
APPENDICE B - LISTATI DEI PROGRAMMI
n = 0;
do{ //gira a sinistra
digitalWrite(RELE1, LOW);
digitalWrite(RELE2, HIGH);
stepper.step(n);
sensorS = analogRead(1);
sensorD = analogRead(2);
sensorC = analogRead(3);
n++;
}while(sensorC > 250 && sensorS < 250);
n = 0;
do{ //gira a destra
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, LOW);
stepper.step(n);
sensorS = analogRead(1);
sensorD = analogRead(2);
sensorC = analogRead(3);
n++;
}while(sensorC > 250 && sensorD < 250);
n = 0;
do{ //vicolo cieco
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, LOW);
stepper.step(n);
sensorS = analogRead(1);
sensorD = analogRead(2);
sensorC = analogRead(3);
n++;
}while(sensorC > 250 && sensorD > 250 && sensorS > 250);
79
APPENDICE B - LISTATI DEI PROGRAMMI
Listing 4.3: Esempio programma per misure odometriche (480 passi) con
inizializzazione wifi-seriale
1
#include <Stepper.h>
3
#define STEPS 48
5
Stepper stepper(STEPS, 12, 11, 10, 9);
7
9
11
13
15
17
int count = 0;
int a = 0;
void setup()
{
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
stepper.setSpeed(40);
Serial.begin(9600);
stepper.step(1);
}
19
21
23
void loop()
{
if (Serial.available() > 0)
{
a = Serial.read();
25
if(a==49)
{
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
delay(50);
stepper.step(480);
}
27
29
31
33
}
35
}
80
Elenco delle figure
1.1
Tunnel del LHC, a destra la linea che segue il LineFollower. . . . . . .
7
1.2
Il LineFollower realizzato. . . . . . . . . . . . . . . . . . . . . . . . .
8
1.3
Motore CC e Tamiya Motor Gearbox . . . . . . . . . . . . . . . . . .
8
1.4
Il ponte H. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
1.5
Duty Cycle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
1.6
Sign-Magnitude PWM. . . . . . . . . . . . . . . . . . . . . . . . . . .
12
1.7
Locked Anti-Phase PWM. . . . . . . . . . . . . . . . . . . . . . . . .
14
1.8
Sensore QTI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
1.9
Il prototipo di encoder realizzato. . . . . . . . . . . . . . . . . . . . .
17
1.10 Funzione del Trigger di Schmitt . . . . . . . . . . . . . . . . . . . . .
18
1.11 Segnali in uscita dal fotodiodo (sotto) e in uscita dal Trigger di Schmitt
(sopra). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
1.12 Arduino Mega. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
1.13 Il LineFollower nel percorso di test . . . . . . . . . . . . . . . . . . .
22
2.1
Concept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
2.2
Il robot realizzato. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
2.3
Motore passo-passo unipolare. . . . . . . . . . . . . . . . . . . . . . .
28
2.4
Curve di pull-in e pull-out. . . . . . . . . . . . . . . . . . . . . . . . .
30
81
ELENCO DELLE FIGURE
ELENCO DELLE FIGURE
2.5
Pilotaggio motore passo-passo . . . . . . . . . . . . . . . . . . . . . .
33
2.6
Scheda sensori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.7
Scheda di potenza, controllo e comunicazione. . . . . . . . . . . . . .
38
2.8
Arduino Nano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
2.9
Modulo XBee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
2.10 Batteria al NiMh . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
3.1
Modello geometrico associato . . . . . . . . . . . . . . . . . . . . . .
44
3.2
Misure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
3.3
Modello geometrico associato alle misure . . . . . . . . . . . . . . . .
50
3.4
Simulazione percorso # 1 per la verifica del modello cinematico . . .
53
3.5
Simulazione percorso # 1 con Filtro di Kalman Esteso . . . . . . . .
54
4.1
Schema elettrico realizzato per il controllo della sequenza di alimentazione dei motori passo-passo . . . . . . . . . . . . . . . . . . . . . . .
58
4.2
Robot Rover, vista frontale. . . . . . . . . . . . . . . . . . . . . . . .
59
4.3
Robot Rover, vista lato destro.
. . . . . . . . . . . . . . . . . . . . .
60
4.4
Robot Rover, vista lato sinistro. . . . . . . . . . . . . . . . . . . . . .
61
4.5
Robot Rover, vista posteriore. . . . . . . . . . . . . . . . . . . . . . .
62
82
Bibliografia
[1] Texas Instruments - “L293,L293D QUADRUPLE HALF-H DRIVERS”,
Settembre 1986 - Revisionato Novembre 2004.
[2] Parallax - “QTI Line Sensor”, www.parallax.com.
[3] ST Microelectronics - “M74HC14 - Hex Schmitt Inverter”, www.st.com - 2001.
[4] “Arduino Mega 1280”, http://arduino.cc/en/Main/ArduinoBoardMega.
[5] Duyao Wang, Xiaoqing Yu, Wanggen Wan, Hongfu Xu - “A New Method of Infrared Sensor Measurement for Micromouse Control”, School of Communication
and Information Engineering, Shangai University - IEEE 2008.
[6] Wantai Motor CO.,LTD. - “PM42L-048-17 - Wantai Mini Stepper Product
Specification”, www.wantmotor.com.
[7] “I motori passo-passo”, Versione 2.1 - http://www.vincenzov.net - Giugno 2001.
[8] Texas Instruments - “High-Voltage High-Current Darlington Transistor Array”,
Dicembre 1976 - Revisionato Febbraio 2003.
[9] Sharp Corporation - “GP2D120XJ00F - Analog Output Type Distance Measuring
Sensor”.
83
BIBLIOGRAFIA
BIBLIOGRAFIA
[10] ST Microelectronics - “L78S05CV - 2A POSITIVE VOLTAGE REGULATOR”,
www.st.com - 2003.
[11] “Arduino Nano 3.0”, http://www.arduino.cc/en/Main/ArduinoBoardNano.
[12] MaxStream - “XBee/XBee-PRO OEM RF Modules v. 1.06”, ZigBee/IEEE
802.15.4 OEM RF Modules by MaxStream, Inc..
[13] Ernest O. Doebelin, Cigada Alfredo, and Gasparetto Michele - “Strumenti e
metodi di misura”, McGraw-Hill - 2008.
[14] Francesco Martinelli - “Mini-course on Filtering and Mobile Robot Localization”,
Università degli Studi di Roma “Tor Vergata” - 2010.
[15] Stefano Al Zanati - “Realizzazione e Localizzazione mediante Kalman di un robot
mobile”, Tesi di Laurea in Ingegneria dell’Automazione, Università degli Studi di
Roma “Tor Vergata” - 2010.
[16] Fulvio Forni - “Filtro di Kalman Esteso per la localizzazione di robot mobili”,
Tesi di Laurea in Ingegneria Informatica, Università degli Studi di Roma “Tor
Vergata” - 2004.
[17] Marco Gerosi - “Navigazione e localizzazione del robot Nomad 150 mediante filtro
di Kalman”, Tesi di Laurea in Ingegneria Informatica, Università degli Studi di
Roma “Tor Vergata” - 2005.
84
Scarica