An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i...

43
An Arduino drone for real-time face detection Candidato : Edoardo Cittadini Relatore : Diego Reforgiato Matricola : 65025

Transcript of An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i...

Page 1: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

An Arduino drone for real-time face detection

Candidato : Edoardo Cittadini Relatore : Diego Reforgiato Matricola : 65025

Page 2: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Indice

Introduzione ……………...………………………………………………………………... 4

Come funziona un drone ..………………………………………………………………… 5

Cosa serve per realizzare il quadricottero ..……………………………………………. 6

Concetti di pre-progettazione …………………………………………………………….. 7

Schema elettrico e progettuale ..…………………………………………………………. 9

Il motore brushless .………………………………………….……………………………10

ESC – Electronic Speed Controller …………………………………………………..…13

Telaio ….…………………………………………………………...……………………….14

Radiocomando/ricevente .……………………………………..…………………………16

LiPo e hardware di controllo …………………………………………...………………...17

GPS …………………………………………………………………………………………19 Gimbal ………………………………………………………………..…………………….20

OSD …………………………………………………………………………………………21

IMU ………………………………………………………….………………………………22

La centralina APM..…………………………………………………………………..……23 Software on board ……………..………………………………………………………….26

Metodo Ziegler-Nichol …………………………………………………………….29

Java code PID ……………………………………………………………………..30

Failsafe ……………………………………………………………………………..31

Come fanno i Failsafe ad attivarsi ……………………………………………….32

Watchdog …………………………………………………………………………..34

2

Page 3: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Protocolli di comunicazione ……………………………………………………………....35

SPI …………………………………………………………………………………..36

I2C …………………………………………………………………………………..37

Software Server-side …………………………………………………………………...…38

Librerie …………………………………………………………………………...…39

DB - SQL …………………………………………………………………………...40

Conclusioni e ringraziamenti…………..………………………………………….43

3

Page 4: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Introduzione Il progetto del quadricottero prevede la creazione di un sistema intelligente in grado di essere pilotato sfruttando varie tecnologie quali il il GPS (Global Position System) per automatizzare un percorso con alcune opzioni o il protocollo radio bidirezionale AFHDS 2 oppure l’autopilot fornito dal software ArduPilot e gestito tramite la lettura e l’analisi incrociata dei valori riportati dai sensori. Gli obiettivi principali consistono nel fornire una buona esperienza di volo ed allo stesso tempo fornire il supporto necessario per poter impiegare il quadricottero per svolgere funzioni che possano andare al di là del solo scopo ludico della macchina. Questo progetto non è solo hardware opportunamente combinato ma è anche e soprattutto software cucito sulle sue componenti fisiche per farle interagire al meglio. Il codice principale, quello che viene caricato sulla EEPROM (Electronic Erasable Programmable Read Only Memory) del microprocessore Arduino, prende ispirazione e segue il modello di un famoso software open source : ArduPilot. Il restante software consiste in un’applicazione Python per PC che fornisce una interfaccia grafica “user-friendly” ed un live streaming della camera montata a bordo del quadricottero. Si è deciso di utilizzare come centralina/controllore di volo l’APM 2.8; questa scelta è dovuta sia al fatto che integra un processore Arduino con sufficiente memoria flash per garantire un corretto funzionamento del servizio GPS, cosa che non sarebbe possibile con un microprocessore appartenente alla famiglia degli Arduino nano, sia al fatto che rappresenta una soluzione hardware compatta particolarmente resistente ad eventuali urti e perciò ideale allo scopo. Tuttavia sarebbe possibile riprodurre la centralina APM attraverso varie operazioni di saldatura dei singoli componenti su una scheda millefori inglobandole su un involucro di plastica rigida realizzato tramite stampante 3D. Il motivo fondamentale della scelta di un processore della famiglia Arduino nell’era dell’ IoT (Internet of Things) e dei microchip è l’approccio Open Source di questo tipo di processori; essi infatti non solo sono supportati da una vastissima comunità di programmatori che lavora continuativamente allo sviluppo di librerie ma ha anche una ricca documentazione che permette di addentrarsi all’interno dell’architettura della scheda e compiere operazioni di bassissimo livello.

4

Page 5: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Come funziona un drone ? Un drone è una macchina a pilotaggio remoto che permette di svolgere diversi compiti a seconda della sua progettazione. Esistono droni Racing che solitamente si pilotano con visori VR (Virtual Reality) e che sono ancora in fase sperimentale, sono dotati di motori molto potenti e il loro scopo è prettamente ludico infatti servono solo a competere con altri droni. Un’altra categoria è rappresentata dai droni FPV (First Person view) che devono poter essere pilotati anche senza avere un vero e proprio contatto visivo; ciò è possibile perché sono dotati di una o più videocamere che trasmettono in diretta streaming su uno schermo quello che viene inquadrato dal drone in ogni momento della sua fase di volo. Il funzionamento della macchina è abbastanza semplice : si ha una centralina di volo, nel nostro caso l’APM, che al suo interno comprende il microprocessore ovvero l’unità di elaborazione centrale dell’input ricevuto e una IMU (Inertial Measurement Unit) che si occupa di rilevare e trasmettere al microprocessore le variazioni esterne rispetto al sistema. Per semplificare il concetto si può immaginare l’Arduino come il cervello del drone mentre la IMU rappresenta i sensi. I motori sono collegati alla centralina tramite degli appositi connettori chiamati ESC (Electronic Speed Controller) che convertono gli impulsi elettrici nei movimenti rotativi dei motori. La piattaforma GPS ha dei pin di connessione dedicati sulla centralina ed è gestita in maniera autonoma rispetto a tutte le altre componenti hardware della scheda. Per poter radiocomandare il nostro drone ovviamente serve inserire all’interno della centralina uno spazio sufficiente per il supporto di una ricevente radio, nel nostro caso ad 8 canali (8ch). Esistono varie forme di telaio come esistono vari tipi di elica che devono essere scelti in base a quali saranno i compiti specifici per cui il drone verrà impiegato. Non rappresentano un punto chiave per il funzionamento del progetto ma rientrano in quelle piccole finezze che ne rendono più piacevole l’utilizzo. Tutto quello descritto finora funziona perché viene alimentato da una LiPo, batteria ai polimeri di Litio, che come vedremo dopo deve rispondere a precisi requisiti di peso, dimensioni, amperaggio e voltaggio. Per un funzionamento ottimale della macchina è necessario trovare un opportuno rapporto peso-potenza ed è fondamentale che tutte le sue componenti fisiche siano opportunamente bilanciate per conferirgli la massima stabilità.

5

Page 6: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Cosa serve per realizzare il quadricottero ?

1) 4 motori brushless dagli 800Kv ai 1000Kv (2 CW e 2 CCW) : Kv bassi → maggiore coppia Kv alti → maggiore potenza

2) 4 ESC da 30A 3) 1 telaio da 450 (45 cm misurati sulla diagonale o interasse tra i fulcri dei

motori 4) 1 centralina APM 2.8 con IMU (bussola,barometro,magnetometro e giroscopio tutti a 3 assi) 5) 1 radio con ricevente ad 8ch con protocollo AFHDS 2A (il protocollo potrebbe anche essere diverso) 6) 1 piattaforma GPS compatibile con l’hardware Arduino (Ublox nel nostro caso) 7) 4 eliche 10 x 4.5 oppure 10 x 3.8 8) 1 LiPo (amperaggio variabile in base a prestazioni e durata del volo) 9) 1 gimbal con fotocamera a 2 assi 10) GPS Ublox alimentato a 5V 11) Power module con BEC a 5V 12) Minim OSD (facoltativo ma consigliato) Il drone può essere equipaggiato direttamente col software ArduPilot, ma il nostro obbiettivo è più specifico perciò parte del codice sorgente verrà rivisto ed adattato. Il prezzo totale per realizzare un buon velivolo parte dai 500 euro anche se si può arrivare a spendere anche più del doppio.

6

