• No results found

4. BAYESIAN CORRECTION of MISCLASSIFICATION of PERTUSSIS in

4.5. Discussion 99

En este capítulo se describe la arquitectura, implementación de los componentes que integran el entorno de desarrollo y las interfaces de interoperabilidad que existe entre ellos. Todo el proyecto web está compuesto por una aplicación web, un conjunto de máquinas virtuales embebidas que se encargan de ejecutar las rutinas en cada robot, una interfaz de comunicación REST que permite la intercomunicación entre el IDE y los robots y una documentación de usuario que facilita el aprendizaje de los diferentes componentes que integran el ambiente.

El entorno de desarrollo o aplicación web a la cual los estudiantes se conectan a través de un navegador web, permite programar los dispositivos, realizar los procesos de modelado, programación y compilación de las rutinas. El despliegue a producción de esta aplicación se realiza de manera contenerizada en un cluster Kubernetes de un proveedor de computación en nube, lo cual permite una alta escalabilidad al proyecto y gran nivel de adaptación a las necesidades. De ser requerido, la imagen puede ser instalada en una máquina virtual local en caso de que la institución educativa no posea conexión a internet o la conexión presente características insuficientes para proveer calidad en el trabajo educativo.

El ambiente visual de desarrollo integrado web fue construido bajo un ambiente LAMP (Linux, Apache, Mysql, PHP) usando un marco de trabajo (framework) de diseño propio en una arquitectura por capas basado en el esquema modelo, vista, controlador (MVC) [43], lo cual facilita el reuso, mantenimiento y gestión del código fuente.

Para la generación del código compilado ejecutable, que contiene los códigos de operación de la máquina virtual correspondiente a las rutinas modeladas se hace uso de un preprocesador y compilador, los cuales se integran como librerías externas al marco

de desarrollo y que son incluidas al momento de realizar la compilación del modelo que construyó el estudiante. Dispositivo Embebido Internet Dispositivo Embebido A. 1 A. 2 Worker 1 Worker 2 Worker ...N Base de Datos Kubernetes Cluster Balanceador de Cargas

Ilustración 6 Esquema de comunicación entre los dispositivos y el servidor

Se construyeron en total tres máquinas virtuales para ser embebidas en cada uno de los dispositivos robóticos con sus respectivas interfaces de comunicación. En el caso de la tarjeta se desarrolóo una propia basada en un microcontrolador que emplea el software CCS C Compiler y se construye una interfaz de comunicación en Windows usando Python. Para el caso del Lego EV3 y Raspberry PI se construye la máquina virtual y la interfaz de comunicación usando el lenguaje de programación Python corriendo sobre el sistema operativo EV3DEV.

Finalmente, para la comunicación de los dispositivos robóticos se emplea una API REST a la aplicación web para la sincronización de las rutinas o programas. Esta comunicación se realiza dependiendo de la capacidad de conexión a internet del dispositivo robótico ya que puede ser directa a la API o mediada por una aplicación instalada en un computador de apoyo.

3.1.1 Comportamiento funcional de la aplicación web que cumple

el rol de entorno de desarrollo (IDE)

La interacción de los estudiantes con el entorno de desarrollo se realiza a través de un navegador web, donde se pueden realizar diversas tareas como: gestión de dispositivos robóticos, construcción de las rutinas de programación, compilación de las rutinas, envío de código ejecutable a los dispositivos robóticos y solicitud de ejecución remota de las rutinas. Estas tareas, deberán ser realizadas en su totalidad para el envío y ejecución de código remoto en el dispositivo robótico.

La primera etapa que debe cumplir un estudiante para acceder al entorno de desarrollo es la creación de un usuario personal a través del registro de usuario. Esto lo habilita como estudiante al interior de la aplicación y permite tener un sistema RBAC con los múltiples estudiantes que hagan parte la aplicación controlando el acceso y ofreciendo seguridad sobre los elementos construidos por el estudiante.

Posteriormente el estudiante deberá realizar la creación del dispositivo robótico en la plataforma, donde a cada robot se le asignará un código de identificaciónúnico y una clave para permitir las conexiones remotas desde el robot hacia la aplicación web. Esta configuración deberá ser incorporada manualmente a través de un archivo de configuración al interior del módulo de comunicación del robot con el objetivo de posibilitar la comunicación bi-direcciónal entre el entorno de desarrollo y el robot.

