
ARQUITECTURA
Componentes
A continuación, se presenta una lista final de componentes, y sus proveedores. Cabe recalcar que la mayoría de estos fueron provistos por el laboratorio, y que al final, por dificultades y tardanzas con proveedores, se tuvo que cambiar algunos componentes que fueron adquiridos por el equipo de desarrollo. Lo que hizo que el diseño final cambiará.


Se presenta además un diagrama final con la distribución de dichos componentes en el sistema. Lo que permite observar la distribución de estos. Se decidió ubicar la Raspberry en el dorso del robot para evitar que muchos cables pasaran por el cuello si se ubicaba por ejemplo en la cabeza y tener más central la parte de control del sistema, hacia los demás componentes. Nótese los nombres que se les dio a los servomotores, estos nombres son importantes en el código que los opera, lo que se explicará en otra sección.

Materiales
Los materiales usados para la estructura del robot fueron acero 1020, aluminio, madera y PLA para las piezas impresas en 3D. Se escogieron estos materiales por sus propiedades adecuadas para fácil manufactura, además de estar fácilmente disponibles, contarse con los conocimientos y herramientas para procesarlos y de cumplir con los requerimientos estructurales del robot, que no eran muy exigentes. Es importante recalcar aquí, que se tuvo problemas con lámina que se quería para la cubierta del robot, la cuál no pudo ser procesada en la universidad y no se encontró proveedores oficiales de la universidad que tuviera la capacidad para los cortes que se requerían para esta y otras piezas, por lo que al final se priorizaron las piezas más importantes (uniones de los hombros para los servomotores) y se cambió el diseño para hacer uso de piezas menos complejas y que estuviesen a nuestra disposición.

ARQUITECTURA
A continuación, se presenta un resumen de lo que ya se ha detallado en entregas anteriores. El software del sistema se compone básicamente de tres servidores corriendo en una Raspberry Pi 4 de 8GB de RAM. Un servidor es una aplicación front-end de React, la cual se encarga de renderizar el rostro del robot en la pantalla y permitir al usuario ingresar los mensajes que quieren que el robot reproduzca. Cabe remarcar aquí que, a partir de la retroalimentación recibida en la entrega anterior, se añadió la funcionalidad que permite enviar varios mensajes a la vez, que serán procesados por el robot en el orden en el que se añadan a la lista. Otro servidor se encargar de detectar las emociones y gestionar los movimientos del robot, recibiendo peticiones desde React para empezar el proceso y detener los motores cuando se haya terminado la reproducción. Finalmente, se tiene un WebSocket que se usa para la sincronización entre el envió de mensajes y la renderización de la cara del robot.
​
En el siguiente diagrama general del programa se muestran algunos detalles adicionales más específicos de los archivos y la función de cada componente del sistema, así como la forma en que se comunican estos para cumplir con su función y coordinar la operación del sistema.

Motores y movimientos
​
Para la parte de movimientos de motores, se ideó una estructura que consiste en un objeto json, donde las propiedades son los sentimientos que se pueden identificar con el paquete de text2emotion. Cada propiedad de estas corresponde a un conjunto de gestos que en teoría reflejan esta emoción. Estos gestos se definen por los movimientos que realizan las extremidades y la cabeza del robot. Se puede mover los motores de acuerdo a la siguiente figura:

En el código, los motores se identifican como LEFT_X, LEFT_Z, RIGHT_X, RIGHT_Z, HEAD_X, HEAD_Y para mover el motor en el eje respectivo.
La estructura mencionada es la siguiente (encontrada en el archivo move.py):

Y así para cada emoción. Cada emoción es un arreglo en donde cada posición define un conjunto de movimientos que describen un gesto. La idea es que se elija en cada instante de tiempo, una posición de este arreglo aleatoriamente, y se representa el gesto. Todo esto mientras se esté reproduciendo el mensaje recibido. De esta manera, el movimiento puede percibirse un poco más natural, al no ser repetitivo.
Por ahora, solo se crearon arreglos con un solo elemento, pero solo es cuestión de caracterizar más gestos y añadirlos. Esto fue por cuestiones de tiempo y retrasos con los proveedores, temas que se explicarán en otras instancias ajenas a este documento. Lo que se quiere resaltar acá, es que la estructura está lista y el código está definido para añadir la cantidad de gestos que se desee, y se pretende explicar cómo se caracterizan estos movimientos.
Cada movimientos es un objeto del tipo:
{ "motor": LEFT_X, "deg": 0, "wait": 1},
En donde la propiedad motor define el motor que realizará el movimiento, los grados define cuantos grados se va a mover y la propiedad wait establece el tiempo de delay después del movimiento. Acá es importante recalcar, que si este valor es diferente de cero, los movimientos que siguen no se ejecutarán hasta que pase el delay. Por lo tanto, si se quieren que varios movimientos se ejecuten al tiempo, este parámetro debe ser cero entre ellos. Si se quiere que un movimiento se ejecute después de otros, se pone al final de los mismo y se pone el delay en el movimiento precedente. La siguiente figura muestra esta situación:
En esta figura, los tres primeros movimientos se ejecutan en “paralelo”, luego al tercer movimiento hay un delay, por lo que los 3 siguientes movimientos no se ejecutarán hasta que pase el delay y lo harán en “paralelo” hasta el siguiente delay. Otra cosa a tener en cuenta es que si un texto tiene varias emociones asociadas, también se alternará aleatoriamente entre movimientos de estas emociones, hasta que termine de reproducirse el mensaje.