Workshop 3 - MatteoMurcia/ARProject GitHub Wiki

WorkShop 3

Carol Moreno , Laura Parada, Laura Garcia, Matteo Murcia, Felipe Gutierrez

Introducción

El objetivo de este workshop fue integrar los módulos de EoT, AIoT y AR, los cuales fueron desarrollados previamente de manera individual. Para este Workshop el modulo de EoT leyo un SG y datos de pulsación, estos datos fueron enviados a el modulo de AIoT el cual los procesa y devuelve estos datos procesados a EoT con una enfermedad y una probabilidad, después de esto EoT envía al modulo de AR los datos de probabilidad, enfermedad y pulsos por minuto, el modulo de AR recibe un json con la información, la procesa y la muestra en un diseño 3D el cual es desplegado sobre un target.

Diagrama de Bloques General

Diagrama de bloques general

Este diagrama describe el proceso de funcionamiento del desarrollo del workshop 3. Inicialmente el modulo ECG AD8232 (sensor) toma la información del ESG la cual, se procesa en el arduino y se envia a la raspberry, la rasppbery le envia a el bloque de Inteligencia Artificial para que puedan predecir la posibles enfermedades, el bloque de inteligencia artificial devuelve un JSON con la enfermedad y la probabilidad de que el paciente la sufra, en la raspberry se complementa la información con los pulsos por minuto de la persona y se envia un Json con los 3 datos a el bloque de Realidad Aumentada el cual al recibirlos los muestra en un modelo 3D en un celular, todos los Json se envian a través de un broker MQTT en la nube.

Diagrama de Bloques

Este diagrama se realizó para el módulo de AR , para esto se describió el proceso de funcionamiento del módulo desde el momento en el que se recibe el mensaje a través de un MQTT, como se maneja el MQTT a través de un client suscription el cual se programó utilizando el lenguaje C#, después de esto pasa a un script, en este script se toman los datos recibidos y se ubican en un texto 3D, después, el texto 3D es reflejado en el modelo 3D el cual se despliega sobre un target, después de relacionado lo anterior, se descarga vuforia y se corre el APK sobre el celular el cual utiliza su cámara y su pantalla para mostrar el modelo 3D sobre el target físico. Se puede observar ya en el celular 3 datos que cambian según el estado del paciente, estos son: Enfermedad, Probabilidad y pulso.

Criterios de diseño

Para el desarrollo de la solución particular se definieron los siguientes criterios de diseño:

  • Para la elaboración del modelo 3D y su implementación en realidad aumentada se utilizó Unity 3D ya que este facilita la elaboración de estos y cuenta con las librerías y dependencias necesarias para crear una aplicación de realidad aumentada, estas son Vuforia.
  • Para la elaboración del target se implementó Photoshop ya que permite realizar de forma fácil una imagen adecuada para la proyección del modelo 3D
  • Para la recepción de datos se elaboró un script para suscribir y publicar los datos enviados mediante MQTT
  • Para mostrar los datos en forma de texto se implementó un script que recibe que los valores y los muestra en un GameObject text en Unity 3D.

Diagrama de Flujo

Se dividió el diagrama de flujo en tres partes: Raspberry, broker y unity3D. Cómo primera instancia, se tuvo en cuenta los datos que la raspberry recibe de un pre-procesamiento con inteligencia artificial en el control de la enfermedad, es decir, probabilidad, pulsos y enfermedad relacionada. Dichos datos deben ser procesados en la misma y posteriormente enviados al broker HiveMQ. Para establecer la conexión entre el sensor y el broker, la raspberry debe enviar una publicación con los datos (en formato json) obtenidos por medio del protocolo TCP/IP por el puerto 1883. Si la conexión es aceptada, se procede a guardar cada dato en tópicos, sino, debe nuevamente enviar la solicitud de conexión.

Cuando la conexión a sido establecida con el broker, es necesario vincular o suscribir el dispositivo que se va a implementar para la visualización de los datos, en esta ocasión se vincula Unity 3D. En esta herramienta, se ejecutan las funciones establecidas en el script: suscripción, publicación y un método para enviar y actualizar los datos a la vista de unity3D.

Documentación de código generado

 using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using uPLibrary.Networking.M2Mqtt.Utility;
using uPLibrary.Networking.M2Mqtt.Exceptions;
using uPLibrary.Networking.M2Mqtt.Internal;

public class NewBehaviourScript : MonoBehaviour
{
    //Información para poder conectarse al Mqtt broker y variables necesarias.

