Arna u Arbós Ruiz S DE CONT BOT QUA D-ROTOR E GRAU Di...

57
S SISTEMA Gra DE CONT Di au d’Engin Arna TROL I SUP TREBAL rigit pel P nyeria Ele T au Arbós PERVISIÓ LL DE FI D Prof. Alber ectrònica I Tarragona 2014 Ruiz Ó D’UN RO DE GRAU rt Oller Pu Industrial a OBOT QUA jol i Automàt AD-ROTOR tica R

Transcript of Arna u Arbós Ruiz S DE CONT BOT QUA D-ROTOR E GRAU Di...

  

 

 

S

SISTEMA

Gra

DE CONT

Di

au d’Engin

Arna

TROL I SUP

TREBAL

rigit pel P

nyeria Ele

T

au Arbós

PERVISIÓ

LL DE FI D

Prof. Alber

ectrònica I

 

Tarragona

2014

Ruiz

Ó D’UN RO

DE GRAU

rt Oller Pu

Industrial

a

OBOT QUA

jol

i Automàt

 

AD-ROTOR

tica

R

1

Índex

1 Objectius ................................................................................................................... 3

2 Introducció ................................................................................................................ 3

2.1 Motivació ........................................................................................................... 3

2.2 Historia dels quad-rotors ................................................................................... 4

2.3 El quad-rotor AR.Drone 2.0 ............................................................................... 8

2.3.1 Parts del hardware ....................................................................................... 8

2.3.1.1 Electrònica ............................................................................................. 8

2.3.1.2 Gravació de vídeo .................................................................................. 9

2.3.1.3 Motors ................................................................................................... 9

2.3.1.4 Estructura .............................................................................................. 9

2.3.2 Comparativa amb altres models .................................................................. 9

2.4 Visio artificial ................................................................................................... 10

2.4.1 Seguiment imatges en color ....................................................................... 11

2.4.1.1 RGB ...................................................................................................... 11

2.5 MATLAB ........................................................................................................... 12

2.5.1 Comunicació UDP ....................................................................................... 12

2.5.2 Visió artificial .............................................................................................. 13

2.5.2.1 Vision System Toolbox ........................................................................ 13

2.5.2.1.1 BlobAnalysis ................................................................................. 14

2.5.2.1.2 ShapeInserter ............................................................................... 14

2.5.2.1.3 VideoPlayer .................................................................................. 14

2.5.2.1.4 TextInserter .................................................................................. 14

2.5.2.2 Image Processing Toolbox ................................................................... 15

2.5.2.2.1 Imread .......................................................................................... 15

2.5.2.2.2 Imsubtract .................................................................................... 15

2.5.2.2.3 Im2bw ........................................................................................... 15

2.5.2.2.4 rgb2gray ....................................................................................... 15

3 Implementació ........................................................................................................ 16

3.1 Visió ................................................................................................................. 16

3.2 Control i Comunicació ..................................................................................... 19

3.3 Codi complert .................................................................................................. 21

2

4 Resultats .................................................................................................................. 23

4.1 Prova 1 (traçat d’una U manualment) ............................................................. 24

4.2 Prova 2 (traçat d’una U manualment) ............................................................. 27

4.3 Prova 3 (traçat d’una L amb càmera) .............................................................. 30

4.4 Prova 4 (traçat d’una U amb càmera) ............................................................. 32

4.5 Prova 5 (traçat amb diferents moviments circulars) ....................................... 35

5 Conclusions.............................................................................................................. 35

Annexes .......................................................................................................................... 37

A.1 Codi Visio .............................................................................................................. 37

A.2 Codi Control i Comunicació .................................................................................. 39

A.3 Codi Final .............................................................................................................. 40

A.4 Dades .................................................................................................................... 46

a) Prova 1 ......................................................................................................... 46

b) Prova 2 ......................................................................................................... 48

c) Prova 3 ......................................................................................................... 50

d) Prova 4 ......................................................................................................... 51

e) Prova 5 ........................................................................................................ 53

3

1 Objectius

Amb la realització d’aquest projecte, es pretén crear una aplicació en entorn MATLAB,

pel control d’un quad-rotor, de forma autònoma mitjançant visió artificial. L’usuari serà capaç

de veure per pantalla tots els paràmetres que capta el quad-rotor, i comprovar el seu correcte

funcionament en un seguit de gràfiques que els mostren per pantalla, apart de guardar en vídeo

tot el captat per la càmera.

Apart també es pretén aprofundir en el mon de la robòtica mòbil, més concretament en

la dels vehicles aeris no tripulats i el seu funcionament en l’ús experimental.

Els objectius finals del projecte s’han vist bastant reduïts degut a la complicació del

mateix i el seguit de problemes que s’han trobat. Deixant només el control autònom del quad-

rotor, i la parametrització per pantalla de certs paràmetres.

2 Introducció

2.1 Motivació

La motivació principal que m’ha fet triar aquest projecte, és la meva fascinació pel mon

de la robòtica, més encaminat a la robòtica mòbil i el enorme ventall de possibilitats i funcions

que poden dur a terme aquest grup de robots amb un mateix equip.

Altres motivacions son el repte que suposava dur a terme aquest ambiciós projecte.

Ambiciós perquè era inèdit a la nostra universitat, i únicament estava jo per dur-lo a terme. On

tots els problemes, dubtes o contratemps els hauria d’afrontar sol amb la ajuda dels consells

que em dones el tutor.

Indagar en el mon de la visió artificial, fins ara desconegut per mi, es un dels punts que

em tira enrere però les ganes de aprendre i descobrir nous coneixements em fan oblidar que

pot ser un gran problema.

Lo explicat amb anterioritat més les ganes de poder fer una gran aplicació de control

autònom del robot fan que l’elecció del projecte, sigui clara.

4

2.2 Historia dels quad-rotors

Els inicis:

Breguet-Richet Gyroplane (1907)

Un helicòpter 4 del rotor dissenyat per Louis Breguet. Aquesta va ser la primera aeronau

d'ala rotatòria en enlairar-se per si sola, encara que només en vol lligat a una altitud d'uns pocs

metres. El 1908 es va informar que en haver volat 'diverses vegades', encara que els detalls són

escassos.

Fig.1 Maqueta del quad-rotor de Breguet-Richet Gyroplane

Oehmichen No.2 (1920)

Etienne Oehmichen va experimentar amb dissenys d'helicòpters en la dècada de 1920.

Entre els sis dissenys que va provar, el seu helicòpter No.2 tenia quatre rotors i vuit hèlixs, tots

impulsats per un sol motor. El Oehmichen No.2 utilitza un marc de tub d'acer, amb rotors de

dues pales en els extrems dels quatre braços. L'angle d'aquestes fulles es podria variar per

deformació. Cinc de les hèlixs, fent girar en el pla horitzontal, estabilitzant lateralment l’aparell.

Una altra hèlix es munta al nas per a la direcció. El parell restant de les hèlixs eren per a la

propulsió cap endavant. L'avió mostrava un grau considerable d'estabilitat i capacitat de control

per a la seva època, i va realitzar més d'un miler de vols de prova durant la meitat de 1920. En

1923 va ser capaç de romandre en l'aire durant diversos minuts seguits.

5

de Bothezat helicopter (1922)

El Dr. George de Bothezat i Ivan Jerome van desenvolupar aquest avió, amb sis rotors de

pales a l'extrem d'una estructura en forma de X. Dues petites hèlixs de pas variable es van

utilitzar per l'empenta i el control de l'angle yaw. Construït pel Servei Aeri d'Estats Units, que va

fer el seu primer vol a l'octubre de 1922 Prop de 100 vols van ser fets fins a finals de 1923, l’altura

màxima assolida van ser uns 5 metres. Encara que la demostració de viabilitat, es veia que era

de poca potència, que no responia, mecànicament complex i susceptible a problemes de

fiabilitat. El pes del pilot era massa elevat durant el vol estacionari per intentar el moviment

lateral.

Fig.2 Fotografia del quad-rotor de Bothezat helicopter

Convertawings Model A Quadrotor (1956)

Aquest helicòpter únic estava destinat a ser el prototip d'una línia molt més gran de

quad-rotors tant civils com militars. El disseny comptava dos motors que accionen quatre rotors

a través d'un sistema de corretges v. No va necessitar cap rotor de cua i el control s'obté variant

l'empenta entre els rotors. Va volar amb èxit moltes vegades a mitjans dels anys 1950, aquest

helicòpter va consolidar el disseny del quad-rotor com també va ser el primer helicòpter de

quatre rotors en demostrar que volava cap endavant amb èxit. A causa de la manca de comandes

per a les versions comercials o militars però, el projecte es va acabar.

Models recents:

En les últimes dècades, els vehicles aeris no tripulats (UAV petita escala) s'han tornat

més comunament usat per a moltes aplicacions. La necessitat dels avions amb una major

maniobrabilitat i capacitat de planejar ha portat a l'augment de la intensitat en la investigació

quad-rotor. El disseny de quatre rotors permet quad-rotors siguin relativament simple en

disseny però molt fiable i fàcil de manejar. La investigació d'avantguarda segueix augmentant la

viabilitat de quad-rotors fent avenços en la comunicació multi-nau, exploració medi ambient, i

la maniobrabilitat. Si totes aquestes qualitats en desenvolupament es poden combinar plegades,

els quad-rotors serien capaços de missions autònomes avançades que en l'actualitat no són

possibles amb cap altre vehicle.

6

Alguns programes actuals inclouen:

De Aermatica Spa Anteos és la primera ala rotatòria RPA (avions dirigits per control

remot) que ha obtingut el permís oficial per volar en l'espai aeri civil, per l'Autoritat d'Aviació

Civil italià (ENAC), i serà la primera capaç de treballar en l'espai aeri no segregat.

Fig.3 De Aermatica Spa Anteos

AeroQuad i ArduCopter són projectes de maquinari i programari de codi obert basat en

Arduino per a la construcció de bricolatge de els quad-rotors.

Parrot AR.Drone és un petit quad-rotor a radio control amb càmeres connectades a ell,

construït per Parrot SA, dissenyat per a ser controlable amb els smartphones o tablets.

7

DJI Phantom Vision, més professionals i no tant recreatius donat la seva major

autonomia i millores el a funció de captació d’imatges que inclou un estabilitzador per càmera

externa i un control remot per augmentar el control.

Fig.4 DJI Phantom 2 Vision+

