Wednesday, February 15, 2017

SAP d-shop’s Virtual House – Un viaje de los físico a lo Virtual


Este post fué posteado originalmente en SAP d-shop’s Virtual House – A journey from Physical to Virtual.





Hace algún tiempo…nuestro buenos amigos del SAP d-shop Newtown Square (Llamados John Astill y companía) construyeron una Casa IoT para SAP Insurance. Esta pequeña casa (Por cierto, hecha y pintada a mano) utiliza un Arduino Nano, varios sensores y luces LED…y…lo cual es impresionante dicho sea de paso…una lavadora impresa en 3D con un sensor de agua…y por supuesto…estaba y está…habilitada para IoT.




Pensamos que era impresionate…así que tenemos una en nuestro propio SAP d-shop en Silicon Valley y se ha convertido en pieza clave de todos nuestros tours por el d-shop.

Luego…un tiempo después, nuestro amigos de HCP Marketing (Llamados Joe Binkley y compañía) e Intel construyeron un Edificio Inteligente. Un edificio muy bonito…controlado por Amazon Alexa que utiliza un Intel Galileo, algunos Arduinos así como también servos (motores), luces, un panel solar y hasta un ventilador…nuevamente todo esto…habilitado para IoT…pero como se deben haber imaginado ya…controlado por voz…así que puedes enviar el elevador de arriba para abaja…abrir o cerrar las puertas e inclusive enviar todo el edificio en modo de emergencia…afortunadamente…lo hemos mantenido en el d-shop por bastante tiempo y eso otro de nuestros demos con factor “wow” cada vez que alguien viene a visitarnos…




Tener ambos disponibles…poco a poco se fué enciendo la llama de la innovación y la creatividad…por que no construir una Casa Virtual que pueda ser utilizada con el Oculus Rift y que es controlada por Alexa?


No es un trabajo sencillo…pero de hecho que amamos los retos…y gracias a nuestra experiencia previa con Unity3D and Alexa working together ya sabiamos por donde empezar…



La arquitectura es bastante simple… El servidor Heroku no es más que un servidor de Eco, así que va a repetir todo lo que le pasemos como una respuesta JSON. Nuestra aplicación en Unity constantemente revisa el servidor Heroku para determinar si algún mensaje al que deba responder. Por supuesto, para que este trabaje como se quiere, necesitamos crear un skill en Amazon Alexa solo para poder actualizar el servidor. Así que, cuando decimos “open door”, entonces Alexa va a enviar un comando al servidor Heroku y este en respuesta va a generar un mensaje “open door” en JSON. Nuestra aplicación en Unity va a leer la respuesta generada por el servidor Heroku, y actuar correctamente abriendo la puerta…por supuesto, no queremos que esto siga pasándo una vez que ya se ejecutó el comando…así que luego de que Unity executa la acción va a enviar un mensaje nulo al servidor Heroku, así que la próxima vez el mensaje JSON va a ser también nulo y Unity simplemente va a esperar por el próximo comando válido.

Si quieren echar un pequeño vistazo a como se ve la Casa Virtual…aquí hay un par de imagenes…pero no se olviden de ver el video, J Así tendrán la experiencia completa -;)





Ahora…este proyecto comenzó como un “Project in a Box” (para uso interno solamente…disculpen por eso) lo cual significa…que todo el código fuente y la explicación de como construirlo desde cero debería ser proporcionada…pero…pero por razones obvias…eso no pasó L Así que en vez de eso…lo convertimos en un “Product in a Box” lo cual significa que (Disculpen nuevamente…solo empleados) pueden descargar la aplicación compilada y simplemente modificar el archivo de configuración para tenerlo funcionando por su cuenta J El código fuente no está siendo proporcionado pero obviamente con un simpático email pueden conseguirlo -;)

Consigánlo aquí

Ahora…que tengo toda su atención…por favor vean el video J Es un bonito viaje que parte la Casa IoT a la Casa Virtual pasándo por el Edificio Inteligente…