Una vez creado el dispositivo robótico en la plataforma, el estudiante puede realizar la programación del robot en el modelador gráfico incorporado en la herramienta (Ilustración 7 Flujo de programación de robot usando la plataforma)

Registro en la plataforma

Es

tu

d

ia

n

te

Configuración de el robot Creación del diagrama y codificación Procesamiento de Diagrama Envío de código hexadecimal ejecutable Iniciar

Ilustración 7 Flujo de programación de robot usando la plataforma

En el modelado de las rutina se hace uso de una notación acotada de BMPn [43] para representar el flujo de tareas a realizar por el dispositivo robótico. Las rutinas se componen por bloques funcionales (Actividades), carriles y estructuras de control (compuertas inclusivas, eventos de inicio y eventos de finalización) interconectadas por flechas direccionadas que representan el orden de ejecución de las tareas a realizar por el dispositivo robótico (Ejemplo Ilustración 8 Proceso modelado encendido y apagado de un Bombillo LED).

En el caso de requerirse ciclos en el modelo gráfico, deberá usarse las compuertas de tipo “dada una condición retornan a la tarea de inicio deseada”. El uso de BMPN frente a una notación propia del aplicativo, admite que estudiante se familiarice con una notación estándar que le permite el desarrollo del pensamiento procedural y sistemático, y le permite en un futuro abordar problemas relacionados con gestión de procesos en la industria.

Encender Led Esperar 10 Segundos Apagar Led Esperar 10 Segundos Contador > 10 Aumentar Contador No Si

R

o

b

o

t

Iniciar Terminar

Ilustración 8 Proceso modelado encendido y apagado de un Bombillo LED

Cada actividad cuenta con una serie ordenada de pasos, los que a su vez definen a través de un código fuente textual la tarea a realizar por el robot. Al dar clic sobre una actividad, se despliega en la pantalla un menú que permite agregar pasos precargados o que el usuario desarrolle con anterioridad. Crear un nuevo paso, o modificar el orden en que son ejecutados los pasos, permite el reúso del código entre las rutinas (Ilustración 9 Ejemplo de pasos de una actividad).

Crear nuevo paso Enviar a Artefacto Guardar Diagrama Cerrar Diagrama

Pasos de Actividad:

Esperar 10 Segundos

► Esperar 10 Segundos Borrar

Agregar otro paso

Agregar

Ilustración 9 Ejemplo de pasos de una actividad

Los pasos están constituidos por un código fuente textual escrito en un lenguaje de desarrollo propio con sintaxis basada en PHP que se caracteriza en que las palabras reservadas están en el idioma español. El lenguaje cuenta con estructuras de control básica (if-then-else, while, for), soporte a llamado de funciones definidas por el usuario,

soporte de llamado a funciones internas y definición de variables débilmente tipadas, es decir, que resuelven su tipo en tiempo de ejecución.

Tabla 12 Elementos constituyentes del modelador gráfico

Elemento Hijo Elemento Padre Descripción

Actividad --

Evento de Inicio -- Indica el punto de inicio de

la rutina

Evento de Finalización -- Indica el punto de

finalización de una rutina

Compuerta Exclusiva -- Sirve de condición para

tomar una decisión al interior del flujo

Carriles -- Representa los actores que

se incluyen en el diagrama

Pasos Actividad Segmento de código

textual que realiza una tarea específica

Una vez el estudiante culmina el proceso de modelado y configuración de pasos, puede realizar el envío de la rutina al artefacto robótico para lo cual se realiza al lado del servidor, el procesamiento y compilación de la rutina para su posterior envío al dispositivo robótico.

Finalmente, el estudiante cuenta con un tablero de comando que permite gestionar las rutinas que tiene el dispositivo robótico almacenado, ejecutar rutinas, volver a enviar el código fuente y realizar tareas de gestión básicas sobre el robot.

3.1.2 Arquitectura de la aplicación web del entorno de desarrollo