Page 7: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Concetti fondamentali di pre-progettazione 1) Per poter funzionare in maniera reattiva al massimo delle sue prestazioni è buona norma calcolare la potenza dei motori in maniera tale che siano in grado di sollevare almeno il doppio del peso del drone 2) Come conseguenza di quanto appena detto al punto 1 occorre trovare il rapporto ottimale tra il peso della batteria ed il suo amperaggio; un’errore comune è credere che aumentando la capacità della batteria aumenti anche l’autonomia di volo; infatti una batteria più grande comporta più peso da spostare e più peso da spostare significa richiedere ai motori uno sforzo maggiore con conseguente maggior consumo di energia. In diverse situazioni l’aumento della grandezza della batteria potrebbe anche influire in maniera negativa sull’autonomia del quadricottero, ma si tratta di casi limite. 3) Le eliche a 3 pale rendono i movimenti del drone più armonici e conferiscono maggiore stabilità al mezzo ma tuttavia consumano più energia rispetto alle tradizionali eliche bipala. Dopo vari esperimenti il sottoscritto è convinto che l’esperienza di utilizzo sia migliore con le eliche tripala che perciò ha deciso di adottare nella configurazione finale a costo di perdere un po’ di autonomia a favore di maggior precisione e manovrabilità. 4) Il peso delle componenti deve essere bilanciato nella maniera migliore possibile per mantenere il baricentro il più centrato possibile per evitare di sovraffaticare dei motori rispetto agli altri con conseguente usura precoce e surriscaldamenti localizzati. 5) L’amperaggio degli ESC deve essere opportunamente proporzionato alla potenza dei motori; se un ESC è troppo “piccolo” in termini di Ampere si corre il rischio di bruciarlo e viceversa se un ESC è sovradimensionato rispetto alla potenza effettiva dei motori si corre il rischio di bruciare il propulsore. 6) La dimensione delle eliche, in particolar modo il loro diametro, va scelto accuratamente in base alla distanza tra un motore ed il suo adiacente (distanza misurata senza eliche) al fine di evitare turbolenze in fase di volo create dall’eccessiva vicinanza delle pale. Un altro parametro di cui tener conto è il pitch, ovvero l’inclinazione delle pale dell’elica rispetto al piano orizzontale che influenzano la reattività del drone ai comandi impartiti e la portanza del quadricottero. Si può quindi intuire che più il telaio sarà grande più grandi dovranno essere le eliche per mantenere un buon compromesso tra peso,prestazioni e portanza. 7) L’aerodinamica del mezzo deve anche essere studiata in base alle modalità di volo che il drone può usare.

7

Page 8: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Generalmente le conformazioni più usate sono quella a “X” detta anche a “croce” e quella a “+” detta anche a “più” che sono compatibili tra loro e perciò ci si limita a gestire e cambiare i due assetti solo a livello software. 8) Nel caso le componenti hardware fossero assemblate e saldate manualmente è necessario assicurarsi che comunichino tutte tra di loro tramite lo stesso protocollo o al limite tramite protocolli compatibili per evitare problemi nel funzionamento del codice (software). Per la ragione appena scritta sopra è fortemente consigliato usare schede compatte già pronte per eliminare ogni dubbio sui problemi di compatibilità. 9) Se si volesse integrare nel progetto un gimbal con fotocamera per effettuare riprese aeree e voli in modalità FPV (First Person view) è consigliabile riservare dei canali della ricevente radio per i movimenti assiali del braccio meccanico. Generalmente i gimbal sono a due assi ed è anche la scelta che ho deciso di integrare nel mio progetto. Tuttavia il drone potrebbe anche essere semplicemente dotato di una camera a installazione fissa che risulta essere più semplice da gestire ma che evidentemente limita notevolmente le performance del comparto fotografico. 10) Deve inoltre essere deciso a priori se un drone dotato di macchina fotografica dovrà essere in grado di salvare i dati su una memoria flash di tipo micro SD oppure se si dovrà limitare ad uno streaming dei dati su un dispositivo remoto il quale si farà carico della memorizzazione delle informazioni.

8

Page 9: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Schema elettrico e progettuale

La figura sopra rappresenta il tipico schema di un quadricottero dove i cavi rossi rappresentano il flusso di corrente positiva in uscita dalla batteria, i cavi neri il flusso di corrente negativa entrambi collegati agli ESC dei motori brushless. I motori con i relativi hardware associati sono collegati alla centralina APM 2.8 sul lato sinistro di quest’ultima tramite degli appositi pin dedicati. Sulla parte destra invece si hanno dei pin riservati all’ingresso della ricevente radio fino ad un massimo di 8 canali, perciò nel nostro caso verranno sfruttate tutte le posizioni disponibili. La parte bassa della scheda ha degli ingressi liberi che possono essere usati per gestire gli hardware aggiuntivi come la telecamera o magari dei sensori anti-collisione. Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul lato basso a destra è dedicata alla piattaforma GPS che permette di automatizzare un percorso e rendere il drone autonomo dal radiocomando.

9

Page 10: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Il motore brushless Il motore brushless, letteralmente “senza spazzole”, è un tipo di motore che funziona tramite corrente continua e non ha bisogno dell’attrito di pettini metallici per generare la corrente che permette al motore di girare. Questo tipo di motore porta numerosi vantaggi rispetto ai motori con attriti interni; sono soggetti ad un’usura minore nel tempo, hanno minori probabilità di generare scintille in fase di rotazione e sono meno esposti a problemi di temperatura. Ogni motore brushless è collegato all’esterno tramite tre cavi che si occupano di gestire le fasi del motore; le fasi sono 3 perchè è il minimo per garantire un senso preciso di rotazione. L’ordine dei cavi non è arbitrario a priori; infatti scambiandone due qualsiasi si può invertire il senso di rotazione del motore. La fase di un motore non è altro che la posizione del rotore rispetto allo statore (questo principio è valido per tutti i tipi di motori, da quelli a combustione interna fino a quelli elettrici) che è misurata tramite un apposito controllore interno al motore e gestita sempre via hardware tramite il regolatore di fase. Viene misurata calcolando tramite il regolatore la forza elettromotrice di ritorno.

La figura a sinistra rappresenta una sezione vista dall’alto che mostra le principali differenze tra un motore a spazzole ed uno senza

La potenza di un motore elettrico viene espressa in KV (KiloVolt) che sarebbe il numero di rotazioni per minuto che il motore compie per 1 Volt di corrente prelevata dalla batteria. I motori utilizzati per questo progetto, come già detto in precedenza, sono da 920KV, perciò per ogni volt faranno poco meno di 920 RPM (Rotazioni Per Minuto).

10

Page 11: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

A loro volta questo tipo di motori si divide in altre due sottocategorie: inrunner ed outrunner. Il funzionamento è identico, differiscono solo per la posizione in cui sono alloggiati i magneti fissi. Internamente il motore è formato dalle seguenti componenti osservabili anche nell’immagine a destra. 1) Il fondello è la parte che chiude la campana del motore ed integra la ventola di raffreddamento, con il compito di forzare il flusso d’aria all’interno del motore sulle sue parti soggette a surriscaldamento come ad esempio gli avvolgimenti in rame che formano le bobine. Nella foto a fianco si può vedere sulla sinistra ed è la parte viola alla quale si collegano i tre cavi neri. 2) La campana è il rivestimento esterno del motore; solitamente è costruita in acciaio magnetico ed ospita al suo interno i magneti permanenti. Nella foto sopra la campana è indicata dalla freccia “Motor Bell”. 3) I magneti permanenti sono alloggiati in posizione fissa all’interno della campana ed hanno il compito di creare il campo magnetico permanente del motore. Nella foto sopra sono indicati dalla freccia “Permanent Magnets”. 4) Lo statore è la parte interna del motore che accoglie gli avvolgimenti di rame che formano le bobine ed è indicato dalla freccia “Motor Stator”. 5) L’albero è l’elemento che, come in qualsiasi altro tipo di motore, ha il compito di spostare ad di fuori del motore l’energia cinetica del motore sotto forma di energia meccanica. Rappresenta inoltre il primo elemento del sistema di trasmissione finale della propulsione. 6) I cuscinetti si trovano ovunque si trovi qualche componente in movimento; in particolare nella figura sono indicati dalla freccia “Bearings” che più precisamente indica quelli dell’albero. Lo scopo dei cuscinetti è mantenere in asse i pezzi soggetti ad accelerazioni e contemporaneamente ridurre gli attriti interni.

11

Page 12: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Ovviamente quelli elencati sono solamente i più importanti pezzi che compongono il motore, in pratica sono molti di più.

Il funzionamento dal punto di vista digitale di questo componente è abbastanza complesso perciò verranno spiegati solo i concetti fondamentali per comprendere cosa succede a livello hardware ogni qual volta venga impartito un comando via radio che modifica lo stato di ogni motore. La variazione di velocità è gestita e misurata tramite il sistema PWM (Pulse Width Modulation). PWM è un sistema di modulazione basato sulla variazione dell’ampiezza di un segnale misurato tramite il Duty cycle ovvero il rapporto tra la la durata di un segnale alto e l’intero tempo di durata di trasmissione del segnale; questo aspetto verrà analizzato meglio nel capitolo successivo quando parleremo degli ESC. Il risultato ottenuto dal calcolo del duty cycle è sempre un valore compreso tra 0 ed 1, infatti per il valore 0 significa che il motore è spento mentre per il valore 1 si può intuire che il motore stia lavorando a pieno carico (al 100% delle sue capacità). Tutti i valori intermedi compresi nell’intervallo appena definito rappresentano dei valori approssimati ai quali corrisponde un determinato livello percentuale di potenza da trasferire al motore. In pratica il valore 0 non è mai un’assenza totale di segnale, ma spesso via hardware viene gestito in maniera tale che venga passato un impulso minimo tale che possa ad esso essere associato il valore teorico 0. Il sistema PWM è gestito tramite l’analisi di onde quadre molto complesse ma tuttavia nel nostro caso porta con se numerosi vantaggi che lo rendono preferibile rispetto agli altri sistemi di modulazione. Il principale punto di forza è la drastica riduzione della potenza dissipata dal circuito limitatore rispetto al massiccio utilizzo di transistor. In un circuito gestito tramite modulazione a larghezza di impulso è sufficiente un transistor il quale o conduce completamente o non conduce affatto la corrente riducendo al minimo la potenza dissipata. Quanto appena descritto avviene nel mezzo tra il motore ed il suo relativo ESC che verrà analizzato meglio nel prossimo paragrafo; la parte software che si occupa di gestire tale aspetto viene categorizzata come “firmware per ESC”.

12

Page 13: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

ESC – Electronic Speed Controller L’ESC è la componente associata al motore che si occupa di gestirne la potenza erogata espressa come rotazioni al minuto. Dal punto di vista digitale la potenza massima,minima e parziale è calcolata ed espressa in funzione PWM spiegata nel paragrafo precedente. Sono componenti che lavorano in maniera talmente stretta rispetto ai motori ai quali sono collegati che molto spesso li rendono completamente incompatibili a motori elettrici di altre categorie. È il caso per esempio dei motori brushed e dei motori brushless. Per spiegare il funzionamento di un regolatore elettronico di velocità tramite la modulazione a larghezza di impulso (PWM) può essere utile fare un paragone con una lampadina alimentata da una batteria. Se si attiva l’interruttore la lampadina si illumina al massimo della sua luminosità; è come se il comando del gas nel radiocomando venisse attivato al massimo. Tuttavia in linea teorica se si riuscisse ad accendere e spegnere l’interruttore molto velocemente si potrebbe creare una specie di regolatore di luminosità. Questo è esattamente ciò che fa normalmente un qualsiasi controllore ESC; esso valuta quanto ampio è il segnale alto, ovvero quanto dura la fase in cui l’interruttore che accende la lampadina sta in posizione ON fino a quando non torna su OFF. Successivamente il segnale appena valutato viene modulato con un valore da 0 a 1 che poi viene espresso per comodità in percentuale e successivamente viene trasferita la quantità di corrente a quel valore associata. Per fare un esempio, se il valore calcolato è il 10% del voltaggio della batteria, nel caso del drone sarebbe equivalente a tenere il comando del gas sollevato ad 1/10 della sua corsa a partire dal basso, allora il controllore genererà un segnale in onda quadra (onda classica delle apparecchiature digitali) che sarà alto (valore 1) per il 10% e 0 per il 90%. Il segnale viene misurato in maniera ciclica ed è campionato su un loop che prende il nome di “Duty cycle” letteralmente ciclo di lavoro. In parole povere l’output di ogni Duty cycle è il quantitativo di corrente da trasferire in quel determinato istante al motore. Da ciò si può anche risalire alla potenza erogata dal motore, infatti se un motore per esempio da 920 KV è alimentato da una batteria per esempio da 11.1 V e il segnale in uscita dall’ESC è pari a 1 ovvero il 100% del voltaggio massimo allora il motore girerà a 11.1 X 920 = 10212 rpm teorici ai quali vanno sottratti quelli persi per attrito. Questa è una semplice spiegazione di quello che viene eseguito a partire dal segnale radio fino al trasferimento del comando al motore e risulta essere nonostante la maggiore complessità il sistema di pilotaggio migliore per qualsiasi motore elettrico.

13

Page 14: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Il telaio Il telaio nonostante possa essere considerata una componente banale o semplicemente legata ad un fattore estetico in realtà ha alcune peculiarità per le quali deve essere accuratamente scelto a seconda del fine per il quale il drone è stato concepito. Un telaio ben scelto rende l’esperienza di utilizzo molto più appagante soprattutto se il pilota non è abbastanza pratico e non conosce le caratteristiche tecniche del mezzo.

Un telaio come quello mostrato sopra è preferibile per voli veloci o comunque per macchine pensate principalmente con lo scopo di ottimizzare i voli dinamici a sfavore dell’hovering, ovvero lo stallo con mantenimento stabile della posizione, e dell’utilizzo per riprese panoramiche. Viceversa un telaio come quello nella figura a destra, ovvero il classico quadricottero, rappresenta il frame ideale per voli in prima persona (FPV) oppure per voli di ricognizione e/o riprese aeree. È concepito con obiettivi opposti rispetto al tricottero, infatti predilige stabilità e precisione nelle manovre rispetto alla velocità ed all’aerodinamica. Il quadricottero che andremo ad assemblare utilizza lo stesso telaio mostrato di fianco caratterizzato da una diagonale misurata dal fulcro di un motore al fulcro del motore opposto lungo la diagonale di 450 mm. In conclusione secondo i principi dell’ingegneria meccanica ed aerospaziale è preferibile al crescere della dimensione della massa da muovere avere un unico propulsore di grandi dimensioni piuttosto che una combinazione di propulsori più piccoli, ciò è ben definito dalle proprietà del numero di Reynolds (Re), ma tuttavia la

14

Page 15: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

semplicità degli algoritmi di controllo dei movimenti dei multirotore che si basano semplicemente sulla variazione delle velocità dei motori stessi rende la scelta di questi ultimi vantaggiosa fino a quando le dimensioni del mezzo sono contenute. Ciò spiega anche perché gli elicotteri sono dotati nella maggior parte dei casi di due sole eliche, una con la funzione di motore principale e una che corregge la spinta laterale e gestisce il rollio. Si noti che il risultato finale è lo stesso solo che il sistema che gestisce i motori degli elicotteri, indipendentemente dalla qualità del software, risulta essere di gran lunga più efficiente rispetto a quello utilizzato per gestire i multirotore di piccole dimensioni. Come spesso capita in ambito commerciale/industriale il miglior sistema di riferimento risulta essere quello che non ha solo il comportamento migliore in assoluto ma bensì quello che garantisce il miglior compromesso tra efficienza del mezzo ed i suoi costi di produzione.

Risulta perciò essere chiaro il motivo per il quale i droni della fascia che interessa a noi risultano essere tutti dei multirotore. Ultimamente il design su cui puntano di più i principali produttori di droni commerciali è il telaio a geometria variabile, ovvero un telaio in cui i bracci possono essere piegati per diminuire l’ingombro in fase di trasporto ma che comunque hanno una posizione fissa durante il volo. È possibile aggiornare facilmente il quadricottero con questo tipo di telaio, rimanendo tuttavia una modifica che influisce solamente sul fattore comodità.

15

Page 16: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Il radiocomando/ricevente La radio è una componente fondamentale del progetto in quanto in base alla sua scelta cambia il modo in cui il software interagisce col drone. Dal punto di vista dell’esperienza utente le differenze percepite sono minime ed inoltre bisogna tenere in considerazione che un radiocomando a più canali può gestire un maggior numero di differenti operazioni. Oltre al numero di canali, le radio differiscono tra di loro per i protocolli di comunicazione usati e le frequenze di trasmissione. In un passato abbastanza recente il sistema di trasmissione radio più usato era l’ FM (Frequency Modulation) mentre il sistema di trasmissione a 2.4 Ghz veniva considerato di nicchia perché molto costoso. Tuttavia ad oggi grazie ai progressi della tecnologia il sistema a 2.4 Ghz con tutti i suoi vantaggi è largamente usato e molto meno dispendioso. Una radio di questo tipo non è influenzata da interferenze in quanto ogni telecomando comunica esclusivamente con la sua ricevente con la quale si sincronizza all’accensione. Esistono due tipologie di radio: quelle a comando proporzionale e quelle a comando non proporzionale. Le prime inviano un segnale proporzionale ai movimenti degli stick sul radiocomando o alla pressione su un tasto, le seconde eseguono sempre il comando nella stessa maniera indipendentemente dall’ampiezza del movimento o dalla forza applicata sul pulsante. È facile capire che per il progetto useremo una radio di tipo proporzionale poiché è molto importante gestire i comandi parzializzando i movimenti. In particolare il protocollo scelto è l’ AFHDS 2A (Automatic Frequency Hopping Digital System) che ha la caratteristica di eseguire automaticamente, come suggerisce il nome, il cambio di frequenza nella quale riceve il segnale più pulito possibile. La pulizia di una banda rispetto ad un’altra dipende strettamente dall’ambiente di volo e dagli apparecchi elettronici presenti nell’area.

16

Page 17: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

LiPo e Hardware di controllo

La batteria è un componente di vitale importanza perché è l’unica fonte di alimentazione per tutto il restante hardware del drone. Le LiPo (batterie ai Polimeri di Litio) rispetto alle tradizionali batterie al Litio pesano meno e possono essere costruite con diversi profili; entrambe ottime ragioni per renderle preferibili per equipaggiare un drone il cui peso deve essere ridotto il più possibile. Durante il loro utilizzo le LiPo possono essere soggette ad espansioni del tutto naturali delle quali però bisogna tenere conto quando se ne progetta l’alloggiamento sul mezzo.