Raffaello D’Andrea, seria un dels “gurus” en el mon dels quad-rotors, ha desenvolupat

un gran nombre d’aplicacions per quad-rotors fent coses realment espectaculars.

Fig.5 Raffaello D’Andrea en una de les seves demostracions

8

2.3 El quad-rotor AR.Drone 2.0

El nostre quad-rotor, es tracte del AR.Drone 2.0 de la casa parrot, destinat principalment

a us domèstic i lúdic. Els seu funcionament es simple i es controla mitjançant un dispositiu mòbil

(ja sigui telèfon o tauleta, nomes ha de disposar de connexió Wi-fi).

Fig.6 AR.Drone 2.0

2.3.1 Parts del hardware Donat que es un quad-rotor comercial, les dades que disposem de ell son les que el

fabricant facilita, fet que fa que no es puguin detallar amb molta precisió.

Tot i ser un quad-rotor comercial, la facilitat que hi ha per trobar opcions de control ja

sigui via MATLAB, LabView i altres que fa que amb el maquinari que ara detallarem es puguin

fer moltes coses. Tant en MATLAB com LabView (les dos que he buscat més) les opcions i utilitats

que trobes son nombroses, que amb un bon us es poden fer moltes coses.

2.3.1.1 Electrònica

Destinada al control del quad-rotor. Disposa de:

Processador ARM CortexA8 de 32 bits a 1GHz

DSP de vídeo MS320DMC64x a 800 MHz

Sistema operatiu intern Linux 2.6.32

Memòria RAM DDR2 de 1 GB a 200 MHz

9

Mòdul wi-fi b/g/n

Giroscopi de 3 eixos

Acceleròmetre de 3 eixos

Magnetòmetre de 3 eixos

Sensor de pressió

Sensor d’ultrasons per mesurar l’altitud respecte al terra

Càmera QVGA vertical de 60fps per mesurar la velocitat respecte al terra

Connector USB 2.0 per extensions o gravació de vídeo

2.3.1.2 Gravació de vídeo

Característiques de la càmera frontal:

Gravació HD 720p a 30fps

Objectiu gran angular 92º

Codificació H.264

2.3.1.3 Motors

Característiques dels motors:

4 motors de rotor intern sense escombreta

Microcontrolador AVR de 8 MIPS per control de motor

Rodaments de boles en miniatura

Engranatges de Nylatron de baix soroll per els reductors de les hèlices de 1/8.75

2.3.1.4 Estructura

Característiques del cos del quad-rotor:

Pes total 380g amb carcassa de protecció exterior o 420g amb carcassa de

protecció interior

Carcassa d’espuma per aïllar el centre d’inèrcia de les vibracions dels motors

Casco de protecció de polipropilè expandit

2.3.2 Comparativa amb altres models

En comparació amb altres models comercials, el AR.Dron 2.0 és un model prou potent i

bo per fer molts projectes, es poden trobar versions més bones el Parrot Bebop Drone (versió

mes moderna del AR.Drone 2.0) el qual porta millores substancials tant en càmera dotat d’una

càmera frontal mòbil, millores en la electrònica i totes les parts en general ja que es tracte d’un

model més modern.

Altres quad-rotors de caràcter comercial per exemple tindríem els DJI Phantom, més

professionals ja i cars que els Parrot, però més destinats a gravació de vídeo ja disposen

d’estabilitzador per càmeres externes, més duració de bateria i control per comandament a

distancia per augmentar el rang de treball.

10

2.4 Visio artificial

Es pot definir la "Visió Artificial" com un camp del coneixement que, mitjançant la

utilització de les tècniques adequades, permet l'obtenció, processament i anàlisi de qualsevol

tipus d'informació especial obtinguda a través d'imatges digitals. La visió artificial la componen

un conjunt de processos destinats a realitzar el anàlisi d'imatges. Aquests processos són:

captació d'imatges, memorització de la informació, processament i interpretació dels resultats.

Amb la visió artificial es poden:

Automatitzar tasques repetitives d'inspecció realitzades per operadors.

Realitzar controls de qualitat de productes que no era possible verificar per

mètodes tradicionals.

Realitzar inspeccions d'objectes sense contacte físic.

Realitzar la inspecció del 100% de la producció (qualitat total) a gran

velocitat.

Reduir el temps de cicle en processos automatitzats.

Realitzar inspeccions en processos on hi ha diversitat de peces amb

Canvis freqüents de producció.

Per poder dur a terme la visió artificial el diagrama senzill del seu funcionament seria el

següent:

Fig.7 Esquema funcionament visió artificial

En aquest diagrama, podem observar de manera senzilla el funcionament de la visió

artificial, que bàsicament es un llaç de control amb les dades que captem i processem per dur a

terme alguna acció.

Dins del diagrama anterior ens centrarem en la part de processat, on explicarem els tipus

de processat de models de color que hi ha i quines diferencies i ha.

11

2.4.1 Seguiment imatges en color

El seguiment del color es basa en la capacitat que té la càmera per aïllar un color

particular d'una imatge presa, extraient informació concreta sobre la distribució d'aquest color

a la imatge. Aplicant aquesta característica en cada fotograma capturat, és possible determinar

si un objecte (definit en la imatge per una 'taca' d'un color determinat), roman estàtic o s'està

movent respecte del punt de referència de la càmera, pot obtenir a més, el sentit i direcció

d'aquest moviment.

Per a determinar el color de seguiment, cal definir, per a cada canal de color (ja sigui en

mode RGB o YCrCb) un valor màxim i un mínim donant lloc a un conjunt de colors que contindrà

el color desitjat. Aquest requeriment ve de la necessitat d'evitar que els canvis de llum incidents

sobre l'objecte s'entelin seu color real.

2.4.1.1 RGB

Conjunt de colors primaris que obtenim com a descomposició de la llum solar, o

artificialment mitjançant focus emissors de llum d’una longitud d’ona determinada es

denomines colors additius.

S’anomenen colors primaris, perquè la unió dels tres dona com a resultat el blanc. Apart

qualsevol color del espectre es pot obtenir com a convenció d’aquets tres.

Per representar un color en sistema RGB se li assigna un valor entre 0 i 255 per cada un

dels components del color seguint el format (R,G,B), així doncs el color vermell pur es

mostraria com (255,0,0). Els valors més elevats corresponen a un major nivell de llum blanca,

per tant com més elevats són els valors RGB, més clars són els colors.

Posant com exemple l'ús del model RGB de la càmera, podem imaginar el color que

desitja seguir, de la següent manera: contingut a l'interior d'un cub delimitat pels valors màxims

i mínims, que representen el conjunt complet de colors que seguirà la càmera durant el rastreig

d'un objecte:

Fig.8 Representació cub RGB

12

A la part superior frontal dreta representa els valors màxims de les tres components

RGB, mentre que el cantó inferior posterior esquerra, els valors mínims d'aquestes components.

El cub central representa el color que es pretén seguir.

2.5 MATLAB

MATLAB es un programa molt potent amb una infinitat de funcions, el qual es el que he

triat per dur a terme el projecte. Explicarem les tres parts importants que he fet servir x dur a

terme el projecte, que serien la comunicació quad-robot amb el PC, la part de visió i la funció

GUIDE.

2.5.1 Comunicació UDP

Per comunicar-se el quad-rotor amb el PC es fa us de la connexió interna Wi-fi que

incorpora el quad-rotor i el protocol UDP.

UDP (del anglès User Datagram Protocol) és un protocol no orientat a realitzar

connexions. Es a dir quan una maquina A envia paquets a una maquina B, el flux de de dades es

unidireccional. La transferència de dades es realitza sense haver realitzat prèviament una

connexió amb la maquina de destí (maquina B), i el destinatari rebrà les dades sense enviar una

confirmació al emissor (maquina A). Això es degut a que l’encapsulació de les dades enviada per

el protocol UDP no permet transmetre la informació relacionada al emissor. Per això el

destinatari no coneixerà al emissor de les dades excepte per la seva IP.

Les principals característiques son:

Treballa sense connexió, es a dir no utilitza cap sincronització entre origen i destí.

Treballa amb paquets o datagrames sencers, no amb bytes individuals com el TCP.

Una aplicació que utilitzi UDP intercanvia informació en forma de blocs de bytes, de

forma que per cada bloc de bytes enviat de la capa de l’aplicació a la capa de

transport, s’envia un paquet UDP.

No és fiable. No utilitza control de flux ni ordena paquets.

La seva gran avantatja es que provoca poca carga addicional a la xarxa ja que es

senzill i utilitza capsals molt simples.

Un paquet UDP pot ser fragmentat per el protocol IP per ser enviat fragmentat en

varis paquets IP si resulta necessari.

Donat que no hi ha connexió, un paquet UPD admet utilitzar com a direcció IP de

destí la direcció broadcast o multicast de IP. Això permet enviar un mateix paquet a

diferents destins.

Un exemple en codi de com crear una comunicació UDP de forma senzilla seria el

següent:

controlChannel = udp('192.168.1.1', 5556, 'LocalPort', 5556);

13

Amb aquest fragment extret del programa meu de control del quad-rotor, podem

observar com nomes cal indicar la direcció IP (host) i el port on la volem associar.

2.5.2 Visió artificial

En aquesta part explicarem les toolbox de visió que he fet servir per dur a terme el

projecte, es tracte de la Computer Vision System Toolbox v.5.3 i la Image Processing

Toolboxv.8.3. En aquestes toolbox, pròpia del MATLAB disposem d’un seguit de funcions ja

creades per realitzar un ventall de opcions enormes, des de la anàlisis d’imatges, reproducció

de vídeo, inserció de texts a un vídeo, binarització de imatges, etc.

La manera com MATLAB emmagatzema una imatge és en forma de matriu

bidimensional, en què cada cel·la representa el valor d'un píxel de la imatge. Tenim imatges en

escala de grisos, binàries, en color veritable (RGB), com és el nostre cas, entre d'altres.

En el nostre cas en codificació RGB obtindríem unes matrius d’aquesta manera.

Fig.9 Representació matrius de color RGB MATLAB

2.5.2.1 Vision System Toolbox

La Vision System Toolbox, proporciona algoritmes i eines per al disseny i simulació de

sistemes de visió per computador i processament de vídeo. La toolbox inclou algoritmes per a

l'extracció de característiques, detecció de moviment, detecció d'objectes, seguiment

d'objectes, la visió estèreo, processament de vídeo, i l'anàlisi de vídeo. Les eines inclouen E/S

d’arxius de vídeo, dibuix de gràfics i composició. Les capacitats es proporcionen com a funcions

de MATLAB, MATLAB System objects i blocs de Simulink.

BlobAnalysis

ShapeInserter

VideoPlayer

TextInserter

14

2.5.2.1.1 BlobAnalysis

Aquesta funció realitza el reconeixement de regions de píxels i busca regions pròximes

entre elles amb propietats constants o molt similars on els seus voltants son diferents. Dins de

la funció hi ha un seguit de paràmetres que pot calcular o no en funció de si els sol·licitem i com

es configurin, que són els següents:

CentroidOutputPort, retorna el centre de les regions detectades.

BoundingBoxOutputPort, retorna coordenades del quadre delimitador de les

regions.

MaximumBlobArea, àrea màxima en que delimitem una regió.

MinimumBlobArea, àrea mínima que delimitem per considerar una regió com a

tal.

MaximumCount, numero màxim de regions a mostrar que desitgem.

OrientationOutputPort, angle que calcula la funció entre el costat més llarg de

la regió i l’eix x.

2.5.2.1.2 ShapeInserter

Aquesta funció serveix per dibuixar els rectangles que surten al vídeo un cop analitzada

la imatge gracies a les dades extretes de la funció Blobanalysis. Els paràmetres que li donem son

els següents:

BorderColorSource

Input port

Fill

FillColorSource

Opacity

2.5.2.1.3 VideoPlayer

Aquesta funció serveix per reproduir un vídeo o una seqüencia d’imatges, el

parametritzem de la següent manera:

Name

Position

2.5.2.1.4 TextInserter

Amb aquesta funció inserim texts a una imatge, que pot ser guardada o mostrada.

Podem mostrar més d’un string en ASCII a diferents llocs de la imatge. Li passem els següents

paràmetres:

Text

Color

Location

FontSize

15

2.5.2.2 Image Processing Toolbox

La Image Processing Toolbox proporciona un conjunt complet d'algorismes de referència

estàndard, funcions i aplicacions per al processament d'imatges, anàlisi, visualització i

desenvolupament d'algoritmes. Pot dur a terme la millora d'imatge, reducció de soroll, la

segmentació d'imatges, transformacions geomètriques, i el registre d'imatges. Moltes de les

funcions de la toolbox són multiprocés per prendre avantatge dels ordinadors multinucli i

multiprocessador.

Image Processing Toolbox suporta un conjunt divers de tipus d'imatges, inclosos els

d'alta gamma dinàmica, resolució de gigapixel, el perfil ICC incrustat, i tomogràfic. Funcions de

visualització li permeten explorar una imatge, examinar una regió de píxels, ajustar el contrast,

crear contorns o histogrames, i manipular les regions d'interès (ROI). Amb els algoritmes de la

toolbox pot restaurar imatges degradades, detectar i mesurar característiques, analitzar formes

i textures, i ajustar el balanç de color.

Imread (usada només en el cas d’utilitzar el mòbil per la recepció de imatges)

Imsubtract

im2bw

rgb2gray

2.5.2.2.1 Imread

Llegeix una imatge en escala de grisos o de color des de la direcció que li indiquem, en

el nostre cas només cal que li indiquem a quina adreça URL ha d’anar a buscar la imatge.

2.5.2.2.2 Imsubtract

Amb aquesta funció extrèiem una constant d’una imatge, li passem dos paràmetres els

quals els resta.

2.5.2.2.3 Im2bw

Convertim la imatge desitjada, a una imatge binaria mitjançant un llindar. Nomes cal

enviar la imatge desitjada i el valor del llindar que volem per fer la binarització

2.5.2.2.4 rgb2gray

Converteix una imatge RGB a escala de grisos, elimina la informació de saturació i color

de la imatge original deixant nomes la luminància, només cal passar la imatge a convertir i prou.

16

3 Implementació

La implementació de l’aplicació l’he dividit en tres blocs, la part de visió, la part de

control i comunicació amb el quad-rotor i el bloc que ho engloba tot.

Les dues primeres parts s’han fet per poder comprovar el correcte funcionament de les

parts que necessitava per dur a terme el projecte. Cada una d’aquestes parts independents entre

elles fan que ens evitem molts mals de caps a l’hora de comprovar errors amb el funcionament

de tot el conjunt poden testejar per separat la visió de la part del quad-rotor.

3.1 Visió

Pel que fa a la part de visió, el que ens interessava en aquí era poder obtenir i analitzar

les imatges extretes de la web cam del portàtil i d’alguna manera iniciar el projecte. Per dur a

terme aquesta part es van buscar diferents solucions fins a trobar les toolbox anteriorment

comentades.

El codi resultant, que la seva funció es analitzar les imatges preses per la càmera, buscar

patrons de color vermell, indicans el angle i com a afegit per la part final calcular les imatges per

segon que obtenim.

El codi esta construït de la següent manera, el primer pas a fer es la configuració i la

adquisició dels paràmetres de la càmera, per dur a terme això fem us de la funció pròpia del

MATLAB imaqhwinfo, que es crea una estructura de paràmetres amb totes les opcions de vídeo

que disposem, de les quals nosaltres escollim les que ens interessen, que son la càmera pròpia

del portàtil i la configuració YUY2640x480 (resolució de 640x480 en YUY2 que es un tipus de

escala cromàtica similar al RGB). Un cop obtinguts tots els paràmetres seguim configurant els

paràmetres en variables que després utilitzarem.

cam = imaqhwinfo;

cameraName = char(cam.InstalledAdaptors(end));

cameraInfo = imaqhwinfo(cameraName);

cameraId = cameraInfo.DeviceInfo.DeviceID(end);

cameraFormat = char(cameraInfo.DeviceInfo.SupportedFormats(end));

vidDevice = imaq.VideoDevice(cameraName, cameraId, cameraFormat, ...

'ReturnedColorSpace', 'RGB');

vidInfo = imaqhwinfo(vidDevice);

screenSize = get(0,'ScreenSize');

Un cop fet tota la configuració de la càmera, passem a crear totes les funcions que

utilitzarem per la anàlisis de vídeo. Per fer-ho utilitzem les funcions que s’inclouen a la toolbox

de vision System comentades anteriorment. Creem les funcions amb un nom per facilitar-nos la

feina posteriorment i també introduïm els paràmetres de configuració que desitgem obtenir.

S’ha optat per l’ús d’aquestes funcions perquè ens faciliten molt la feina ja que amb una sola

funció podem obtenir el angle de la barra i la seva posició i delimitar el objecte trobat x numero

de píxels. Altres que s’han fet servir son perquè son senzilles d’utilitzar i el seu funcionament es

bastant intuïtiu.

17

hblob = vision.BlobAnalysis('AreaOutputPort', false, ...

'CentroidOutputPort', true, ...

'BoundingBoxOutputPort', true', ...

'MaximumBlobArea', 30000, ...

'MinimumBlobArea', 1000, ...

'MaximumCount', 1, ...

'OrientationOutputPort', true);

hshapeinsBox = vision.ShapeInserter('BorderColorSource', ...

'Input port', ...

Fill', true, ...

'FillColorSource', 'Input port',...

'Opacity', 0.4);

hVideoIn = vision.VideoPlayer('Name', 'Final Video', ...

'Position', [100 100

vidInfo.MaxWidth+20 vidInfo.MaxHeight+30]);

htextBox = vision.TextInserter('Angle: %lf', 'Color', [255,0,0],...

'Location', [20 25],...

'FontSize', 20);

htextBox2 = vision.TextInserter('FPS: %lf', 'Color', [255,0,0],...

'Location', [20 75],...

'FontSize', 20);

La següent part que tenim es la inicialització de totes les variable que fem servir al

programa nostre, no te gaire importància aquest punt ja que simplement son variables que

poden tenir més o menys importància al codi, des de la que ens indica el llindar de color vermell

que volem pel anàlisis de les imatges, a la que ens guarda totes les dades.

redThresh = 0.22;

numFrame = 20;

numloop =1;

nFrame = 0;

nloop = 0;

iPos = vidInfo.MaxWidth/2;

dades = zeros;

dades2 = zeros;

angle = zeros;

temps = 0;

imatges = 0;

FPSr = 0;

A partir d’aquí passaríem a comentar el cos principal del programa. Primerament

després de delimitar el numero de imatges que volem analitzar i el nombre de cops que volem

que ho repeteixi, començaríem a fer la adquisició de imatges procedents de la web cam. Primer

de tot comentar que s’ha col·locat la instrucció tic per tal de poder comptar el numero de

imatges per segon que obtenim. La anàlisis de les imatges com ja s’ha comentat es fa mitjançant

les funcions dels toolbox de vision System i Image Processing. El procediment és el següent,

primerament extraiem una imatge, la girem, n’extrèiem la part vermella de la imatge i la

binaritzem utilitzant el llindar preestablert de color que ens interessa. Un cop fet tot això la

passem per la funció de recerca de regions (blobAnalysis) que ens retornarà el centre de

l’objecte trobat, el seu angle respecte el eix X, i la regió delimitada.

while (nloop < numloop)

while (nFrame < numFrame)

tic

rgbFrame = step(vidDevice);

rgbFrame = flipdim(rgbFrame,2);

18

diffFrameRed = imsubtract(rgbFrame(:,:,1),...

rgb2gray(rgbFrame));

binFrameRed = im2bw(diffFrameRed, redThresh);

[centroidRed, bboxRed, orientationRed] = step(hblob,...

binFrameRed);

Tot seguit fem la conversió dels angles obtinguts a decimal, després d’això venen un

seguit de comandes que són, la creació del vídeo a mostrar amb les imatges captades, amb la

inserció de l’angle, imatges per segon i marcar l’objecte trobat, també és on realitzem el càlcul

de les imatges per segon utilitzant un bucle que cada cop que el temps calculat per les

instruccions tic i toc arriba al segon mirem el numero d’imatges que hem pogut analitzar.

orientationRed = orientationRed*(180/pi);

if(orientationRed<0)

orientationRed=180+orientationRed;

end

vidIn = step(hshapeinsBox, rgbFrame, bboxRed,single([1 0 0]));

vidIn = step(htextBox, vidIn,orientationRed);

vidIn = step(htextBox2, vidIn,FPSr);

step(hVideoIn, vidIn);

t=toc;

temps = temps + t;

imatges = imatges + 1; if (temps>=1)

dades2 = [dades2 imatges];

FPSr = imatges;

imatges = 0;

temps = 0;

end

Fet tot això nomes ens queda guardar les dades i fer la gràfica del històric de imatges

per segon que s’han obtingut. Augmentem el comptador del bucle, i al finalitzar fem la mitja de

totes les imatges per segon que obtenim, això esta fet per tal poder fer proves diferents i escollir

la millor qualitat de imatge i per acabar alliberem la memòria de vídeo i la càmera.

dades = [dades t];

plot(dades2,'o-k');

ylabel('Num. FPS');

nFrame = nFrame+1;

end

nFrame = 0;

nloop = nloop+1;

end

matriu=[dades'];

mitja = mean(dades);

FPS = 1/mitja;

release(hVideoIn);

release(vidDevice);

19

Fig.10 Funcionament de la part de visió del projecte

3.2 Control i Comunicació

En aquest codi, l’objectiu és establir la comunicació amb el quad-rotor, poder enlairar-

lo i adquirir dades d’ell. Per poder dur a terme aquesta part, es van buscar per internet fins

trobar unes funcions molt variades que ens permeten fer bastantes coses. S’ha de comentar que

l’objectiu principal era utilitzar la càmera del quad-rotor, però les funcions que s’encarregaven

d’això només son compatibles amb sistema operatiu Mac, tot i així la resta que s’han necessitat

funcionen correctament.

Per començar el codi utilitzem la funció addpath per tal d’afegir un directori al programa,

d’aquesta manera podem tenir més organitzat els arxius. Tot seguit tenim la configuració dels

ports i adreces per dur a terme la comunicació amb el quad-rotor. Per fer això ens basem amb

les llibreries extretes de internet i que fem servir per tota la part de control del quad-rotor. La

comunicació es del tipus UDP i via wi-fi entre ordinador i quad-rotor. Altrament també fem

enlairar el quad-rotor amb una de les funcions de extretes d’internet. Es posa un control de error

anomenat SequenceNumber que ens pot fer parar el control del quad-rotor si les comunicacions

no funcionen adequadament. I després d’enlairar el quad-rotor, es esperem dos segons per tal

de assegura’ns que s’ha estabilitzat i que s’ha enlairat correctament. També inicialitzem les

variables que necessitem.

controlChannel = udp('192.168.1.1', 5556, 'LocalPort', 5556);

stateChannel = udp('192.168.1.1', 5554, 'LocalPort', 5554);

fopen(controlChannel);

fopen(stateChannel);

SequenceNumber = tic;

SequenceNumber = TakeOff(SequenceNumber, controlChannel,

stateChannel);

if SequenceNumber ~= -1 %saltaria al final del codi si falla

pause(2);

index = 0;

compta=1;

error=0;

20

Un cop fet tot això iniciem el bucle indican un numero de dades que volem, i amb la

funció de Ask4DroneState adquirim totes les dades que ens pot enviar el quad-rotor i els

guardem a una variable. Un cop fet això, fem un control d’error per comprovar si la recepció de

dades es correcte, per fer-ho comprovem que la longitud de la trama rebuda es correcte, de ser-

ho guardem les dades que ens interessen, de no ser-ho incrementem el valor de un comptador

per saber el numero de cops que ha fallat la trama. Al final de tot el bucle introduïm una pausa

per tal de si hem mogut el quad-rotor es pugi estabilitzar i aterrar correctament. Després d’això,

tanquem els canals de comunicació per poder finalitzar el programa.

while (index < 100)

[~, a, SequenceNumber] = Ask4DroneState (SequenceNumber,

controlChannel, stateChannel, 1);

qq=size(a);

if qq(1)>5

bateria(compta)=a(1)

yaw(compta)=a(4);

vx(compta)=a(6);

compta=compta+1;

else

error=error+1;

end

index = index + 1;

end

disp('aterra')

pause(4);

SequenceNumber = Land(SequenceNumber, controlChannel,stateChannel);

end

Fig.11 Funcionament control i comunicació del projecte

21

3.3 Codi complert

En aquest punt, ens centrarem a comentar les modificacions que s’han introduït als

codis anteriors i com s’han combinat. Primerament dir, que en aquesta part s’ha fet una

interfase d’usuari on es mostren certs paràmetres que son, l’angle calculat per la càmera, la

quantitat de imatges per segon actuals, el nivell de bateria que es molt important ja que

l’autonomia del quad-robot es limitada i així es poden fer les proves sense problemes perquè es

pot visualitzar el seu nivell i l’històric de imatges per segon per tal de veure com evoluciona el

sistema.

Fig.12 Interfície d’usuari codó final

Al tractar-se d’un codi fet amb l’aplicació GUIDE del MATLAB, hi ha moltes parts que es

creant automàticament i no les utilitzem. El que importa es el boto d’inici que es on col·loquem

el nostre codi. El boto anirà repetint el programa indefinidament fins que no es torni a prémer.

També s’han inclòs el control del quad-rotor en funció de l’angle calculat. El qual

simplement li enviem la comanda de MotionCommand per governar-lo.

22

end

if (0<orientationRed)&(orientationRed<60)

SequenceNumber = MotionCommand(SequenceNumber,

controlChannel,1,0,0,0,0.3);

pause (0.2);

end

if (120<orientationRed)&(orientationRed<180)

SequenceNumber = MotionCommand(SequenceNumber

controlChannel,1,0,0,0,-0.3);

pause (0.2);

end

if (70<=orientationRed)&(orientationRed<=110)

SequenceNumber = MotionCommand(SequenceNumber,

controlChannel,1,0,-0.3,0,0);

pause (0.2)

end

També s’han inclòs les instruccions necessàries per inserta els paràmetres de angle,

imatges per segon i nivell de bateria i la gràfica del històric d’imatges per segon a la interfície

d’usuari.

set(handles.angle, 'String', orientationRed);

set(handles.FPS, 'String', FPSr);

set(handles.bateria, 'String',Bateria);

axes(handles.axes1);

cla;

plot(dades2,'o-k');

Aquestes serien tot el conjunt de adicions que s’han posat als dos codis ja comentats

anteriorment. Tota la resta son parts de la interfície creades automàticament pel propi MATLAB

que deixarem sense tocar perquè son necessaris tot i que no els utilitzem.

23

4 Resultats

En aquesta part comentarem els resultats obtinguts en el seguit de probes que hem

realitzat. Del seguit de proves realitzades podríem destacar 4, dues movent nosaltres el robot

per adquirir dades i dues mes amb el control per càmera.

Fig.13 Eixos de velocitat del quad-rotor

S’han escollit la velocitat de l’eix X i l’angle yaw, ja que es la velocitat X es la que

necessitem per veure si el robot avança, i juntament amb el angle yaw podem saber si ha girat

el quad-rotor o no.

Mitjançant les dades recollides de velocitat X, el angle yaw per saber l’orientació. Amb

aquestes dues dades i mitjançant el programa Excel fem les gràfiques que acompanyen els

resultats. Als annexes es troben totes les dades extretes i utilitzades per dur a terme les proves.

La formula per el càlcul de la posició es la següent:

𝑥 = 𝑥0 + 𝑣𝑥 · ∆𝑡

En totes les gràfiques de desplaçament, en l’eix X tindríem les mostres preses duran el

temps i en el eix Y, el valor desplaçat. El valor de delta T, s’ha extret de la mitjana de temps de

les proves realitzades per tal de facilitar les coses a l’hora de fer els gràfics simplificar la feina.

24

4.1 Prova 1 (traçat d’una U manualment)

Per dur a terme aquesta prova i la següent, enlairem el robot via MATLAB però el

moviment el fem nosaltres empenyent-lo per tal de poder agafar dades de les velocitats

desitjades. Al ser la primera prova dibuixem una U una mica irregular i obtenim les següents

gràfiques de posició en funció del temps. Aquest temps tant en la primera com segona proves

es un delta T igual a 0.05 segons. En la tercera i quarta prova la delta T, augmenta fins els 0.1

segons de mitja en vaires proves del mateix bucle, certs cops es major i certs cops menor per

això agafem el valor mig.

Cada tram, esta seleccionat en funció de la gràfica de la derivada del angle on els trams

on no varia gaire (no es molt estable el sistema) és quan va recte el quad-rotor i els pics

importants indiquen un gir. Com en les gràfiques anterior al eix X tenim les mostres preses i al

eix Y el valor de la derivada.

Fig.14 Derivada angle yaw

A més a més en la gràfica de l’angle yaw, podem observar clarament com varia el angle

en cada mostra, i quin ha estat el seu valor.

25

Fig.15 Angle yaw prova 1

Començarem mostrant el primer tram recte que hem fet, cal destacar que es tracte de

la primera prova i surt un pel irregular i per això surten algunes coses un pel irregulars. Però en

línies generals podem observar com les dades que obtenim son les correctes.

Fig. 16 Tram 1

0

0,05

0,1

0,15

0,2

0,25

0,3

0,35

0,4

0,45

1 2 3 4 5 6 7 8 9 101112131415161718192021222324252627282930

Dis

taci

a re

corr

egu

da

Numero de mostres Δt=0,05

Prova 1, tram 1

26

Tant en el tram 2 com en el 3, a diferencia del primer tram, son més curt per aquest

motiu son menys irregulars.

Fig.17 Tram 2

Fig.18 Tram 3

0

0,05

0,1

0,15

0,2

0,25

0,3

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Dis

taci

a re

corr

egu

da

Numero de mostres Δt=0,05

Prova 1, tram 2

0

0,05

0,1

0,15

0,2

0,25

0,3

0,35

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Dis

taci

a re

corr

egu

da

Numero de mostres Δt=0,05

Prova 1, tram 3

27

4.2 Prova 2 (traçat d’una U manualment)

En aquesta prova el procediment es el mateix que el de la anterior, però intentant fer-

la més precisa.

Com es pot comprovar en aquest cas obtenim gràfiques més precises al fer-se el

recorregut amb més cura que en l’anterior. Tot i que com podrem comprovar en la següent, on

veiem la derivada del angle, es molt més irregular tot i fer-se millor, això pot ser donat que al

anar més en cura i els moviments que fa el quad-rotor per estabilitzar-se alteren més els angles

obtinguts. Tot i que es pot comprovar les pauses fetes al girar entre cada tram.

Fig.19 Derivada angle yaw

Dividit per trams, obtenim unes gràfiques com les següents:

28

Fig.20 Tram 1

Fig.21 Tram 2

0

0,1

0,2

0,3

0,4

0,5

0,6

0,7

0,8

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

Prova 2, tram 1

0

0,1

0,2

0,3

0,4

0,5

0,6

1 2 3 4 5 6 7 8 9 10 11 12

Prova 2, tram 2

29

Fig.22 Tram 3

Podem observar igual que en la gràfica de la prova 1, que tenim uns pics o al principi o

al final de la gràfica, això es donat a que el robot al enlairar-se i aterrar, no sempre ho fa en línia

recte, sinó que a vegades fa alguns girs bastant pronunciats i donen aquets errors de lectura.

0

0,2

0,4

0,6

0,8

1

1,2

1,4

1,6

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Prova 2, tram 3

30

4.3 Prova 3 (traçat d’una L amb càmera)

En aquesta prova fem el dibuix de una L mitjançant l’ús de la càmera (vol autònom) i

obtindrem els següents resultats.

Podem observar com en les dues gràfiques la posició augmenta en forma de paràbola,

això es degut a que el robot va accelerant quan li diem que avanci, i el tram 2 que falta seria el

gir que ha fet (frena i gira sobre si mateix però ens faltaria la velocitat Y per poder-ho mostrar),

un cop fet el gir es veu en el tram 3 que el robot torna a accelerar i l’augment de la distancia es

parabòlic.

Fig.23 Angle yaw

En aquest gràfic observem els valors del angle yaw, en el transcurs de la prova. Posem

la gràfica del angle, ja que és on millor es pot observar el dibuix que va realitzar el quad-rotor.

Es pot comprovar que el recorregut del quad-rotor, no es molt estable i que tot i indicar-li que

anés en línia recte fa petites variacions en la direcció de moviment. Tot i això es pot observar

com ha realitzat la L, que volíem.

31

Fig.24 Tram 1

Fig.25 Tram 3

0

0,1

0,2

0,3

0,4

0,5

0,6

0,7

1 2 3 4 5 6 7 8 9 10 11 12

Dis

taci

a re

corr

egu

da

Numero de mostres Δt=0,1

Prova 3, tram 1

0

0,2

0,4

0,6

0,8

1

1,2

1,4

1,6

1 2 3 4 5 6 7 8 9

Dis

taci

a re

corr

egu

da

Numero de mostres Δt=0,1

Prova 3, tram 3

32

4.4 Prova 4 (traçat d’una U amb càmera)

En aquesta prova també amb control per càmera realitzem una U amb el quad-robot.

Podrem apreciar que al fer un recorregut més llarg al principi que els anteriors per poder veure

realment com es comporta el quad-rotor en línia recta, es magnifiquen els salts en velocitats,

angles.

En aquestes dues primeres gràfiques de dades, es pot observar com es el comportament

del robot després de donar un gir, que augmenta la velocitat gradualment.

Tot seguit veurem la gràfica de la velocitat per poder veure els salts que hi ha a la primera

gràfica i la de l’angle yaw per poder observar els moviments realitzats.

Fig.26 Valors de la velocitat X

Com s’ha comentat podem veure en aquesta gràfica clarament, les variacions de

velocitat, fet que demostra que tot i dir-li al quad-rotor que vagi en línia recta ho fa però alterant

molt el seu moviment.

33

Fig.27 Angle yaw

En aquesta segona gràfica podem observar com el angle recorregut pel quad-rotor no

és molt estable i que els girs en el primer dels dos el realitza de manera un pel erràtica i en el

segon al ser un tram recte més curt no necessita tant de temps per estabilitzar-se i fer-lo.

Passarem a observar, les gràfiques de distancia, per observar que l’augment i reducció

de la velocitat, fa que les gràfiques surtin una mica irregulars. En els trams 2 i 3 al ser molt curts

la velocitat no es prou variable per mostrar grans salts en les gràfiques de distancies, per això

surten bastant regulars.

Fig.28 Tram 1

-0,5

0

0,5

1

1,5

2

2,5

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41

Dis

taci

a re

corr

egu

da

Numero de mostres Δt=0,1

Prova 4, tram 1

34

Fig.29 Tram 2

Fig.30 Tram 3

0

0,2

0,4

0,6

0,8

1

1,2

1 2 3 4 5 6 7 8 9 10 11 12 13

Dis

taci

a re

corr

egu

da

Numero de mostres Δt=0,1

Prova 4, tram2

-0,05

0

0,05

0,1

0,15

0,2

0,25

1 2 3 4 5

Dis

taci

a re

corr

egu

da

Numero de mostres Δt=0,1

Prova 4, tram 3

35

4.5 Prova 5 (traçat amb diferents moviments circulars)

En aquesta prova es va provar de realitzar una espècie de eslàlom o fer un seguit de girs

m’entres avançava el robot i veure que obteníem. Com és pot comprovar, la gràfica de l’angle

yaw obtinguda, es molt irregular. Per aquest motiu vam desestimar l’intent de analitzar-la i fer

la resta de gràfiques ja que no sortiria res estable.

Fig.31 Angle yaw

En línies generals podem dir que els resultats obtinguts son prou satisfactoris, per ser

que es tracte d’un robot aeri, on qualsevol incidència ja sigui en un lloc tancat per les corrents

d’aire que genera o en un espai obert on faci vent (s’han donat els dos casos) alteren

significativament el seu comportament. Tot i això vam considerar que eren proves prou valides

per analitzar els seus resultats mostrats anteriorment (a excepció de la ultima).

5 Conclusions

Com a conclusions del projecte, podem extreure a trets generals que l’aprenentatge i

aprofundiment en l’ús del programa MATLAB, ha esta considerable passant de les quatre

instruccions apreses a la carrera a aprendre el funcionament de la visió artificial i comunicacions.

Encaminant-nos al tema amb el quad-rotor, podem dir que ha funcionat pràcticament tot

correctament a excepció de la càmera on-board del propi quad-rotor que no hi va haver manera

de que funciones, tret d’aquest petit problema la resta ha funcionat com es desitjava.

36

Algun altre problema trobat, seria el de les comunicacions UDP que al no rebre

confirmació de recepció de trames no es la comunicació més adequada. A més a més tindríem

el problema del temps de mostreig que al anar augmentant la complexitat del codi es reduïa

considerablement passant d’unes 25 imatges per segon a les 8/9 que tenim ara. Tot i això,

considerem que es prou elevat per dur a terme el projecte.

Una de les coses que més ens ha impedit la realització del projecte, i que poso per

separat, es el control del quad-rotor, si que tenim la opció de enviar comandes de moviment

però nomes és pot enviar un valor de inclinació, que fa que al provar de fer els moviments

acceleri massa i no sigui molt fiable al seguir objecte degut a la velocitat que agafa. De poder-se

actuar sobre la velocitat de moviment, que faria que el moviment fos més precís. Tot i això, la

part més complicada, l’estabilització del quad-rotor, tot i enviar-li comandes segueix funcionant

de manera automàtica facilitant les coses en gran forma.

A mode de donar idees per futurs projectes i amb el quad-rotor, tindríem la continuació

d’aquest, incloent la càmera on-board. Recerca de com fer un modelat de les dades del robot

en temps real per poder veure el recorregut que fa i totes les dades de les que disposem.

37

Annexes

A.1 Codi Visio %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% %%%%%%%%%%%%%%%PART Configuracio

Camera%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% cam = imaqhwinfo; % Agafa la info de la camera automaticament, no cal

posarla naltros cameraName = char(cam.InstalledAdaptors(end)); cameraInfo = imaqhwinfo(cameraName); cameraId = cameraInfo.DeviceInfo.DeviceID(end); cameraFormat = char(cameraInfo.DeviceInfo.SupportedFormats(end)); %si 'end' es ->YUY2640*480; si '9'->YUY21280*720

vidDevice = imaq.VideoDevice(cameraName, cameraId, cameraFormat, ... %

Input Video from current adapter 'ReturnedColorSpace', 'RGB'); vidInfo = imaqhwinfo(vidDevice); % Info del video screenSize = get(0,'ScreenSize'); % Info mida pantalla

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% %%%%%%%%%%%%%%%%%Funcions analisis

video%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% hblob = vision.BlobAnalysis('AreaOutputPort', false, ... % propietats

del analisis blob 'CentroidOutputPort', true, ... 'BoundingBoxOutputPort', true', ... 'MaximumBlobArea', 30000, ... 'MinimumBlobArea', 1000, ... 'MaximumCount', 1, ... 'OrientationOutputPort', true); hshapeinsBox = vision.ShapeInserter('BorderColorSource', 'Input port',

... % propietats de les caixes al trobar color 'Fill', true, ... 'FillColorSource', 'Input port',

... 'Opacity', 0.4); hVideoIn = vision.VideoPlayer('Name', 'Final Video', ... % propietats

dl video a mostrar 'Position', [100 100

vidInfo.MaxWidth+20 vidInfo.MaxHeight+30]); htextBox = vision.TextInserter('Angle: %lf', 'Color', [255,0,0],

'Location', [20 25],... 'FontSize', 20); htextBox2 = vision.TextInserter('FPS: %lf', 'Color', [255,0,0],

'Location', [20 75],... 'FontSize', 20);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% %%%%%%%%%%%%%%%%Inicialització

Variables%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

38

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% redThresh = 0.22; % Llindar per la deteccio del Vermell numFrame = 200; % Total de frames per pararse numloop =2; %Total de numero de vegades que hem d repetir el bucle dls

frames x alliberar espai nFrame = 0; nloop = 0; iPos = vidInfo.MaxWidth/2; dades = zeros; dades2 = zeros; angle = zeros; temps = 0; imatges = 0; FPSr = 0;

%% Bucle procesat imatge while (nloop < numloop) while (nFrame < numFrame) tic; rgbFrame = step(vidDevice); % Acquire single frame rgbFrame = flipdim(rgbFrame,2); % Flip the frame for

userfriendliness diffFrameRed = imsubtract(rgbFrame(:,:,1),

rgb2gray(rgbFrame)); % Get red components of the image binFrameRed = im2bw(diffFrameRed, redThresh); % Convert the

image into binary image with the red objects as white [centroidRed, bboxRed, orientationRed] = step(hblob,

binFrameRed); % Get the centroids and bounding boxes of the red blobs

orientationRed = orientationRed*(180/pi); if(orientationRed<0) orientationRed=180+orientationRed; end

vidIn = step(hshapeinsBox, rgbFrame, bboxRed,single([1 0 0]));

% Show the red objects in output stream vidIn = step(htextBox, vidIn,orientationRed); vidIn = step(htextBox2, vidIn,FPSr); step(hVideoIn, vidIn); % Output video stream t=toc; temps = temps + t; imatges = imatges + 1; if (temps>=1) dades2 = [dades2 imatges]; FPSr = imatges; imatges = 0; temps = 0; end dades = [dades t]; plot(dades2,'o-k'); ylabel('Num. FPS'); nFrame = nFrame+1; end nFrame = 0; nloop = nloop+1; end matriu=[dades']; mitja = mean(dades); FPS = 1/mitja;

39

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% %%%%%%%%%%%%%%%%Tancament

video%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% release(hVideoIn); release(vidDevice);

A.2 Codi Control i Comunicació addpath('./ARDroneMatlabAPI'); %afegeix carpeta llibreries menos lio

d'arxius

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% %%%%%%%%%%%%%Configuracio Ports

Drone%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% controlChannel = udp('192.168.1.1', 5556, 'LocalPort', 5556); stateChannel = udp('192.168.1.1', 5554, 'LocalPort', 5554); fopen(controlChannel); fopen(stateChannel); SequenceNumber = tic;

% SequenceNumber = TakeOff(SequenceNumber, controlChannel,

stateChannel);

if SequenceNumber ~= -1

pause(2); %pause de seguretat disp('endavant'); index = 0; compta=1; error=0; dadest=zeros;

while (index < 100) tic; [~, a, SequenceNumber] = Ask4DroneState (SequenceNumber,

controlChannel, stateChannel, 1); qq=size(a); if qq(1)>5 bateria(compta)=a(1); yaw(compta)=a(4); vx(compta)=a(6); compta=compta+1; else error=error+1; end index = index + 1; t=toc; t dadest = [dadest t]; end disp('aterra')

40

pause(4); mitja = mean(dadest); % SequenceNumber = Land(SequenceNumber, controlChannel,stateChannel); end

fclose(controlChannel); fclose(stateChannel);

A.3 Codi Final

function varargout = control_webcam_grafica(varargin) % CONTROL_WEBCAM_GRAFICA MATLAB code for control_webcam_grafica.fig % CONTROL_WEBCAM_GRAFICA, by itself, creates a new

CONTROL_WEBCAM_GRAFICA or raises the existing % singleton*. % % H = CONTROL_WEBCAM_GRAFICA returns the handle to a new

CONTROL_WEBCAM_GRAFICA or the handle to % the existing singleton*. % %

CONTROL_WEBCAM_GRAFICA('CALLBACK',hObject,eventData,handles,...) calls

the local % function named CALLBACK in CONTROL_WEBCAM_GRAFICA.M with the

given input arguments. % % CONTROL_WEBCAM_GRAFICA('Property','Value',...) creates a new

CONTROL_WEBCAM_GRAFICA or raises the % existing singleton*. Starting from the left, property value

pairs are % applied to the GUI before control_webcam_grafica_OpeningFcn

gets called. An % unrecognized property name or invalid value makes property

application % stop. All inputs are passed to

control_webcam_grafica_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows

only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help

control_webcam_grafica

% Last Modified by GUIDE v2.5 05-Sep-2014 01:00:15

% Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn',

@control_webcam_grafica_OpeningFcn, ... 'gui_OutputFcn',

@control_webcam_grafica_OutputFcn, ...

41

'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end

if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT

% --- Executes just before control_webcam_grafica is made visible. function control_webcam_grafica_OpeningFcn(hObject, eventdata,

handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to control_webcam_grafica (see

VARARGIN)

% Choose default command line output for control_webcam_grafica handles.output = hObject;

% Update handles structure guidata(hObject, handles);

% UIWAIT makes control_webcam_grafica wait for user response (see

UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = control_webcam_grafica_OutputFcn(hObject,

eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure varargout{1} = handles.output;

% --- Executes on button press in inici. function inici_Callback(hObject, eventdata, handles) % hObject handle to inici (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) while get(hObject,'Value') addpath('./ARDroneMatlabAPI'); %afegeix carpeta llibreries menos lio

d'arxius

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%

42

%%%%%%%%%%%%%%%%%% Configuracio

Camera%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%% cam = imaqhwinfo; % Agafa la info de la camera automaticament, no cal

posarla naltros cameraName = char(cam.InstalledAdaptors(end)); cameraInfo = imaqhwinfo(cameraName); cameraId = cameraInfo.DeviceInfo.DeviceID(end); cameraFormat = char(cameraInfo.DeviceInfo.SupportedFormats(end)); %si

'end' es ->YUY2640*480; si '9'->YUY21280*720

vidDevice = imaq.VideoDevice(cameraName, cameraId, cameraFormat, ... %

Input Video from current adapter 'ReturnedColorSpace', 'RGB'); vidInfo = imaqhwinfo(vidDevice); % Info del video screenSize = get(0,'ScreenSize'); % Info mida pantalla

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% %%%%%%%%%%%%%%%%%Funcions analisis

video%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% hblob = vision.BlobAnalysis('AreaOutputPort', false, ... % propietats

del analisis blob 'CentroidOutputPort', true, ... 'BoundingBoxOutputPort', true', ... 'MaximumBlobArea', 30000, ... 'MinimumBlobArea', 1000, ... 'MaximumCount', 1, ... 'OrientationOutputPort', true); hshapeinsBox = vision.ShapeInserter('BorderColorSource', 'Input port',

... % propietats de les caixes al trobar color 'Fill', true, ... 'FillColorSource', 'Input port',

... 'Opacity', 0.4); hVideoIn = vision.VideoPlayer('Name', 'Final Video', ... % propietats

dl video a mostrar 'Position', [100 100

vidInfo.MaxWidth+20 vidInfo.MaxHeight+30]);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% %%%%%%%%%%%%%%%%Inicialització

Variables%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% redThresh = 0.22; % Llindar per la deteccio del Vermell numFrame = 50; % Total de frames per pararse numloop =2; %Total de numero de vegades que hem d repetir el bucle dls

frames x alliberar espai nFrame = 0; nloop = 0; dades = zeros; dades2 = zeros; temps = 0; imatges = 0; FPSr=0; Bateria=0;

43

compta=1; error=0; angle = zeros;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% %%%%%%%%%%%%%Configuracio Ports

Drone%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% controlChannel = udp('192.168.1.1', 5556, 'LocalPort', 5556); stateChannel = udp('192.168.1.1', 5554, 'LocalPort', 5554); fopen(controlChannel); fopen(stateChannel); SequenceNumber = tic;

% SequenceNumber = TakeOff(SequenceNumber, controlChannel,

stateChannel); % if SequenceNumber ~= -1 % % pause(2); %pause de seguretat

%% Bucle procesat imatge while (nloop < numloop) while (nFrame < numFrame) tic rgbFrame = step(vidDevice); % Acquire single frame rgbFrame = flipdim(rgbFrame,2); % Flip the frame for

userfriendliness diffFrameRed = imsubtract(rgbFrame(:,:,1),

rgb2gray(rgbFrame)); % Get red components of the image binFrameRed = im2bw(diffFrameRed, redThresh); % Convert the

image into binary image with the red objects as white [centroidRed, bboxRed, orientationRed] = step(hblob,

binFrameRed); % Get the centroids and bounding boxes of the red blobs

orientationRed = orientationRed*(180/pi); if(orientationRed<0) orientationRed=180+orientationRed; end if (0<orientationRed)&(orientationRed<60) %#ok<AND2> <-Aixo

treu els warnings dls & SequenceNumber = MotionCommand(SequenceNumber,

controlChannel,1,0,0,0,0.3); pause (0.2); end if (120<orientationRed)&(orientationRed<180) %#ok<AND2> SequenceNumber = MotionCommand(SequenceNumber,

controlChannel,1,0,0,0,-0.3); pause (0.2); end if (70<=orientationRed)&(orientationRed<=110) %#ok<AND2> SequenceNumber = MotionCommand(SequenceNumber,

controlChannel,1,0,-0.3,0,0); pause (0.2) end

vidIn = step(hshapeinsBox, rgbFrame, bboxRed,single([1 0 0]));

% Show the red objects in output stream

44

step(hVideoIn, vidIn); % Output video stream set(handles.angle, 'String', orientationRed); set(handles.FPS, 'String', FPSr); set(handles.bateria, 'String',Bateria); axes(handles.axes1); cla; plot(dades2,'o-k'); nFrame = nFrame+1; [~, a, SequenceNumber] = Ask4DroneState (SequenceNumber,

controlChannel, stateChannel, 0); qq=size(a); if qq(1)>5 Bateria=a(1); yaw(compta)=a(4); vx(compta)=a(6); compta=compta+1; else error=error+1; end t=toc; temps = temps + t; imatges = imatges + 1; if (temps>=1) dades2 = [dades2 imatges]; FPSr = imatges; imatges = 0; temps = 0; end dades = [dades t]; end nFrame = 0; nloop = nloop+1; end

matriu=[dades']; mitja = mean(dades); FPS = 1/mitja;

pause(2);

% SequenceNumber = Land(SequenceNumber, controlChannel,stateChannel); end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% %%%%%%%%%%%%%%%%Tancament comunicaccions i

video%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% fclose(controlChannel); fclose(stateChannel); release(hVideoIn); release(vidDevice); %clear all; end

function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB

45

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1

as a double

% --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns

called

% Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'),

get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end

function edit2_Callback(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text % str2double(get(hObject,'String')) returns contents of edit2

as a double

% --- Executes during object creation, after setting all properties. function edit2_CreateFcn(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns

called

% Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'),

get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end

function edit3_Callback(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit3 as text % str2double(get(hObject,'String')) returns contents of edit3

as a double

46

% --- Executes during object creation, after setting all properties. function edit3_CreateFcn(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns

called

% Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'),

get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end

A.4 Dades

a) Prova 1

yaw diff yaw vx x

38,343 0,0045966

38,379 0,036 0,00371622

38,273 -0,106 0,00357031

39,845 1,572 0,02965425

40,111 0,266 0,01533349

27,039 -13,072 0,1089492

26,644 -0,395 0,08189839 0

26,499 -0,145 0,208912 0,0104456

27,386 0,887 0,3065664 0,02577392

28,411 1,025 0,2894963 0,04024874

29,855 1,444 0,2823351 0,05436549

30,121 0,266 0,3055486 0,06964292

29,965 -0,156 0,3491329 0,08709957

31,032 1,067 0,3947192 0,10683553

26,285 -4,747 0,2042503 0,11704804

24,881 -1,404 0,06376395 0,12023624

25,366 0,485 -0,0085583 0,11980832

25,849 0,483 -0,1322275 0,11319695

26,699 0,85 -

0,05081314 0,11065629

28,067 1,368 0,01966044 0,11163931

28,821 0,754 0,02139836 0,11270923

27,319 -1,502 0,04677312 0,11504789

28,294 0,975 0,1449866 0,12229722

29,33 1,036 0,254333 0,13501387

27,86 -1,47 0,3254563 0,15128668

27,232 -0,628 0,3944597 0,17100967

27,345 0,113 0,4219691 0,19210812

27,881 0,536 0,3845742 0,21133683

27,554 -0,327 0,4194963 0,23231165

28,086 0,532 0,4545146 0,25503738

47

28,72 0,634 0,3913362 0,27460419

27,647 -1,073 0,4300671 0,29610754

27,534 -0,113 0,4109882 0,31665695

28,941 1,407 0,4423877 0,33877634

29,691 0,75 0,4410665 0,36082966

29,203 -0,488 0,4227513 0,38196723

29,669 0,466 0,3699245 0,40046345

29,724 0,055 0,3596138

30,108 0,384 0,3206951

24,701 -5,407 0,2264223

11,688 -13,013 0,196534

0,093 -11,595 0,0845981

-9,105 -9,198 0,06161906

-33,552 -24,447 0,07302049

-41,191 -7,639 0,06318596

-51,356 -10,165 0,0476546

-58,959 -7,603 0,03209612 0

-60,399 -1,44 0,1053953 0,00526977

-59,488 0,911 0,1721222 0,01387588

-59,829 -0,341 0,2202381 0,02488778

-60,395 -0,566 0,2842957 0,03910257

-60,578 -0,183 0,3140007 0,0548026

-58,572 2,006 0,3560173 0,07260347

-59,268 -0,696 0,3408123 0,08964408

-60,909 -1,641 0,4120139 0,11024478

-61,099 -0,19 0,3764967 0,12906961

-60,225 0,874 0,4096828 0,14955375

-58,316 1,909 0,4038555 0,16974653

-58,963 -0,647 0,3647701 0,18798503

-59,661 -0,698 0,3010546 0,20303776

-58,84 0,821 0,2851826 0,21729689

-57,65 1,19 0,3026558 0,23242968

-57,737 -0,087 0,2767835 0,24626886

-57,646 0,091 0,1103649 0,2517871

-58,803 -1,157 0,119445

-61,609 -2,806 0,03624995

-68,038 -6,429 0,00324759

-79,959 -11,921 0,03863338

-92,565 -12,606 0,01598873

-100,806 -8,241 0,02799056

-110,572 -9,766 0,02788591

-120,314 -9,742 0,0358247

-136,527 -16,213 0,03245862 0

-141,188 -4,661 0,01770792 0,0008854

-145,526 -4,338 0,06738775 0,00425478

-146,247 -0,721 0,2118061 0,01484509

-146,098 0,149 0,2740999 0,02855008

-146,759 -0,661 0,3224874 0,04467445

-144,767 1,992 0,3618135 0,06276513

-143,568 1,199 0,3954019 0,08253522

-142,873 0,695 0,3999771 0,10253408

-143,017 -0,144 0,3769117 0,12137966

48

-142,533 0,484 0,3825148 0,1405054

-141,335 1,198 0,3982416 0,16041748

-140,267 1,068 0,3729572 0,17906534

-141,079 -0,812 0,3919332 0,198662

-141,374 -0,295 0,4293647 0,22013024

-139,384 1,99 0,4590486 0,24308267

-138,747 0,637 0,4369374 0,26492954

-139,806 -1,059 0,4181367 0,28583637

-139,798 0,008 0,4248472

-138,128 1,67 0,4218737

32,676 170,804 -0,1486027

31,581 -1,095 -0,2091147

b) Prova 2

yaw diff yaw vx x

64,465 0,00026102

65,488 1,023003 0,00075276

64,747 -0,7409973 -

0,00021396

64,097 -0,6500015 0,00041245

65,433 1,335999 0,03043574

66,099 0,6660004 0,01215007

28,102 -37,997 0,1198155

28,753 0,651001 0,137997 0

28,857 0,1040001 0,2109682 0,01054841

28,971 0,1140003 0,2426222 0,02267952

29,383 0,4119987 0,1885101 0,03210503

29,729 0,3460007 0,104988 0,03735443

29,685 -

0,04400063 0,1148097 0,04309491

29,179 -0,5059986 0,117229 0,04895636

29,121 -

0,05800056 0,1272863 0,05532068

28,987 -0,1340008 0,1842322 0,06453229

28,844 -0,1429996 0,261845 0,07762454

28,754 -

0,09000015 0,3126987 0,09325947

28,701 -0,0529995 0,3726591 0,11189243

29,918 1,216999 0,4739369 0,13558927

30,674 0,7560005 0,4056554 0,15587204

29,98 -0,6940002 0,5533657 0,18354033

29,086 -0,8939991 0,5853638 0,21280852

28,194 -0,8920002 0,6226086 0,24393895

28,44 0,2460003 0,5348737 0,27068263

27,792 -0,6480007 0,4935541 0,29536034

28,539 0,7469997 0,5135323 0,32103695

26,359 -2,18 0,5084119 0,34645755

26,615 0,2560005 0,4559875 0,36925692

27,352 0,7369995 0,5076818

27,392 0,04000092 0,4041025

26,657 -0,7350006 0,4289355

49

24,899 -1,757999 0,3842337

22,14 -2,759001 0,3371638

20,756 -1,383999 0,2422169

11,388 -9,368001 0,1742671

-1,985 -13,373 0,07360584

-17,361 -15,376 0,1123997

-29,58 -12,219 0,04149752

-40,941 -11,361 0,0258371

-52,317 -11,376 0,0021121

-58,645 -6,327999 -

0,01079709

-59,555 -0,9099998 0,06006655

-59,129 0,4259987 0,1554848 0

-60,118 -0,9889984 0,3024342 0,01512171

-60,316 -0,1980019 0,3750586 0,03387464

-59,973 0,3430023 0,4608681 0,05691805

-59,434 0,5390015 0,4851303 0,08117456

-59,96 -0,526001 0,4705922 0,10470417

-61,325 -1,365002 0,5223165 0,13082

-61,949 -0,6240005 0,5125896 0,15644948

-60,859 1,09 0,4876743 0,18083319

-61,395 -0,5359993 0,459604 0,20381339

-61,307 0,08800125 0,4482152 0,22622415

-61,458 -0,151001 0,4588388 0,24916609

-60,579 0,8790016 0,4542449 0,27187834

-61,845 -1,266003 0,4227671

-61,398 0,4470024 0,3378322

-60,471 0,9269981 0,2756287

-67,938 -7,467003 0,1114058

-83,918 -15,98 0,022917

-100,256 -16,338 -

0,01414831

-116,017 -15,761 0,08713181

-131,901 -15,884 0,06070396

-140,785 -8,884003 0,1014206

-146,916 -6,130997 0,1621536 0

-147,466 -0,5500031 0,3193483 0,01596742

-147,53 -

0,06399536 0,3906134 0,03549809

-148,389 -0,8590088 0,4734078 0,05916848

-148,265 0,1240082 0,4574447 0,08204071

-146,291 1,973999 0,4956723 0,10682433

-146,243 0,04800415 0,4650434 0,1300765

-145,585 0,6579895 0,4581434 0,15298367

-145,54 0,04501343 0,4451912 0,17524323

-144,001 1,538986 0,4855835 0,1995224

-143,573 0,428009 0,5172291 0,22538386

-145,795 -2,222 0,5046222 0,25061497

-145,118 0,677002 0,4760323 0,27441658

-144,717 0,401001 0,5215484 0,300494

-143,472 1,244995 0,496339 0,32531095

-144,32 -0,8480072 0,502544 0,35043815

-144,707 -0,3869934 0,4585597 0,37336614

50

-143,989 0,7180023 0,5495201 0,40084214

-141,924 2,065002 0,5020148 0,42594288

-142,53 -0,6060028 0,5238501 0,45213539

-142,563 -

0,03300476 0,5155426 0,47791252

-142,717 -0,1539917 0,5207228 0,50394866

-142,069 0,647995 0,495719 0,52873461

-141,189 0,8800049 0,4740483 0,55243702

-141,893 -0,70401 0,4884526 0,57685965

-141,985 -

0,09199524 0,4385887 0,59878909

-140,88 1,104996 0,44417 0,62099759

-139,861 1,019012 0,4395941 0,64297729

-141,111 -1,25 0,4493163 0,66544311

-140,738 0,3729858 0,4700162 0,68894392

-142,19 -1,451996 0,4554415 0,71171599

c) Prova 3

yaw diff yaw vx x

-84,391 -

0,00041234 0

-61,542 22,849 -

0,03353781 0

-61,52 0,02199936 0,04524413 0,00452441

-61,167 0,3530006 0,06570038 0,01109445

-61,064 0,1030006 0,05803265 0,01689772

-60,979 0,08499908 0,04954537 0,02185225

-60,872 0,1069984 0,03699796 0,02555205

-60,933 -

0,06099701 0,1039991 0,03595196

-61,943 -1,010002 0,4952277 0,08547473

-64,576 -2,632996 1,189442 0,20441893

-63,297 1,278996 0,9650155 0,30092048

-62,405 0,8920021 0,3174967 0,33267015

-62,503 -

0,09799957 1,205397 0,45320985

-63,995 -1,492001 1,27334 0,58054385

-63,596 0,3989983 1,426568

-63,573 0,02299881 1,559828

-64,736 -1,162998 2,350365

-68,455 -3,719002 2,155518

-74,375 -5,919998 2,224824

-82,231 -7,856003 1,584909

-89,253 -7,021996 1,038408

-97,003 -7,75 0,6129974

-103,763 -6,760002 0,4560179

-108,75 -4,987 0,4665926

-114,387 -5,637001 0,5042366

-119,759 -5,372002 0,5390992

-126,472 -6,712997 0,5440784

-131,785 -5,313004 0,5269046 0

51

-135,717 -3,931992 0,4920582 0,04920582

-136,611 -0,8939972 0,889648 0,13817062

-136,906 -0,2950134 1,19021 0,25719162

-137,987 -1,080994 1,329237 0,39011532

-138,909 -0,9219971 1,911052 0,58122052

-138,967 -

0,05799866 1,982819 0,77950242

-138,312 0,6549988 2,086704 0,98817282

-138,57 -0,2580109 2,307875 1,21896032

-138,73 -0,1599884 2,772215 1,49618182

-138,181 0,548996 0,5894625

-139,777 -1,595993 0,186701

d) Prova 4

yaw diff yaw vx x

-64,749001 0,00024004 0

-64,015999 0,73300171 0,02841543 0

-65,975998 -1,9599991 -

0,13826877 -

0,01382688

-65,889 0,08699799 -

0,11237098 -

0,02506398

-65,529999 0,35900116 -

0,10501427 -0,0355654

-65,378998 0,15100098 -

0,02423282 -

0,03798868

-65,108002 0,27099609 0,07318497 -

0,03067019

-64,737999 0,37000275 0,13168581 -

0,01750161

-64,653 0,08499908 0,04742402 -0,0127592

-64,747002 -

0,09400177 0,00255632 -

0,01250357

-58,93 5,8170013 -

0,13639644 -

0,02614321

-52,717999 6,2120018 -0,0710514 -

0,03324836

-50,584 2,1339989 0,28636652 -0,0046117

-50,98 -

0,39599991 0,56206262 0,05159456

-50,073002 0,90699768 1,0067594 0,1522705

-49,167999 0,90500259 1,2842383 0,28069433

-49,087002 0,08099747 1,3577354 0,41646787

-49,019001 0,06800079 1,6955606 0,58602393

-53,132999 -4,1139984 1,6012725 0,74615118

-60,835999 -7,7029991 1,0102354 0,84717472

-67,418999 -6,5830002 0,44369772 0,89154449

-71,959 -4,5400009 0,26841691 0,91838618

-86,998001 -15,039001 0,38485879 0,95687206

-91,377998 -4,3799973 0,23176843 0,9800489

-98,691002 -7,3130035 0,05738566 0,98578747

-105,462 -6,7709961 0,02266409 0,98805388

-112,612 -7,1500015 0,01950786 0,99000466

52

-134,839 -22,227005 0,03801996 0,99380666

-129,854 4,9850006 0,13491604 1,00729826

-118,611 11,243004 0,03869759 1,01116802

-112,875 5,7360001 0,15954646 1,02712267

-118,244 -5,3690033 0,17321439 1,04444411

-123,837 -5,5929947 0,14513098 1,05895721

-126,547 -2,7099991 0,0690251 1,06585972

-129,01401 -2,4670105 -

0,08238883 1,05762083

-128,827 0,18701172 0,24364641 1,08198547

-129,60699 -

0,77999878 0,81069452 1,16305493

-129,55499 0,05200195 1,2652298 1,28957791

-129,963 -

0,40800476 1,3830519 1,4278831

-130,136 -

0,17300415 1,5059131 1,57847441

-130,00301 0,13299561 1,7927819 1,7577526

-129,994 0,00900269 2,0313294 1,96088554

-129,92799 0,06600952 2,2128668 2,18217222

-132,248 -2,3200073 2,1969774

-137,991 -5,7429962 0,51561993

-143,21899 -5,2279968 -

0,00100124

-148,33099 -5,1119995 1,38246

-153,409 -5,0780029 0,98102957

-156,429 -3,0200043 0,8290695

-159,804 -3,375 0,68573999

-165,735 -5,9309998 0,74764681

-166,726 -

0,99099731 0,83477533

-169,05701 -2,3310089 0,85735321

-174,44901 -5,3919983 0,94101745

-178,34 -3,8909912 0,90952736

172,80499 351,14499 0,7284627

169,614 -3,1909943 0,60794985

159,52499 -10,089005 0,69094396 0

158,377 -1,147995 0,69157088 0,06915709

157,061 -1,3159943 0,65544397 0,13470149

154,69901 -2,3619995 0,64439684 0,19914117

152,30499 -2,3940125 0,73202598 0,27234377

150,149 -2,1559906 0,69873714 0,34221748

148,21201 -1,9369965 0,77974147 0,42019163

146,08501 -2,1269989 0,772089 0,49740053

144,679 -1,4060059 0,80152154 0,57755268

143,12399 -1,5550079 0,96860617 0,6744133

141,339 -1,7849884 0,9469409 0,76910739

139,302 -2,0370026 0,89241856 0,85834925

142,72099 3,4189911 0,83329451 0,9416787

147,711 4,9900055 0,74165452 1,01584415

152,964 5,253006 0,68994647

163,03799 10,07399 0,48306313

-178,98399 -342,02197 -

0,01215408 -

0,00121541

53

-168,94 10,043991 0,0643103 0,00521562

-156,69299 12,247009 0,45885783 0,0511014

-154,436 2,2569885 0,88476098 0,1395775

-148,347 6,0890045 0,74165475 0,21374298

e) Prova 5

yaw vx

-127,064 0,00016932

-146,27299 0,19468726

-127,836 0,09181227

-84,898003 0,46603411

-74,321999 0,62504894

-64,650002 0,66992217

-53,194 0,64033043

-51,519001 0,49180156

-59,424 0,29836002

-67,786003 0,06830042

-75,204002 0,07862451

-80,773003 0,22988963

-87,630997 0,05792851

-93,911003 0,14590009

-99,598999 0,13451356

-103,948 0,1615003

-109,19 0,16734149

-113,578 0,21954906

-116,948 0,24450412

-118,977 0,29368404

-121,301 0,3069073

-124,265 0,29312178

-127,767 0,26331329

-133,313 0,2403519

-138,94701 0,13820218

-146,446 -0,01049564

-153,28999 -0,16134076

-158,01401 -0,20580526

-163,181 -0,16068707

-167,793 -0,0634172

-172,888 0,06142772

-176,76801 0,16316944

-178,60201 0,23627539

179,761 0,26022515

177,97301 0,26836163

176,114 0,26157078

-178,35699 0,2156444

-167,856 0,10624938

-153,991 0,11239284

-139,57401 0,11405746

-125,08 0,24736352

54

-111,483 0,23042887

-100,706 0,22427532

-87,936996 0,15214176

-75,316002 0,08295999

-62,585999 0,04509477

-52,476002 0,0138201

-40,250999 -0,01540045

-36,673 -0,09041107

-41,953999 -0,22888872

-47,842999 -0,38496029

-52,724998 -0,4445408

-58,820999 -0,45569509

-65,207001 -0,42564917

-70,355003 -0,38306385

-77,033997 -0,27746105

-84,306 -0,17822921

-92,211998 -0,01994734

-100,06 0,05818166

-106,324 0,0664247

-114,695 0,06296679

-123,372 0,0804583

-131,866 0,28054088

-140,063 0,34506896

-146,48399 0,40672767

-154,436 0,41653284

-162,23599 0,51370555

-167,424 0,5025472

-159,474 0,54187626

-147,98599 0,45300841

-138,60699 0,36323756

-126,68 0,28465554

-115,054 0,20997259

-102,537 0,06490165

-92,050003 0,05280399

-79,753998 0,07578094

-68,483002 0,01890597

-58,749001 -0,02974868

-50,127998 -0,00075904

-41,306 0,01716035

-34,119999 0,02954285

-25,575001 0,07605977

-16,926001 0,15526757

-8,2989998 0,25127697

-1,2539999 0,29555827

7,3039999 0,27581012

15,34 0,26942781

18,648001 0,29054132

18,43 0,27186897

0,81699997 0,27151841

-4,5229998 0,271662

-13,431 0,2429136

-22,087 0,27120745

55

-28,731001 0,22488654

-37,481998 0,13744214

-46,469002 0,06705891

-55,598999 0,01207264

-63,279999 -0,01088291

-73,262001 -0,01184652

-83,712997 -0,06130802

-93,981003 -0,05381841

-103,751 -0,02368071

-111,733 -7,87E-05

-121,443 0,04749134

-131,16901 0,08853944

-140,90601 0,16098396

-148,23801 0,24037078

-147,575 0,23218788

-137,459 0,09056144

-126,774 0,06138721

-115,974 -0,05162394

-105,467 -0,13813165

-95,249001 -0,02882775

-85,191002 -0,08725427

-77,240997 -0,06028587

-68,392998 -0,00348203

-60,355999 0,02098413

-52,750999 0,07862219

-44,998001 0,18801542

-33,761002 0,32757482

-28,028 0,32936135

-22,561001 0,31827474

-15,52 0,27153161

-8,5760002 0,1981066

-1,795 0,06007057

5,027 -0,07542796

10,515 -0,1534237

17,618999 -0,22739875

24,611 -0,21117084

31,532 -0,08272504

27,700001 -0,02647555

15,64 -0,0250337

2,8829999 -0,07325143

-7,1999998 -0,02633376

-19,294001 -0,06542327

-31,723 -0,04060683

-43,512001 -0,03062557

-54,778 -0,04954425

-66,113998 -0,02535227

-74,852997 -0,08570394

-85,320999 -0,03154587

-94,650002 -0,05219469

-103,895 0,00935452

-113,086 -0,09964187

-120,074 -0,07056013

56

-128,834 0,19364591

-136,948 0,08227593

-144,946 0,18016909

-152,76199 0,1995592

-164,972 0,18438888

-178,731 0,25569111

167,229 0,32330617

155,77299 0,43999267

143,243 0,43704516

132,752 0,75030023

134,179 0,67250997

135,881 0,63117981

141,342 0,53789943

143,37199 0,52656555

147,17599 0,59076577

145,28799 0,58187473

129,539 0,54233789

126,077 0,50778651

126,018 0,41762778

128,384 0,36110067

131,992 0,38419044

135,55299 0,42845264

139,132 0,46390224

145,355 0,0943313

149,918 -0,02315898

153,85201 -0,01686446

158,24001 0,00407714

167,041 -0,01882364

166,582 -0,09049191

165,45399 -0,03177725

170,049 -0,06812066

172,47501 -0,0776408

177,069 -0,05775998

-172,76199 0,03302213

-164,929 0,02318597

-168,35899 -0,09953587