El diseño del ambiente de desarrollo se sustenta en una arquitectura de aplicación web de cuatro capas, a saber: capa de frontend encargada de la interacción con el estudiante; capa de backend que permite la gestión de los servicios web a través de APIs y la ejecución de las tareas; sistema objeto-relacional que sirve de enlace entre el backend y el almacenamiento de datos; y finalmente la capa de base de datos que cumple la tarea

de almacenar y permitir la posterior consulta de los mismos. El backend se construyó siguiendo un patrón Modelo Vista Controlador (MVC). [44]

Ilustración 10 Arquitectura del entorno de desarrollo y componentes que la componen Para el desarrollo de la aplicación se ha optado por la creación de un marco de trabajo (framework) ligero basado en un patrón por capas con arquitectura Modelo-Vista- Controlador y aplicando el principio de Convención sobre configuración (CoC), El desarrollo del marco de trabajo fue creado en el lenguaje de programación PHP y usando el sistema de gestión de base de datos MySQL.

El marco de trabajo está compuesto por los siguientes elementos:

 Modelos. Se encargan de la definición de la estructura y las propiedades de los objetos que contendrán los datos provenientes del ORM. Es decir, se encargan de la declaración de cómo se realizará el mapeo de los atributos al realizar el proceso de transformación del modelo relacional al modelo objetual. Todos los modelos heredan de la clase abstracta ParentModel, en donde se definen los atributos de definición de la clase y los métodos abstractos para la interacción con la base de datos.

 Vistas. Definen las interfaces gráficas de usuarios como listados y formularios. Las interfaces de usuario son renderizadas a través de la clase DefaultTemplate usando los archivos de la vista. Por convención se asumió que las vistas deberán estar contenidas en una carpeta con el mismo nombre que el controlador que la

despliegua y el nombre debe coincidir con la del método que ejecuta la acción al interior del controlador.

 Controladores. Definen las interacciones entre las vistas y los modelos, así como la manipulación y validación de datos. Todos los controladores heredan de la clase abstracta AppController, en donde se definen los métodos para enrutamiento de peticiones, renderizado automático de plantillas y reglas de control de acceso globales a la aplicación.

 ORM (Mapeo objeto relacional). Se encarga de las operaciones de creación, actualización, borrado y visualización de los datos de la base de datos relacional, mapeándolos a su respectiva representación objetual.

 Archivos de configuración y librería. Archivos que sirven de soporte a las funcionalidades y configuraciones del marco de trabajo.

En la Ilustración 11 Modelo entidad relación del aplicativo web puede evidenciarse la estructura de datos de la aplicación, la cual puede consultarse en detalle en el Anexo B: Diccionario de datos de la aplicación web del entorno de desarrollo.

Ilustración 11 Modelo entidad relación del aplicativo web.

3.2 Proceso de compilado

El proceso de transformar el diagrama en código de máquina virtual requiere un proceso intermedio de precompilado que convierta el archivo XML del modelo, la información de

los pasos y las condiciones almacenados en la base de datos a un archivo de código plano para su posterior compilación y conversión a código hexadecimal ejecutable.

3.2.1 Proceso de precompilado

El proceso de precompilado sigue las siguientes fases:

1. Obtención de la información del modelo desde la base de datos. Extraer de la base de datos el modelo en formato XML y convertirlo a formato de arreglo asociativo.

2. Extracción de las compuertas lógicas del archivo XML. Se extrae dos arreglos asociativos con la información de las compuertas lógicas y las actividades existentes en los archivos XML. Las claves de este array asociativo corresponden con el identificador único del elemento.

3. Recorrido del diagrama. Se recorre el diagrama en forma de grafo usando el algoritmo DFS (Depth First Search) o búsqueda en profundidad. El resultado de este recorrido determina el orden del código

4. Establecimiento de Relaciones. Se recorren todos los elementos extraídos del grafo y se hallan sus conexiones a través de los índices del array asociativo. 5. Obtiene las condiciones de las compuertas lógicas y los códigos de las

tareas. Se extrae de la base de datos la información de las condiciones de

evaluación de las compuertas lógicas y el código fuente de las actividades que se desarrollan a través del diagrama.