Le batterie sono caratterizzate da una capacità espressa in mAh (milliAmpereora) e da una tensione espressa in Volt (V). La tensione delle celle LiPo varia da circa 2,7 V quando la batteria è scarica al valore di circa 4,23 V al 100% della carica. È fondamentale proteggere queste batterie dalla sovraccarica limitandone la tensione a non più di 4,235 V per ogni cella usata. Quando il voltaggio, a seguito dell’utilizzo del drone, scende sotto i 3 V la batteria deve essere ricaricata il prima possibile.

Le moderne batterie hanno integrato un circuito per integrare un modulo hardware di controllo del voltaggio fondamentale per un corretto utilizzo in SICUREZZA della batteria. I comportamenti sono differenti in base ai moduli utilizzati; quello che usiamo noi, quello rosso riportato sopra a destra scrive sul display LCD il livello di carica totale e poi il livello di ogni singola cella ed emette un forte e acuto segnale acustico quando il voltaggio raggiunge la tensione stabilita (da 2.8 V a 3.5 V ad intervalli di 0.1 V).

17

Page 18: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Gli svantaggi principali di questo tipo di batterie sono l’instabilità quando sono sotto-circuitate a causa della bassissima resistenza interna e l’obbligo di usare caricatori specifici per evitare incendi o esplosioni in fase di ricarica. Il rischio di incendio è elevato anche nel caso in cui una cella si forasse ed è per questo motivo che praticamente tutte le batterie sono vendute con un rivestimento di plastica elastico anti foratura. Per il progetto usiamo una batteria da 2200 mAh a 7.4 V per i vari test ed una batteria da 5800 mAh a 11.1 V come soluzione finale per il progetto stabile. Con la prima si ha un volo più armonico dovuto al voltaggio più basso ed una durata di circa 12 minuti, mentre con la seconda si raggiungono circa 25 minuti di volo con una reattività ai comandi maggiore. La prima inoltre risulta essere molto più economica e leggera, perciò in caso di incidente limiterebbe i danni anche dal punto di vista economico oltre che fisici dovuti alla minore massa in movimento. Inoltre la batteria utilizzata in fase di prototipazione deve necessariamente essere leggera perché essendo meno potente non è in grado di fornire ai motori corrente sufficiente per sollevare un carico (payload) significativo. Per valutare quale sia il miglior rapporto peso efficienza si possono creare modelli matematici che permettono di vedere quanto il peso può essere aumentato utilizzando una batteria di capacità maggiore senza diminuire il tempo di volo. La figura in alto a destra mostra il grafico sul quale si è basata la scelta della batteria finale. Analizzando i costi dei componenti in correlazione al grafico si può vedere che l’aumento di prestazioni, inteso come incremento dell’autonomia, dai 6000 mAh agli 8000 mah non è sufficientemente significativo da motivare la spesa. Perciò studiando le caratteristiche delle LiPo presenti sul mercato e tenendo in forte considerazione il rapporto costo/prestazioni si è giunti alla conclusione che la migliore scelta fosse proprio la 5800 mAh.

18

Page 19: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

GPS Il GPS (Global Position System) è un componente fondamentale dei moderni veicoli a pilotaggio remoto, in particolare per i droni.

Attraverso questo hardware è possibile far svolgere al quadricottero missioni pianificate o compiti specifici, i quali vengono pianificati prima del volo ed elaborati nella piattaforma a terra che prende il nome di ground station, che solitamente è identificata nel PC dell’operatore.

Le missioni sono formate da un’area di decollo, waypoints ed un’area di atterraggio che solitamente corrisponde alla stessa area di decollo.

1) Area di decollo → punto in cui il drone decolla ed esegue il setting delle impostazioni precedentemente inserite dalla ground station come ad esempio quota operativa e direzione 2) Waypoints → punti nei quali il quadricottero esegue delle operazioni specifiche variabili a seconda della missione come ad esempio scattare una foto oppure misurare la temperatura 3) Area di atterraggio → punto nel quale la missione termina se non ci sono stati imprevisti durante il suo svolgimento che può coincidere col punto di decollo (percorso ad anello chiuso) oppure no (percorso open path) Per questioni di sicurezza è sempre possibile interrompere una missione in qualsiasi momento e riprendere il controllo manuale del mezzo. Inoltre è possibile pianificare una via di fuga nel caso si verifichino imprevisti durante il volo; di solito si utilizza il “Return-to-home” che consiste nel far tornare in linea retta il drone al punto di partenza ad una quota prestabilita e farlo atterrare automaticamente. Tuttavia in situazioni critiche in cui non è possibile il ritorno a casa si opta per l’atterraggio automatico sul posto per poi procedere al recupero.

19

Page 20: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Gimbal Il Gimbal è un supporto cardanico composto da 2 o 3 assi, a seconda del tipo di utilizzo o applicazioni ricercate.

Viene collegato ad un apposito giroscopio che regola automaticamente l’inclinazione verticale ed orizzontale del supporto per ottenere immagini quanto più stabilizzate possibile.

I tre assi sui quali si può muovere sono gli stessi che corrispondono ai gradi di libertà (DOF) del drone stesso, ovvero rollio, imbardata e beccheggio che possono essere ridotti a 2 eliminando il rollio come nel caso di questo progetto in quanto ritenuto un movimento di importanza marginale poco adatto al pilotaggio da parte di un singolo individuo.

Il componente è formato nella parte superiore da un pad con una scheda logica che rappresenta il punto di contatto con la superficie della PDB (Power Distribution Board) all’estremità inferiore del drone mentre il resto rimane in sospensione nell’area vuota compresa tra la superficie di atterraggio ed il vano batteria.

La tecnologia che equipaggia questo hardware è nota come MEMS, il cui significato è Micro-Electro-Mechanical Systems.

A livello software contiene un micro-firmware che legge dei valori da alcuni accelerometri e giroscopi dedicati o da qualsiasi IMU ed imposta il meccanismo di movimento, che esso sia tramite motori brushless o servomotori in maniera tale da stabilizzare la ripresa.

20

Page 21: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

OSD L’OSD, acronimo di On Screen Display, indica un particolare dispositivo hardware

utilizzato nelle telecomunicazioni per aggiungere informazioni supplementari allo stesso video che si sta trasmettendo sul canale. L’informazione supplementare aggiunta prende il nome di overlay (“sovrastrato”) che consiste in uno strato trasparente che viene aggiunto sopra il video con le nuove informazioni desiderate ottenute disegnando su di esso. L’implementazione di questa funzionalità avviene via hardware perciò la latenza accumulata ed il costo computazionale sono praticamente nulli.

Il dispositivo lavora sulle informazioni da aggiungere nell’ overlay leggendo il frame in uscita dalla videocamera come una matrice di pixel della quale conosce le esatte coordinate X ed Y ed agisce colorando con una tonalità RGB predefinita tali pixel per la corretta rappresentazione dei dati.

Per questo motivo tale dispositivo per poter funzionare ha bisogno di un’entrata video, di un collegamento seriale full-duplex alla centralina ottenuto tramite due canali (Tx ed Rx), l’alimentazione a 5V e la messa a terra GND. La foto a sinistra mostra il video catturato dalla ricevente della ground station dopo che esso è stato estratto dalla videocamera e filtrato tramite l’OSD.

È possibile cambiare la disposizione degli elementi mostrati nell’overlay collegando tramite l’apposita piedinatura l’OSD ad un computer dotato del software di comunicazione seriale col dispositivo che permette di modificarne l’aspetto tramite un semplice meccanismo grafico di tipo drag and drop.

21

Page 22: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

IMU La IMU, nome esteso “Inertial Measurement Unit”, è l’hardware che permette attraverso l’utilizzo degli accelerometri, dei giroscopi e dei magnetometri di misurare le velocità e le accelerazioni angolari lungo i tre assi e perciò consente di conoscere la posizione dell’oggetto sulla quale è installata ogni qualvolta venga interrogata tramite la trasformazione dei dati grezzi detti “raw data” in valori angolari. Le IMU più usate sono quelle appartenenti alla serie 6, ovvero MPU-6000 e MPU-6050. La differenza tra le due sta nel protocollo seriale utilizzato nella comunicazione con il flight controller. La prima comunica tramite SPI ed è la più utilizzata su tutti i sistemi avionici di piccole/medie dimensioni, compresa la scheda APM 2.8 utilizzata per il progetto, perché è in grado di campionare il giroscopio ad 8 KHz e si comporta molto bene in presenza di vibrazioni. La seconda comunica tramite I2C (si legge “i quadro c”) è più economica, più lenta e ancora meno sensibile alle vibrazioni ma è poco usata nei sistemi avionici a causa della minore velocità dovuta al protocollo utilizzato. MPU-6000 alla pari con MPU-6050 è composta da un accelerometro e da un giroscopio a tre gradi di libertà (3 DOF), uno rispettivamente per ciascuno degli assi X,Y e Z. Se si sommano i 3 DOF dell’accelerometro ai 3 DOF del giroscopio si ottengono i 6 DOF che sono quelli riportati nel datasheet del microprocessore. Ad inizio capitolo si è parlato di raw data,ed il perchè è da ricercare nel fatto che questo dispositivo non fornisce la misura di un angolo in gradi pronta per poter essere utilizzata dal controllore PID ma fornisce per ogni asse un valore intero a 16 bit ottenuto sommando i valori di due registri contigui che rappresenta un’accelerazione. Dal datasheet si può constatare che il valore di 16384.0 corrisponde ad una accelerazione di 1G. Acc_rawX=Wire.read()<<8|Wire.read(); La riga di codice sopra riportata mostra come eseguire in maniera elegante uno shift del primo registro nella parte alta della variabile a 16bit Acc_rawX e una somma degli 8 bit del registro successivo nella parte bassa ottenendo così il valore reale campionato ottenuto dall’unione dei due registri. Basterà poi dividere tale valore per 16384.0 per ottenere l’accelerazione sull’asse X.

22

Page 23: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

La centralina APM Il controllore di volo è il cuore di ogni drone, rappresenta l’hardware che mette in comunicazione e permette a tutti gli altri hardware di interagire tra di loro scambiandosi informazioni essenziali per una corretta navigazione ed interpretazione dei comandi.

Lo schema sopra riporta una sezione della centralina APM in versione 2.8, dove viene mostrato lo schema logico di collegamento della ricevente radio fino ad un massimo di 8 canali con i relativi comandi in ordine di posizione. Precisiamo inoltre che non è possibile cambiare l’ordine dei comandi a piacimento in quanto essi dipendono strettamente dalla struttura interna del software installato nella scheda APM. La ricevente del radiocomando rappresenta la fonte dei segnali di input per il controllore di volo.

23

Page 24: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Nella figura alla pagina precedente si può vedere come sul lato sinistro, quello opposto al lato coi pin di input, si trovano i pin di output. Si noti che quanto riportato in figura è un esempio specifico, in quanto i motori 1 e 2 potrebbero girare anche in senso orario e lo stesso i motori 3 e 4 potrebbero girare in senso antiorario, l’importante è che i motori vengano sempre appaiati in coppia come mostrato in figura senza scambiare i pin. La parte alta della centralina ha 14 pin utilizzabili per collegare hardware legati alla telemetria o comunque slegati dalle funzionalità base di I/O. La scheda è dotata di un processore Arduino MEGA (ATmega2560) ed una memoria flash di 4Mb sufficiente a contenere i dati di bordo per la navigazione autonoma. La figura a destra mostra le posizioni dei comandi telemetrici nella parte alta della centralina. È molto importante impostare correttamente questi valori perché alcuni di essi rappresentano dei feedback visivi del corretto funzionamento di alcuni moduli, ad esempio il LED collegato al GPS.

Al suo interno l’ APM è formata da una IMU (Inertial Measurement Unit), componente che si occupa di rilevare,gestire e correggere in maniera attiva gli spostamenti del drone lungo i 3 assi (rollio, virata, imbardata). Per fare ciò al suo interno ha una serie di accelerometri e giroscopi. Il controllore di volo è inoltre dotato di barometro, strumento usato per misurare

la pressione dell’aria, che permette di gestire l’hovering, ovvero la possibilità del drone di rimanere in stallo all’altezza in cui si trova anche dopo aver rilasciato il comando dell’acceleratore. Include anche un magnetometro, strumento fondamentale per mantenere una buona stabilità del mezzo e che permette di mantenere l’orientamento durante il volo.

24

Page 25: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Esso si occupa di compensare il campo magnetico esterno, ma dato che il campo magnetico terrestre varia a seconda del punto in cui ci si trova è buona norma calibrarlo sempre prima del primo volo, soprattutto se ci si sposta significativamente dall’area operativa precedente. Deve essere ricalibrato anche in caso vengano apportate modifiche sostanziali al progetto, come ad esempio l’aggiunta di una telecamera o di un nuovo sensore. Sono presenti inoltre vari socket che permettono il dialogo tra la centralina e le varie periferiche secondo diversi standard tra i quali l’ I2C sviluppato da Philips nel 1982. Le periferiche collegabili sono il GPS (Global Position System),un compasso esterno, l’OSD (On Screen Display) ed il power module per alimentare la scheda a 5V. Il processore, la vera unità di elaborazione del quadricottero è un ATmega2560, lo stesso microcontrollore, o MCU, usato nella scheda Open Source Arduino Mega.

Questo processore, appartenente alla famiglia dei processori RISC (Reduced Instruction Set Computer), ha un clock nominale di 16 Mhz (può arrivare anche a 20MHz) ed è in grado di eseguire la maggior parte delle sue istruzioni base in un solo ciclo di clock. Fu sviluppato a partire dal 1996 e fu una delle prime MCU a far uso delle memorie flash con i conseguenti vantaggi che esse comportano. Le memorie sono organizzate secondo l’architettura Harvard che prevede la separazione della memoria dati dalla memoria delle istruzioni. L' unità centrale può effettuare un accesso ai due bus contemporaneamente e, sfruttando sistemi di pipeline, si può eseguire una istruzione per ogni ciclo macchina. I due bus possono avere ampiezze diverse: ad esempio, nell’ATmega2560 con bus dati a 8 bit, il bus istruzioni è ampio 16 bit. Questa struttura si presenta come la più adeguata a macchine di tipo RISC.

25

Page 26: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Software on board (embedded) Il software utilizzato per il progetto è l’ArduPilot scritto in Wiring, il linguaggio di Arduino, diretto derivato del C e del C++. Il linguaggio oltre a presentare ottimizzazioni mirate per la compilazione di un sistema real time permette una programmazione ad oggetti (OOP) e ha numerose librerie che permettono un rapido approccio alle funzioni cercate. Il programma è sviluppato in un linguaggio di basso livello perchè ciò non solo permette di avere controllo totale sull’hardware sul quale il codice viene eseguito ma permette in maniera abbastanza semplice le operazioni di verifica e validazione delle sezioni time-critical o time-budget. L’ArduPilot è un software molto conosciuto nel settore, è stato sviluppato in poco più di 5 anni e deve il suo successo prima di tutto al fatto di essere un progetto Open source sotto licenza GPL (General Public Licence) e poi al basso costo e della grande reperibilità dell’hardware per il quale è studiato. Nasceva in origine come standard per il modellismo dinamico per poi diventare in pochissimo tempo un vero e proprio sistema di pilotaggio intelligente per UAV. L’acronimo UAV indica tutti i mezzi aerei sprovvisti di pilota e di personale a bordo :

UAV → Unmanned Aerial Vehicle

L’automazione del software basa il suo funzionamento principalmente sugli algoritmi di controllo PID che sono anche i sistemi più utilizzati in ambito industriale in qualsiasi settore. La sigla PID significa “Proporzionale-Integrale-Derivativo” ed è un sistema a retroazione negativa. Un qualsiasi meccanismo di controllo si dice in retroazione (o retroregolazione) se ad ogni iterazione si è in grado di correggere un eventuale errore tenendo conto del risultato dell’iterazione precedente. Esistono due tipi diversi di retroazione :

- Positiva → poco usata per problemi di stabilità ed efficienza - Negativa → comunemente usata perchè stabile ed efficiente

26

Page 27: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

La retroazione positiva è definita tale perché il suo funzionamento porta il sistema ad amplificare in positivo,quindi aggiungere un valore correttivo allo stato del sistema stesso. Questo meccanismo è instabile in quanto spesso utilizzando questo approccio il sistema tende a divergere rispetto all’obiettivo e ciò è matematicamente dimostrabile. All’opposto la retroazione negativa porta il sistema ad effettuare una correzione di tipo sottrattivo, quindi il valore generato ad ogni iterazione tende a smorzare in caso di errore lo stato successivo del sistema e ciò porta generalmente il sistema stesso a convergere verso l’obiettivo. In campo matematico i sistemi vengono definiti “ad anello aperto” se non possiedono alcun meccanismo di retroazione, “ad anello chiuso” se sono retroazionati. Per far capire meglio la differenza tra i due tipi di sistema si consideri il seguente esempio : Impostare un controllore di velocità di un mezzo ad anello aperto garantisce che l’acceleratore sia sempre fermo nella stessa posizione ma non garantisce il mantenimento della velocità in situazioni come una salita. Il sistema ad anello chiuso invece è in grado di tenere anche traccia del parametro velocità per correggere il dosaggio dell’acceleratore in situazioni come ad esempio una salita in maniera tale da tenere effettivamente costante la velocità in tutte le situazioni. Già con questo semplice esempio si può capire che i sistemi retroazionati sono molto più precisi ed efficienti di quelli non retroazionati.

Ardupilot è un software, come già detto in precedenza, con architettura ad anello chiuso che sfrutta gli algoritmi PID come sistema di retroazione.

27

Page 28: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Da ciò si può capire che modificare i parametri P, I, D ha conseguenze dirette sul comportamento del modello. La modifica deve avvenire con criterio e per quanto non sia obbligatorio è sempre consigliato procedere modificando prima il valore di P, poi il valore di I ed infine il valore di D. La figura a destra ci sarà d’aiuto per spiegare i cambiamenti sul comportamento del modello al variare dei valori dei tre parametri. La modifica dei valori è a tutti gli effetti un’operazione di cinematica inversa. Il parametro P rappresenta il valore proporzionale; è il valore che determina la stabilità del modello sui tre assi (roll, pitch, yaw). Quando risulta troppo alto il modello reagisce vibrando in maniera abbastanza vistosa. Quando è troppo basso il modello risulta instabile e “molle”. Il parametro I rappresenta il valore responsabile della tenuta di traiettoria del modello sui tre assi (roll, pitch, yaw). Più il valore di I è alto più il modello manterrà la sua traiettoria ferma dopo il cambio di direzione sull’asse relativo. Per valori di I bassi si comporta in maniera opposta. È importante tenere questo valore alto ma non troppo, infatti nel caso di valori fuori scala il modello comincerà a vibrare e avrà problemi in stabilità su azioni tipo “stop ‘n’ go” o il roll in fase di discesa. Il parametro D rappresenta il valore responsabile della morbidezza negli stop repentini sui vari assi. In particolare lo si nota nei flip e nei roll a 360°. A fine giro, se il modello mostra una specie di colpo di frusta, vuol dire che il nostro modello ha bisogno di più D. È importante portare questo valore ad un numero abbastanza alto da rendere il modello morbido in modo tale da non notare nessuno stop brusco o colpo di frusta.

28

Page 29: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Regole di Ziegler-Nichols Il metodo di Ziegler-Nichols venne ideato e realizzato nel 1942, è tra i più utilizzati grazie alla sua semplicità e per il fatto di non richiedere un modello matematico del processo. L’algoritmo consiste nel trovare un valore chiamato comunemente “guadagno critico” che viene calcolato

1) Il processo viene fatto controllare da un controllore esclusivamente proporzionale (KI e KD vengono impostati a zero).

2) Il guadagno K del controllore proporzionale viene gradualmente aumentato. 3) Il guadagno critico Ku è il valore del guadagno per cui la variabile controllata

presenta oscillazioni sostenute, cioè che non spariscono dopo un transitorio: questa è una misura dell'effetto dei ritardi e della dinamica del processo

4) Si registra il periodo critico Pu delle oscillazioni sostenute. 5) Secondo la tabella sotto, si determinano le costanti per il controllore P, PI

PID. Alla pagina seguente mostriamo un esempio di una possibile implementazione di una classe per calcolare i valori di PID secondo il paradigma Object-Oriented nel linguaggio Java. Il codice non presenta la soluzione finale ma solo i metodi per calcolare i parametri che poi dovranno essere sommati.

29

Page 30: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Java code public class PID {

public float integrale(float tf,float ti,float ef,float ei,float ki){

// integrale contiene tutti i valori calcolati dell'integrale

// ti è il tempo iniziale, tf il tempo finale

// ei è l'errore iniziale, ef l'errore finale

// ki è il coefficiente integrativo del pid

float integrale=0;

float area=((ei+ef)*(tf-ti))/2 ;

integrale=area*ki; /*calcoliamo l'integrale sommando il triangolo e il quadrato

moltiplicandolo per il coefficiente integrativo */

return integrale;

}

public float proporzionale (float e,float kp){

float proporzionale=kp*e; //calcoliamo la proporzionale

return proporzionale;

}

public float derivativa(float tf,float ti,float ef,float ei,float kd){

float ritorno;

float sen=Math.abs(ef-ei); //seno del triangolo

float cos=Math.abs(tf-ti); //coseno del triangolo

ritorno=kd*sen/cos; /*derivata dei due punti è uguale alla inclinazione creatasi

dalla retta creata virtualmente dai due punti */

return ritorno;

}

}

30

Page 31: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Failsafe In ambito embedded o di sistemi dinamici per lo più controllati tramite meccanismi o automazioni real-time, gli ingegneri sono soliti definire “failsafe” tutta la suite di procedure specifiche che hanno lo scopo di gestire il fallimento riducendo al minimo i rischi ed i danni per l’oggetto controllato dal sistema e per l’ambiente esterno . Le suddette funzioni hanno il grado più alto di priorità e ciascuna routine principale gestisce in maniera altamente specifica il caso di fallimento. Il comportamento del Failsafe non è standardizzato ma è deterministico, ovvero la gestione (handling) degli eventi è stabilita a priori in fase di progettazione prima della stesura del codice in base ai requisiti richiesti ed ai costi di realizzazione e successivamente tale comportamento deve essere fedele senza eccezioni in ogni caso d’uso.

La figura sopra mostra un diagramma di flusso del comportamento del sistema se il Failsafe per la perdita di segnale radio fosse configurato secondo il criterio “return to home”. In tal caso come mostrato al verificarsi di una perdita di segnale durante il volo il software reagisce mettendosi per un tempo predefinito in uno stato di stallo, detto hovering, e successivamente interroga il GPS per essere navigato in linea retta fino al punto dal quale è decollato ad una quota prestabilita per poi tornare in uno stato di hovering per un altro intervallo prestabilito ed infine atterrare in verticale. efficiente sarebbe stato programmare un atterraggio in verticale nel punto esatto in cui la trasmissione radio si è interrotta secondo il criterio “Immediate landing” .

31

Page 32: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Un’altra problematica che viene gestita tramite il Failsafe, soprattutto per quando riguarda i velivoli, è la gestione del carburante/carica della batteria. Abbiamo accennato in maniera superficiale nel capitolo riguardante le LiPo e gli hardware di controllo che esiste un componente chiamato Power module che oltre ad essere l’hardware che possiede il BEC a Un altro modo di gestire tale evento in maniera più semplice ma molto meno 5V per alimentare la centralina è il responsabile del controllo del livello di carica della fonte di alimentazione. Il Failsafe del controllo della batteria generalmente utilizza un approccio Immediate landing ma in caso di software particolarmente ingegnerizzato, ricco di interazioni tra i vari sensori e CPU ad elevata frequenza di clock è possibile eseguire la stessa routine di Return to home utilizzata per la mancanza di segnale radio. Come e quando entrano in azione i Failsafe Arrivati a questo punto è normale porsi la domanda : “Come fa il Failsafe a sapere quando intervenire se la comunicazione con l’operatore è stata interrotta e non è possibile impartire alcun comando ? ” A livello di codice viene implementato un sistema di controllo che è conosciuto col nome di polling. La funzione principale di tutto il sistema è loop(), un ciclo infinito che non può essere interrotto in nessun modo e che viene ripetuto fino allo spegnimento fisico del quadricottero. La durata di ogni ciclo di loop() dipende strettamente dal numero di controlli e dalle funzioni che il microcontrollore dovrà eseguire, però è calcolabile in maniera precisa in qualsiasi momento all’interno del flusso di esecuzione. Tornando al polling, esso è definito come il controllo ciclico di tutti i moduli,periferiche o unità che compongono il sistema in esecuzione. È abbastanza semplice ora capire che è possibile inserire all’interno della funzione loop() una funzione che restituisca un valore booleano {true,false} che funge da interruttore di attivazione/spegnimento per il Failsafe associato. Alla pagina seguente si trova lo pseudocodice semplificato per far capire come avviene il funzionamento appena descritto a livello di sistema

32

Page 33: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

#define MIN_VALUE 9.3 //definisce il valore minimo del voltaggio per una LiPo 3S bool checkRadioError(); //prototipo funzione di check per il segnale radio float checkBatteryVoltage(); //prototipo funzione di check per il livello della batteria void setup(){ //codice inizializzazioni } void loop(){

if(checkRadioError() == true){ /*attivo il failsafe radio*/

} if(checkBatteryVoltage() <= MIN_VALUE){

/*attivo il failsafe batteria*/ }

} bool checkRadioError(){

Tx outgoingSignal = Tx.init(); /*questi oggetti non esistono realmente*/ Rx inputStreamSignal = Rx.init(); /*questi oggetti non esistono realmente*/

outgoingSignal.send(); //spedisce un segnale radio al quadricottero delay(125); //aspetta ⅛ di secondo

if(inputStreamSignal.read() == null){

return true; } else{

return false; }

} float checkBatteryVoltage(){

return analogRead(batPin); //legge e restituisce il voltaggio della batteria }

33

Page 34: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Watchdog

In alcune porzioni del programma particolarmente critiche, si può avere tuttavia la necessità di eseguire un controllo ancora più rigoroso rispetto a quello che viene effettuato in fase di validazione e ciò

avviene sfruttando dei timers implementati in hardware chiamati Watchdogs. Il watchdog o watchdog timer (in italiano: "temporizzazione di supervisione" - letteralmente: "cane da guardia") è un sistema di temporizzazione hardware che permette alla CPU la rilevazione di un loop infinito di programma o di una situazione di deadlock. Generalmente un watchdog ha lo scopo di resettare il sistema al verificarsi di una delle situazioni descritte sopra. Possono essere implementati in maniera più complessa al fine di salvare lo stato del sistema prima di resettarlo per poi eseguire operazioni di debugging sull’applicazione/processo che ha portato allo stato di stallo e ciò viene implementato usando due di questi controllori, uno che salva lo stato prima del reset ed uno che si occupa del reset vero e proprio. Particolari watchdog possono innescare inoltre azioni di sistemi di controllo per effettuare operazioni di messa in sicurezza di apparati secondari come ad esempio, spegnimento di motori, alimentazioni o altro, in attesa che la condizione di errore venga eliminata.

Esempio Pratico

Sistemi embedded remoti, come ad esempio satelliti o stazioni spaziali, non sono fisicamente accessibili ad un operatore umano e ciò può causare la permanente perdita di funzionamento di tale sistema se esso non fosse in grado di riprendersi autonomamente dagli errori. Ciò renderebbe tali sistemi oltre che imprevedibili fortemente rischiosi da implementare in quanto potrebbero bloccarsi in un imprevedibile stato di deadlock rendendo gli investimenti fatti e gli obiettivi per cui sono stati realizzati nulli. I Watchdog timers sono implementati proprio per evitare situazioni del genere e rendere autocorrettivi i sistemi stessi che li implementano.

34

Page 35: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Protocolli di comunicazione hardware Un protocollo di comunicazione hardware, noto anche come interfaccia per la comunicazione, è il modo che un microcontrollore utilizza per scambiare dati con periferiche esterne e viceversa. La trasmissione dei dati può essere parallela o seriale; nel primo caso, come riportato nella figura sopra a sinistra, deve essere presente lato hardware una linea di trasmissione per ogni bit che deve essere trasferito più la linea di clock, mentre nel secondo caso, dato che la trasmissione avviene in serie sono sufficienti due linee, una per il clock e l’altra per il trasferimento dei dati. La trasmissione parallela dei dati risulta più efficiente ma tuttavia risulta essere troppo costosa da implementare, in quanto richiede un maggior numero di linee dedicate e poi è fortemente limitata dal fatto che pochi microcontrollori hanno a disposizione l’elevato numero di linee di I/O che essa richiede. Perciò anche se meno efficiente spesso si ricorre all’utilizzo della comunicazione seriale che ha come unico vantaggio l’utilizzo di un minor numero di canali. Esistono due tipologie di comunicazione seriale :

- Sincrone - Asincrone

Le comunicazioni sincrone utilizzano una linea che genera un segnale di clock utilizzato appunto dai due comunicanti per sincronizzarsi. I due principali protocolli appartenenti a questa famiglia sono SPI e I2C. Le comunicazioni asincrone invece utilizzano i dati trasmessi come fonte di sincronizzazione tra le due parti, infatti il trasmettitore inizia la comunicazione inviando un bit di start, poi il dato vero e proprio, la cui lunghezza varia da cinque a otto bit (con il bit meno significativo per primo), un bit opzionale di parità ed un tempo di stop di lunghezza variabile (uno, uno e mezzo o due tempi di bit). Il bit di partenza è sempre o space o 0. Il bit di stop è sempre o mark o 1 e crea uno spazio prima della partenza del carattere successivo. La modalità asincrona, in caso di trasmissioni di una certa lunghezza, usa i segnali in modo molto meno efficiente della modalità sincrona, in cui, dopo un preambolo di sincronizzazione, tutti i bit trasportano dati. La modalità di trasmissione dati utilizzata dai dispositivi a bordo del drone è di tipo sincrono.

35

Page 36: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

SPI Il Serial Peripheral Interface o SPI è un sistema di comunicazione tra un MCU e altri circuiti integrati o tra più microcontrollori.

È uno standard inventato da Motorola a metà degli anni ‘80 e consiste nella comunicazione tra un dispositivo master e uno o più dispositivi slave. Richiede tre linee fisse più n linee a seconda del numero di dispositivi slave collegati. Le tre linee fisse presenti in ogni dispositivo che supporta questo protocollo sono rispettivamente SCLK (“Serial

shift clock”) che rappresenta il segnale di clock per sincronizzare trasmettitore e ricevente, MOSI (“Master Output Slave Input”) è la linea di comunicazione dati dal master verso lo slave e MISO (“Master Input Slave Output”) è la linea di comunicazione dati dallo slave al master. Lo sdoppiamento delle linee di entrata e di uscita permette una comunicazione di tipo full-duplex. Le altre linee che compongono il bus sono SS (“Slave Select”) che servono al dispositivo master che conduce la comunicazione per selezionare quale dei dispositivi slave dovrà essere il target dell’informazione passata. Esistono inoltre due bit di configurazione che sono CPOL e CPHA. CPOL (“Clock POLarity”) permette di definire la polarità del segnale di clock, ovvero permette di definire lo stato se lo stato di idle si identifica con il livello logico basso o col livello logico alto. CPHA (“Clock PHAse”) permette di definire la fase del clock, ovvero se CPHA = 0 allora i dati in uscita dal master verranno letti sul fronte di discesa e quelli in uscita dagli slave sul fronte in salita, se si inverte la fase ovvero CPHA = 1 avverrà l’esatto opposto. Con questi due bit sono possibili quattro differenti configurazioni, però dispositivi che comunicano tramite SPI devono necessariamente adottare tutti la stessa configurazione.

36

Page 37: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

I2C I2c, o più correttamente (“Inter Integrated Circuit ”) è uno standard di CI2 comunicazione seriale creato da Philips negli anni ‘80 ma reso ufficiale solo nel 1992

A differenza della comunicazione SPI l’ I2C è sempre di tipo half-duplex. È composto da due linee; SCL (“Serial Clock”) e SDA (“Serial Data”) entrambe bidirezionali che necessitano di una connessione verso l’alimentazione tramite resistenze di pull-up. Le linee SCL e SDA sono definite “open collector” per poter consentire l’implementazione della funzione AND cablato direttamente sul bus. A differenza di una comunicazione SPI, I2C è definita come multiMaster architecture nella quale la periferica che inizia la trasmissione genera quindi il segnale di sincronismo è designata automaticamente come dispositivo master, mentre la periferica target della trasmissione dei dati indirizzata dal master è considerata come slave. Una periferica master per una certa trasmissione, potrà in seguito essere anche slave per un’ altra trasmissione. Una periferica slave può in ogni momento rallentare o addirittura interrompere la comunicazione del master grazie all’ AND cablato. Il meccanismo dell’ AND cablato consente anche di arbitrare una comunicazione: se due periferiche master iniziano contemporaneamente una trasmissione, la priorità verrà data a quella che trasmette per prima uno zero logico. I dati possono essere trasferiti a velocità massime di 100 Kbps in modalità Standard, 400 Kbps in modalità Fast e 3.4 Mbps in modalità High-Speed. Nella modalità Standard gli Slave sono indirizzati a 7 bit, mentre nelle modalità Fast e High-Speed l’indirizzamento può essere a 7 o a 10 bit. Fisicamente il carico capacitivo sul bus non deve eccedere i 400 pF per non compromettere la velocità di comunicazione. Generalmente I2C è più lento di SPI ma è meno sensibile alle interferenze esterne.

37

Page 38: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Software Server-side (High level application) Ad alto livello il sistema per cui il drone è stato costruito si occupa di effettuare riconoscimento di oggetti (Object detection), e per fare ciò ha bisogno di un access point per ricevere le immagini in streaming. Un trasmettitore video analogico è infatti stato installato a bordo con lo scopo di

trasmettere in real time il video della telecamera installata nel gimbal. Un ricevitore analogico è collegato al PC tramite cavo USB-OTG (On-The-Go) con lo scopo di prelevare il segnale video che sarà l’input per il riconoscitore. Il linguaggio di programmazione che si è scelto di utilizzare è python per via della sua versatilità grazie alla quale è possibile scrivere programmi

anche molto complicati in un ristretto numero di linee di codice mantenendo una struttura abbastanza ordinata e rendendo il codice autoesplicativo (intention revealing code) grazie alla sua natura ad oggetti (OOP) unita alla sua natura funzionale (FP). È presente un database (DB) SQL gestito tramite la libreria sqlite3 contenente le informazioni relative ai profili degli utenti riconoscibili ed una cartella col campionamento dei volti. È presente anche una cartella contenente un file .yaml che viene aggiornato ogni qualvolta un utente viene aggiunto o rimosso dalla base di dati e che contiene le coordinate usate dall’algoritmo LBPH (Local Binary Patterns Histograms) per identificare i volti e relazionarli col profilo nel DB. Per rendere queste operazioni accessibili e comprensibili al numero più vasto di utenti possibile si è deciso di creare un modello grafico che dia un feedback visivo all’utente durante tutte le operazioni mascherando a quest’ultimo il funzionamento del sistema e garantendo la consistenza dei dati attraverso un forte meccanismo di controllo di preinserimento o modifica dei dati. Il meccanismo di cancellazione prevede una cross function che dopo aver identificato l’utente che si desidera eliminare ne salva l’ID prima della rimozione finale per poter eliminare anche le immagini ad esso relative nella cartella delle foto utilizzate per il riconoscimento. La comunicazione dei dati tra le varie finestre funziona sempre col criterio read/write, il che avviene scrivendo scrivendo su un file il parametro da passare prima della distruzione della finestra e leggendo successivamente il valore da ereditare nel nuovo contesto.

38

Page 39: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Librerie L’applicazione sfrutta due librerie principali per la gestione del suo run-time:

OpenCV → Libreria di computer vision PyQt5 → Libreria per interfacce grafiche/GUI

Le OpenCV (Open Computer Vision) gestiscono il core del programma e si occupano delle funzionalità legate al riconoscimento di un pattern all’interno di un’immagine che

viene acquisita in maniera dinamica da un live streaming del drone o in maniera statica da un input pre esistente. Si occupano inoltre delle funzioni di scrittura e lettura dei file nella cartella dedicata a tale scopo creata in fase di progettazione del software. Con le OpenCV si possono gestire sorgenti video dinamiche

differenti ad alto livello tramite la funzione VideoCapture() oppure la lettura può direttamente avvenire da un’ immagine statica. Le PyQt5 si occupano di gestire la parte grafica e quindi di permettere una corretta interazione tra l’utente ed il sistema. Hanno a loro completo carico il run-time grafico e gestiscono finestre,bottoni,menu. Possono essere programmate in maniera esclusivamente grafica oppure possono essere codificate direttamente come classe. Nel primo caso il lavoro risulta essere più semplice ma vengono perse la maggior parte delle personalizzazioni possibili programmandole in maniera diretta. Tuttavia nel nostro caso si ha la necessità di gestire dinamicamente la maggior parte dei componenti, e ciò avviene aggiungendo metodi alla classe che definisce l’interfaccia grafica (GUI) stessa, perciò l’implementazione avviene direttamente a livello di codice python. La stilizzazione dei componenti avviene tramite i fogli di stile CSS nello stesso modo con il quale viene creato il design dei componenti delle pagine HTML nelle web application.

39

Page 40: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

DB - SQL In tutti i programmi e/o applicazioni che basano il loro funzionamento sulla manipolazione ed elaborazione dei dati è fondamentale avere un modello che corrisponda alla struttura degli oggetti usati per la computazione ma tuttavia indipendente dalla logica stessa del programma. Ciò è ottenibile in vari modi tra cui strutturare un’architettura software di tipo read/write. Tuttavia questo tipo di implementazione ha sicuramente come vantaggio la semplicità dal punto di vista della codifica ma risulta essere pericolosa per la possibile corrompibilità dei dati con la conseguente perdita parziale o totale di informazione. Un’ altra problematica dell’utilizzo dei file è legata alla possibile non consistenza dei dati, infatti quello che viene scritto in un file di testo risulta essere sempre a tutti gli effetti una stringa che poi dovrà subire un processo di parsing in fase di lettura e assegnamento per poter essere interpretata come il tipo di dato che rappresenta. L’ ultimo grande problema legato ai file riguarda le prestazioni, infatti si tenga presente che operazioni quali scrittura e lettura sono funzioni molto onerose con una richiesta di risorse e tempi di accesso molto elevati che rischiano di ridurre fortemente l’usabilità dei programmi e perciò il loro uso intensivo è sconsigliato in ambito di applicazioni time-budget e/o time-critical e a maggior ragione nei sistemi real-time. A causa dei grossi ed evidenti limiti sopra descritti la soluzione adottata quasi nella totalità dei casi, a meno di poche informazioni da memorizzare, è il DataBase. I DBMS relazionali o RDBMS (Relational Data Base Management System) nascono proprio con lo scopo di incrementare le prestazioni dei calcolatori. Furono originariamente ideati all’inizio degli anni `70 dallo scienziato Edgar Frank Codd, che mentre lavorava per conto di IBM ai primi Hard Disk si accorse dell’inefficienza del sistema codasyl (Conference/Committee on Data Systems Languages) utilizzato in quel periodo.

40

Page 41: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

La principale differenza tra le due tipologie di gestione dati è che codasyl optava per una struttura basata su righe (record) a lunghezza variabile memorizzate indipendentemente l’una dall’altra e legate in qualche modo tramite una struttura dati complessa ad albero mentre i DataBase relazionali utilizzano record a lunghezza fissa ed i campi opzionali o complessi sono a loro volta scomposti in tabelle con righe a lunghezza arbitraria. Il corretto utilizzo delle basi di dati garantisce alcune caratteristiche fondamentali per la gestione dei dati all’interno di sistemi informatizzati. Tali principi sono raccolti in due macro categorie : ACID e BASE. I database relazionali o SQL godono delle proprietà ACID :

1) Atomicity → le transazioni interne alla base di dati sono atomiche, ciò significa che o vengono eseguite interamente o non vengono proprio eseguite

2) Consistency → quando una transazione inizia la base di dati si trova in uno stato consistente, ovvero non viola nessun vincolo di integrità e quindi non vi sono dati contraddittori al suo interno, e tale stato deve essere mantenuto anche alla fine della transazione.

3) Isolation → ogni transazione deve essere indipendente dalle altre altre in modo tale che un eventuale fallimento non condizioni lo stato delle altre operazioni

4) Durability → detta anche persistenza assicura, col fine di evitare malfunzionamenti, che una volta spedita una richiesta di cambiamento o inserimento di dati nella tabella essi non dovranno più essere persi. Per rendere tale compito ancora più sicuro esistono dei registri di log delle

operazioni che vengono eseguite sulla base di dati I database non relazionali o NoSQL godono delle proprietà BASE :

1) Basically Available → il sistema deve garantire la disponibilità dei dati e quindi dovrà sempre rispondere a qualsiasi richiesta

2) Soft State → lo stato del sistema può cambiare nel tempo, anche in periodi di tempo senza input ci possono essere cambiamenti in corso a causa, in questo modo lo stato del sistema è sempre “soft”. La consistenza dei dati diventa un problema da risolvere da parte dello sviluppatore e non deve essere gestita dal database

3) Eventually Consistent → quando nuovi dati vengono aggiunti al sistema essi si propagheranno gradualmente un nodo alla volta fino a far diventare consistente l’intero sistema

41

Page 42: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Il DB utilizzato per l’applicazione è di tipo SQL implementato tramite la libreria SQLite3, la quale scritta in C, implementa brillantemente un DBMS relazionale di tipo ACID. La libreria è particolarmente indicata per database di piccole/medie dimensioni e può essere utilizzata su una vasta gamma di calcolatori grazie alla sua implementazione in C che non la rende particolarmente esigente in termini di risorse. SQLite non è un’applicazione stand-alone ma può essere facilmente inglobata all’interno della maggior parte degli ambienti di sviluppo. Si sarebbe potuto anche utilizzare un approccio tramite DataBase NoSQL ma tuttavia si è scelto di separare le immagini dalla corrispondente riga nel db per avere un base di dati snella e molto versatile in grado di rispondere in tempi molto più brevi senza perdere nulla dal punto di vista della precisione.

42

Page 43: An Arduino drone for real-time face detection€¦ · Secondo le dinamiche delle scheda Arduino i pin disponibili per le componenti hardware telemetriche sono 14. Un’entrata sul

Conclusioni Il progetto appena realizzato unisce e permette di imparare e conoscere gran parte delle tecnologia hardware utilizzate e le metodologie di interfacciamento con software di alto livello e linguaggi di programmazione quali Java, Python, Wiring e C++. Il settore dei droni, dell’avionica a pilotaggio remoto e dei mezzi UAV è in forte sviluppo perciò alla fine di questo progetto durato poco più di un anno alcune nuove tecnologie sono state inventate e si sono compiuti notevoli progressi nell’analisi incrociata dei dati prelevati dai sensori e nel numero di periferiche collegabili al flight controller stesso. Ci si aspetta in futuro, come si è già iniziato a fare, di poter sviluppare queste tecnologie in modo tale da portarle sugli aerei o su qualsiasi altro mezzo per poter rendere la guida autonoma una realtà sicura ed efficace. Il conseguimento di tale obiettivo non sarà dovuto solo all’ hardware ma si baserà anche fortemente sul codice scritto; in particolare gli algoritmi di object detection, object tracking ed object recognition avranno un ruolo cruciale per determinare l’affidabilità e la qualità di un sistema autonomo. Ringraziamenti Vorrei ringraziare il professor Diego Reforgiato Recupero, relatore di questa tesi di laurea per la disponibilità ed il sostegno fornito durante tutta la durata di questo lungo progetto. Ringrazio anche la mia famiglia per il sostegno morale ed economico ed in ugual modo ringrazio tutto l’ AUGC Arduino User Group Cagliari di cui ormai anche il sottoscritto fa parte. In particolar modo un grosso ringraziamento va a:

- Leandro Zaccaria per le spiegazioni sugli hardware, il funzionamento dei microcontrollori e circuiti digitali

- Stefano Ledda per le spiegazioni sui sistemi con retroazione, gli IDE e le compatibilità tra componenti

- Mauro Cau per le spiegazioni sui protocolli di comunicazione e teoria dei segnali analogici e digitali

43