Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tutor
Alberto Jardón Huete
Leganés, 2019
II
RESUMEN
La aplicación creada y desarrollada realiza el papel de ser la interfaz entre el robot
colaborativo y el usuario de esta misma. Permite seleccionar diferentes opciones a través
de las cuales interactúan el paciente y el robot.
Al ser un prototipo inicial de un software de aplicación posee únicamente tres opciones
de trabajo, las cuales son la evaluación, rehabilitación y la generación de un informe.
Como su propio nombre indica, en la opción de evaluación se realiza una monitorización
de los movimientos laterales y rotativos del brazo y hombro del paciente, todos estos
datos interceptados por el robot son almacenados para su posterior uso en futuras terapias
de rehabilitación. Se extraen los datos más significativos de los diferentes movimientos
del paciente y se genera una trayectoria acorde a la limitación de movilidad articular de
dicho paciente. Como última opción, es posible generar un informe con los datos más
importantes del paciente, a través de los cuales la aplicación puede acceder gracias a la
creación de hojas de datos generadas durante la monitorización de los movimientos del
paciente.
Tanto la creación de las hojas de datos como el fichero con los datos más elocuentes son
la fuente principal de información que permiten al fisioterapeuta realizar un correcto y
preciso seguimiento de cada paciente.
Palabras clave:
Automatización, Salud, Robótica,
III
IV
DEDICATORIA
Sería un gran honor poder gratificar todo este esfuerzo realizado en la elaboración de este
proyecto a mi familia, y en especial a mis padres, los cuales me ha apoyado día tras día
en la realización del trabajo y me ha alentado a dar lo mejor de mí cada día, sin su ánimo
no habría sido posible crear esta aplicación Matlab, por ello deseo dedicarles esta
publicación, y, no olvidar a aquellas personas tan cercanas a mí con las que convivo día
a día, en especial a mi pareja, la cual me ha escuchado y ayudado en cada momento y ha
sido uno de los pilares más importantes durante el proyecto. De la misma forma,
agradezco a todos aquellos profesores que me han acompañado durante el transcurso de
mi formación universitaria.
V
VI
ÍNDICE DE CONTENIDOS
1. INTRODUCCIÓN ................................................................................................... 1
Motivación del trabajo ....................................................................................... 1
Objetivos ............................................................................................................ 2
2. MATLAB ................................................................................................................. 5
2.1 Historia............................................................................................................... 5
2.2 Software ........................................................................................................... 12
2.3 Lenguaje........................................................................................................... 13
2.4 Aplicaciones ..................................................................................................... 16
2.4.2 Comunicaciones inalámbricas .................................................................. 18
2.4.3 Deep Learning .......................................................................................... 21
2.4.4 Visión artificial ......................................................................................... 22
2.4.5 Procesamiento de señales ......................................................................... 24
2.4.6 Robótica .................................................................................................... 25
3. MATLAB APP DESIGNER................................................................................. 27
3.1 Software ................................................................................................................ 27
3.2 Componentes ........................................................................................................ 28
3.2.1 Ejes ................................................................................................................. 28
3.2.2 Botón .............................................................................................................. 29
3.2.3 Lista desplegable ............................................................................................ 30
3.2.4 Editor de campo ............................................................................................. 32
3.2.5 Etiqueta........................................................................................................... 35
4. DISEÑO DE INTERFAZ ..................................................................................... 38
4.1. Ventana INICIO ............................................................................................... 38
4.1.1 Propiedades ............................................................................................... 41
4.1.2 Función Startup ........................................................................................ 41
4.1.3 Funciones Callback .................................................................................. 43
4.2. Ventana PACIENTE ........................................................................................ 44
4.2.1. Propiedades ............................................................................................... 45
4.2.2. Función Startup ........................................................................................ 46
4.2.3. Funciones Callback .................................................................................. 47
4.3. Ventana NUEVO ............................................................................................. 48
4.3.1. Propiedades ............................................................................................... 50
4.3.2. Función Startup ........................................................................................ 51
VII
4.3.3. Funciones Callback .................................................................................. 52
4.3.4. Otras funciones ......................................................................................... 55
4.4. Ventana EXISTENTE ...................................................................................... 57
4.4.1. Propiedades ............................................................................................... 59
4.4.2. Función Startup ........................................................................................ 59
4.4.3. Funciones Callback .................................................................................. 60
4.4.4 Otras funciones ............................................................................................... 63
4.5. Ventana PRINCIPAL ...................................................................................... 67
4.5.1. Propiedades ............................................................................................... 68
4.5.2. Función Startup ........................................................................................ 69
4.5.3 Funciones Callback ........................................................................................ 70
5. CONCLUSIONES ................................................................................................. 72
6. BIBLIOGRAFÍA ................................................................................................... 73
VIII
IX
ÍNDICE DE FIGURAS
X
Figura 3.6: Propiedad BackgroundColor de la Lista desplegable. ............................... 32
Figura 3.7: Propiedad FontColor de la Lista desplegable. ............................................ 32
Figura 3.8: Componente Editor de campo. ................................................................... 33
Figura 3.9: Uso de editores de campo para la búsqueda del paciente. .......................... 33
Figura 3.10: Uso de editores de campo para mostrar resultados de la búsqueda. ......... 33
Figura 3.11: Propiedad Label del componente Editor de campo. ................................ 34
Figura 3.12: Propiedad Alineación horizontal del componente Editor de campo. ....... 34
Figura 3.13: Ejemplo del componente Etiqueta ............................................................ 35
Figura 3.14: Componente Etiqueta ............................................................................... 35
Figura 3.15: Propiedad Text del componente Etiqueta. ................................................ 35
Figura 3.16: Propiedad VerticalAlignment del componente Etiqueta. ......................... 36
Figura 3.17: Propiedad FontSize del componente Etiqueta. ......................................... 36
Figura 3.18: Propiedad FontWeight del componente Etiqueta. .................................... 36
Figura 3.19: Propiedad BackgroundColor del componente Etiqueta............................ 36
Figura 4.1: Ventana INICIO.......................................................................................... 39
Figura 4.2: Componentes ventana INICIO. .................................................................. 40
Figura 4.3: Función generada automáticamente con ajustes en eje app.Roboespas. ... 40
Figura 4.4: Propiedades ventana INICIO. ..................................................................... 41
Figura 4.5: Función Startup de la ventana de INICIO. ................................................. 42
Figura 4.6: Función Callback del botón de Inicio en la ventana de INICIO................. 43
Figura 4.7: Función Callback al cerrar ventana INICIO. .............................................. 44
Figura 4.8: Ventana PACIENTES. ............................................................................... 44
Figura 4.9: Componentes ventana PACIENTE............................................................. 45
Figura 4.10: Propiedades ventana PACIENTE. ........................................................... 46
Figura 4.11: Código función Startup de la ventana PACIENTE. ................................ 46
Figura 4.12: Función Callback botón Nuevo paciente en ventana PACIENTE. ......... 47
Figura 4.13: Función Callback del botón Paciente existente en ventana PACIENTE. . 47
Figura 4.14: Ventana NUEVO. ..................................................................................... 48
Figura 4.15: Componentes ventana NUEVO. ............................................................... 49
Figura 4.16: Propiedades ventana NUEVO. ................................................................. 50
Figura 4.17: Función Startup de la ventana NUEVO.................................................... 51
Figura 4.18: Función Callback del componente NombreEditField. ............................. 52
Figura 4.19: Función Callback del componente SegundoapellidoEditField. ................ 53
XI
Figura 4.20: Función Callback del componente PrimerapellidoEditField. ................... 53
Figura 4.21: Función Callback del componente Ladoafectado. .................................... 53
Figura 4.22: Función Callback del componente Edad. ................................................. 53
Figura 4.23: Función Callback de GenerarcdigoButton. .............................................. 54
Figura 4.24: Función Callback del botón Terminar. ..................................................... 55
Figura 4.25: Primera parte de la función Rellenar_Lista. ............................................. 56
Figura 4.26: Segunda parte de la función Rellenar_Lista. ............................................ 57
Figura 4.27: Ventana EXISTENTE. ............................................................................. 58
Figura 4.28: Componentes ventana EXISTENTE. ....................................................... 59
Figura 4.29: Propiedades de la ventana EXISTENTE. ................................................. 59
Figura 4.30: Función Startup de la ventana EXISTENTE. ........................................... 60
Figura 4.31: Función Callback del componente NombreEditField. ............................. 61
Figura 4.32: Función Callback del componente Apellido1EditField............................ 61
Figura 4.33: Función Callback del componente Apellido2EditField. ........................... 61
Figura 4.34: Función Callback del componente EdadEditField. .................................. 61
Figura 4.35: Función Callback del botón Buscar. ......................................................... 62
Figura 4.36: Función Callback del componente SiguienteButton. ............................... 63
Figura 4.37: Función Buscar_Nombre. ......................................................................... 63
Figura 4.38: Función Buscar_Apellidos1. .................................................................... 64
Figura 4.39: Función Buscar_Apellidos2. ................................................................... 65
Figura 4.40: Función Buscar_Edad. .............................................................................. 66
Figura 4.41: Función Buscar_Codigo. .......................................................................... 67
Figura 4.42: Función Buscar_Lado. .............................................................................. 67
Figura 4.43: Componentes ventana PRINCIPAL. ........................................................ 68
Figura 4.44: Ventana PRINCIPAL. .............................................................................. 68
Figura 4.45: Propiedades ventana PRINCIPAL. ........................................................... 69
Figura 4.46: Función Startup de la ventana PRINCIAPAL. ......................................... 69
Figura 4.47: Función Callback del botón Evaluación. .................................................. 70
Figura 4.48: Función Callback del botón Rehabilitación. ............................................. 71
Figura 4.49: Función Callback del botón Generar informe. ......................................... 71
XII
XIII
ÍNDICE DE TABLAS
XIV
XV
1. INTRODUCCIÓN
En esta primera sección del trabajo se realizará una pequeña percepción de lo que es el
proyecto en sí, a lo que hay que añadir la motivación del trabajo, es decir, qué motivos
han sido los causantes de la elección de la creación de una aplicación como tema principal
de este Trabajo de Fin de Grado. A estos motivos hay que añadirles cuál o cuáles son los
objetivos principales del proyecto.
Año tras año, la tecnología incrementa su nivel de avance, y a día de hoy está tomando
una velocidad abismal. Realizó su gran despegue con la Revolución Industrial, y a partir
de ahí ha ido mejorando y se han producido grandes innovaciones. La tecnología ha
sufrido una extensa ramificación en diversas materias, de entre las cuales destaca la
tecnología informática, siendo el tema principal de este proyecto.
La tecnología informática se define como la parte de la tecnología encargada del estudio,
diseño, desarrollo, innovación, puesta en práctica, ayuda o gerencia de los sistemas
informáticos [1]. Con todo esto aparece el término de software, el cual define la RAE
como el conjunto de programas, instrucciones y reglas informáticas para ejecutar ciertas
tareas en un ordenador computadora [2].
Además de este concepto, cabe destacar el término de interfaz, el cual es la definición
principal de este trabajo. Se define interfaz como aquella conexión, física o lógica, entre
una computadora y el usuario, un dispositivo periférico o un enlace de comunicaciones
(definición extraída de la RAE [3]).
Tanto el concepto de interfaz como el de software, son una de las principales
características de lo que hoy en día se denomina Experiencia de Usuario (o User
Experience). Cuando se hace referencia a este término, se hace alusión al conjunto de
factores y elementos relativos a la interacción del usuario, con un entorno o dispositivo
concretos, cuyo resultado es la generación de una percepción positiva o negativa de dicho
servicio, producto o dispositivo [4]. Se tienen en cuenta tanto los factores relacionados
con el diseño, como a los aspectos involucrados con las emociones, sentimientos,
construcción y transmisión de la marca, etc. También, no se debe olvidar que, la
experiencia del usuario, además profundiza en la compresión de los usuarios, qué
necesitan, qué es lo que valoran, sus habilidades, y sus limitaciones [5].
La experiencia de usuario tuvo sus comienzos en sistemas informáticos y diseños de
páginas web, pero con el paso del tiempo, ha incrementado su alcance a diversos campos.
Uno de los objetivos principales de esta temática es crear una interfaz sencilla de
comprender para el usuario, ya que, por el contrario, si fuese algo más compleja,
emplearía más tiempo en descifrar las diferentes prestaciones que ofrece la aplicación,
haciendo que la misma se vea escasamente eficaz. Es decir, se busca hacer uso directo de
ella de una forma más sencilla y rápidamente comprensible.
1
Por tanto, la motivación en la realización de este trabajo es un breve resumen de todo lo
anterior. Se desea generar un interfaz, capaz de producir en el usuario experiencias
satisfactorias, fusionando los aspectos emocionales con los relativos al diseño. Además,
se busca eliminar esas barreras fronterizas entre el humano y la máquina [6]. A esto se le
debe añadir la búsqueda de una aplicación con diferentes prestaciones y que aporte una
alta usabilidad, es decir, la facilidad con que las personas pueden utilizar una herramienta
particular o cualquier otro objeto fabricado por humanos con el fin de alcanzar un objetivo
concreto. Todo esto se quiere utilizar para tratar de una manera diferente un trastorno
motor conocido como espasticidad, del que se hablará y profundizará en él más adelante.
Objetivos
2
Figura 1.1: Robot KUKA LBR IIWA.
Este modelo de robot KUKA es uno de los primeros robots colaborativos capaces de
realizar tareas que poseen una gran precisión y cuidado, contando con medidas de
seguridad que permiten la interacción entre el paciente, en este caso, y el entorno de
trabajo, existiendo una cantidad ínfima de daños [11]. La característica principal y más
importante que posee este robot es su capacidad de aprendizaje, es decir, el robot es capaz
de memorizar las coordenadas de diversos puntos en una trayectoria. Esta prestación es
de gran importancia ya que permitirá realizar una correcta evaluación de la limitación de
movilidad que padece el paciente, memorizando los puntos pertenecientes a la trayectoria
realizada por el mismo, y que servirá para poder determinar las trayectorias para futuras
terapias de rehabilitación del afectado.
Finalmente, definido el trastorno motor denominado como espasticidad, y explicadas
algunas de sus características y causas, sumado a la existencia del robot Kuka, con sus
características más importantes, se llega a la conclusión del objetivo principal de este
proyecto. El propósito primordial de este proyecto es generar la interfaz a través de la
cual el paciente realizará sus terapias de rehabilitación, siendo la misma manipulada por
el fisioterapeuta, por lo que tiene una fácil manipulación, haciendo que posea una gran
usabilidad. Sus tres funciones principales son la de evaluación, rehabilitación y
generación de informe.
En la parte de evaluación, el paciente debe mover el brazo robótico para que el mismo
pueda memorizar la trayectoria realizada la cual servirá para determinar el área de
limitación móvil que posee el paciente. A raíz de trayectoria y esos puntos obtenidos, será
posible generar nuevas trayectorias acordes a la movilidad del paciente, las cuales serán
empleadas en la opción de “Rehabilitación”. Cada movimiento y trayectoria que se
realicen serán monitorizadas en todo momento, permitiendo así obtener un conjunto de
3
valores, que podrán mostrarse en unas gráficas. Estos datos obtenidos se añaden a los
resultados, de los cuales es posible obtener un parte médico, para ello se encuentra creada
la opción de “Generar informe”.
4
2. MATLAB
2.1 Historia
Esta gran herramienta de cálculo nace en 1984, como primera versión, gracias a Cleve
Moler. Él creó este programa con el fin de evitar el uso del lenguaje Fortran, aunque
hacía uso de los paquetes de subrutinas de este lenguaje en los cursos de Análisis
Numérico y de Álgebra Lineal, evitando así cualquier programa que hiciera uso del
lenguaje Fortran. El lenguaje empleado por MATLAB se creó en 1970, permitiendo
acceder al lenguaje de matrices LINPACK y EISPACK, logrando así el objetivo con el
que fue creado, obviando el uso de Fortran [12].
Para indagar de manera más profunda en la historia de este potente software se hace
referencia a un artículo que escribió el creador del programa, Cleve Moler, por el
vigésimo aniversario del software:
“MATLAB es ahora un entorno informático técnico con todas las funciones, pero
comenzó como un simple "Laboratorio Matrix". Tres hombres, JH Wilkinson, George
Forsythe y John Todd, desempeñaron papeles importantes en los orígenes de
MATLAB. Nuestra cuenta comienza hace más de 50 años.
Figura
Figura 2.1: J. H. 2.1: J. H. Wilkinson
Wilkinson andACE,
and the Pilot the Pilot
1951,ACE, 1951,
National
National Physical Physical Laboratory,
Laboratory, Teddington,Teddington,
England England
England.
5
matriciales en la máquina y se convirtió en la principal autoridad mundial en álgebra
lineal numérica.
Fui a Caltech como estudiante de primer año en 1957 y dos años más tarde tomé
John Todd's Math 105, Numerical Analysis. Hicimos algunos de nuestros deberes con
calculadoras mecánicas, pero también utilizamos el Burroughs 205 Datatron, una de
las pocas docenas de computadoras en el sur de California en ese momento.
6
En 1961, era hora de graduarse. Todd me recomendó que fuera a Stanford y
trabajara con su amigo George Forsythe. En ese momento, Forsythe era profesor en
el departamento de matemáticas, pero estaba comenzando el proceso que crearía el
departamento de informática de Stanford, uno de los primeros del mundo, en 1965.
En 1962, después del curso de análisis numérico de Forsythe y una visita de Stankin
a Wilfordson, escribí un programa Fortran para resolver sistemas de ecuaciones
lineales simultáneas. Las barajas de tarjetas perforadas para el programa se
distribuyeron bastante ampliamente en ese momento, incluso a través de SHARE, el
Grupo de Usuarios de IBM.
7
Figura 2.5: Membrana en forma
de L.
8
Figura 2.7: Libro editado por
Wilkinson yReinsch.
Cada verano, durante 15 años, Wilkinson daba una clase en un curso corto en la
Universidad de Michigan y luego visitaba el Laboratorio Nacional de Argonne
durante una o dos semanas. Los investigadores de Argonne tradujeron el código
Algol para el cálculo del valor propio de la matriz del manual de Wilkinson y Reinsch
a Fortran para producir EISPACK. Esto fue seguido por LINPACK, un paquete de
programas Fortran para resolver ecuaciones lineales.
9
único tipo de datos era "matriz". El comando AYUDA enumeró todas las funciones
disponibles, con sus nombres abreviados.
Este primer Fortran MATLAB era portátil y podía compilarse para ejecutarse en
muchas de las computadoras que estaban disponibles a fines de los años setenta y
principios de los ochenta. Lo instalamos en los sistemas interactivos de tiempo
compartido que fueron alojados por computadoras centrales en universidades y
laboratorios nacionales.
La primera "computadora personal" que utilicé fue la Tektronix 4081, que Argonne
adquirió en 1978. La máquina era del tamaño de un escritorio y consistía en una
pantalla gráfica Tektronix conectada a una Interdata 7/32, la primera
minicomputadora de 32 bits. Solo había 64K, eso es 64 kilobytes de memoria.Pero
10
había un compilador Fortran y, por lo tanto, al usar la superposición de memoria,
pudimos ejecutar MATLAB.
11
Los tres fundamos The MathWorks en California en 1984. [13]”
Es de gran importancia destacar, que tanto la narración biográfica como las imágenes
extraídas han sido directamente copiadas de la página original, debido que, al tratarse de
datos biográficos personales, se debe de mantener la redacción original.
2.2 Software
12
El nombre de este programa viene de la abreviatura de MATrix LABoratory, ya que una
de sus principales utilidades es la que se encarga de realizar operaciones matriciales,
aparte de poder representar en gráficas diferentes conjuntos de datos y funciones, crear
algoritmos, crear y desarrollar diferentes interfaces (MATLAB App Designer), y hace
que sea posible la comunicación con otros programas, aunque posean un lenguaje
diferente.
2.3 Lenguaje
Cualquier aplicación que haya sido creada en MATLAB se desarrolla con un lenguaje de
programación propio. Además, este lenguaje es interpretado, es decir, es un lenguaje que
necesita un compilador para poder realizar su procesado, evitando la acción de leer y
traducir el código en su totalidad. Pero esto no sería posible sin un programa llamado
intérprete, el cual realiza la función de traducir cada orden o instrucción, que el humano
introduce, al código máquina, que son las instrucciones de la CPU del ordenador. Cada
instrucción es leída una a una conforme se ejecuta el programa y se descomponen en
instrucciones del sistema, incluso es capaz de automatizar tareas tales como las
declaraciones de variables, haciendo que sea mucho más ágil la programación de los
códigos [15].
Dejando a un lado los aspectos negativos que posee este tipo de lenguaje, hay que destacar
también sus ventajas, entre las cuales destacan la independencia existente entre la
máquina y el sistema operativo, ya que no posee órdenes propias del procesador, en su
lugar posee las llamadas a funciones, las cuales son reconocidas por el intérprete. Al
existir un intérprete en un sistema operativo, se garantiza que cualquier programa escrito
en ese lenguaje funcionará correctamente. Además, es posible realizar pequeñas
modificaciones en el código mientras que el mismo se está ejecutando, evitando así la
acción de tener que compilar de nuevo el código en su totalidad.
Una vez explicado el término de lenguaje interpretado, se debe añadir que este lenguaje
puede ejecutarse en archivos de script, los llamados archivos *.m, como en escenarios
interactivos. Gracias a este lenguaje, MATLAB perite realizar operaciones con vectores
y matrices, representación de datos y funciones, implementar logaritmos, realizar cálculos
13
lambda, crear interfaces de usuarios, realizar programación orienta a objetos (conocido
como POO), y finalmente, la comunicación con programas en otros lenguajes y con otros
dispositivos hardware [16].
Para finalizar con esta sección que hace referencia al lenguaje que se emplea en
MATLAB, se va a proceder a explicar brevemente algunas de las funciones que ofrecidas
por MATLAB que han sido las más empleadas en la realización de este proyecto.
• Delete (obj): De lo que se encara esta función es de eliminar el objeto que se encuentre
entre sus paréntesis. En este caso lo que se desea es eliminar la aplicación que en ese
mismo instante se está ejecutando [19].
• Xlswrite (filename, A): Sea A el nombre del archivo de la hoja de Excel, y filename
el nombre que recibe este archivo de Excel, al hacer uso de esta función se escribirá
esa matriz de datos A en el fichero Excel especificado con el nombre de filename [20].
• Xlsread (filename): Gracias a esta función es posible leer un archivo de Excel que
posee el nombre del valor que contenga la variable filename. Por una parte, generará
un conjunto de valores numéricos y por otra parte generará datos alfabéticos como
cadenas de caracteres y demás [21].
• For: Es utilizado para realizar bucles o loops un número de veces indicado por el
usuario. Seguido de la sentencia for es obligatoria añadir un índice, que se empleará
dentro del código, y unos valores, que indicarán el número de veces que se ejecutará
el bucle. Dentro del bucle se encuentran las sentencias o funciones que se desean
ejecutar en cada iteración [23].
14
• Char (A): Consiste en una matriz compuesta por caracteres, es decir, una secuencia
de caracteres. Su función es convertir el valor de A, que puede ser una matriz, un
vector o un número en concreto, en caracteres. Esta función sobre todo se ha usado
en la parte de en la que se genera un código aleatorio para cada paciente [24].
• Readtable (filename, Name, Value): Esta función es la encargada de crear una tabla a
partir del archivo con el que se denomina a filename, siendo el modo de lectura
columna a columna. Además, es capaz de importar unas opciones específicas que son
indicadas a través del valor de Name y Value [25].
• Transpose (A): Al hacer uso de esta función, lo que ocurre es que se transpone el
valor de A, ya sea una matriz o un vector. Esta función se ha usado principalmente a
la hora de leer y escribir datos en la tabla [27].
• Strcmp (s1, s2): Hacer uso de esta función permite comparar dos cadenas de
caracteres s1 y s2. El valor que devuelve es de tipo bool, es decir, puede ser un 1 o un
0. Esto es de gran utilidad a la hora de realizar la búsqueda de un paciente en el archivo
Excel [28].
• Find (X): Esta función se utiliza para buscar valores diferentes de 0 que existen en el
dato X, este dato puede ser tanto un vector como una matriz. El resultado al hacer uso
de esta función es un vector con las posiciones en las que los números pertenecientes
a X tienen un valor superior a 0. Si se trata de una matriz, su lectura se realizará
primero seleccionando una columna, y leyendo cada fila de esa columna,
obteniéndose así un vector lineal. Además, es posible que el dato X se trate de una
sentencia como >,<,=, que es como se ha empleado en el código para deducir en qué
posición se encuentra el paciente buscado [29].
15
uso de la sentencia elseif. La diferencia entre switch y if/elseif/else es que para que se
ejecute cada sentencia en switch solo se debe comprobar un único valor, al contrario
que al hacer uso de if/elseif/else, ya que esta función puede comprobar más de una
condición para cada valor. En el código se usa para poder llevar un recuento del
número de coincidencias entre el nombre, apellido o edad introducido del paciente y
los que se encuentran en el documento de Excel [31].
2.4 Aplicaciones
MATLAB es un programa que hoy en día se encuentra al alcance de todo el mundo, sobre
todo es usado por millones de ingenieros y científicos. Gracias a su gran profesionalidad
a la hora de desarrollar las toolboxes, son capaces de pasar pruebas muy rigurosas y todas
ellas se encuentran documentadas en su totalidad. MATLAB se puede aplicar a varios
campos de investigación, que se explicarán brevemente a continuación.
Gracias a esta aplicación, es posible analizar una gran cantidad de datos, crear diferentes
modelos de machine learning y predictivos, y poder implementar estos mismos en los
sistemas de la Tecnología Informática de las empresas.
Al mismo tiempo permite el acceso a los datos que se encuentran almacenados en
archivos planos, bases de datos, historiadores de datos y la nube, ofreciendo también la
opción de conectarse a fuentes en directo, como por ejemplo hardware de adquisición de
datos y datafeeds financieros. Además, estos datos se pueden administrar y gestionar en
función del tipo de dato que se trate y sus capacidades de procesamiento, para que estén
organizados a la hora de crear algún programa que hará uso de estos datos, los cuales
pueden ser representados mediante gráficos MATLAB y el entorno Live Editor [33].
16
También ofrece la opción de poder aplicar técnicas de ingeniería que poseen
características específicas de dominio que existen en los datos de sensores, texto, imagen,
vídeo, etc. Posee apps de machine learning y deep learning que permiten modelizar de
diferentes maneras los datos a analizar, estos modelos pueden ajustarse gracias a
algoritmos que seleccionan de manera automática las características de los datos que se
están estudiando. A parte de ajustarse automáticamente, estos modelos se pueden
implementar en sistemas de producción que hagan uso de la Tecnología Informática,
evitando así escribir el código en otro lenguaje, además, es capaz de convertir los modelos
a código C/C++.
Una de las ventajas del uso de MATLAB en el análisis de datos es la reducción del tiempo
a la hora de realizar el procesado de los datos, siendo estos desde datos de sensores, hasta
imágenes o texto, gracias al tipo de datos del que hace uso MATLAB. Algunas tareas,
como por ejemplo la sincronización de series temporales dispares, o la sustitución de
valores atípicos con otros interpolados, el filtrado de señales que poseen ruido, o la
separación de texto, se realizan de una manera mucho más sencilla gracias a sus funciones
de alto nivel. Como se ha mencionado antes, es posible representar los datos en gráficos,
lo cual permite la rápida visualización de los datos y así ayudar a comprender la tendencia
y detectar posibles problemas de calidad [33].
MATLAB también ofrece la oportunidad de trabajar con Machine Learning, ya que
brinda al usuario con apps para la clasificación y regresión, obteniendo así unos rápidos
resultados, esto es debido a la gran variedad de algoritmos que ofrece, ya sean tanto de
clasificación como de regresión. A parte, ofrece la posibilidad de comparar modelos y de
poder exportar modelos para realizar análisis más tarde. También ofrece la opción de
facilitar la escritura en código gracias a la optimización de hiperparámetros que se
encuentran en las funciones, buscando una manera más sencilla de encontrar los
parámetros más óptimos a la hora de realizar el ajuste del modelo [33].
17
Figura 2.15: Machine Learning en MATLAB.
18
reutilizables, para poder verificar iterativamente diseños o prototipos de este tipo de
comunicaciones. Una de las ventajas que también ofrece MATLAB es la generación
automática de código HDL o C, como se había mencionado en el apartado anterior,
acelerando así el proceso de implementación del código en otros lenguajes. También es
capaz de automatizar el análisis de datos y pruebas, y proceder a la posterior simulación
de los resultados [34].
Si se desea realizar diseños cuya base está sostenida por los estándares de capa física
3GPP y 802.11, MATLAB pone a disposición del usuario una serie de herramientas de
soporte completo, evitando la dependencia de simuladores ni entornos de prueba para los
modelos que se creen. Estas herramientas permiten crear modelos de referencia para su
posterior verificación de conformidad con modelos estándares, medir el rendimiento que
se encuentra en el nivel de enlace y personalizar estas herramientas [34].
19
Los modelos de hardware creados en Simulink pueden ser compartidos y utilizados por
los diferentes usuarios de MATLAB, los cuales son capaces de generar de manera
automática código HDL que garantiza ser legible y sintetizable para la implementación
de FPGA, SoC y ASIC. El rendimiento de sistemas LTE, así como la reducción del
tiempo de desarrollo se debe a las aplicaciones de referencia que posee, al igual que los
bloques IP de LTE que se encuentran optimizados para HDL [34].
20
2.4.3 Deep Learning
Una de las ventajas que ofrece MATLAB a la hora de trabajar en Deep Learning, es el
fácil acceso a modelos tan recientes como GoogLeNet, VGG-16, VGG-19 y AlexNet
entre otros. Permite acelerar algoritmos de los diferentes recursos de centros de datos
evitando la necesidad de una programación especializada. Por otro lado, a la hora de
trabajar con redes neuronales, es posible la creación, modificación y análisis de
arquitectura de las mismas, haciendo uso de herramientas de visualización y de apps
brindadas por MATLAB. Estas mismas apps aceleran el proceso de etiquetado de ground-
truth de imágenes, vídeos y audios, gracias a su capacidad de automatización [35].
Algunas de las apps específicas pertenecientes a los campos de datos de audio, vídeo e
imagen que ofrece MATLAB hacen que sea posible un rápido procesado de conjuntos de
21
datos, comprobando así problemas y su posterior solución antes del entrenamiento. Un
ejemplo de estas apps mencionadas es la app Deep Network Designer, la cual permite la
creación de arquitecturas de red complejas o modificar redes que hayan sido previamente
entrenadas para la transferencia de aprendizaje [35].
Una vez creados los modelos de Deep Learning, ya sea CUDA, código C, sistemas
empresariales o la nube, pueden ser implementados en cualquier lugar. Esto se debe a la
existencia de una excelente calidad de rendimiento, que posibilita la opción de hacer uso
de librerías optimizadas pertenecientes a Intel, NVIDIA y ARM [35].
Los datos obtenidos a partir de imágenes y demás archivos similares, pueden explorarse
de forma interactiva, generándose de forma automática el código en MATLAB, evitando
así partir desde cero en el código. Algunas de las apps más importantes que se ofrecen en
este campo son la segmentación de imágenes, la cual es capaz de segmentar una imagen
haciendo uso de gradiente, es decir, un algoritmo de contornos activos XYZ. Además de
esta app hay que destacar la calibración de cámaras, la cual se encarga de la estimación
de parámetros de distorsión del objetivo, tanto intrínsecos como extrínsecos de la cámara.
Y finalmente, no se puede olvidar la app encargada del etiquetado de imágenes y vídeos,
que permite, dentro de un conjunto de imágenes, etiquetar los datos de validación de
terreno, dando la opción de visualizar vídeos y secuencias de imágenes [36].
22
Figura 2.21: Ejemplo app de imagen en MATLAB.
23
hardware, el cual es directamente generado desde MATALB. Además, permite la
conexión a estos soportes hardware, ya sean cámaras de vídeo, cámaras GgE Visio, y
DCAM entre otros. Los datos que admite son los “estándar”, permitiendo así el acceso a
ellos a través de apps y funciones preintegradas. Una vez más, su alto rendimiento hace
posible la ejecución de flujos paralelos, ya sea haciendo uso de GPU NVIDIA o CPU
multinúcleo, evitando así los algoritmos de reprogramación, además de poder ejecutase
en la nube. Todos los algoritmos pueden ser ejecutados en hardware de PC, FPGA y
ASIC, y pudiendo trabajar en código C/C++ y HDL [36].
MATLAB facilita en gran medido la tarea de trabajar con datos de series temporales,
proporcionando así un flujo de trabajo unificado que será de gran utilidad en el desarrollo
de sistemas integrados y aplicaciones de transmisión. Es capaz de proporcionar señales
de diferentes fuentes para su posterior medición y análisis. Y como siempre, los
algoritmos desarrollados pueden estar orientados a la transmisión de audio, sensores
inteligentes e instrumentación [37].
Las señales que proceden de diferentes fuentes no solo pueden medirse y analizarse, si no
que se pueden transformar, filtrar y visualizar sin ser apenas un experto en la materia. En
las señales además se pueden medir las características de tiempo y frecuencia. También
se ofrecen aplicaciones para el análisis y aprendizaje automático [37].
24
Gracias a su flujo de trabajo y a DPS System Toolbox, permite verificar los diseños de
punto fijo en la simulación de forma previa a la implementación y, por último, posee
algoritmos capaces de implementar, generando código C optimizado para procesadores
ARM y código HDL para FPGA y ASIC [37].
2.4.6 Robótica
Esta sección es la más importante, ya que la interfaz diseñada está orientada a ser usada
con el robot colaborativo KUKA. Gracias a MATLAB es posible la conexión con el robot
y poder controlarlo con los algoritmos desarrollados por el usuario, algunos de estos
algoritmos pueden ser independientes del hardware y existe la opción de conectar con
ROS, abreviatura de Robot Operating System. Como en todos los apartados, MATLAB
facilita a gran nivel la reducción del tiempo de creación de código, ya que es capaz de
generar código automático en lenguaje C/C++, VHDLy CUDA entre otros, para poder
implementarlos en dispositivos como FPGAs, PLCs y GPUs. Además de poder conectar
con este tipo de hardware, también es posible hacerlo con uno de bajo coste como Arduino
y Raspberry Pi, con la ayuda de paquetes de soporte hardware previamente diseñados [38].
Es de gran utilidad para poder analizar tanto la mecánica como dinámica de cuerpos
rígidos como brazos manipuladores o plataformas de vehículos. Es capaz de trabajar con
archivos de formato CAD, es decir, el formato que reciben los archivos obtenido del
diseño de cuerpos por ordenador. A la hora de analizar estos cuerpos, existe la posibilidad
de personalizar los ajustes del análisis añadiendo restricciones como por ejemplo la
fricción, entre otros [38].
Es de gran interés, dentro de las conexiones con dispositivos hardware, la conexión con
el sensor LiDAR, que permite realizar mapas de entornos gracias a los datos que recibe a
través de la técnica de localización y mapeo simultáneo, también conocido como SLAM.
Con los datos obtenidos de la realización del mapeo, es posible crear algoritmos de
planificación de ruta y movimiento, pudiendo así navegar por escenarios o entornos que
25
se encuentran restringidos, además, puede hacer posible la creación de una ruta libre de
obstáculos [38].
Si, por el contrario, existen rutas con ciertos obstáculos, es posible capacitar al robot para
tomar decisiones a la hora de evitar el obstáculo en su camino gracias a los algoritmos
que diseñe el propio usuario. A parte de estos algoritmos, pueden implementarse
máquinas de estado, las cuales definirán las condiciones y acciones necesarias en la toma
de decisiones [38].
Cualquier sistema complejo que se desee analizar, se podrá realizar con la ayuda de apps
y algoritmos, además de visualizar y diseñar el comportamiento del mismo en los
dominios de tiempo y frecuencia. Los sistemas lineales y de control, pueden ajustarse de
manera automática haciendo uso del lugar geométrico de las raíces haciendo uso de
técnicas interactivas, aunque también es posible ajustar algunos controladores de
ganancia especificando algunos objetivos de ajuste como por ejemplo el seguimiento de
referencias, márgenes de estabilidad o anulación de perturbaciones [38].
26
3. MATLAB APP DESIGNER
3.1 Software
MATLAB App Designer se caracteriza por ser un programa que permite crear apps con
un carácter profesional, con la ventaja de que el usuario de este software no debe ser un
profesional en el campo de diseños de software. La creación de las aplicaciones se divide
en dos partes, por un lado, se encuentra el código, la cual es la parte más importante, ya
que es la que se encargará de ejecutar todas las sentencias y hacer que funcione la
aplicación. Por otro lado, se encuentra la parte visual, que, aunque no posea la misma
importancia que el código cumple un papel importante y es encargarse del aspecto visual.
Aquí el creador puede trabajar con total libertad, explorando los recursos que se ponen a
su disposición y creando aplicaciones visuales de todo tipo haciendo uso de la
imaginación. Esta libertad se debe a la carencia de limitaciones a la hora de crear el
aspecto visual de la aplicación, ya que, cuando se crea la aplicación, el creador tiene a su
disposición un lienzo sobre el que colocar todos los elementos que desee, desplazarlos
donde quiera y cambiar sus tamaños sólo arrastrando el ratón. Además, muchos
componentes se pueden personalizar de una manera sencilla y rápida, gracias a un editor
integrado que se encarga de crear el código correspondiente a estos ajustes de manera
automática [39].
Una gran ventaja al hacer uso de este software es la comprobación automática de errores
en la ejecución del código, ya que hace uso de Code Analyzer, el cual mostrará tanto
mensajes de advertencia como de error mientras se está escribiendo el propio código, para
así optimizar el tiempo de escritura del código, identificando errores muy básicos para
evitar gastar tiempo en localizarlos y corregirlos [39].
Otra de las ventajas que ofrece este programa es la gran variedad de componentes que
puede utilizar el creador, ya sean botones, listas desplegables, editores de campo, tanto
numéricos como alfabéticos, áreas de texto, etc. Todo ello brinda al usuario del software
con un gran abanico de combinaciones entre todos los componentes, de los cuales la gran
mayoría poseen las llamadas funciones Callback. Estas funciones se ejecutan cuando se
interactúa con alguno de los componentes que se encuentren en el área de diseño, y se
encargan de recopilar la información que el usuario introduce en ellas, la cual se empleará
en ocasiones futuras en la ejecución de otras funciones [39].
También hay que mencionar la posibilidad de compartir apps creadas con otros usuarios
de MATLAB. Esto se debe a que es posible empaquetar las apps creadas con este
27
programa y compartirlas mediante MATLAB Desktop y MATLAB Online, estas apps
empaquetadas poseen un único archivo para su instalación, permitiendo así al resto de
usuarios de MATLAB instalar y poder acceder a la aplicación de una forma rápida y
sencilla. A parte de crear este tipo de aplicaciones, permite crear aplicaciones web gracias
a las aplicaciones independientes que se generan al hacer uso de MATLAB Compiler,
permitiendo así empaquetar las mismas como apps web, donde poseerán una dirección
URL exclusiva que será el medio para dar a conocer las aplicaciones, evitando la
instalación de softwares [39].
3.2 Componentes
Este apartado está dedicado a los componentes más empleados en la creación del
proyecto, donde se describirán brevemente cada uno de ellos y se explicarán sus
propiedades más importantes y utilizadas. Existen una gran variedad de componentes,
desde los más comunes, hasta algunos específicos de aeroespacial, pasando por
componentes contenedores y de instrumentación.
3.2.1 Ejes
Los ejes se utilizan para controlar la apariencia y el comportamiento de los datos que
representan, ya sea un conjunto de números como una imagen, que es para lo que se ha
empleado en la elaboración del proyecto. En la Figura 3.1 se muestra cómo se visualiza
este componente en el software.
Los ejes son uno de los componentes que mayor número de propiedades posee, por lo que
sólo se destacarán las más utilizadas. En primer lugar, se encuentran las propiedades de
la configuración, las cuales se modifican si el usuario se encuentra en el lienzo del diseño.
Ahí, las propiedades que se pueden modificar son referidas a la parte más visual, como,
por ejemplo, el título del gráfico, el nombre de los ejes, el color de fondo, la fuente
empleada, su tamaño y estilo entre otros. Como en esta app los ejes se usan para mostrar
imágenes, los campos referidos al título o al nombre de los ejes debe estar vacío y el fondo
del mismo debe permanecer en blanco. Por otro lado, se encuentran las propiedades
referidas al inspector, que son las más numerosas y específicas en la personalización del
componente [40]. Las más empleadas han sido las siguientes:
28
• XColor: Es el color que se elige para la línea del eje, los valores de las marcas y las
etiquetas de dirección de x, aunque también puede afectar a las líneas de la cuadrícula.
Para seleccionar el color se puede hacer uso del triplete RGB, entre otros. El triplete
RGB es un vector en el que hay que indicar la intensidad de los colores rojo, verde y
azul, y deben ser valores que se encuentren en un rango entre 0 y 1 [40].
• YColor: Al igual que XColor es el color que se elige tanto para la línea de eje, valores
de marca y etiquetas, pero en este caso en la dirección y. De nuevo, el color se
selecciona con un triplete RGB y su funcionamiento es el mismo que el de XColor
[40].
• ZColor: Posee las mismas características, y realiza las mismas funciones que XColor
e YColor.
3.2.2 Botón
Son componentes que muestran una respuesta cuando el usuario interactúa con ellos, es
decir, cuando el usuario los presiona y suelta posteriormente [41]. Al modificar las
propiedades se confieren diferentes aspectos a la imagen del botón. A continuación, en la
Figura 3.2 se muestra este componente.
29
Durante el proyecto, este componente se ha utilizado principalmente para finalizar las
acciones de una ventana, por ejemplo, cuando se realiza la búsqueda completa de un
paciente existente; o para continuar realizando acciones en una misma ventana, por
ejemplo, a la hora de registrar un nuevo paciente y se desea generar el código de este. Las
propiedades utilizadas en este componente son pocas, pero se explican a continuación:
• Text: Es lo que se denomina como la etiqueta del botón, es decir, el valor que aparece
en el botón, ya sea un carácter, conjunto de caracteres o números. Si los datos se
representan como una matriz de celdas, el botón poseerá varias líneas de texto [41].
• FontWeight: Se encarga de remarcar el texto del botón o no, es decir, la fuente con
la que se haya escrito el texto se podrá poner en “negrita”. Normalmente, el valor de
esta propiedad suele ser normal, es decir, sin remarcar el texto, pero, por el contrario,
si se activa esta opción, su valor pasará a ser bold, que es cuando el texto aparece en
negrita [41].
• Position: Al igual que en el componente anterior, esta propiedad está compuesta por
un vector de cuatro valores. El primero de ellos se denomina left, e indica la distancia
entre la esquina interior izquierda del lienzo y la esquina exterior izquierda del botón.
El siguiente se llama bottom, y se encarga de representar la distancia entre los bordes
inferiores tanto internos como externos del lienzo y del botón respectivamente. A
continuación de este se encuentra el valor width, que es la medida del largo del botón,
es decir, del extremo izquierdo y derecho. Y por último se encuentra el valor de
height, el cual representa la altura del botón, medido desde su borde inferior hasta su
borde superior [41].
Este componente, también llamado Drop-Down, cumple como función principal otorgar
un buen aspecto visual y controlar el comportamiento de los elementos de la llista
desplegable [42]. En la Figura 3.3 se muestra este componente.
30
Figura 3.3: Componente Lista desplegable.
Este componente muestra diferentes opciones para un valor, donde el usuario debe señalar
el que desee. En el proyecto este componente se ha utilizado en la ventana encargada del
registro de un nuevo paciente, en la parte donde se tiene que marcar el lado del cerebro
que se encuentra afectado, dando como opciones Derecho e Izquierdo, como se muestra
en la Figura 3.4.
Las propiedades que posee este componente son varias, pero se van a destacar las más
importantes:
• Label: Esta propiedad hace referencia al nombre de la lista desplegable, puede tratarse
de un solo carácter o un conjunto de ellos, o un vector de números [42]. En este caso
en concreto, label posee el nombre de Lado afectado.
• Items: Con este término se hace referencia a los elementos que forman la lista
desplegable, siendo los mismos un conjunto de celdas de vectores compuestos por
caracteres, o un conjunto de cadenas de caracteres [42]. En la lista aparecerán tantos
componentes como opciones se muestren disponibles como posibles respuestas.
31
Figura 3.5: Value e Items de la Lista desplegable.
• BackgrounColor: Indica el color que se mostrará como fondo, el cual se puede definir
a través del triplete RGB, con un vector hexadecimal o, de la manera más sencilla,
que es seleccionando algunas de las opciones de color que se encuentran enumeradas
en la tabla [42]. Por defecto, el color que aparece es un gris claro, cuyo triplete RGB
es [0.96, 0.96, 0.96] como se muestra en la Figura 3.6.
Este componente se encarga de que el usuario pueda ingresar datos numéricos o texto
dentro de ellos, donde su aspecto visual está determinado por las propiedades que posee,
las cuales pueden ser modificadas como el usuario desee. En la Figura 3.8 se muestra
este componente, tanto el que permite ingresar datos numéricos como texto.
32
Figura 3.8: Componente Editor de
campo.
Durante el desarrollo del proyecto se ha hecho uso de este componente varias veces, tanto
en la ventana encargada del registro de un nuevo paciente como en la ventana encargada
de realizar la búsqueda de uno existente, introduciendo datos como el nombre, los dos
apellidos y la edad, y mostrando el código y lado afectado. Por un lado, en la Figura 3.9
se muestran los campos rellenados con los datos necesarios para realizar la búsqueda del
paciente, y, por otro lado, en la Figura 3.10 se muestran los datos resultantes de la
búsqueda.
33
• Label: Es una propiedad que pertenece a la configuración de este componente, y hace
referencia al nombre o etiqueta que recibe el campo de edición. En el proyecto esta
propiedad posee valores como Nombre, Primer apellido, Segundo apellido, Edad,
Código y Lado afectado, como se muestra en la Figura 3.11.
34
3.2.5 Etiqueta
Este componente se caracteriza por mostrar en la ventana texto estático, es decir, texto
que no se puede modificar y sirve de guía al usuario durante la ejecución de las ventanas
[44]. En el proyecto se ha utilizado para guiar al usuario durante la introducción de los
datos que eran necesarios ser ingresados. A continuación, en la Figura 3.13 se muestra
este componente, y en la Figura 3.14 se muestra como aparece en una de las ventanas.
Al igual que todos los componentes, su aspecto visual viene definido por las propiedades
que posee, como las que se indican a continuación.
35
Figura 3.16: Propiedad VerticalAlignment
del componente Etiqueta.
36
• Position: De nuevo aparece esta propiedad, que se ha mencionado en anteriores
apartados, por lo que para evitar redundancia se omitirá la repetición de este
contenido.
37
4. DISEÑO DE INTERFAZ
Por otro lado, si el paciente que desea realizar la terapia se encuentra ya registrado, se le
pedirá rellenar los campos correspondientes al nombre, apellidos y edad. Una vez
completados estos campos aparecerá su código personal y su lado afectado.
Una vez seleccionado el paciente a tratar, aparece el menú principal, donde se encuentran
las tres opciones que se pueden realizar, estas son: Evaluación, Rehabilitación y Generar
informe.
Esta ventana es la más sencilla del programa, consta solo de tres imágenes, que se
encuentran dispuestos en tres ejes diferentes, y de un botón de comienzo. Las imágenes
que se muestran en la ventana son los logotipos de organizaciones implicadas en el
desarrollo de la aplicación.
38
Por otro lado, en la esquina superior izquierda se encuentra el logo de Robotics Lab. Esta
asociación está formada por profesores, investigadores y alumnos pertenecientes a la
universidad Carlos III de Madrid. Allí realizan proyectos de investigación y desarrollo
relacionado con la robótica.
39
Figura 4.2: Componentes ventana INICIO.
40
CÓDIGO EXPLICACIÓN
app.Robospas = uiaxes (app.InicioW) Los ejes llamados Roboespas se
encuentran en la app llamada InicioW
app.Roboespas.XColor = [1 1 1] El color de los ejes de X viene dado por
el vector RGB (red, green, blue), con
valores entre 0 y 1.
App.Roboespas.XTick = [] Vector con las marcas de graduación
en un orden creciente.
App.Roboespas.YColor = [1 1 1] El color de los ejes de Y viene dado por
el vector RGB (red, green, blue), con
valores entre 0 y 1.
App.Roboespas.YTickLabel = ‘’ Marcación de etiquetas.
App.Roboespas.BackgroundColor = Define el color del fondo de los ejes,
[1 1 1] indicando el valor del vector triplete
RGB. En este caso se selecciona el
color blanco.
App.Roboespas.Position Vector en el que se encuentran las
coordenadas del eje respecto del
origen de la imagen de la app.
Tabla 4.1: Explicación código automático app.Roboespas
4.1.1 Propiedades
Cada vez que se genera una aplicación, con su respectivo código, ésta se define con una
clase, la cual posee sus propiedades y métodos. En esta app, sólo ha sido necesario crear
una propiedad, a la que se ha llamado PacienteApp, la cual hace referencia a la futura
ventana que se generará una vez pulsado el botón de Inicio, que es la ventana donde se
procederá a seleccionar el tipo de paciente, paciente nuevo o existente.
41
los avisos sobre objetos que se han transmitido como respuesta a algo que está
sucediendo.
Dentro de esta función se encuentran las sentencias que se desea que se ejecuten una vez
se realice la llamada a esta función. A continuación, en la Figura 4.5 se visualiza la
función startup de esta ventana con las sentencias correspondientes, y una breve
explicación en forma de comentario, de lo que está ocurriendo.
Como se observa en la línea 21, se produce la definición de la función, con las variables
de app y evento por defecto, lo cual ha sido explicado en el párrafo anterior. Las líneas
23 y 24 están dedicadas a una breve explicación de lo que se está realizando en esa
función.
La parte importante se sitúa en las líneas siguientes, donde se hace uso de las funciones
imread e imshow. El primer paso consiste en asignar cada imagen a una variable, en este
caso a la variable a se le asigna la imagen ROBOESPAS.jpg, a la variable uni se le asigna
la imagen UC3M.jpg y, finalmente, a la variable rl se le asigna la imagen RL.png. La
elección del nombre de las variables hace referencia, en parte, a la imagen que seleccionan
A continuación, las líneas 27, 30 y 30 del código hacen uso de la función imshow con la
finalidad de mostrar las imágenes en los ejes que se han indicado. Por ejemplo, en la línea
30 para mostrar la imagen UC3M.jpg en los ejes app.UC3M, es necesario escribir el
nombre de la función, es decir, imshow, y colocar entre sus paréntesis el nombre de la
variable que almacena la imagen, siendo en este caso la variable uni, seguido de la
sentencia ‘Parent’ que se encuentra separada por una coma, y volverlo a separar del
nombre de los ejes donde se desea mostrar la imagen con otra coma.
42
Una vez especificados en qué ejes se debe mostrar cada imagen, se finaliza la función
añadiendo la palabra end, que se genera automáticamente al añadir una función strartup.
De esta manera queda finalizada la explicación de este fragmento de código.
Y finalmente, como se abrirá una nueva ventana, se ha de cerrar la existente, para ello se
debe eliminar la aplicación que se está ejecutando en ese momento, en este caso es el
archivo INICIO.mlapp. Al escribir la sentencia de la línea 41 se produce la eliminación
de la app que se está ejecutando en ese momento.
43
Además de esa función, existe otra que se genera al cerrar la ventana de la aplicación. En
ella lo que se hace de nuevo es proceder a la eliminación de la aplicación, siendo esta
acción una forma de asegurar la completa eliminación de la aplicación que se está
ejecutando en ese momento. Este fragmento de código se visualiza en la Figura 4.7.
44
A continuación, en la Figura 4.8 se muestra una imagen de cómo es esta ventana de
selección. Las imágenes o logotipos que se visualizan en la ventana de opciones ya han
sido explicados en la sección 4.1, evitando así explicar de nuevo cada una de ellas. Al
igual que en la ventana de INICIO, cada imagen se encuentra ligada a un eje, a través del
cual podrá ser visualizada en la ventana. Por tanto, los componentes de esta ventana son
tres ejes, llamados igual que en la ventana de INICIO, es decir, app.Roboespas, app.RL
y app.UC3M, además de dos botones de selección llamados app.NuevopacienteButton y
app.SeleccionarpacienteButton. Estas propiedades se muestran a continuación en la
Figura 4.9.
4.2.1. Propiedades
Al igual que en la sección anterior, esta ventana, al ser definida como una clase, posee
sus métodos y propiedades, ya sean públicos o privados. En este caso, las propiedades
creadas y definidas por el usuario poseen un acceso público, mientras que las que se han
generado automáticamente poseen un acceso privado. Si bien, en la Figura 4.10, se
45
visualiza el código correspondiente a la creación de esas propiedades públicas, las cuales
son InicioApp, NuevoApp y ExistenteApp.
Cada vez que se ejecuta una ventana por primera vez es necesario que exista una función
Startup, sobre todos en los casos multiventana, como en este proyecto. La ventana que se
ejecuta proviene de otra que anteriormente se estaba ejecutando, y por ello es necesario
hacer referencia a esa app. Esto se va a explicar a continuación, con ayuda de la Figura
4.11, donde se muestra el código correspondiente a esta función de inicialización.
46
Como se ha explicado anteriormente, los parámetros que recibe esta función son la propia
app que se está ejecutando, y la app que ha mandado la ejecución de la misma, en este
caso hace referencia al archivo INICIO.mlapp, donde está orden se visualiza en la línea
40 de la Figura 4.6. A parte, al igual que en la sección 4.1, se dedican unas líneas de
código a la asignación de imágenes a unas determinadas variables, para después proceder
a mostrarlas en los ejes correspondientes.
Figura 4.13: Función Callback del botón Paciente existente en ventana PACIENTE.
En esta última imagen se aprecia el código que se ejecuta al pulsar el botón de Paciente
existente. En la línea 57 se produce la asignación a la propiedad app.ExistenteApp del
47
archivo correspondiente a la ventana de búsqueda del paciente existente, es decir, el
archivo EXISTENTE.mlapp. Y en la línea siguiente, la número 58 se produce la
eliminación de la aplicación que se está ejecutando, que es la misma que en el caso
anterior, la ventana de selección del tipo de paciente, es decir, la app correspondiente al
archivo PACIENTE.mlapp.
Esta ventana es la encargada de recopilar los datos del paciente nuevo que se desea
registrar. Estos datos son el nombre, primer y segundo apellido, la edad del paciente y el
lado del cerebro que se encuentra afectado. A continuación, en la Figura 4.14 se visualiza
la ventana que se genera al ejecutarse el archivo correspondiente a NUEVO.mlapp.
Esta ventana posee diferentes campos a rellenar con los datos pertenecientes al paciente.
Se debe introducir tanto el nombre, como los apellidos, la edad y el lado afectado del
paciente. Una vez ingresados estos datos, se habilita el botón correspondiente a Generar
código, el cual realiza la función de generar un código aleatorio para cada paciente. Este
código está compuesto por cuatro letras mayúsculas y un número perteneciente al rango
48
entre 0 y 9, en total el código está compuesto por 5 dígitos, se explicará más adelante en
la sección 4.3.4 En cuanto al apartado de Observaciones, es un campo voluntario a
rellenar. Por otro lado, se encuentran los componentes utilizados para la creación de esta
ventana, los cuales se pueden observar en la Figura 4.15, los cuales se encuentran
explicados en la Tabla 4.2.
COMPONENTE DESCRIPCIÓN
Ventana donde se mostrará el resto de
app.NUEVOUIFigure
elementos.
Campo en blanco para introducir el
app.NombreEditField
nombre del paciente.
Campo en blanco para introducir el
app.PrimerapellidoEditField
primer apellido del paciente.
Campo en blanco para introducir el
app.SegundoapellidoEditField
segundo apellido del paciente.
Campo donde aparece el código
app.Codigo
generado para cada paciente.
app.ComentariosTextArea Campo para introducir comentarios.
app.IntroduzcalossiguientesdatosLabel Etiqueta que contiene texto estático.
app.GenerarcdigoButton Botón para generar el código.
49
Campo en blanco para introducir la
app.Edad
edad del paciente.
app.Ladoafectado Lista desplegable para seleccionar una
opción
app.TerminarButton Botón para finalizar la ventana.
app.RL Ejes para visualizar la imagen de
Robotics Lab
app.Roboespas Ejes para mostrar la imagen del
logotipo de Roboespas.
app.UC3M Ejes para mostrar la imagen del
logotipo de la universidad.
Tabla 4.2: Descripción componentes ventana NUEVO.
4.3.1. Propiedades
Al tratarse de una clase, está compuesta por propiedades y métodos. Las propiedades se
visualizan en la Figura 4.16, y los métodos empleados en esta ventana se explicarán más
adelante en la sección 4.3.4.
50
PacienteApp. De igual forma, cuando se pulsa el botón Terminar, se hace con la intención
de abrir una nueva ventana, y para ello es necesario indicar qué ventana se abrirá e indicar
qué propiedad se encargará de ello, por eso, se declara en la línea 33 la propiedad de
PrincipalApp. A parte de estas propiedades, cada valor que es introducido por el usuario,
o valores de los que se quiere guardar su valor, es necesario guardarlos en diferentes
propiedades públicas, para que así todas las funciones puedan hacer uso de sus valores.
Esto se visualiza en las líneas de la 37 a la 42, donde se declaran las propiedades que
hacen referencia a los valores introducidos, como el nombre, los apellidos, la edad y el
lado afectado; o también para almacenar valores como por ejemplo el código generado
para cada paciente.
51
Lo que cambia en esta función respecto a las otras se puede apreciar en las líneas desde
la 138 hasta la 142. En primer lugar, se crea la variable header, la cual será el encabezado
del fichero de Excel, con los nombres de Nombre, Apellido 1, Apellido 2, Edad, Código
y L. Afectado. Después se crea el archivo de Excel, con el nombre que se haya elegido,
que en este caso es el de Lista_De_Pacientes.xlsx, y después es necesario añadirle el
vector con el conjunto de nombres que corresponden al encabezado, y de manera opcional
se introduce la página en la que se quieren guardar los datos. Todo esto corresponde la
línea 139 del código. De esta manera se crea un Excel vacío en el caso de que se esté
ejecutando por primera vez la aplicación y no existan datos de ningún paciente. Pero si,
por el contrario, ya existe un fichero Excel, al ejecutarse estas líneas de código lo único
que harán será sobrescribir la primera línea del archivo, es decir, la que corresponde al
encabezado, manteniendo intactos el resto de datos. Y finalmente, en la línea 142, se
desactiva el botón de Generar código con la intención de obligar al usuario a introducir
todos los datos antes de la generación del código.
52
Figura 4.20: Función Callback del componente PrimerapellidoEditField.
En esta función de la Figura 4.22 se aprecia que en la línea 228 del código se habilita la
opción de poder pulsar el botón Generar código, esto se debe a que la aplicación ya ha
recogido todos los datos necesarios para realizar el registro del nuevo paciente, y estos
datos, como se ha mencionado anteriormente, se encuentran almacenados en las
propiedades de la aplicación, descritas en la sección 4.3.1.
Una de las funciones más importantes es la que se muestra en la Figura 4.23, esta es la
encargada de generar el código para cada paciente una vez que ha sido pulsado el botón
de Generar código. Dentro de esta función Callback, se ejecutan una serie de sentencias
que podrían haberse agrupado en una función y hacer la llamada de la misma al ejecutar
53
la función Callback, además se hace llamada a la función Rellenar_Lista, la cual se
explica a continuación en la sección 4.3.4.
Estos valores se almacenarán posteriormente en un vector que será el código del paciente,
pero para ello es necesario antes declarar un vector vacío en el que almacenar estos
valores. Esta acción se observa en la línea 184 de la Figura 4.23 llamando a este vector
vacío con el nombre de code. Una vez creado el código vacío es necesario rellenarlo con
los valores correspondientes, para ello la manera más sencilla de realizarlo es haciendo
uso de un bucle for para recorrer todas las posiciones del vector code, asignando en las
54
cuatro primeras los valores del vector letras, y en la última posición el valor del vector
número. Como el vector de letras está compuesto por números es necesario convertir estos
números en letras haciendo uso del código ASCII, es por ello que se utiliza la función
char.
Como se ha mencionado anteriormente, una vez que se han introducido todos los datos
correspondientes al registro del nuevo paciente, y se ha generado su código personalizado,
es hora de pasar a la siguiente ventana, lo cual se realiza pulsando el botón Terminar.
Después, es necesario indicar que archivo se debe ejecutar, que en este caso es la ventana
que contiene el menú principal, y se ha llamado PRINCIPAL.mlapp, lo cual se refleja en
la línea 226. Y como siempre, cada vez que se abre una nueva ventana, es necesario que
se elimine la que se está ejecutando, lo cual está escrito en la línea 227.
En este apartado aparecen las funciones que han sido necesarias ser creadas para el
correcto funcionamiento de la aplicación, es decir, las funciones que no se han generado
de forma automática como las funciones Callback, si no que el autor de la aplicación ha
generado sus propios algoritmos contenidos en la función. El principal ejemplo que existe
en esta ventana es la función llamada Rellenar_Lista, la cual se muestra en la Figura 4.25
55
y Figura 4.26. Han sido necesarias dos imágenes debido a la extensión del código de las
mismas.
Cuando se ejecuta esta función, lo primero que se ha de realizar es la lectura del fichero
Excel y almacenar sus datos en variables, por un lado, en Y se almacenarán todos aquellos
datos de carácter alfabético, ya sean datos de tipo string o tipo char. Y en la variable X se
almacenan todos los valores numéricos que se encuentran en el fichero Excel, como es el
caso de las edades. Todo esto se visualiza en la línea 52. Por otro lado, en la línea 54, se
almacenan las dimensiones de la tabla de Excel adjudicando a la variable f el número de
filas, y a la variable c el número de columnas. Una vez guardados los datos leídos en
Excel, y conocidos el número de filas y de columnas, se realizarán dos bucles for, como
se muestra en las líneas 57 y 58, para así poder guardar los diferentes valores en los
vectores característicos de cada campo. El valor de cada columna se corresponde con cada
campo de los datos característicos, y el número de filas indica el número de pacientes,
excepto la primera línea que contiene el encabezado del archivo Excel. Por tanto, el valor
de las columnas varía entre 1 y 6. El orden de las variables es Nombre, Apellido1,
Apellido2, Edad, Código y L. Afetado, por lo que la forma de recorrer la matriz es
seleccionar una columna y almacenar todos los vectores, seleccionar una nueva columna,
y almacenar los valores en un vector nuevo, y así hasta completar la matriz, que es lo que
56
ocurre de la línea 57 a la 78. En especial hay que destacar las líneas de la 67 a la 70,
puesto que como se había mencionado antes, la variable X se encarga de almacenar los
datos numéricos, mientras que, Y almacena el resto, así que es necesario que el primer
valor del vector edades sea el título del encabezado, por eso se almacena como string, y
el resto de valores se corresponde con el listado de edades.
Una vez creados los vectores con los datos de los pacientes existentes es necesario añadir
los nuevos datos del paciente. Para ello se aumenta en una posición cada vector y se
almacena en esa última posición los parámetros que recibe la función, que es lo que ocurre
entre las líneas 81 y 86 como se muestra en la Figura 4.26.
Una vez definidos los vectores con los datos correspondientes es el momento de
sobrescribir los datos de la tabla de Excel, para ello es necesario transponer los vectores
para que se escriban en sentido vertical. Además, a cada vector le corresponde una
columna de la hoja Excel, es por ello que de las líneas 89 a 94 se le adjudica una letra
diferente a cada vector. Con estas últimas sentencias ya quedaría actualizada la hoja de
Excel.
Esta ventana es la encarga de buscar al paciente que coincide con los datos que está
ingresando el usuario, dentro del archivo Excel. Para ello es necesario ingresar el nombre
y los dos apellidos del paciente, a parte de su edad, y ya la aplicación se encarga de
57
facilitar otros datos como el código y el lado afectado. En la Figura 4.27, se muestra la
ventana que se ejecuta a la hora de seleccionar un paciente existente.
Como siempre, aparecen los logotipos más relevantes del proyecto, que son el de Robotics
Lab, Roboespas y el logotipo de la universidad. Para poder realizar una búsqueda correcta
se deben ingresar en el orden siguiente el nombre del paciente, seguido de sus apellidos
y por último su edad, de esta forma el botón de Buscar se desbloquea, permitiendo así
visualizar el código y lado afectado del paciente. Una vez mostrados todos los datos del
paciente se debe pulsar el botón Siguiente. A continuación, en la Figura 4.28 se muestra
el listado de los componentes empleados en la creación de la ventana.
Los componentes empleados son básicamente los mismos que en la sección 4.3, hay ejes
para poder mostrar las imágenes, campos de texto para introducir datos y para mostrarlos
y botones para así poder interactuar con la aplicación.
58
Figura 4.28: Componentes ventana EXISTENTE.
4.4.1. Propiedades
Como en todas las ventanas, debe existir una propiedad a la que se le asigne la app de
inicialización y otra encargada de que le sea asignada la próxima aplicación que se desea
ejecutar. Además, todos los datos que son ingresados por el usuario deben almacenarse
en variables que puedan ser utilizadas por todas las funciones, para ello lo mejor es utilizar
propiedades de acceso público como se muestra en la Figura 4.29.
59
Figura 4.30: Función Startup de la ventana EXISTENTE.
Las principales funciones Callback de esta sección se centran en los campos que son
rellenados por el usuario como por ejemplo lo es el nombre, los apellidos y la edad del
mismo, a parte de la interacción con otros elementos como los botones para avanzar a
otros pasos. Pero para una correcta búsqueda es necesario rellenar los campos por orden,
y de esta misma manera se van a explicar las funciones de llamada. En primer lugar, se
encuentran los campos que son necesarios rellenar por el usuario, y el primero de todos
ellos es el nombre, como se muestra en la Figura 4.31.
60
Figura 4.31: Función Callback del componente NombreEditField.
Como se observa en la línea 186 se produce la asignación del valor introducido por el
usuario a la propiedad denominada como Nombre, con la finalidad de que posea un acceso
público para que pueda ser usado por diferentes funciones. A parte, otra sentencia que
aparece en el código se encuentra en la línea 189, la cual es la encargada de inhabilitar el
botón Buscar, para así evitar llamar a la función Callback del mismo. Al igual que en la
sección 4.3.3 se mostrarán las tres funciones Callback que son bastante similares a la
Figura 4.31.
61
En la Figura 4.34, lo único que cambia con respecto el resto de sentencias es que en la
línea 237 se habilita el botón de Buscar, siempre y cuando antes se haya introducido el
valor de la edad. Una vez almacenados todos los datos necesarios para realizar la
búsqueda, es el momento de pulsar el botón Buscar, el cual posee una función Callback
en la que se hará llamada a otras funciones necesarias para realizar la búsqueda del
paciente. Por tanto, la siguiente función Callback se encuentra en la Figura 4.35.
Una vez pulsado el botón de Buscar se llama a las funciones encargadas de localizar la
posición del paciente en la tabla de Excel. En la línea 217, la función se encarga de
devolver un vector con todas las posiciones de los nombres que coinciden con el nombre
del paciente buscado. Lo mismo ocurre en las líneas 218, 219 y 220, siendo en esta última
línea donde el valor que se recibe es único, y no un vector de varios posibles pacientes,
todas estas funciones se encuentran explicadas más adelante en la sección 4.4.4.
A continuación, en la línea 223 se vuelve a inhabilitar el botón de Buscar, ya que solo es
necesario una búsqueda por paciente. El siguiente paso es obtener tanto el código como
el lado afectado del paciente, para ello se llama a las funciones Buscar_Codigo y
Buscar_Lado, y se les pasa el valor que corresponde a la posición que ocupa el paciente
en la lista de Excel para así identificar su código y lado afectado, pero como son funciones
definidas y desarrolladas por el creador de la interfaz se explicarán en la sección 4.4.4.
La última función Callback se encuentra en la Figura 4.36, la cual corresponde a la acción
de pulsar el botón de Siguiente. Esta función sólo se encarga de asignar a la propiedad
PrincipalApp el fichero que debe ejecutar, que es lo que se muestra en la línea 247, y
además se procede a la eliminación de la aplicación que se está ejecutando en ese
momento. Con estas últimas sentencias finalizan todas las funciones Callback de esta
sección.
62
Figura 4.36: Función Callback del componente SiguienteButton.
64
En primer lugar, ok_apellidos1 es un vector de la misma longitud que el vector que recibe
por parámetro llamado lista_nombres, y además estará compuesto de 0 y 1 como
resultado de la función strcmp. Los valores que se compararán serán el primer apellido
introducido por el usuario y los valores que se encuentran en la segunda columna de la
matriz Y, los cuales corresponden a los primeros apellidos, y la variable i se utiliza para
recorrer la matriz fila por fila. En vez de usar la función find, se irá comparando cada
valor del vector ok_apellidos1, y si algún valor es igual a 1 se incrementará el valor de
m, la cual decidirá el tamaño del vector Posiciones_Apellidos1 y se le asignará el valor
de la posición del o de los pacientes cuyos nombres y apellidos coinciden con los
introducidos por el usuario. El funcionamiento de la función Buscar_Apellidos2, la cual
se muestra en la Figura 4.39, es prácticamente igual que la función descrita
anteriormente, la única variación es que la búsqueda se realiza en la tercera columna de
la matriz Y, la cual corresponde a la lista de los segundos apellidos de los pacientes
registrados.
El último valor que hay que buscar es la edad, y como tal, el resultado que se debe obtener
tras su búsqueda debe ser único, puesto que los datos pertenecen a un solo paciente. A
continuación, en la Figura 4.40, se muestra la función encargada de buscar la edad. Como
todas las veces que se realiza una búsqueda, es necesario tener el conjunto de datos sobre
los que se desea realizar la búsqueda, para ello, como se muestra en la línea 114, se
procede a leer y almacenar los datos leídos en variables, en este caso, al tratarse de datos
numéricos la variable con la que se trabaja es la X. Además, los datos leídos se almacenan
como un vector vertical, y para trabajar con ellos deben encontrarse de manera horizontal,
por ello, en la línea 115 se hace uso de la función transpose.
Por otro lado, el valor que se pasa por referencia es la edad que ha introducido el usuario,
que, a pesar de tratarse de un número, el código lo recibe como un dato de tipo string, así
que, para poder buscar correctamente la edad es necesario cambiar el formato del dato,
que es lo que ocurre en la línea 116. Una vez se tenga la edad en el formato correcto, es
el momento de buscar al paciente. Lo primero es buscar, dentro del conjunto de pacientes
que son candidatos a ser el buscado, la edad deseada, para ello se recorre el vector que
65
contiene las posiciones de esos candidatos, que es lo que ocurre en la línea 120. Por otro
lado, durante la comparación, es necesario explicar la línea 122, donde al vector
lista_apellidos2 se le reduce su valor en una unidad, es decir, este vector contiene las
posiciones que ocupan los pacientes en la lista contando como primera posición el título
del encabezado. Pero el vector X cuenta como primer valor la edad del primer paciente,
sin tener en cuenta el título del encabezado, es por ello por lo que al vector
lista_apellidos2 se le reduce su valor en una unidad, con el fin de que coincidan las
posiciones del vector X y lista_apellidos2.
Cada vez que se produzca una coincidencia el valor de m aumentará en una unidad, pero
siempre alcanzará el valor de 1 y no más puesto que solo debe haber un resultado. Como
resultado de la búsqueda, en el vector Posición_Edad se almacena el lugar donde se
encuentra registrado el paciente, finalizando así la función encarada de buscar la edad.
Una vez localizado al paciente, se deben mostrar sus datos en la ventana, pero para ello
primero se deben conocer estos datos. Se tienen que localizar haciendo uso del valor
devuelto por la función anterior, como se muestra en la Figura 4.41. Lo primero es
almacenar los datos extraídos del Excel en una variable, que es lo que se muestra en la
línea 137. Y seguidamente se asigna a la variable Codigo el valor que se encuentra en la
columna 5, la cual corresponde a la lista de códigos, y la fila donde se encuentra el
paciente, que es el valor que se ha obtenido de la función Buscar_Edad.
66
Figura 4.41: Función Buscar_Codigo.
Para obtener el valor del lado afectado, se hace uso de la función que se encuentra en
Figura 4.42, la cual es igual a la encargada de buscar el código, la única variación que
existe es la columna donde realiza la búsqueda, que en este caso es la número 6, la que
corresponde al listado de lados afectados.
67
Figura 4.44: Ventana PRINCIPAL.
4.5.1. Propiedades
En esta ventana, las propiedades que se han creado sólo se encargan de que se les sea
asignadas los archivos correspondientes a las ventanas que se desean ejecutar y que
corresponden con la opción seleccionada. Como esta ventana se ejecuta tanto si se ha
introducido un nuevo paciente, como si se ha seleccionado uno existente, poseerá dos
68
aplicaciones de inicialización, cada una correspondiente con la ventana de la que
provienen, es decir, si el menú principal se abre después de introducir un nuevo paciente,
la propiedad NuevoApp recibirá esta aplicación como la de inicialización. Estas
propiedades se muestran en la Figura 4.45.
En el diseño de esta interfaz siempre habrá funciones Startup ya que en todas las ventanas
se muestran imágenes gracias a la ayuda del componente UIAxes. Esta ventana presenta
una gran sencillez, por lo que su función Startup no presenta una gran complejidad, como
se muestra en la Figura 4.46.
69
En primer lugar, cuando se crea la función le llegan dos parámetros, uno referido a la
aplicación que se está ejecutando, es decir, el archivo PRINCIPAL.mlapp será lo que se
llama como app, y por otro lado aparece el parámetro inicioapp, el cual corresponde al
fichero que ha mandado la ejecución de la ventana. Tanto el archivo NUEVO.mlapp como
el archivo EXISTENTE.mlapp, serán esas aplicaciones de inicialización como se indica
en las líneas 31 y 32. Por otro lado, igual que en el resto de funciones Startup, a las
variables denominadas como a, uni y rl se les asigna y almacena en las líneas 34, 37 y 40
las imágenes que se desean mostrar, para posteriormente mostrarlas en los ejes
correspondientes, es decir, el eje app.Roboespas para la variable a, el eje app.UC3M para
la variable uni y el eje app.RL para la variable rl. De esta manera queda finalizada la
función Startup.
Esta ventana es el menú principal de selección de opciones de las acciones que se desean
realizar, cuenta para ello con tres botones de selección donde cada uno de ellos posee una
función Callback que se ejecuta al pulsarse el botón correspondiente. Si por ejemplo se
pulsa el botón de Evaluación, la función Callback que se ejecutará es la que se muestra
en la Figura 4.47.
70
Figura 4.48: Función Callback del botón Rehabilitación.
71
5. CONCLUSIONES
Una vez finalizado el proyecto, y realizadas todas las pruebas necesarias, se llega a las
siguientes conclusiones. En primer lugar, y como se mencionó en el capítulo 2 y 3, el
hecho de haber utilizado MATLAB en este proyecto, y en concreto, haber usado
MATLAB App Designer, permite desarrollar el proyecto con una amplia variedad de
elementos y de ajustes y configuraciones que permiten crear un proyecto con un alto nivel
de personalización, dejando atrás resultados que posean un aspecto clásico y sencillo.
Dentro del entorno de MATLAB App Designer, cabe destacar que al comienzo de usar
este software, se encontraron numerosas dificultades, ya que se trataba de un software
totalmente desconocido y el periodo de habituación y comprensión del programa se alargó
mínimamente más de lo esperado, aunque gracias a diversos videos colgados en Internet
donde se explicaba detalladamente la ejecución de diferentes acciones para obtener
resultados como por ejemplo, la creación de ventanas múltiples, mostrar imágenes en
ejes, el funcionamiento de algunas de las propiedades de los componentes que ofrece este
software, etc.
Por otro lado, como se explicó en capítulos diferentes, la elaboración de la aplicación se
divide en dos partes. Primero se encuentra la parte encargada del diseño y aspecto visual
que poseerá la aplicación, donde se encuentran todos los componentes. Esta parte ha
resultado sencilla, puesto que la inserción de los componentes en el área de diseño era
muy sencilla, sólo había que arrastrar los componentes a la zona deseada y modificar su
diseño. Dentro del diseño, se podían modificar algunas propiedades, las cuales eran muy
sencillas y directas, no entraban en campos de difícil comprensión, es decir, se podían
modificar propiedades como el nombre, colores de fondo, tamaño de la letra, y demás.
En segundo lugar, se encuentra la parte encargada del código que se ejecutará durante la
aplicación. Esta parte no puede catalogarse como fácil ni difícil, ya que el lenguaje usado
durante la programación de las diferentes ventanas es lenguaje de MATLAB, del cual se
poseían conocimientos previos debido a haber cursado anteriores asignaturas donde se
hacía uso de este lenguaje, se conocían la mayoría de las funciones empleadas en el
proyecto y del resto de sentencias usadas. La parte más complicada fue el hecho de cómo
acceder a algunas de las propiedades que poseen los componentes, cómo son las
sentencias necesarias para ello, y qué significan algunas de las propiedades que aparecen
en cada componente. Además, como se ha mencionado anteriormente, ha sido necesario
consultar algunos video tutoriales sobre qué sentencias usar y cómo escribirlas para poder
modificar estas propiedades haciendo uso del código, así como visitar diversos algunos
blogs de usuarios para realizar breves consultas.
Finalmente, hay que hacer una mención especial a la finalización de la aplicación, la cual
podría haber sido más compleja y se hubiese completado hasta el final, indagando un
poco en el código de las ventanas responsables de la Evaluación, Rehabilitación y
Generación del informe. Esto se debe a la ausencia de unas funciones necesarias para
poder controlar al robot, las cuales no han podido ser incluidas debido a la falta del código,
el cual no era de mi responsabilidad, si no que era complementario.
72
6. BIBLIOGRAFÍA
[11] “LBR IIWA – El primer robot colaborativo y sensible con el Humano”. Autracen
http://www.autracen.com/lbr-iiwa/ (Acceso: 29 de agosto de 2019)
73
[13] “The Origins of MATLAB”. MathWorks
https://es.mathworks.com/company/newsletters/articles/the-origins-of-matlab.html
(Acceso: 30 de agosto de 2019)
[17]
https://es.mathworks.com/help/matlab/ref/imread.html?searchHighlight=imread&s_t
id=doc_srchtitle (Acceso: 30 de agosto de 2019)
[18]
https://es.mathworks.com/help/matlab/ref/imshow.html?searchHighlight=imshow&s
_tid=doc_srchtitle (Acceso: 30 de agosto de 2019)
[19]
https://es.mathworks.com/help/matlab/ref/delete.html?searchHighlight=delete&s_tid
=doc_srchtitle (Acceso: 30 de agosto de 2019)
[20]
https://es.mathworks.com/help/matlab/ref/xlswrite.html?searchHighlight=xlswrite&s_ti
d=doc_srchtitle (Acceso: 30 de agosto de 2019)
[21] https://es.mathworks.com/help/matlab/ref/xlsread.html?s_tid=doc_ta
(Acceso: 30 de agosto de 2019)
[22]
https://es.mathworks.com/help/matlab/ref/randi.html?searchHighlight=RANDI&s_ti
d=doc_srchtitle (Acceso: 30 de agosto de 2019)
[23]
https://es.mathworks.com/help/matlab/ref/for.html?searchHighlight=for&s_tid=doc
_srchtitle (Acceso: 30 de agosto de 2019)
[24]
https://es.mathworks.com/help/matlab/ref/char.html?searchHighlight=char&s_tid=d
oc_srchtitle (Acceso: 30 de agosto de 2019)
[25]
https://es.mathworks.com/help/matlab/ref/readtable.html?searchHighlight=readtable
&s_tid=doc_srchtitle (Acceso: 30 de agosto de 2019)
[26]
https://es.mathworks.com/help/matlab/ref/switch.html?searchHighlight=switch&s_ti
d=doc_srchtitle (Acceso: 30 de agosto de 2019)
74
[27]
https://es.mathworks.com/help/matlab/ref/transpose.html?searchHighlight=transpos
e&s_tid=doc_srchtitle (Acceso: 30 de agosto de 2019)
[29]
https://es.mathworks.com/help/matlab/ref/find.html?searchHighlight=find&s_tid=do
c_srchtitle (Acceso: 30 de agosto de 2019)
[30]
https://es.mathworks.com/help/matlab/ref/length.html?searchHighlight=length&s_ti
d=doc_srchtitle (Acceso: 30 de agosto de 2019)
[31]
https://es.mathworks.com/help/matlab/ref/if.html?searchHighlight=if&s_tid=doc_sr
chtitle (Acceso: 30 de agosto de 2019)
[32]
https://es.mathworks.com/help/matlab/ref/string.html?searchHighlight=string&s_tid
=doc_srchtitle (Acceso: 30 de agosto de 2019)
75
[43] https://es.mathworks.com/help/matlab/ref/matlab.ui.control.editfield-
properties.html (Acceso: 13 de septiembre de 2019)
[44] https://es.mathworks.com/help/matlab/ref/matlab.ui.control.label-properties.html
(Acceso: 13 de septiembre de 2019)
76