6. Generación de código. Con el resultado de los anteriores pasos se construye un archivo de texto de código fuente plano que servirá de intermediario entre el modelo original y el compilador. Se usan directivas enmarcadas con ## para definir los elementos del pre compilador.

Preprocesamiento XML2Array XML de diagrama Pasos Condiciones Base de datos DFS Conexión lógica de artefactos Integración de elementos Array2Texto

Ilustración 12 Esquema de preprocesamiento del modelo e integración de código

3.2.2 Proceso de Compilación

Para realizar la conversión del lenguaje de alto nivel a un lenguaje de bajo nivel se desarrolló un compilador de una sola pasada que traduce sentencias escritas en un lenguaje de programación con influencias de PHP, C y Basic a los códigos de operación de la máquina virtual.

El compilador se desarrolló en el lenguaje de programación PHP y se compone de los siguientes elementos:

1. Definiciones. Tabla de definición de constantes, en los cuales a un código de

ejecución se le asigna un código numérico correspondiente a la tarea a realizar por la máquina virtual.

2. Analizador Léxico. Recibe el código fuente a través de una variable y

produce una salida compuesta por tokens, que caracterizan las palabras para el procesamiento realizado por el analizador sintáctico.

3. Analizador Sintáctico. Comprueba la sintaxis de la salida del analizador

léxico. Definiendo la estructura del código y poblando el segmento de código del compilador.

4. Tabla de símbolos. Almacena la tabla de variables y funciones su respectivo

A continuación, usando la notación BNF [45] se listan los elementos y reglas que conforman el análisis sintáctico del lenguaje.

3.2.3 Expresiones

Una expresión representa un valor numérico a través de una variable, una lista de expresiones, el llamado de una función o un número.

expresion_prima ::= [numero | variable | ( expresion ) | funcion]

3.2.4 Operadores Aritméticos

Los operadores aritméticos toman uno o varios operandos y devuelven un solo valor numérico. Los operadores matemáticos implementados son suma, resta, multiplicación y división. La multiplicación y la división tienen mayor orden de procedencia por lo cual deben ejecutarse antes de realizar las sumas y las restas.

expresion ::= [expresion_prima * expresion_prima | expresion_prima / expresion_prima | expresion_prima ]

expresion ::= [expresion + expresion | expresion – expresion]

3.2.5 Operadores Relacionales

Para permitir la comparación entre dos valores, se implementaron los operadores relacionales mayor que, mayor o igual que, menor que, menor o igual que e igual que.

expresion_booleana ::= [expresion > expresion | expresion >= expresion | expresion < expresion | expresion <= expresion | expresion == expresion]

Una expresión es también una expresión booleana, tomándose como falso el valor cero y verdadero cualquier otro valor.

3.2.6 Operadores lógicos

Los operadores lógicos retornan un único valor booleano de acuerdo a los valores de entrada. Los operadores lógicos implementados son en el Y y el O.

expresion_booleana ::= [1 | 0 | expresion_booleana && expresion_booleana | expresion_booleana || expresion_booleana]

3.2.7 Variables

Para la declaración de una variable se antepone el carácter ‘$’, seguido de un nombre identificador de la variable y un igual finalizado por una expresión matemática. Las variables son almacenadas en la tabla de símbolos del compilador

variable := $[texto]

Definicion_variable ::= variable = expresion

Los valores almacenados en las variables pueden ser obtenidos por las funciones.

3.2.8 Sentencias

En las sentencias se define el comportamiento y las instrucciones a realizar. Una sentencia puede ser la asignación de una variable, la definición de una condición o ciclo, la definición de un bloque de sentencias, o múltiples sentencias separadas por el carácter “;”

sentencia ::= [Definicion_variable | Definicion_condicion | Definicion_ciclo | { sentencia } | sentencia ; sentencia | funcion ]

3.2.9 Condicionales

Los condicionales permiten cambiar el orden secuencial de ejecución de un programa generando una bifurcación.

3.2.10 Ciclo mientras

El ciclo mientras (del inglés while), realiza iteraciones de manera indeterminada hasta que la condición sea inválida. Cuando la expresión booleana es falsa se termina el ciclo y se continúa la ejecución del programa

Definicion_ciclo ::= mientras ([expresion_booleana]) [sentencia]

3.2.11 Ciclo para

El ciclo para (del inglés for) realiza una tarea un número determinado de veces con un incremento determinado para la variable de control.

Definicion_ciclo ::= Para [Definicion_variable] , [expresion] , [expresion] hacer [sentencia]

3.2.12 Funciones

Las funciones son subrutinas con un espacio propio de memoria que retornan un valor. Opcionalmente las funciones pueden recibir variables de entradas que modifican el valor de retorno. Las funciones se deben declarar al principio del programa.

Definicion_funcion ::= funcion [nombre_funcion] ( [$var1, $var2 …]) [sentencia] Definicion_funciones ::= [Definicion_funcion Definicion_funcion ]

3.2.13 Llamado a función

Para realizar el llamado de una función, debe pasarse como argumento sus parámetros de entrada. El compilador soporta recursión ya que una función puede llamarse a sí misma.

Funcion := nombre_funcion ( [$var1, $var2 …] )

3.2.14 Definición de programa

El programa está compuesto de declaración de funciones seguido de sentencias.

3.2.13 Funciones Internas

Las funciones internas permiten interactuar con las funciones definidas en la máquina virtual y realizar alguna acción determinada. Con el objetivo de aprovechar el hardware de la Raspberry PI, del Lego EV3 y de la tarjeta de desarrollo propio, se crearon un conjunto de funciones para cada dispositivo como se muestra en Tabla 13 Lista de funciones disponibles para el sistema operativo EV3DEV y en la Tabla 14 Lista de funciones internas disponibles para la tarjeta de construcción propia.

Tabla 13 Lista de funciones disponibles para el sistema operativo EV3DEV

Función Descripción Ejemplo

ejecutar() Ejecuta código Python ejecutar("print 'Hola Mundo');

motor(tipo, puerto) Asigna un tipo de motor a un puerto. Donde tipo de motor puede ser grande o mediano.

$m1 =

motor("grande","outA");

encenderMotor(MOTOR, velocidad)

Enciende un motor con la velocidad especificada.

encenderMotor($m1,500);

detenerMotor(MOTOR) Detiene un motor detenerMotor($m1);

distanciair() Calcula la distancia mediante el uso de un sensor

infrarrojo

$distancia = distanciair();

toque() Sensor de Toque 1, si hay contacto, 0 en caso contrario

$t = toque();

Tabla 14 Lista de funciones internas disponibles para la tarjeta de construcción propia.

Función Descripción Ejemplo

encender(Puerto) Enciende un puerto del micro-controlador encender(12);

apagar (Puerto) Apaga un puerto del micro-controlador apagar (12);

dormir (Segundos) Pausa la ejecución del programa por un determinado tiempo en segundos

dormir ( Micro segundos )

Pausa la ejecución del programa por un determinado tiempo en micro segundos

udormir (100);

izquierda () Se asigna los puertos de salida de motores para que el robot gire hacia la

izquierda

izquierda();

derecha () Se asigna los puertos de salida de motores para que el robot gire hacia

la derecha

derecha();

adelante() Se asigna los puertos de salida de motores para que el robot vaya

hacia adelante

adelante();

atras() Se asigna los puertos de salida de los motores para que el robot vaya hacia

atrás

atras();

arrancar() El robot enciende motores arrancar();

detener() El robot detiene los motores detener();

leer() El robot lee el valor de un puerto $valor = leer(12);

leeranalogo() El robot lee el valor de un puerto análogo $valor = leeranalogo(12);

3.3 Máquina virtual

En general, una máquina virtual permite realizar una abstracción del hardware del dispositivo o de un sistema operativo con el objetivo de presentar a una aplicación una serie de interfaces o un entorno más genérico que facilitan la interoperabilidad de una aplicación en diversas plataformas con el objetivo de lograr una reducción de la complejidad de programación para una plataforma en específico y aprovechar de manera más eficientes los recursos disponibles [46].

Para el entorno de desarrollo se ha realizado la construcción de dos máquinas virtuales, la primera compatible con la tarjeta desarrollo propio basada en microcontrolador

empleando el software CCS C Compiler y para el caso del Lego EV3 y Raspberry PI se