scieee AI-readable full text Open interactive document viewer

Implementació de un gimbal amb càmera per a un cubesat

Baldrich Salvadó, Xavier

Abstract

Aquest treball consistirà a desenvolupar i muntar un gimbal amb una càmera implementada, els objectius són els següents: dissenyar el hardware de la playload que permet moure la càmera i escollir un mètode de seguiment d'objectes per al moviment de la càmera amb la finalitat que enfoqui a la Terra. Per fer això es començarà amb un set de components disponibles per controlar la Raspberry Pi. La Raspberry Pi servirà al mateix moment de on board computer (OBC) del CubeSat. En finalitzar el TFG s'espera que el gimbal amb la càmera estigui muntat al prototip CubeSat i que es pugui controlar des d'un dispositiu extern

Full text

TREBALL DE FI D’ESTUDIS Document: Memòria IMPLEMENTACIÓ DE UN GIMBAL AMB CÀMERA PER A UN CUBESAT Autor/Autora: Xavier Baldrich Salvadó Director/Directora - Codirector/Codirectora: Javier Gago Barrio / Manuel Lamich Arocas Titulació: GRAU EN ENGINYERIA ELECTRÒNICA INDUSTRIAL I AUTOMÀTICA Convocatòria: Primavera, 2024. i Resum Aquest treball consistirà a desenvolupar i muntar un gimbal amb una càmera implementada, els objectius són els següents: dissenyar el hardware de la playload que permet moure la càmera i escollir un mètode de seguiment d'objectes per al moviment de la càmera amb la finalitat que enfoqui a la Terra. Per fer això es començarà amb un set de components disponibles per controlar la Raspberry Pi. La Raspberry Pi servirà al mateix moment de on board computer (OBC) del CubeSat. En finalitzar el TFG s'espera que el gimbal amb la càmera estigui muntat al prototip CubeSat i que es pugui controlar des d'un dispositiu extern. Abstract This project will involve developing and assembling a gimbal with an integrated camera. The objectives are as follows: design the hardware for the payload that allows the camera to move and choose a method of object tracking for the camera's movement so that it focuses on the Earth. To achieve this, a set of available components for controlling the Raspberry Pi will be used. The Raspberry Pi will also serve as the onboard computer (OBC) for the CubeSat. By the end of the project, it is expected that the gimbal with the camera will be assembled on the CubeSat prototype and controllable from an external device. ii Índex RESUM ...................................................................................................................................................... I ABSTRACT ................................................................................................................................................. I ÍNDEX ...................................................................................................................................................... II ÍNDEX DE TAULES ................................................................................................................................... IV ÍNDEX DE FIGURES................................................................................................................................... V LLISTA D’ABREVIATURES/GLOSSARI ......................................................................................................... VI 1. INTRODUCCIÓ ...................................................................................................................................... 1 1.1 OBJECTE .............................................................................................................................................. 2 1.2 ABAST ................................................................................................................................................ 3 1.3 REQUERIMENTS .................................................................................................................................... 3 1.4 JUSTIFICACIÓ ........................................................................................................................................ 6 2 ANTECEDENTS I/O REVISIÓ DE L’ESTAT DE LA QÜESTIÓ ..................................................................... 8 2.1 CUBESAT ............................................................................................................................................. 8 2.1.1 Desplegament .............................................................................................................................. 9 2.1.2 Interfície del CubeSat al coet ....................................................................................................... 9 2.1.3 Col·locació en òrbita .................................................................................................................. 12 2.2 PIMORONI PAN TILT HAT ...................................................................................................................... 13 2.3 INTEL·LIGÈNCIA ARTIFICIAL .................................................................................................................... 15 2.4 COMPUTER VISION .............................................................................................................................. 16 2.5 OPEN CV .......................................................................................................................................... 17 3 HARDWARE .................................................................................................................................... 19 3.1 ESQUEMA DEL HARDWARE .................................................................................................................... 19 3.2 SERVOS ............................................................................................................................................. 21 3.3 SISTEMA OPERATIU LEGACY 32 BITS ........................................................................................................ 22 3.4 CAPACITATS DEL HARDWARE .................................................................................................................. 23 4 MÈTODES DE DETECCIÓ I SEGUIMENT ............................................................................................ 25 4.1 POSSIBLES SOLUCIONS AL SEGUIMENT DE LA TERRA .................................................................................... 25 4.2 DETECCIÓ .......................................................................................................................................... 26 4.2.1 Detecció de moviment ............................................................................................................... 26 4.2.2 Detecció per formes ................................................................................................................... 28 4.2.3 Detecció per colors ..................................................................................................................... 29 4.3 SEGUIMENT ....................................................................................................................................... 32 5 RESULTATS ..................................................................................................................................... 34 5.1 SEGUIMENT PER FORMES ...................................................................................................................... 34 5.2 SEGUIMENT PER MOVIMENT .................................................................................................................. 40 5.3 SEGUIMENT PER COLORS ....................................................................................................................... 42 5.4 TRIA DE LA SOLUCIÓ FINAL ..................................................................................................................... 45 6 PRESSUPOST .................................................................................................................................. 46 6.1 PRESSUPOST DEL HARDWARE ................................................................................................................ 46 6.2 PRESSUPOST DEL SOFTWARE ................................................................................................................. 46 6.3 PRESSUPOST MÀ DE OBRA ..................................................................................................................... 47 6.4 PRESSUPOST TOTAL .............................................................................................................................. 47 7 ANÀLISI I VALORACIÓ DE LES IMPLICACIONS AMBIENTALS I SOCIALS ............................................... 48 iii 8 CONCLUSIONS I TREBALLS FUTURS ................................................................................................. 49 9 REFERÈNCIES .................................................................................................................................. 50 10 ANNEXES ....................................................................................................................................... 52 iv Índex de taules TAULA 1. PRESSUPOST DEL HARDWARE .................................................................................................................... 46 TAULA 2. PRESSUPOST DEL SOFTWARE ..................................................................................................................... 46 TAULA 3. PRESSUPOST DE LA MÀ D'OBRA .................................................................................................................. 47 TAULA 4. PRESSUPOST TOTAL .................................................................................................................................. 47 v Índex de figures FIGURA 1. PANTILTHAT CONNECTAT A LA RASPBERRY PI [1] ............................................................................................ 2 FIGURA 2. SATÈL·LIT EN ÒRBITA [2] ............................................................................................................................ 2 FIGURA 3. CÀMERA B01 [3] .................................................................................................................................... 3 FIGURA 4. ESQUEMA RASPBERRY PI 3 MODEL B [4] ...................................................................................................... 4 FIGURA 5. MOTOR SERVO 9G [23] ............................................................................................................................ 4 FIGURA 6. PAN TILT HAT MÒDUL DE PIMORONI [5] ...................................................................................................... 5 FIGURA 7. PCB DE PIMORONI, PART DAVANTERA [5] ..................................................................................................... 5 FIGURA 8. PCB DE PIMORONI, PART POSTERIOR [5] ...................................................................................................... 5 FIGURA 9. FONT D'ALIMENTACIÓ [6] .......................................................................................................................... 6 FIGURA 10. EL PRIMER CUBESAT CREAT [7] ................................................................................................................. 8 FIGURA 11. FAMÍLIA DE CUBESAT [8] ........................................................................................................................ 8 FIGURA 12. EL PRIMER DISPENSADOR [7] .................................................................................................................. 10 FIGURA 13. EXEMPLE DE DISPENSADOR DE 6U [7] ...................................................................................................... 10 FIGURA 14. ESPAI ON ES POSA EL CUBESAT AL COET [7] ............................................................................................... 11 FIGURA 15. TIPUS DE COETS [7] .............................................................................................................................. 11 FIGURA 16. TIPUS DE ÒRBITES [9] ........................................................................................................................... 12 FIGURA 17. VISTA DELS SATÈL·LITS EN LES ÒRBITES [10] ............................................................................................... 13 FIGURA 18. PANTILTHAT CONNECTAT A LA RASPBERRY PI [1] ........................................................................................ 13 FIGURA 19. PINOUT DE LA RASPBERRY PI 3 MODEL B [11] ........................................................................................... 14 FIGURA 20. ESQUEMA DE LA IA [12] ....................................................................................................................... 15 FIGURA 21. PINS DELS SERVOS ................................................................................................................................ 19 FIGURA 22. PINS A CONNECTAR DE LA RASPBERRY PI 3 MODEL B ................................................................................... 20 FIGURA 23. ESQUEMA FINAL .................................................................................................................................. 20 FIGURA 24. PWM I DUTY CICLE [17] ...................................................................................................................... 21 FIGURA 25. PRIMERES CONNEXIONS ........................................................................................................................ 23 FIGURA 26. CONNEXIONS FINALS ............................................................................................................................ 24 FIGURA 27. IMATGE EN COLOR / IMATGE PASSADA A BLANC I NEGRE ............................................................................... 26 FIGURA 28. DIFERÈNCIA DE MOVIMENT .................................................................................................................... 27 FIGURA 29. PARTS EN MOVIMENT DE LA IMATGE ........................................................................................................ 27 FIGURA 30. IMATGE EN COLOR / IMATGE PASSADA A BLANC I NEGRE ............................................................................... 28 FIGURA 31. ESPAI RGB [13] .................................................................................................................................. 29 FIGURA 32. SEGMENTACIÓ DE COLORS EN UNA IMATGE [14]......................................................................................... 29 FIGURA 33. ESPAI RGB I ESPAI HSV [15] ................................................................................................................. 30 FIGURA 34. VALORS DEL COLOR VERMELL [16] .......................................................................................................... 30 FIGURA 35. VALORS DEL COLOR BLAU [16] ................................................................................................................ 31 FIGURA 36. IMATGE DE LA CÀMERA EN COLOR ............................................................................................................ 31 FIGURA 37. TRIA DEL COLOR A SEGUIR ...................................................................................................................... 31 FIGURA 38. MOVIMENT DE SEGUIMENT .................................................................................................................... 33 FIGURA 39. PILOTA DE TENIS .................................................................................................................................. 34 FIGURA 40. ENTORN DE LA PILOTA DE TENIS ............................................................................................................... 34 FIGURA 41. PÈRDUA DE LA DETECCIÓ DE LA PILOTA ...................................................................................................... 35 FIGURA 42. RETROBAMENT DE LA PILOTA .................................................................................................................. 35 FIGURA 43. CINTA DE PINTOR ................................................................................................................................. 36 FIGURA 44. ENTORN DE LA CINTA DE PINTOR.............................................................................................................. 36 FIGURA 45. CANVI DE LA DETECCIÓ DEL CERCLE DE LA CINTA ......................................................................................... 37 FIGURA 46. SISTEMA PERDUT ................................................................................................................................. 37 FIGURA 47. PILOTA DE FUTBOL ................................................................................................................................ 38 FIGURA 48. ENTORN DE LA PILOTA DE FUTBOL ............................................................................................................ 38 FIGURA 49. CANVI DE DETECCIÓ A LA PILOTA DE FUTBOL .............................................................................................. 39 FIGURA 50. EXEMPLE ÀREA D'INTERÈS 1 ................................................................................................................... 40 FIGURA 51. EXEMPLE ÀREA D'INTERÈS 2 ................................................................................................................... 40 FIGURA 52. EXEMPLE ÀREA D'INTERÈS 3 ................................................................................................................... 41 FIGURA 53. ENTORN DEL SEGUIMENT PER MOVIMENT ................................................................................................. 41 vi FIGURA 54. TRIA DEL COLOR A SEGUIR ...................................................................................................................... 42 FIGURA 55. ÀREA D’INTERÈS DEL COLOR ................................................................................................................... 42 FIGURA 56. CANVI D'ENTORN EN EL COLOR ............................................................................................................... 43 FIGURA 57. QUASI PÈRDUA DE L'ÀREA D’INTERÈS ........................................................................................................ 43 FIGURA 58. RETROBAMENT DE L'ÀREA D'INTERÈS ....................................................................................................... 44 FIGURA 59. ENTORN DEL SEGUIMENT PER COLOR ........................................................................................................ 44 Llista d’abreviatures/Glossari No s’escau. 1 1. Introducció El treball de fi de grau realitzat és un treball que està emmarcat en el projecte PLATHON del grup d'investigació DISEN del departament d'Enginyeria Electrònica de la ESEIAAT. El projecte PLATHON pretén desenvolupar prototips de CubeSats per simular missions espacials amb Hardware In the Loop (HIL). De manera que es pugui provar el software en un CubeSat que està en una missió simulada en un simulador orbital desenvolupat pel grup DISEN. El projecte consisteix en crear un dispositiu per controlar una càmera, amb dos motors servo, que anirà implementada a un CubeSat. Un CubeSat és un tipus de satèl·lit miniaturitzat per la investigació i les aplicacions espacials en una òrbita terrestre baixa, bàsicament és un nano satèl·lit. Es considera nano satèl·lit aquella que té una massa entre 1 kg i 10 kg, generalment per orbitar en l'òrbita LEO (Low Earth Orbit). El CubeSat té la característica de què a part de tenir una massa entre 1 kg i 10 kg, té una forma de cub amb una mida de 10x10x10 centímetres, aquesta dada és la que diferencia un CubeSat amb un nano satèl·lit convencional. Es fan servir CubeSats perquè són dispositius molt més senzills que els satèl·lits, són més fàcils de fer per les empreses, molt més econòmics i ocupen menys espai pel llançament a la òrbita, aquests serien els motius de pes pel qual utilitzarem un CubeSat. En aquest treball crearé una playload consistent amb la càmera on el seu moviment estarà controlat per un gimbal amb 2 motors servo. Aquesta càmera la controlaré amb una Raspberry Pi 3 model B, una pi càmera, una PCB de l'empresa Pimoroni i dos motors servo. La part més interessant d'aquest treball és que farem servir la intel·ligència artificial per tal que la càmera reconegui un objecte que serà la Terra i un cop l'haguí reconegut, segueixi aquest objecte, això ho explicaré més detalladament al següent apartat. Això ho farem amb la llibreria OpenCV [18] (Open Source Computer Vision Library) la qual com diu el nom també engloba la visió per computació. Aquests termes últimament són molt utilitzats en el dia a dia de les empreses i cada cop més en el dia a dia de la gent convencional, com veiem podríem parlar que la intel·ligència artificial és el futur de les nostres vides. Per acabar, m'agradaria comentar que aquest treball està englobat en altres treballs de fi de grau d'altres alumnes, com he dit, jo crearé la playload per controlar la càmera, però hi ha altres estudiants que estan creant la resta de plaques, com per exemple la placa d'alimentació del CubeSat, entre d'altres. 8 2 Antecedents i/o revisió de l’estat de la qüestió 2.1 CubeSat La historia dels CubeSats comença l’any 1999, el projecte va ser dut a terme pel professor Jordi Puig-Suari (Universitat Politecnica de California) i el professor Bob Twiggs (Universitat de Stanford). L’objectiu del projecte era reduir el cost econòmic i el temps de desenvolupament per enviar un satèl·lit a l’espai, també es volia incrementar l’accessibilitat de l’espai i permetre que es poguessin enviar més freqüentment satèl·lits a l’espai. Figura 10. El primer CubeSat creat [7] El Cubesat [7] es una classe de satèl·lit que té una mida estàndard, exactament de 10x10x10 centímetres i també una forma exacta, ha de ser quadrada. Cada unitat de Cubesat es defineix com a U, per exemple, 1U Cubesat es un cub de 10 centimetres, és a dir 1 unitat de CubeSat amb una massa de 1,3 quilograms aproximadament. Les unitats de CubeSats varien entre 1U i 12U, com més CubeSats més funcions farà el satèl·lit. Aquí podem veure les famílies de CubeSats que existeixen, ha de ser 1U, 2U, 3U, 6U o 12U. Això es per requeriments quan llancem el satèl·lit a l’espai. Figura 11. Família de CubeSat [8] 9 2.1.1 Desplegament Per a una bona comprensió del projecte, aquests son els passos generals que es segueixen per al procés logístic de llançament d’un satèl·lit: - Selecció de coet i lloc de llançament segons les característiques de la missió espacial: es tindrà en compte la posició on el coet col·locarà el satèl·lit un cop estigui a l’espai. - Certificació en laboratori de proves: per garantir que el satèl·lit podrà ser llançat de forma segura i podrà operar a l’espai. - Ompliment de formularis per a l’acceptació del llançament: els gestors de llançament demanen proves específiques perquè el satèl·lit sigui admès per al seu llançament. - Enviament del satèl·lit al lloc de llançament: embalatge del satèl·lit i, en alguns casos, assegurar aquest enviament per evitar danys . - Llançament del satèl·lit: llançament del coet i posterior posada en òrbita del satèl·lit. 2.1.2 Interfície del CubeSat al coet Dispensadors: Els CubeSats no son les úniques parts dels nano satèl·lits, també hi ha els dispensadors. Aquests fan de interfície entre els CubeSats i el coet que llançarà el nano satèl·lit a l’espai, el dispensador fa de subjectador del CubeSat, protegeix el satèl·lit durant el vol i llança el satèl·lit a l’espai quan es l’hora de fer-ho, es una part molt important del procés. Hi ha diferents dispensadors al mercat i cada un té especificacions diferents però tots estan dissenyats per subjectar el satèl·lit, protegir-lo i llançar-lo a l’espai. També tots estan dissenyats per posar la mida estàndard del CubeSat, 10x10x10 centímetres. 10 Aquí explicaré els dos dispensadors més utilitzats del mercat: - Dispensadors de 3U: El primer dispensador de CubeSats va ser el Poly-Picosatellite Orbital Deployer (PPOD). Va ser creat per la Universitat de California i pot subjectar 3 unitats de CubeSats. Quan és hora de llançar el satèl·lit, el coet envia una senyal electrònica al P-POD, aquest el que fa és obrir la porta que veiem a la imatge i finalment llança el satèl·lit en òrbita. Gairebé tots els dispensadors tenen dissenys diferents però l’objectiu és el mateix, un contenidor segur amb una porta que s’obra per tal de llançar el satèl·lit en orbita. - Dispensadors de 6U: Després de utilitzar freqüentment els dispensadors de 3U i que tot anés correcte, els desenvolupadors van qüestionar el següent escenari: fer més gran el dispensador. Al 2014 es va inventar el dispensador de 6U, com podem veure, la forma del dispensador es molt similar a la de 3U però més gran. El que fan és posar dispensadors de 3U per cada costat, així fan que el resultat final sigui un dispensador de 6U. Realment fa la mateix funció que un dispensador de 3U, però s’hi afegeixen 3U més per tenir més funcionalitats al satèl·lit. Figura 12. El primer dispensador [7] Figura 13. Exemple de dispensador de 6U [7] 11 Coet: Quan es va dissenyar el projecte, la idea era posar els dispensadors a qualsevol lloc on hi hagués espai del coet, i així es va fer, aquesta manera de guardar els dispensadors al coet encara segueix vigent, on hi hagi espai es posa el nano satèl·lit. Però hi ha altres opcions, per exemple, els CubeSats es poden llançar amb la carga en una missió de re suplement a l’estació espacial, el CubeSat es portarà a l’estació espacial i des de allà es llançarà. En aquesta imatge es veuen els diferents coets que es fan servir per llançar els CubeSats a l’espai, almenys fins al 2017. Els CubeSats no estan limitats pel coet de llançament, s’adapten molt be a qualsevol coet, però aquests son els mes utilitzats: Figura 15. Tipus de coets [7] Figura 14. Espai on es posa el CubeSat al coet [7] 12 2.1.3 Col·locació en òrbita L’òrbita del satèl·lit sempre està relacionada amb la missió espacial. En una missió espacial, sempre s’especifica el tipus d’òrbita desitjada ja que aquesta garantirà que l’objectiu de la missió sigui exitós. A continuació, es mostraran algunes característiques generals que les òrbites de nano satèl·lits compleixen i per què aquest tipus d’òrbita són les més utilitzades. Els diferents tipus d’òrbites es classifiquen per l’altura orbital. Les més utilitzades són LEO (Òrbita Terrestre Baixa), MEO (Òrbita Terrestre Mitjana) i HEO [10] (Òrbita Terrestre Alta). A la figura s’observen les òrbites circulars. Figura 16. Tipus de òrbites [9] Òrbita LEO: Es consideren òrbites LEO (Low Earth Orbit) les situades entre 150 km i 1000 km aproximadament, per estar per sobre del drag atmosfèric i per sota dels perillosos cinturons de radiació de Van Allen. Òrbita GEO: Les òrbites GEO (Geoestacionary Equatorial Orbit). En aquest tipus d’òrbites, el satèl·lit roman sempre sobre el mateix punt de l’equador terrestre i per aconseguir-ho ha d’ajustar la seva velocitat angular amb la velocitat angular de la Terra. Òrbita MEO: MEO (Medium Earth Orbit). Són òrbites situades entre els 2000 km i els 36000 km amb períodes de diverses hores. Aquestes òrbites són utilitzades freqüentment pels satèl·lits d’observació, defensa i posicionament, com les constel·lacions de GPS, GLONASS, Galileo o COMPASS (BeiDou). 13 La òrbita escollida per llançar el nano satèl·lit es la òrbita LEO, perquè aquesta és la que està més a prop de la Terra. Més o menys està a uns 500 quilometres. Com podem veure a la següent imatge, no es podria veure tot el conjunt de la Terra, nomes una part, aquest punt s’ha de tenir en compte en el moment de escollir el algorisme final. Figura 17. Vista dels satèl·lits en les òrbites [10] 2.2 Pimoroni Pan Tilt Hat El Pan-Tilt HAT de Pimironi permet muntar i controlar un mòdul de pan-tilt directament a sobre del miniordinador Raspberry Pi. És perfecte per a moltes aplicacions i projectes, aquest conjunt de servos amb moviment horitzontal i vertical permetrà girar 180 graus en ambdós eixos. Es connecta perfectament amb el mòdul de càmera Raspberry Pi i qualsevol altre mòdul amb una forma similar. El microcontrolador integrat del HAT i els seus paquets intel·ligents permeten controlar de manera independent els dos servos (pan i tilt) molt fàcilment, així com alimentar fins a 24 LEDs regulars o NeoPixel RGB. També hi ha una ranura pràctica a través de la qual es pot passar els cables dels servos, LEDs i càmera elegantment a través del PCB. També hi ha inclòs un petit suport acrílic per a subjectar la càmera de manera segura al cap del mòdul de pan-tilt. Figura 18. PanTiltHat connectat a la Raspberry Pi [1] 14 Especificacions: - Mòdul pan-tilt (moviment de 180 graus en cada eix) amb dos servos. - HAT amb dos canals de servo, un canal de LED PWM o NeoPixel RGB (o RGBW). - Pins de capçalera en angle recte pre-soldats a la part inferior del HAT per als canals de servos i LED. - Ranura per passar els cables dels servos, LEDs i càmera. - Suport acrílic per subjectar la càmera Pi v1 o v2 i la tira NeoPixel (amb difusor). - Distribució de pins del Pan-Tilt HAT. - Compatible amb tots els models de Raspberry Pi amb capçalera de 40 pins. - Biblioteca de Python [20]. Software: Hi ha creada una biblioteca de Python molt senzilla per fer molt fàcil controlar el PanTilt HAT. Només s’ha d'indicar al Pan-Tilt HAT l'angle al qual vols que faci pan o tilt (de -90 a +90 graus) i començarà a moure's. A partir d’aquí ja es pot crear l’algorisme per fer el projecte final. Dimensions: El mòdul de pan-tilt mesura aproximadament 50 x 37 x 61 mm (L x A x H). El HAT i les peces de connexió afegeixen 13,2 mm més a l'altura. Els servos consumeixen molta corrent, aproximadament 0,5 A cada servo, s’ha de connectar una font d'alimentació de bona qualitat de 2,5A com l'oficial del Raspberry Pi. El canal de servo 1 controla el pan i el canal de servo 2 controla el tilt, tot i que es poden intercanviar fàcilment en el software. Aqui veiem els 40 pins GPIO de la Raspberry, els pins il·luminats son els pins que fa servir la placa de Pimoroni per comunicar-se amb els servos. Figura 19. Pinout de la Raspberry Pi 3 model B [11] 15 2.3 Intel·ligència artificial La Intel·ligència Artificial (IA) es refereix al desenvolupament de sistemes informàtics i algorismes que poden realitzar tasques que típicament requereixen intel·ligència humana. Aquestes tasques inclouen la resolució de problemes, l'aprenentatge, la percepció, la comprensió del llenguatge natural i la presa de decisions. La IA té com a objectiu crear màquines que puguin adaptar-se, raonar i millorar el seu rendiment amb el temps, imitant o superant les capacitats humanes en diversos dominis. La incorporació de la IA a diversos sectors ha portat a crear canvis significatius en els processos i operacions ofertes. L'atenció mèdica és un d'aquests sectors on la IA ha tingut un major impacte. Aplicacions de IA com l'anàlisi predictiu ajuden en el diagnòstic precoç i en els plans de tractament personalitzats. En radiologia, els models de DL (Deep Learning) assisteixen en la identificació d'anomalies en imatges mèdiques amb una precisió comparable a la dels professionals capacitats. En el transport, la IA ha impulsat l'arribada de vehicles autònoms. Aquests vehicles utilitzen algorismes de ML (Machine Learning) per interpretar dades de sensors, cosa que els permet navegar per entorns complexos i prendre decisions en temps real. Malgrat aquests immensos beneficis, aquestes aplicacions també comporten riscos. Les qüestions relacionades amb la privacitat, la seguretat de les dades i les implicacions ètiques són riscos importants. Per exemple, l'ús de la IA en l'atenció mèdica implica manejar dades sensibles dels pacients, cosa que planteja problemes de privacitat i seguretat. Les aplicacions reals de la IA són vastes i estan creixent, oferint immensos beneficis potencials al mateix temps que presenten desafiaments significatius que s'han d'abordar. Un esquema conceptual dels diferents aspectes de la IA i les seves especialitats es pot veure en la figura. Figura 20. Esquema de la IA [12] 16 2.4 Computer Vision La Visió per Computador es pot definir com una disciplina que explica com reconstruir, interpretar i entendre una escena 3D a partir de les seves imatges 2D. Es tracta de modelar i replicar la visió humana utilitzant programari i maquinari informàtic. La Visió per Computador es solapa significativament en els següents camps: - Processament d'Imatges: Se centra en la manipulació d'imatges. - Reconeixement de Patrons: Explica diverses tècniques per classificar patrons. - Fotogrametria: S'ocupa d'obtenir mesures precises a partir d'imatges. Visió per Computador Vs Processament d'Imatges: - El processament d'imatges tracta de la transformació d'imatge a imatge. L'entrada i la sortida del processament d'imatges són ambdues imatges. - La visió per ordinador és la construcció de descripcions explícites i significatives d'objectes físics a partir de les seves imatges. La sortida de la visió per ordinador és una descripció o una interpretació d'estructures en una escena 3D. Aplicacions de la Visió per Computador: Aplicació en Robòtica: - Localització: Determinar la ubicació del robot automàticament. - Navegació. - Evitació d'obstacles. - Assemblatge (encaix de peces, soldadura, pintura). - Manipulació (per exemple, manipulador robot PUMA). - Interacció Humà-Robot (HRI): Robòtica intel·ligent per interactuar amb i servir a les persones. Aplicació en Medicina: - Classificació i detecció (per exemple, classificació de lesions o cèl·lules i detecció de tumors). - Segmentació 2D/3D. - Reconstrucció 3D d'òrgans humans (RMN o ultrasons). - Cirurgia robòtica guiada per visió. Aplicació en Automatització Industrial: - Inspecció industrial (detecció de defectes). - Assemblatge. - Lectura de codis de barres i etiquetes de paquets. - Classificació d'objectes. - Comprensió de documents (per exemple, OCR). 17 Aplicació en Seguretat: - Biometria (reconeixement de l'iris, empremtes digitals, reconeixement facial). - Vigilància: Detectar certes activitats o comportaments sospitosos. 2.5 Open CV OpenCV (Open Source Computer Vision Library) és una biblioteca de programari de visió per computador i aprenentatge automàtic de codi obert. OpenCV es va crear per proporcionar una infraestructura comuna per a aplicacions de visió per computador i per accelerar l'ús de la percepció automàtica en productes comercials. OpenCV facilita a les empreses l'ús i la modificació del codi. OpenCV va ser inicialment una iniciativa de recerca d'Intel per assessorar aplicacions que requereixen molta CPU. Es va llançar oficialment el 1999. L'any 2006, es va publicar la seva primera versió important, OpenCV 1.0. A l'octubre de 2009, es va publicar la segona versió important, OpenCV 2. A l'agost de 2012, OpenCV va ser assumida per una organització sense ànim de lucre, OpenCV.org. La biblioteca té més de 2500 algorismes optimitzats, que inclouen un conjunt complet d'algorismes clàssics i d'avantguarda de visió per computador i aprenentatge automàtic. Aquests algorismes es poden utilitzar per detectar i reconèixer cares, identificar objectes, classificar accions humanes en vídeos, seguir moviments de càmera, seguir objectes en moviment, trobar imatges similars en una base de dades d'imatges, eliminar ulls vermells de les imatges preses amb flash, seguir moviments oculars [18], etc. OpenCV té més de 47 mil persones a la comunitat d'usuaris i un nombre estimat de descàrregues que supera els 18 milions. La biblioteca s'utilitza extensament en empreses, grups de recerca i per organismes governamentals. A més de les empreses ben establertes com Google, Yahoo, Microsoft, Intel, IBM, Sony, Honda, Toyota que fan servir la biblioteca, hi ha moltes startups com Applied Minds, VideoSurf i Zeitera, que fan un ús extensiu d'OpenCV. Els usos desplegats d'OpenCV abasten des de la costura d'imatges de streetview, la detecció d'intrusions en vídeos de vigilància a Israel (que te la famosa ‘capsula de ferro’), el monitoratge d'equipaments de mines a la Xina, l'ajuda als robots per navegar i recollir objectes a Willow Garage, la detecció d'accidents de ofegament en piscines a Europa, la realització d'art interactiu a Espanya i Nova York, la inspecció de pistes d'aterratge per detectar residus a Turquia, la inspecció d'etiquetes en productes a fàbriques de tot el món i la detecció ràpida de cares al Japó. Té interfícies en C++, Python, Java i MATLAB i suporta Windows, Linux, Android i Mac OS. OpenCV s'inclina majoritàriament cap a aplicacions de visió en temps real. Hi ha més de 500 algorismes i aproximadament 10 vegades més funcions que componen o donen suport a aquests algorismes. OpenCV està escrit nativament en C++ i té una interfície amb plantilles que funciona perfectament amb els contenidors STL. 24 Finalment, l’últim problema que vaig tenir és que els motors servo eren força inestables, de tant en tant deixaven de funcionar, això era culpa dels drivers dels motors de la PCB Pimoroni. Per resoldre aquest problema vaig decidir que la millor opció era no usar la placa de control del servo motors de pan i tilt. Per fer-ho cal connectar els pins dels servo motors directament al port GPIO de la Raspberry Pi, tenint en compte que un d’ells és controlat per amplada de pols (PWM). Usant cables femella-femella vaig connectar directament els servos directament a la Raspberry. A part de solucionar el comportament erràtic per culpa de la placa, vaig poder eliminar els cables anteriors que havia connectat, i nomes utilitzava els pins dels motors, es a dir, a partir d’ara treballaré amb els polsos dels motors servo. Ho podem veure a la següent fotografia: Figura 26. Connexions finals Amb això podem veure que ara mateix, la única utilitat que te la PCB es de subjectar el mòdul de la càmera amb els seus dos motors integrats. El fet d’usar la connexió directa dels servos al pins GPIO de la Rapberry és el mecanisme de control integrat per defecte del pins PWM. Quan s’activa un pin controlat per amplada de pols, s’envia el senyal, el dispositiu actua i es torna la senyal del pin PWM no queda estabilitzada i no és constant. En el meu cas, actuar vol dir que el servo es mou a la posició indicada per l’amplada del pols. Però el problema és que un cop el motor s’ha mogut la senyal del PWM s’activa i desactiva contínuament i fa que el motor tingui una vibració. Per resoldre cal instal·lar un software que fa que la senyal del PWM sigui constant durant tota l’estona en que el pin està actiu. Una altra avantatge d’usar aquest mètode és que el motor queda bloquejat i no es mou si hi ha alguna força externa aplicada. Per altra banda caldrà tenir en compte desactivar aquest funcionament dels pins PWN per tal que els motors quedin lliures quan no s’usin. Per tal d’activar aquest comportament, a més d’introduir el codi necessari en l’algorisme, cal iniciar un procés en la Raspberry cada cop que es fa un login. Aquesta activació es fa amb la comanda ‘sudo pigpiod’. 25 4 Mètodes de detecció i seguiment En aquest apartat m’enfocaré en explicar els components tècnics que han estat presents durant el disseny i el desenvolupament del projecte. L’objectiu principal es que la càmera amb els motors sigui capaç de seguir la terra independentment de les situacions externes que hi puguin haver. Per arribar a aquest objectiu he hagut de separar el treball en diferents parts del software. Software: - Possibles solucions al seguiment de la Terra. - Detecció - Seguiment Donada la falta de contingut específic durant la titulació referents a l’adquisició d’imatges, extracció de característiques i retroacció, el camí per trobar la solució final ha estat bastant difícil i amb molt desafiaments, això es causa de que es el primer cop que m’enfronto amb un problema d’aquestes característiques. Jo, personalment, mai havia fet cap projecte relacionat amb la intel·ligència artificial i la visió per computador, mes o menys he hagut de començar de 0 i això ha fet que sigui mes difícil per mil, però també ha sigut mes enriquidor i podríem dir que divertit. El problema més significatiu ha sigut entendre el funcionament de la lògica que es fa servir per llegir imatges i saber com son processades, bàsicament, entendre com funciona el programari de OpenCV. En els següents apartats explicaré detalladament cada part del treball, la seva metodologia i els seus desafiaments. Aquests punts cobreixen les capacitats del hardware, les possibles solucions del problema que inclou la detecció i el seguiment de la Terra, l’avaluació de les diferents propostes de solució i la tria final del sistema. 4.1 Possibles solucions al seguiment de la Terra Aquest és un problema que es coneix com a seguiment d’objectes o tracking en anglès. Inclou dos punts fonamentals per tancar el cercle: primer la detecció i localització de punt d’interès de l’escena, i segon el seguiment de l’objecte, aplicant el moviment adequat als servos per a que el punt d’interès es localitzi al centre de l’escena que captura la càmera. El seguiment d'objectes amb OpenCV té moltes aplicacions en la vida quotidiana i la indústria: - Seguretat i Vigilància: Per seguir persones o vehicles en càmeres de seguretat. - Esports: Per analitzar el moviment dels jugadors o la pilota durant un partit. - Automòbils Autònoms: Per detectar i seguir vianants o altres vehicles. - Producció Cinematogràfica: Per seguiments automàtics de càmera. En resum, el seguiment d'objectes amb OpenCV consisteix a identificar un objecte, analitzar les seves característiques, i utilitzar aquesta informació per seguir el seu moviment en una sèrie d'imatges o un vídeo. Tot i que la tecnologia i els algorismes poden ser complexos, el concepte general és bastant senzill: reconèixer i seguir un objecte en moviment. 26 Qualsevol procés de detecció retornarà la posició en format (x,y) indicant en quin píxel de la imatge es troba el centre del criteri que s’usi per a determinar el possible moviment de l’escena o del satèl·lit. A més retornarà les dimensions de la zona detectada. Per tant el procés de seguiment serà independent del procés de detecció i per tant he treballat els dos separadament. Després de saber les limitacions del nostre hardware, he fet una recerca exhaustiva per veure quines son les possibles solucions a la detecció. He vist que les possibles solucions son les següents: seguiment de cares, seguiment per moviment, seguiment per forma, seguiment per colors. Tot seguit explicaré els diferents sistemes de detecció i posteriorment l’algorisme de seguiment que he usat. 4.2 Detecció En la cerca del tema de tracking el sistema més usat per tal d’explicar com funciona és el seguiment de cares. Es captura imatges i usant un algorisme anomenat Viola&Jones [21] basant en filtres en blanc i negre es detecta la possible ubicació de les cares i mida d’aquestes en la imatge. Vaig provar aquest algorisme al principi per poder treballar sobre els servomotors i comprovar que el moviment era el correcte. Un cop vaig tenir el codi correcte de control de moviment vaig eliminar l’algorisme de detecció de cares. Això ho vaig fer per considerar que era una situació que no es pot aplicar al problema que tracto de solucionar i per tant havia de buscar maneres alternatives a localitzar el que era d’interès en l’escena que en el meu cas és un objecte rodo i principalment blau. Vaig trobar tres alternatives que no usaven cares. La primera centrar el punt d’interès en allò que es mogués en l’escena, la segona centrar el punt d’interès en allò que tingues forma rodona i la tercera centrar el punt d’interès en allò que tingues colors blaus. 4.2.1 Detecció de moviment En aquest apartat explicaré pas per pas com es detecta el moviment en un conjunt de imatges. En la primera fotografia podem veure el mateix que veu la càmera, tot seguit converteix aquesta imatge en blanc i negre per poder treballar amb més eficàcia i perquè no hi haguí molt soroll en la imatge. Figura 27. Imatge en color / Imatge passada a blanc i negre 27 Per comprovar si hi ha moviment, agafem la imatge del frame següent i la passem a blanc i negre. Es el mateix que hem fet anteriorment però amb la següent imatge que la càmera ens mostra. Figura 28. Diferència de moviment Aquí podem veure que hi ha moviment entre les dues imatges, ens hem de fixar en la terra que es veu que hi ha parts blanques que son diferents a les altres, si es així, hi ha moviment. Finalment el que fa el sistema es restar les dues imatges i així obtenim una sola imatge que ens mostra on s’ha efectuat el moviment, això ho fa a la primera fotografia que veiem a continuació. Figura 29. Parts en moviment de la imatge En la segona fotografia el sistema ha aplicat un filtre passa baixes per poder treballar més fàcilment amb les imatges eliminant possible soroll. 28 Per acabar, en la tercera fotografia, el sistema converteix en 1 i 0 la imatge, els 1’s es el color blanc i els 0’s es el color negre. La part blanca és la zona de la imatge que es diferent entre les dues imatges i per tant correspon al moviment que hi ha hagut entre les dues imatges. Podem veure que hi ha dos parts blanques en la imatge, es a dir, dos parts de la fotografia que estan en moviment. El sistema agafa per defecte la part blanca que es més gran, i per tant, en aquest cas agafa la terra. El problema esta quan la part en moviment més gran no es la terra, en aquest cas el sistema perd de vista la terra i segueix un altre punt de la fotografia. Es de suposar que en el context de imatges de satèl·lit que suposem enfocaran a la terra, aquesta serà l’objecte més gran de la imatge. El retorn d’aquest algorisme serà el punt central d’aquesta àrea més gran corresponent a moviment i la seva mida en amplada i alçada. 4.2.2 Detecció per formes En aquest cas em centraré en la detecció de cercles per que és el que ens interessa detectar en la imatge. La detecció de cercles funciona de forma similar a la detecció de moviment al principi, convertint la imatge de color a gris per estalviar càlculs. Figura 30. Imatge en color / Imatge passada a blanc i negre Un cop te la imatge en gris, el sistema intenta mirar en tota la imatge quines son les posicions on es possible que hi hagin cercles, això ho fa un algorisme que ja estava prèviament creat des de el programari de OpenCV. Aquest algorisme és la transformada de Hough [22] adaptada a cercles. Inicialment va ser pensat per trobar línies en les imatges i posteriorment es va ampliar a trobar cercles. No entraré en detalls ja que es va usar com a caixa negra. La idea intuïtiva és que mira com si un conjunt de píxels de la imatge es possible que formin un cercle d’un determinat radi i posició. Si un determinat cercle (radi i posició) surt moltes vegades aquest serà la resposta. De forma similar al cas anterior la sortida de l’algorisme és el centre del cercle detectat i el radi del cercle. 29 4.2.3 Detecció per colors En aquest cas el que volem es trobar en la imatge quins píxels tenen un color que podria determinar la presencia de la Terra. Igual que en els casos anteriors, aquests píxels seran els que marcaran el punt d’interès per a fer el seguiment. Per tant he d’estudiar com es representa i es tracta el color en imatges. El color es representa amb el RGB [13] (Red, Green, Blue), és un espai de color que reprodueix els colors visibles per als humans mitjançant la barreja dels 3 colors primaris i que es va crear pensant en els dispositius que el creaven (les pantalles). Figura 31. Espai RGB [13] Per crear els colors de una imatge, es sumen els 3 colors del RGB i aquest creen altres colors, ho podem veure en la següent imatge. Figura 32. Segmentació de colors en una imatge [14] 30 El sistema treballa amb el espai de colors RGB, però com que va ser creat per treballar amb dispositius d’emissió de llum no és gens d’intuïtiu. Per tant en el moment de seleccionar quins son els colors que volem seguir, ho fa amb el espai de colors HSV [15] (Hue, Saturation, Value). Aquest espai té una dimensió corresponent al color (hue), una altra per la intesitat (value) i el terer per la puresa del color (saturation). Figura 33. Espai RGB i espai HSV [15] Fa servir l’espai de colors HSV perquè quan escollim el color, en l’espai RGB es canvien els 3 valors dels canals, per exemple, volem passar de un color vermellós, com el de la següent imatge, a un color més blavós. El rang que tenim ara en el RGB es de [206, 26, 25], i el rang de HSV es de [0.4, 88, 81]. Figura 34. Valors del color vermell [16] 31 Quan canviem de color els valors del rang de HSV i RGB canvien, però la diferencia clau esta en que en el espai de colors de RGB es canvien els 3 valors del rang, i en l’espai de colors de HSV nomes es canvia un valor del rang. Això ho podem veure en la següent imatge. Ara els valors del rang de RGB son de [25, 173, 206], veiem que els 3 valors del rang han canviat. Però en l’espai de colors HSV el rang que tenim ara es de [190.8, 88, 81], aquí nomes ha canviat un valor del rang (el hue corresponent al color) i per això es més fàcil treballar amb l’espai de colors HSV en el moment de la selecció de colors. Figura 35. Valors del color blau [16] Un cop sabem com funciona l’espai de colors HSV, el sistema per detectar el color el que fa es mostrar una imatge del vídeo com la següent. Figura 36. Imatge de la càmera en color Quan ens mostra aquesta imatge, l’usuari ha de escollir manualment quins colors vol que el sistema detecti, aquesta es la part que es fa servir l’espai de colors HSV. Figura 37. Tria del color a seguir Aquí veiem que els colors que s’han escollit es mostren en pantalla amb una tonalitat més blanca. 32 Un cop tenim es colors escollits, el sistema torna al espai de colors RGB i fa el seguiment dels colors amb l’espai de colors RGB. Per a fer aquest seguiment, donada una imatge posa a 1 tots els píxels que estan dins del rang de colors seleccionats en el pas anterior. I com en el cas de detecció de moviment tindran una imatge amb 1 i 0, on els 1s corresponent a píxels que tenen el color que volem. D’aquests píxels seleccionarem aquells que formin l’àrea més gran. Per tant, la sortida d’aquest algorisme serà el punt central d’aquesta àrea més gran corresponent a moviment i la seva mida en amplada i alçada. Cal concloure que tots aquests algorismes seleccionat la àrea més gran i per tant si hi ha més de una àrea que compleix els requisits de l’algorisme, no tenim la certesa que l’àrea que retorna no sigui la que ens interessa. En aquest problema, si suposem que la Terra esta envoltada de espai negre, això no hauria de suposar un problema perquè l’únic objecte important que ens trobarem serà la pròpia Terra. 4.3 Seguiment Un cop tenim el punt central on es troba la zona que ens interessa seguir, cal calcular quin és el moviment que caldrà aplicar als servo motors per tal que aquesta zona estigui centrada en la imatge. Aquest procés és independent del algorisme de detecció que s’apliqui. El seguiment d'objectes amb OpenCV és una tècnica utilitzada per identificar i seguir el moviment d'objectes específics dins d'un vídeo o una seqüència d'imatges. Tot i que la implementació tècnica pot ser complexa, la teoria darrere d'aquest procés es pot explicar de manera senzilla. Fases del seguiment 1. Identificació Inicial de l'Objecte i Extracció de Característiques: El primer pas és identificar l'objecte que volem seguir que ja hem explicat en el punt anterior. Això pot implicar seleccionar l'objecte manualment en la primera imatge o utilitzar un algorisme per detectar-lo automàticament com ara moviment, forma o color. En el meu cas les característiques que interessen per poder fer el seguiment és la posició del objecte d’interès i la mida si es vol mostrar gràficament la part de la imatge que s’usa per fer el seguiment. 2. Ajustament i Actualització de la posició: A mesura que el vídeo avança, OpenCV compara cada nova imatge amb la "foto" inicial de l'objecte. Busca l'objecte basant-se en les característiques que s'han enregistrat. Si l'objecte es mou, l'algorisme intentarà actualitzar la posició dels motors per tornar a centrar l’objecte. 33 El seguiment d'objectes no és perfecte, i les condicions poden canviar (com la il·luminació, l'angle de visió o altres objectes que es mouen al voltant). Per això, els algorismes de seguiment solen ajustar les característiques de l'objecte sobre la marxa, millorant la seva capacitat per seguir-lo correctament. Per fer aquest seguiment es parteix de la posició en que s’ha detectat el punt d’interès (𝑥, y) i del punt que marca el centre de la imatge (c𝑥, 𝑐y) per obtenir la diferencia entre els dos punts en píxels (∇𝑥, ∇y). Per cada píxel de diferencia que hi hagi entre l’objecte i el centre mouré el servo motor en el eix corresponent mitjançant la següent equació. (𝑝𝑎𝑛, 𝑡𝑖𝑙𝑡)= (7 ∗ ∇𝑥, 7 ∗ ∇y) on pan correspon al moviment horitzontal i tilt al moviment vertical. Figura 38. Moviment de seguiment 40 5.2 Seguiment per moviment Per aquesta solució he fet la mateixa prova que en el punt anterior, he fet veure que el meu sistema girava en orbita amb la Terra. Durant la creació dels vídeos, he vist que per aquesta solució el meu sistema havia d’estar tota l’estona en moviment però quan el sistema esta parat, aquest busca moviment per on sigui i deixa d’enfocar l’àrea d’interès que esta enfocant. Això fa que sigui bastant inestable. Com veurem en les fotografies de continuació, la mida de l’àrea d’interès sempre va variant bruscament, això es pel fet que he comentat anteriorment, que el sistema sempre esta buscant moviment i per tant una àrea d’interès diferent. Com es pot veure en les 3 imatges, no hi ha cap requadre blau que sigui semblant a l’anterior. Figura 50. Exemple àrea d'interès 1 Figura 51. Exemple àrea d'interès 2 41 Figura 52. Exemple àrea d'interès 3 Fotografia de l’entorn: Figura 53. Entorn del seguiment per moviment A continuació, deixo l’enllaç dels vídeos de la càmera i el vídeo de l’entorn de la càmera: Vídeos → https://drive.google.com/drive/folders/1bKqDePXkF2q1MPNkI6EkC6uILMpW9hj?hl=es-419 42 5.3 Seguiment per colors Per a la ultima solució he seguit el mateix sistema que les dues versions anteriors. Fer veure que la càmera esta en òrbita amb la Terra. Aquí primer de tot el sistema farà una fotografia de l’entorn, un cop esta feta, l’usuari ha de seleccionar manualment amb el ratolí quins colors vol seguir, ho podem veure en la següent fotografia: Figura 54. Tria del color a seguir Com es pot veure, la Terra surt de color blanc, això vol dir que hem seleccionat els colors de la Terra. Quan el sistema ha detectat els colors que l’usuari li ha dit que ha de seguir, es pot veure que l’àrea d’interès és la més precisa de tots els sistemes: Figura 55. Àrea d’interès del color 43 Per comprovar que aquesta solució funciona correctament, el que he fet és estressar la càmera i variar l’entorn, com podem veure en la imatge de a continuació, la càmera esta enfocant dos entorns diferents, el de la Terra i un entorn extern. Figura 56. Canvi d'entorn en el color Es pot veure perfectament que tot i estressar el sistema, aquest segueix enfocant la Terra correctament i mai perd de vista l’àrea d’interès que ens interessa. Però no tot son bones noticies, veiem que seguidament després d’aquest frame de vídeo, el sistema perd una mica de vista la Terra, no la perd del tot perquè esta enfocant una part de la Terra, però no tota. Figura 57. Quasi pèrdua de l'àrea d’interès 44 Però després d’aquest petit entrebanc, el sistema torna a la normalitat i funciona correctament. Figura 58. Retrobament de l'àrea d'interès Fotografia de l’entorn: Figura 59. Entorn del seguiment per color A continuació, deixo l’enllaç dels vídeos de la càmera i el vídeo de l’entorn de la càmera: Vídeos → https://drive.google.com/drive/folders/1BnhMpflCuBrqyP_jd1pf5KKThOu2cab?hl=es-419 45 5.4 Tria de la solució final Després de avaluar les 3 possibles solucions, ja podem veure quina és la solució més precisa i robusta: 1. Seguiment per moviment: El seguiment per moviment es el sistema que pitjor ha funcionat, això es perquè tota l’estona esta buscant moviment i si detecta qualsevol cosa que sigui diferent de la Terra en moviment, la seguirà. Imaginem que passa un cometa per davant de la càmera, aquesta perdrà de vista la Terra i seguirà el cometa, per tant ja no es un sistema vàlid. 2. Seguiment per formes: El seguiment per cercle hem vist que funciona bastant bé, tot i que quan hem estressat el sistema, aquest no ha treballat amb la precisió que estàvem buscant, fallava una mica. L’inconvenient que podríem trobar a la vida real es que la càmera enfocaria diferents parts de la Terra, diferents parts que siguin cercles, per tant, el sistema fallaria. 3. Seguiment per colors: Per acabar, la solució del seguiment per colors és la que ens ha donat més bons resultats. Quan hem estressat el sistema, aquesta ha actuat amb bastanta precisió i en cap moment ha perdut la Terra de vista. Si ens imaginem que el sistema esta a l’espai, aquest no pedreria la Terra de vista perquè hauríem seleccionat tots els colors de la Terra, i per tant, tota la Terra en el seu conjunt. Podríem dir que per ser un prototip, funciona bastant bé. Com que el sistema esta en la orbita LEO, que es una orbita que no es veu tota la Terra en el seu conjunt, es pot treure les següents hipòtesis: - El seguiment per moviment si que es compatible perquè es fixaria nomes si la Terra es mou i no en la seva totalitat. - El seguiment per formes no seria possible perquè no es podria veure tota la Terra en el seu conjunt i per tant no es podria crear el cercle. - El seguiment per colors si que serviria perquè des de l’espai la Terra més o menys te uns colors predeterminats que son el blau, el marro/verd i el blanc. Si nomes escollim aquets colors per fer el seguiment, el sistema hauria de funcionar correctament. Després de fer totes les avaluacions de cada possibles solució, he arribat a la conclusió de que la millor solució és la opció del seguiment per colors, és la que ha donat més bons resultats. 46 6 Pressupost 6.1 Pressupost del Hardware El pressupost del hardware utilitzat suposa un cost total de 127,45 €, en aquest s’inclou pa Raspberry pi 3 model b, la càmera B01, els motors servo 9g, el mòdul pan tilt hat de Pimoroni, la PCB de Pimoroni i la Font d’alimentació. Taula 1. Pressupost del Hardware Descripció Unitats Preu Total Raspberry Pi 3 model B 1 55,00 € 55,00 € Càmera B01 3 3,33 € 9,99 € Motors servo 9g 3 3,33 € 9,99 € Pan Tilt Hat mòdul de Pimoroni 1 18,83 € 18,83 € PCB Pan Tilt Hat de Pimoroni 1 24,86 € 24,86 € Font d'alimentació 1 8,78 € 8,78 € Total Pressupostat 127,45 € 6.2 Pressupost del Software La inversió per a la utilització dels diferents softwares és nul, ja que el Python3, el OpenCV, la llibreria de PantiltHat i el software de la Raspberry Pi 3 model B (Legacy 32 bit) son de cos nul. Taula 2. Pressupost del Software Descripció Unitats Preu Total Python3 1 0,00 € 0,00 € OpenCV 1 0,00 € 0,00 € Llibreria de PantiltHat 1 0,00 € 0,00 € Software de la Raspberry (Legacy 32 bits) 1 0,00 € 0,00 € Total Pressupostat 0,00 € 47 6.3 Pressupost mà de obra Per a calcular el cost de la mà d’obra per realitzar aquest projecte s’han fet tres hipòtesis de la inversió que suposaria la mà d’obra. Taula 3. Pressupost de la mà d'obra Mà d'obra Concepte €/hora Hores Preu [€] Pressupost mínim Remuneració mínima pràctiques UPC 6 250 1500 Pressupost màxim Remuneració estimada pràctiques UPC 8 250 2000 Pressupost enginyer Remuneració enginyer qualificat 60 125 7500 Per a les dues primeres hipòtesis s’ha calculat les hores i la remuneració d’aquestes suposant que el projecte ha estat realitzat per un enginyer en l’etapa de formació final del grau. S’han estimat unes 600 hores de duració del projecte tal com marca el pla docent dels estudis. Per una banda, s’ha fet una primera suposició establint el preu mínim per hora que figura als contractes de pràctiques de la UPC, és a dir 6€/hora. La segona proposta s’ha realitzat amb la remuneració de 8€/hora tal com recomanen els contractes de pràctiques de la UPC. En el cas que el projecte fos realitzat per a un enginyer ja qualificat, s’ha de tenir en compte que les hores per a completar-lo disminuirien un 50%, per altra banda el preu per hora establert s’augmentaria a 60€/hora. 6.4 Pressupost total El pressupost final suposaria una inversió inicial de 127,45€, segon el qual podem estimar una correcta viabilitat per a dur a terme el prototip, ja que no suposa un elevat cost en funció a la finalitat del producte i els seus beneficis. En aquest càlcul final no s’ha tingut en compte el cost de la mà d’obra, ja que com s’ha dit anteriorment, és una estimació del capital que s’hauria d’invertir. Taula 4. Pressupost total Concepte Preu [€] Hardware 127,45 € Software 0,00 € Total 127,45 € 48 7 Anàlisi i valoració de les implicacions ambientals i socials Aquest treball no te un gran impacte ambiental, de fet és bastant lleu. El que si que es podria considerar que es perjudicial es que el nano satèl·lit al cap de molts anys seria un residu espacial. La brossa espacial o ferralla espacial són objectes creats per l'home que estan actualment en òrbita al voltant de la terra però que no tenen cap tipus d'utilitat pràctica. La brossa espacial està formada per quasi qualsevol cosa, que pot anar des d'etapes senceres d'un coet o satèl·lits fora de servei, fins a fragments d'explosions, capes de pintura, residus provinents dels acceleradors sòlids, líquid refrigerant de satèl·lits amb generadors nuclears i altres petites partícules. Aquest problema es bastant nou en les nostres vides, això ha fet que els governs vulguin limitar i mitigar la quantitat de brossa espacial, però es un problema que encara seguim treballant en l’actualitat . 49 8 Conclusions i Treballs futurs Un cop realitzat el projecte, i havent analitzat les diferents característiques per a implementar un gimbal amb càmera per a un CubeSat, es pot concloure que s’han assolit els dos objectius principals del projecte, dissenyar el hardware de la playload que permet moure la càmera i escollir un mètode de seguiment de objectes per al moviment de la càmera amb la finalitat que enfoqui a la Terra. Amb la realització d’aquest projecte s’ha pogut concloure que la Raspberry Pi ha assolit la seva funció de una forma satisfactòria. Un altre aspecte ha sigut que els servo motors efectuaven un moviment força brusc i poc fi i finalment que el consum del sistema en general és bastant elevat, aproximadament 2,25 A. Tot i això, per tenir un pressupost de aproximadament 100€, el sistema ha donat un bon resultat. El millor sistema de seguiment es per colors, ja que quan el sistema ha sigut estressat en cap moment ha perdut l’objectiu de vista. El sistema de seguiment per moviment no ha acabat de funcionar bé perquè en tot moment esta buscant moviments i en conseqüència deixa de enfocar la àrea d’interès. Finalment el seguiment per cercles funciona correctament però quan ha sigut estressat no ha donat tants bons resultats com el seguiment per color. Aquest projecte comporta diferents treballs a fer en un futur, el prototip implementat serà la proposta per a que posteriorment es pugui fer un prototip final. S’hauria de dissenyar les plaques PCB per a un correcte funcionament i no com les plaques de la marca Pimoroni que s’han utilitzat. També s’hauria de millorar la capacitat de processament de imatges del sistema, sobretot amb una targeta gràfica en bones condicions. Un altre aspecte que s’ha de millorar es la capacitat de la càmera implementada i els motors servo, son dos elements que son de molt baix cost que s’han utilitzat per fer el prototip. Com s’ha comentat anteriorment, el sistema consumeix 2,25 A aproximadament, un altre aspecte a millorar seria crear un sistema que consumeixi menys per tal de que la seva vida útil sigui major. En la part del software es podria millorar la fluïdesa del moviment del gimbal, ja que a vegades fa moviments força bruscos, aquest punt estaria relacionat amb la millorar dels motors servo, faria falta un control de actitud més fi. Una proposta per a un prototip final seria fer la detecció i el seguiment de una posició determinada per una IMU (Unitat de Moviment Inercial) que permetrà trobar la posició i direcció del enfocament de la càmera. De forma que es podrà programar un canvi de graus en el temps (tenint en compte la posició de la Terra i la posició del satèl·lit) i per tant la càmera seguirà en tot moment la Terra. 56 class PiVideoStream: def __init__(self, resolution=(CAMERA_WIDTH_BIG, CAMERA_HEIGHT_BIG), framerate=CAMERA_FRAMERATE, rotation=0, hflip=False, vflip=False): # initialize the camera and stream self.camera = PiCamera() self.camera.resolution = resolution self.camera.rotation = rotation self.camera.framerate = framerate self.camera.hflip = hflip self.camera.vflip = vflip self.camera.start_recording('/home/pi/Desktop/video3.h264') self.rawCapture = PiRGBArray(self.camera, size=resolution) self.stream = self.camera.capture_continuous(self.rawCapture, format="bgr", use_video_port=True) # initialize the frame and the variable used to indicate # if the thread should be stopped self.frame = None self.stopped = False def start(self): # start the thread to read frames from the video stream t = Thread(target=self.update, args=()) t.daemon = True t.start() return self def update(self): # keep looping infinitely until the thread is stopped for f in self.stream: # grab the frame from the stream and clear the stream in # preparation for the next frame self.frame = f.array self.rawCapture.truncate(0) # if the thread indicator variable is set, stop the thread # and resource camera resources 57 if self.stopped: self.camera.stop_recording() self.stream.close() self.rawCapture.close() self.camera.close() return def read(self): # return the frame most recently read return cv2.resize( self.frame,( CAMERA_WIDTH, CAMERA_HEIGHT )), self.frame def stop(self): # indicate that the thread should be stopped self.stopped = True #------------------------------------------------------------------------------ class WebcamVideoStream: def __init__(self, CAM_SRC=WEBCAM_SRC, CAM_WIDTH=WEBCAM_WIDTH, CAM_HEIGHT=WEBCAM_HEIGHT): """ initialize the video camera stream and read the first frame from the stream """ self.stream = CAM_SRC self.stream = cv2.VideoCapture(CAM_SRC) self.stream.set(3, CAM_WIDTH) self.stream.set(4, CAM_HEIGHT) (self.grabbed, self.frame) = self.stream.read() # initialize the variable used to indicate if the thread should # be stopped self.stopped = False def start(self): """ start the thread to read frames from the video stream """ t = Thread(target=self.update, args=()) t.daemon = True t.start() 58 return self def update(self): """ keep looping infinitely until the thread is stopped """ while True: # if the thread indicator variable is set, stop the thread if self.stopped: return # otherwise, read the next frame from the stream (self.grabbed, self.frame) = self.stream.read() def read(self): """ return the frame most recently read """ img_frame = self.frame if (WEBCAM_HFLIP and WEBCAM_VFLIP): img_frame = cv2.flip(img_frame, -1) elif WEBCAM_HFLIP: img_frame = cv2.flip(img_frame, 1) elif WEBCAM_VFLIP: img_frame = cv2.flip(img_frame, 0) return img_frame def stop(self): """ indicate that the thread should be stopped """ self.stopped = True #----------------------------------------------------------------------------------------------- def show_FPS(start_time, fps_count): if verbose: if fps_count >= FRAME_COUNTER: duration = float(time.time() - start_time) FPS = float(fps_count / duration) print("show_FPS - Processing at %.2f fps last %i frames" %( FPS, fps_count)) fps_count = 0 start_time = time.time() else: fps_count += 1 59 return start_time, fps_count def visualize_fps(image, fps: int): if len(np.shape(image)) < 3: text_color = (255, 255, 255) # white else: text_color = (0, 255, 0) # green row_size = 20 # pixels left_margin = 24 # pixels font_size = 1 font_thickness = 1 # Draw the FPS counter fps_text = 'FPS = {:.1f}'.format(fps) text_location = (left_margin, row_size) cv2.putText(image, fps_text, text_location, cv2.FONT_HERSHEY_PLAIN, font_size, text_color, font_thickness) return image def init_camera(): if WEBCAM: vs = WebcamVideoStream().start() vs.CAM_SRC = WEBCAM_SRC vs.CAM_WIDTH = WEBCAM_WIDTH vs.CAM_HEIGHT = WEBCAM_HEIGHT print("Reading Stream from Web Camera Wait ....") time.sleep(5.0) # Let Webcam warm up Increase if getting errors else: vs = PiVideoStream().start() # Initialize video stream vs.camera.rotation = CAMERA_ROTATION vs.camera.hflip = CAMERA_HFLIP vs.camera.vflip = CAMERA_VFLIP print("Reading Stream from Pi Camera Wait ....") 60 time.sleep(2.0) # Let camera warm up return vs Algorisme dels servos: from gpiozero import AngularServo from time import sleep from gpiozero.pins.pigpio import PiGPIOFactory from config import pan_servo_delay, PAN_PIN, TILT_PIN, pan_start_x, pan_start_y global _pan,_tilt def init(): factory = PiGPIOFactory() global _pan, _tilt _pan = AngularServo(PAN_PIN, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000, pin_factory=factory) _tilt = AngularServo(TILT_PIN, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000, pin_factory=factory) pan(pan_start_x) tilt(pan_start_y) return _pan, _tilt def pan(angle=0): # check maximum server limits and change if exceeded # These can be less than the maximum permitted global _pan if angle>_pan.max_angle: angle = _pan.max_angle if angle<_pan._min_angle: angle = _pan.min_angle _pan.angle = angle sleep(pan_servo_delay) 61 return angle def tilt(angle=0): # check maximum server limits and change if exceeded # These can be less than the maximum permitted global _tilt if angle>_tilt.max_angle: angle = _tilt.max_angle if angle<_tilt._min_angle: angle = _tilt.min_angle _tilt.angle = angle sleep(pan_servo_delay) return angle def free(): global _pan,_tilt _pan.value = None _tilt.value = None def get(): global _pan,_tilt return _pan.angle, _tilt.angle def max_tilt(): global _tilt return _tilt.max_angle def min_tilt(): global _tilt return _tilt.min_angle def max_pan(): global _pan return _pan.max_angle 62 def min_pan(): global _pan return _pan.min_angle Algorisme del moviment: from config import * import cv2 #----------------------------------------------------------------------------------------------- def motion_detect(gray_img_1, gray_img_2): motion_found = False biggest_area = MIN_AREA # Process images to see if there is motion differenceimage = cv2.absdiff(gray_img_1, gray_img_2) differenceimage = cv2.blur(differenceimage, (BLUR_SIZE,BLUR_SIZE)) # Get threshold of difference image based on THRESHOLD_SENSITIVITY variable retval, thresholdimage = cv2.threshold(differenceimage, THRESHOLD_SENSITIVITY, 255, cv2.THRESH_BINARY) # Get all the contours found in the thresholdimage try: thresholdimage, contours, hierarchy = cv2.findContours( thresholdimage, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) except: contours, hierarchy = cv2.findContours( thresholdimage, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) if contours != (): # Check if Motion Found for c in contours: found_area = cv2.contourArea(c) # Get area of current contour if found_area > biggest_area: # Check if it has the biggest area biggest_area = found_area # If bigger then update biggest_area (mx, my, mw, mh) = cv2.boundingRect(c) # get motion contour data motion_found = True if motion_found: motion_center = (int(mx + mw/2), int(my + mh/2), mw, mh) if verbose: 63 print("motion-detect - Found Motion at px cx,cy (%i, %i) Area w%i x h%i = %i sq px" % (int(mx + mw/2), int(my + mh/2), mw, mh, biggest_area)) else: motion_center = () else: motion_center = () return motion_center Algorisme de les formes: import cv2 import numpy as np from config import * """ import matplotlib.pyplot as plt plt.ion() plt.imshow(can,cmap='gray');plt.axis('off');plt.show() plt.imshow(output);plt.axis('off');plt.show() """ def cer(frame, circles): output = frame.copy() circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: cv2.circle(output, (x, y), r, (255, 255, 255), 4) cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (255, 255, 255), -1) plt.imshow(output,cmap='gray');plt.axis('off');plt.show() def cercle_detect(frame): cercle = () # frame = cv2.blur(frame,(3,3)) #Convert the image to hsv space and find range of colors 64 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # detect circles in the image circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 100) # ensure at least some circles were found if circles is not None: # convert the (x, y) coordinates and radius of the circles to integers circles = np.round(circles[0, :]).astype("int") cercle = (circles[0][0], circles[0][1], circles[0][2]*2, circles[0][2]*2) return cercle Algorisme del color: import cv2 import numpy as np from config import * colors = [] def on_mouse_click(event, x, y, flags, frame): global colors if event == cv2.EVENT_LBUTTONUP: color_bgr = frame[y, x] color_rgb = color_bgr[::-1] color_hsv1 = rgb2hsv(color_rgb) color_hsv = color_hsv1*1.0 color_hsv[:-1] *= 0.95 colors.append(color_hsv) color_hsv = color_hsv1*1.0 color_hsv[:-1] *= 1.05 colors.append(color_hsv) print(colors) 65 def rgb2hsv(rgb): rgb = rgb/255.0 mx = rgb.max() mn = rgb.min() df = mx-mn if mx == mn: h = 0 elif mx == rgb[0]: h = (60 * ((rgb[1]-rgb[2])/df) + 360) % 360 elif mx == rgb[1]: h = (60 * ((rgb[2]-rgb[0])/df) + 120) % 360 elif mx == rgb[2]: h = (60 * ((rgb[0]-rgb[1])/df) + 240) % 360 if mx == 0: s = 0 else: s = df/mx v = mx h = int(h / 2) s = int(s * 255) v = int(v * 255) return np.array((h, s, v)) colors = [] def min_max_colors(colors): minh = min(c[0] for c in colors) mins = min(c[1] for c in colors) minv = min(c[2] for c in colors) maxh = max(c[0] for c in colors) maxs = max(c[1] for c in colors) maxv = max(c[2] for c in colors) hsv_min = np.array((minh, mins, minv))