Manual Para El Proyecto de Concreto Armado - Enrique Arna L- Salomon Epelboim - 1985
Arna u Arbós Ruiz S DE CONT BOT QUA D-ROTOR E GRAU Di...
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