Workshop 2 - MatteoMurcia/ARProject GitHub Wiki
Para este workshop se desarrolló un demo en el cual, se utiliza la realidad aumentada para mostrar 2 diferentes datos recibidos a través de un MQTT en un modelo 3D ubicado sobre un target, todo esto utilizando Unity 3D con vuforia como software y lenguajes para el desarrollo como python, C#, javascript, entre otros, dando como resultado un demo de realidad aumentada el cual despliega sobre un target un modelo 3D que deja ver la probabilidad de sufrir una enfermedad y el valor actual.
For this workshop, a demo was developed in which, augmented reality was used to show 2 different data received through an MQTT in a 3D model located on a target, all using Unity 3D with Vuforia as software and languages for development as python, C #, Javascript among others, resulting in an augmented reality demo which displays a 3D model on a target that shows the probability of suffering a disease and the current value.
Es una plataforma de desarrollo en tiempo real de unity, esta permite crear visualizaciones de VR (realidad virtual) y AR(realidad aumentada).
Es un kit de desarrollo de software de realidad aumentada para dispositivos móviles que permite la creación de aplicaciones de realidad aumentada.
Es una herramienta en la cual se pueden recrear tanto imagenes en 2D como imagenes en 3D para diferentes tipos de formato.
Es una plataforma de mensajería basada en MQTT diseñada para el movimiento bidireccional de datos rápido, eficiente y confiable.
Es un editor de gráficos rasterizados desarrollado por Adobe Systems Incorporated. Usado principalmente para el retoque de fotografías y gráficos.
Como primera medida se decidió sobre qué target debía ser reflejado el modelo 3D, el target se desarrolló con el software Photoshop creando una imagen a blanco y negro, se hicieron pruebas con un target diferente con el uso de vuforia subiendo la imagen (target) a una base de datos en vuforia para posteriormente usar Unity y mostrar un dinosaurio, luego se hizo el target que creímos el adecuado para un hospital. Para diseñar el modelo 3D se tuvo en cuenta en un inicio desarrollarlo sobre herramientas como blender, revit, SketchUp, paint 3D, entre otras; finalmente, se optó por la herramienta de paint 3D debido a que este puede realizar los modelos en el formato adecuado para exportarlo a unity 3D (.fbx), su interfaz es mucho más facil de manejar, es gratis y ademas se pueden utlizar modelos base y adaptarlos a el diseño requerido; para hacer el modelo 3D se utilizo un plantilla de paint 3D la cual se modifico para que esta encajara con el diseño previamente determinado. A continuacion se decidio el metodo para recibir una trama de Json a traves de MQTT, para establecer la conexión entre el broker y unity3D se implemento la librería M2MQTT. Dentro de esta librería, se encuentra el proyecto M2Mqtt.sln que debe ser desplegado en Visual Studio Community para la configuración del .NET. Una vez realizado esto, se encuentra la biblioteca M2Mqtt.Net.dll la cual debe ser insertada en el proyecto de unity. Dentro del proyecto unity, se debe crear el archivo mqtt.cs en donde se encuentra el siguiente código:
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{
//Aquí se declaran las variables de información de conexión con el broker
private MqttClient client;
public string brokerHostname = "broker.mqttdashboard.com";
public int brokerPort = 8000;
static string subTopic = "testtopic/AR"; //Variable que se encarga de escuchar
private string msg;
TextMesh text;
// Inicialización obtención de datos
void Start(){
if (brokerHostname != null ){
Debug.Log("connecting to " + brokerHostname + ":" + brokerPort);
Connect();
//Registrar el mensaje recibido
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
byte[] qosLevels = { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE };
client.Subscribe(new string[] {subTopic}, qosLevels);
}
text = gameObject.GetComponent("TextMesh") as TextMesh;
}
private void Connect(){
Debug.Log("about to connect on '" + brokerHostname + "'");
client = new MqttClient(brokerHostname); //Crear instancia del cliente
//Guid representa un identificador único global es decir el identificador del suscriptor
string clientId = System.Guid.NewGuid().ToString();
try{
client.Connect(clientId);
} catch (Exception e){
Debug.LogError("Connection error: " + e);
}
}
//Se publica en consola el mensaje que se está recibiendo del suscriptor
void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e){
msg = System.Text.Encoding.UTF8.GetString(e.Message);
Debug.Log("Received message from " + e.Topic + " : " + msg);
}
// La actualización se llama una vez por trama
void Update(){
Debug.Log("update");
text.text = msg;
}
}
Debido a que la trama aun no es enviada conforme las especificaciones dadas al scrum master, se realiza un envio artificial de MQTT para que el demo pueda ser probado; lo anterior se realizo utlizando la pagina web HiveMQ en la cual se pueden generar un mensaje de MQTT a traves del broker gratuito que ofrece la pagina. Finalmente, se ensamblo el target, modelo 3D y la recepción de datos en unity 3D, para esto se ubico el modelo 3D, se ubicaron dos GameObject de tipo Text sobre este, para cada Text se creó un script en C# utilizando la función PlayerPrefs, que permite realizar cambiar cada vez que el jugador interactúe con la interfaz, estos scripts reciben los datos y los muestran en el texto, para eso es necesario relacionar cada script con un GameObject Text, esta relación se realiza creando un Text(script) y se relaciona como componente del objeto Text. Luego de tener el modelo con los textos y que estos cambien de forma dinámica se procede a ubicar el target en la parte inferior del modelo, para que este funcione es necesario poner el modelo con todos los componentes dentro del ImageTarget.
Para probar la funcionalidad del desarrollo primero, se hicieron pruebas con la camara el computador y un target “virtual”, después de esto, se instalo un JDK en un celular android y se imprimio un target sobre el cual se desplego el modelo 3D junto con los datos recibidos.
En este workshop se logro desarrollar un target en el cual se desplega un modelo 3D, esto solo se puede realizar en un equipo con unas especificaciones de hardware minimas. El procesamiento de los MQTT tuvo más contratiempos debido a el uso de diferentes librerias y versiones de unity, con esto se pudo concluir que : Es necesario tener el mismo versionamiento de unity en todos los equipos que se utilicen para desarrollar, debido a la complejidad de las herramientas utilizadas el hardware tiene que tener unos minimos para que todo el desarrollo pueda funcionar de manera optima, la realidad aumentada funciona mejor si el target es fisico y no digital. Al unir todos estos requerimientos da como resultado el objetivo de el workshop, un demo de realidad virtual funcional, en el cual se puede observar un modelo 3D el cual refleja 2 tipos de datos los cuales varian según la necesidad.
- https://www.hivemq.com/company/
- https://en.wikipedia.org/wiki/Vuforia_Augmented_Reality_SDK
- https://es.wikipedia.org/wiki/Adobe_Photosho
- https://unity.com/es
- http://blog.jorand.io/2017/08/02/MQTT-on-Unity/
- https://stackoverflow.com/questions/55954173/unity3d-update-function-stops-when-mqtt-message-is-received
- https://answers.unity.com/questions/1330095/receiving-mqtt-messages.html
- https://github.com/vovacooper/Unity3d_MQTT
- https://www.hivemq.com/public-mqtt-broker/
- https://www.youtube.com/watch?v=A-5PGITQ1go&t=135s