    private MqttClient client; // definicion de cliente mqtt
    public string brokerHostname = "broker.mqttdashboard.com"; //nombre del broker
    public int brokerPort = 8000; // puerto utilizado
    static string subTopic = "testtopic/AR"; // topico al que se subscribira
    // variables para guardar la información de los mensajes con sus valores predeterminados. 
    private string msg = "Pulso: 75";
    private string enferm = "Enfermedad: sano";
    private string proba = "Probabilidad: 50";
    // variables para poder vincular los TextMesh y poderles cambiar el texto.
    TextMesh enf;
    TextMesh prob;
    TextMesh text;
    // Start is called before the first frame update
    void Start()
    {
        if (brokerHostname != null ) //revisa si existe una coneccion al broker y procede a conectarce.
        {
            Debug.Log("connecting to " + brokerHostname + ":" + brokerPort);
            Connect(); // conecion con el broker
            client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; // recepcion de mesajes publicados
            byte[] qosLevels = { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE }; // nivel de qos
            client.Subscribe(new string[] {subTopic}, qosLevels); // subscripcion al topico
        }
        // encontrar los TextFrames que se utilizaran.
        enf = GameObject.Find("Enf")
                         .GetComponent("TextMesh") as TextMesh;
        prob = GameObject.Find("Prob")
                         .GetComponent("TextMesh") as TextMesh;
        text = GameObject.Find("Text")
                         .GetComponent("TextMesh") as TextMesh;
    }
private void Connect()  // función para conectarse al broker usado cuando se inicia el programa
    {
        Debug.Log("about to connect on '" + brokerHostname + "'");
        client = new MqttClient(brokerHostname); //cliente Mqtt
        string clientId = System.Guid.NewGuid().ToString(); // cliente Mqtt
        try
        {
            client.Connect(clientId); //conectarse con el id 
        }
        catch (Exception e)
        {
            Debug.LogError("Connection error: " + e);
        }
    }   
// función que recibe los mensajes definido cuando inicial el programa para que siempre este funcionando 
void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) 
    {
        string json = System.Text.Encoding.UTF8.GetString(e.Message); // recepcion de json en el mensaje
        Debug.Log("Received message from " + e.Topic + " : " + json);
        Info info = JsonUtility.FromJson(json); //convertimos el json en una classe para recibir la informacion
        // guardar la información obtenida del json en variables para poderlas mostrar en los TextMesh
        msg = "Pulso: "+info.mensage.ToString(); 
        enferm = "Enfermedad: "+info.enfermedad;
        proba = "Probabilidad: "+info.probabilidad.ToString();
    }
    // Update is called once per frame
// usada para que cuando haya un cambio en la información se actualize el los textos.
    void Update()
    {
        Debug.Log("update");
        // cambiar texto de los TextMesh
        text.text = msg;
        enf.text = enferm;
        prob.text = proba;
    }
}
public class Info   //clase utilizada para obtener los datos dentro del json
{
    public string enfermedad;
    public int probabilidad;
    public int mensage;
}

Cuando empieza la aplicación este se conecta al broker del MQTT utilizando la función connect(), luego se subscribe al tópico y se buscan los 3 TextMesh donde se mostrara la información entrante, en seguida, utilizando la función client_MqttMsgPublishReceived leemos el mensaje recibido en la suscripcion del MQTT el cual esta en formato json, se lee el json utilizando JsonUtility y la clase Info, despues los 3 campos se guardan en 3 variables las cuales son utilizadas luego en la función update para cambiar la información en los 3 TextMesh.

Configuración experimental y resultados de validación

Se realizaron varias pruebas, iniciando con el desarrollo del target montando uno aleatorio y subiéndolo a una base de datos en vuforia para realizar la prueba en Unity y montar un APK de prueba que mostraba una imagen en 3D. Así se verificó el funcionamiento de un aplicación el realidad aumentada.

Posteriormente se hicieron pruebas en HiveMQ para recibir un json y mandar la información por MQTT que posteriormente se muestra en la aplicación de realidad aumentada para ser reemplazado en el modelo 3D y mostrado en la aplicación.

Representación del modelo 3D en Unity

Representación de los mensajes publicados desde el Broker de MQTT

Representación de proyección de datos iniciales en el modelo AR

Representación de datos actualizados en el modelo AR

Demostración de dimensiones 3D

⚠️ **GitHub.com Fallback** ⚠️