Ahora…se preguntarán por los modelos 3D Models utilizados para la Casa Virtual…como pueden ver en una de las images, la mayoría de ellos fueron descargados pero algunos de ellos fueron diseñados por nosotros J utilizándo Blender…Como el Amazon Echo, el Robot impreso en 3D y los llaveros con nombre, el Amazon Echo y obviamente la casa en sí J Para algunas otras cosas como las mesas y las plantas…esos fueron importados a Blender y “pintados a mano” puesto que la texturas no estaban disponibles.

Ahora…algo que pensamos que es realmente importante…es listar todos los problemas y lecciones que aprendimos mientras desarrollamos esta aplicación…

Problemas y Lecciones Aprendidas:

  • Como este es un Product in a Box y no un Project in a Box, no vamos a incluir el código fuente de la aplicación, pero lo que vamos a hacer en vez de eso es contarles los problemas y lecciones que aprendimos del desarrollo de este proyecto.
  • Unity utiliza el .NET Framework 3.5, el cual ya está deprecado por el .NET 4.0 así que muchas cosas no van a funcionar simplemente porque no han sido implementadas…y por qué es esto? Bueno…Unity utiliza Mono (que es .NET para Linux) y yo pienso que lo utilizán para mantener uniformidad entre todas las plataformas. Mientras Mono continue en .NET 3.5, lo más seguro es que Unity tampoco va a actualizase.
  • Cuando cargamos escenas, la iluminación puede quedar hecha un desastre…así que empiezas en el nivel uno…te mueves al nivel dos y de pronto parece que fuera de noche…la solución es simple…escogemos “Window à Lighting à Lightmaps”, desmarcamos el “Auto” checkbox y presionamos “Build” para hacer un bake a luz nuevamente.
  • Los Coroutines son simplemente asombrosos. Normalmente, no puedes hacer que tu aplicación duerma o espere…pero utilizándo Coroutines de hecho que puedes…Coroutines son como threads o hilos.
  • Cuando utlizamos luces, debemos asegurarnos de apagarlas cuando el personaje no está en el cuarto, porque esto nos va a ahorrar un poco de procesamiento gráfico y porque aunque sea virtualmente…tenemos que preocuparnos por el medio ambiente…
  • Unity no tiene una función o propiedad de wrap (salto de línea automático) para textos en 3D…lo cual es problemático especialmente si queremos hacer un muro de Twitter…así que la única opción es programar uno desde cero…aunque no es tan complicado…simplemente tomamos el texto, lo dividimos por espacio en un array…concatenamos cada palabra revisándo primero si la longitud de la cadena es menor que nuestro tope  (que puede ser el máximo número de caracteres que entran en nuestro muro), si la cadena es mayor que el tope, simplemente agregamos un retorno de carro (“\n”) antes de hacer la concatenación.
  • A medida que la aplicación crece puedes tener la necesidad de duplicar assets, lo cual es perfectamente normal y no agrega mucho poder extra de procesamiento (Especialmente si crean un Prefab y utilizan ese prefab), pero no se olviden de asignar un nombre único, de otra manera van a tener un dolor de cabeza si la aplicación necesita interactuar con esos assets.
  • Algunas veces vamos a tener que descargar modelos 3D de internet…otras veces vamos a crearlos utilizándo Blender…pero no hay que olvidar que muchas veces una simple esfera, cubo o algún otro objeto primitivo de Unity puede funcionar perfectamente utilizándo simplemente una imagen como textura.
  • Cuando creamos nuestro skill con Alexa…debemos asegurárnos de no cometer ningún error ortográfico…de otra manera se van a golpear la cabeza pensándo porque Alexa no está haciendo lo que le hemos pedido que haga…
  • Cuando probamos nuestra aplicación Debug.log() y Print() se volverán tus mejores amigos…nada mejor que un valor impreso o un mensaje para darse cuenta que es lo está funcionando mal.
  • Cuando movemos un objeto, debemos asegurárnos de guardar la posición original  y luego agregar el nuevo valor al valor que tenemos guardado. De lo contrario, algo puede provocar que los valores resulten errados…teniendo guardados los valores originales, podemos evitar tener que calcular los valores originales nuevamente y simplemente retornar al valor original para que todo encaje un su lugar.
  • Cuando utilizámos Texo en 3D nos daremos cuenta de que aún cuando coloquemos un objeto en frente del textp…este se mantendrá siempre visible…lo cual obviamente no es muy bonito…así que temos dos opciones…crear un shader para ocultarlo…o la manera más simple…hacer el objeto que está en frente...transparente. Esto no es algo perfecto para cualquier solución pero por lo menos funcionará.
  • El mayor problema al que nos podemos enfrentar cuando hacemos que Unity y Alexa conversen, es que cuando le digamos a Alexa que prenda las luces, ella responderá “La luz está prendida”…pero si le decimos lo mismo una segunda vez su respuesta debería ser “La luz ya está prendida” …para hacer esto…deberíamos utilizar una Base de Datos o algo parecido para almacenar la información…y cuando cerramos la aplicación, deberíamos limpiar los estados…si bien esto se puede hacer…es bastante trabajo, y que pasa si la aplicación colapsa de improviso? Deberíamos resetear los estados manualmente? No es lo ideal…
  • Esto nos lleva al punto de utilizar el elevador…podemos abrir la puerta o enviarlo a cualquiera de los pisos…en línes generales…eso es bastante sencillo…cada piso es una escena, así que necesitamos estar en el primer piso para poder enviar el elevador al segundo o tercer piso…pero…que pasa si estamos afuera del elevador? Estamos en el primer piso…pedimos el tercer piso…y luego abrimos la puerta…a medida que el personaje se mueve junto con el elevador…cuando abrimos la puerta todo se va a ver mal…solución? Simplemente utilizamos un cubo que no tenga un mesh renderer, así que es invisible…asignámos un collider con “is trigger” habilitado…y validamos que el personaje está interactuándo con el cubo para poder hacer que el elevador se mueva…de esa manera, así aunque pidamos el tercer piso y Alexa confirme que el elevador se está moviendo hacia arriba…nada va a pasar…cuando abrimos la puerta…podemos asumir que el elevador subió o bajó hasta tu piso para que podamos entrar…solo una ilusión…pero funciona…
  • Alexa no tiene una opción para retrazar el re-prompt (cuando pregunta si queremos hacer algo más), así que cuando exploramos la Casa Virtual ella nos preguntará “What else can I do for you?” y si no le respondemos nada, el skill simplemente se irá a dormir…así que tendremos que despertarla nuevamente…eso es algo un poco triste debido a la naturaleza de la aplicación…pero no hay nada que podamos hacer a menos que Amazon proponga una solución para que el re-prompt espere más tiempo…
  • Como todo el Alexa-Unity3D depende de Heroku…podemos esperar algunos retrazos o comandos dados por Alexa que no van a ser replicados necesariamente en el mundo virtual…puede ser un problema con la conexión a Internet o simplemente un problema con Heroku …

Como mencioné al inicio…el entorno se ve afectado por el clima…si está soleado…veremos un cielo claro y soleado…si está lloviendo veremos cielo oscuro y húmedo…y esto involucra utilizar un Skybox…aunque no un Skybox común y corriendo…y a propósito de esto, que es un Skybox? Bueno…simplemente…es un cubo que cubre todo el entorno y tiene diferentes images para simular el cielo…el problema es que un Skybox regular solo nos permite asignar 6 lados…lo cual por supuesto no es óptimo…necesitamos un Skybox de 12 lados…para que así podamos asignar images de cielo soleado e imágenes de cielo oscuro…de esa manera cuando revisamos el clime podemos modificar la luminosidad y esto va a afectar al Skybox puesto que va a utilizar uno u otro brindándonos el efecto de que está reflejando el clima que hace afuera…
Greetings,

Blag.
Development Culture.

No comments: