Monday, July 30, 2018

Cozmo, leeme


Conoces a Cozmo? El robot amigable de Anki? Bueno...aquí está...

Cozmo es un robot programable que tiene muchas características...y una de ellas incluye una camera...así que puedes hacer que Cozmo tome una foto de algo...y luego hacer algo con esa foto...

Para programar a Cozmo necesitamos utilizar Python...en realidad...Python 3 -;)

Para este blog, vamos a necesitar un par de cosas...así que vamos a instalarlas...

pip3 install ‘cozmo[camera]’

Esto va a instalar el SDK de Cozmo...y vamos a necesitar también instalar el app de Cozmo app en nuestro teléfono celular también...

Si ya tienen el SDK instalado, quizás deberían actualizarlo porque si no tienen la última versión esto no va a funcionar...

pip3 install --upgrade cozmo

Ahora, necesitamos algunas cosas adicionales...

sudo apt-get install python-pygame
pip3 install pillow
pip3 install numpy

pygame es un framework para juegos
pillow es un wrapper para la librería PIL que se usa para manipular images.
numpy nos permite manejar números complejos en Python.

Esta fué la parte sencilla...puesto que ahora debemos instalar OpenCV...el cual nos permite manipular imágenes y video...

Esta parte es un poco complicada, así que si se quedan atracados...busquen en Google o simplemente escribanme un mensaje...

Primero, debemos asegurárnos de que OpenCV no está instalado...desinstalándolo...a menos que estén seguros de que funciona correctamente...

sudo apt-get uninstall opencv

Luego, debemos instalar los siguientes pre-requisitos...

sudo apt-get install build-essential cmake pkg-config yasm python-numpy

sudo apt-get install libjpeg-dev libjpeg8-dev libtiff5-dev libjasper-dev 
libpng12-dev

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev 
libv4l-dev libdc1394-22-dev

sudo apt-get install libxvidcore-dev libx264-dev libxine-dev libfaac-dev

sudo apt-get install libgtk-3-dev libtbb-dev libqt4-dev libmp3lame-dev

sudo apt-get install libatlas-base-dev gfortran

sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev 
libtheora-dev libxvidcore-dev x264 v4l-utils

Si por alguna razón, algo no está disponible en su sistema, simplemente remuevánlo de la lista e intenten otra vez...a menos que sean como yo y quieran pasar horas tratándo de conseguir todo...

Ahora, debemos descargar el código fuente de OpenCV para que podamos construírlo...desde el código fuente...

wget https://github.com/opencv/opencv/archive/3.4.0.zip
unzip opencv-3.4.0.zip //This should produce the folder opencv-3.4.0

Luego, debemos descargar las contribuciones porque hay cosas que no vienen incluídas con OpenCV por defecto...y quizás quieran utilizarlas en algún otro proyecto...

wget https://github.com/opencv/opencv_contrib/archive/3.4.0.zip
unzip opencv-contrib-3.4.0.zip 
//This should produce the folder opencv_contrib-3.4.0

Como tenemos las dos carpetas, podemos comenzar a compilar...

cd opencv-3.4.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE 
-D CMAKE_INSTALL_PREFIX=/usr/local 
-D INSTALL_PYTHON_EXAMPLES=OFF 
-D CMAKE_CXX_COMPILER=/usr/bin/g++ 
-D INSTALL_C_EXAMPLES=OFF 
-D OPENCV_EXTRA_MODULES_PATH=/YourPath/opencv_contrib-3.4.0/modules 
-D PYTHON_EXECUTABLE=/usr/bin/python3.6 
-D WITH_FFMPEG=OFF 
-D BUILD_OPENCV_APPS=OFF 
-D BUILD_OPENCD_TS=OFF 
-D WITH_LIBV4L=OFF 
-D WITH_CUDA=OFF 
-D WITH_V4L=ON 
-D WITH_QT=ON 
-D WITH_LAPACK=OFF 
-D WITH_OPENCV_BIOINSPIRED=OFF 
-D WITH_XFEATURES2D=ON 
-D WITH_OPENCL=OFF 
-D WITH_FACE=ON 
-D ENABLE_PRECOMPILED_HEADERS=ON 
-D WITH_OPENCL=OFF 
-D WITH_OPENCL_SVM=OFF 
-D WITH_OPENCLAMDFFT=OFF 
-D WITH_OPENCLAMDBLAS=OFF 
-D WITH_OPENCV_DNN=OFF 
-D BUILD_OPENCV_APPS=ON 
-D BUILD_EXAMPLES=OFF ..

Tengan mucho cuidado de pasar la ruta correcta para la carpeta opencv_contrib...así que es mejor pasar la ruta completa para evitar cualquier error de compilación...

Y sí...ese es un comándo bastante extenso para un build...y me tomó mucho tiempo hacerlo funcionar...puesto que hay que asegurárse de que todos los parámetros son correctos...

Una vez que hemos terminado, necesitamos compilarlo...puesto que cmake va a preparar la "receta"...

make -j2

Si hay algún error, simplemente hagan esto...y comiencen otra vez...

make clean
make

Luego, podemos finalmente instalar OpenCV con estos comandos...

sudo make install
sudo ldconfig

Para pobrar que está funcionando correctamente...simplemente debemos hacer esto...

python3
>>>import cv2


Si no tienen ningún error...entonces estamos listos para continuar -;)

Eso fué bastante trabajo...en fín...necesitamos una herramienta adicional para asegurárnos de que nuestra images es procesada de la mejor manera...

Debemos descargar textcleaner y ponerlo en la misma carpeta que nuestro script de Python...

Y...en caso de que se estén preguntándo...sí...vamos a hacer que Cozmo tome una foto...vamos a procesar la imagen...usar SAP Leonardo's OCR API y luego hacer que Cozmo nos lea el mensaje...emocionánte, no?
SAP Leonardo's OCR API aún está en la version 2Alpha1...pero fuera de eso...funciona extremadamente bien -;)

Aunque tomen en cuenta que si el resultado no es siempre el más acertado es porque la luz, la posición de la imagen, tu escritura y por el hecho de que el OCR API aún está en Alpha...

Ok...así que primero lo primero...necesitamos una pequeña pizarra...


Y claro...mi escritura a mano no es la mejor del mundo... -:(

Ahora, saltemos al código fuente...


CozmoOCR.py
import cozmo
from cozmo.util import degrees
import PIL
import cv2
import numpy as np
import os
import requests
import json
import re
import time
import pygame
import _thread

def input_thread(L):
    input()
    L.append(None)

def process_image(image_name):
 image = cv2.imread(image_name)
 
 img = cv2.resize(image, (600, 600))
 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
 blur = cv2.GaussianBlur(img, (5, 5), 0)
 denoise = cv2.fastNlMeansDenoising(blur)
 thresh = cv2.adaptiveThreshold(denoise, 255, 
                 cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
 blur1 = cv2.GaussianBlur(thresh, (5, 5), 0)
 dst = cv2.GaussianBlur(blur1, (5, 5), 0)
 
 cv2.imwrite('imggray.png', dst)
 
 cmd = './textcleaner -g -e normalize -o 12 -t 5 -u imggray.png out.png'
 
 os.system(cmd) 

def ocr():
 url = "https://sandbox.api.sap.com/ml/ocr/ocr"
 
 img_path = "out.png"
 
 files = {'files': open (img_path, 'rb')}
 
 headers = {
     'APIKey': "APIKey",
     'Accept': "application/json",
 }
 
 response = requests.post(url, files=files, headers=headers)
 
 json_response = json.loads(response.text)
 json_text = json_response['predictions'][0]
 json_text = re.sub('\n',' ',json_text)
 json_text = re.sub('3','z',json_text)
 json_text = re.sub('0|O','o',json_text) 
 return json_text

def cozmo_program(robot: cozmo.robot.Robot):
 robot.camera.color_image_enabled = False
 L = []
 _thread.start_new_thread(input_thread, (L,))
 robot.set_head_angle(degrees(20.0)).wait_for_completed()
 while True:
  if L:
   filename = "Message" + ".png"
   pic_filename = filename
   latest_image = robot.world.latest_image.raw_image
   latest_image.convert('L').save(pic_filename)
   robot.say_text("Picture taken!").wait_for_completed()
   process_image(filename)
   message = ocr()
   print(message)
   robot.say_text(message, use_cozmo_voice=True, 
                                       duration_scalar=0.5).wait_for_completed()
   break

pygame.init()
cozmo.run_program(cozmo_program, use_viewer=True, force_viewer_on_top=True)


Analicemos un poco el código fuente...

Vamos a utilizar threads (hilos), puesto que necesitamos tener una ventana donde podamos ver lo que Cozmo está viendo y otra con Pygame donde podamos presionar "Enter" como un comando para hacer que Cozmo tome la foto.

 Basicamente, cuando ejecutamos la aplicación, Cozmo va a mover su cabeza y entrar en modo de imagen...luego, si presionamos "Enter" (En el terminal) va a tomar una foto y enviarla a nuestra función de procesamiento de OpenCV.

Esta función va a simplemente tomar la imagen, cambiar su tamaño, convertirla a escala de grises, hacer un GaussianBlur para distorcionar la imagen y remover el ruido y reducir el detalle. Luego vamos a aplicar denoising para deshacernos del polvo y el brillo...aplicar un threshold para separar los pixels blancos y negros, y aplicar un par más de distorciones...

Finalmente vamos a llamar a textcleaner para remover aún más ruido y hacer que la imagen sea más clara...

Así que, aquí está la foto original tomada por Cozmo...


Esta es la imagen luego de nuestro post-procesamiento en OpenCV...


Y finalmente, esta es nuestra imagen luego de utilizae textcleaner...

Finalmente, una vez que tenemos la imagen tal como la queremos, podemos llamar al OCR API lo cual es bastante secillo y directo...

Para obtener el API Key, simplemente vamos a  https://api.sap.com/api/ocr_api/overview y nos legeamos...

Una que obtenemos una respuesta del API, podemos hacer una pequeña limpieza con Regular Expressions solo para asegurárnos de que no hay ninguna letra que ha sido incorrectamente identificada...

Finalmente, podemos hacer que Cozmo nos lea el mensaje en voz alta -;) Y solo para propósitos de demostración...


Aquí, tuve la suerte de que la luz y todo lo demás estaban perfectos...así que obtuve una respuesta muy limpia...las pruebas sucesivas fueron bastante malas -:( Pero, nuevamente...es importante tener buena iluminación...

Por supuesto...quieren ver un video del proceso en acción, no? Bueno...aunque suene gracioso...mi primer intento fué perfecto! Aún mejor que este...pero no tome el video -:( Las prubeas sucesivas fueron bastante malas hasta que pude conseguir also razonable...y eso es lo que van a ver...el sol entrándo por la ventana no me ayudo mucho...pero de todos es bastante bueno...


Espero que les haya gustado este blog-:)

Saludos,

Blag.
SAP Labs Network.

Monday, May 21, 2018

The Blagchain



Últimamente, he estado aprendiendo sobre Blockchain y Ethereum. Dos temas bastante interesántes y actuales...pero como dicen...la mejor manera de aprender es haciendo...así que me puse a trabajar en el Blagchain.

Entonces, que es Blagchain? Basicamente, es una pequeña aplicación Blockchain que tomas algunas cosas de Blockchain y otras cosas de Ethereum y fué creado como algo educacional...en el Blagchain puedes obtener un usuario, crear o un producto o comprarlo y todo será almacenado en una estructura en cadena...

Antes de ir a las imagenes...vamos a hablar un poco sobre la tecnología que elegí para este proyecto...

Existen muchas tecnologías disponibles...así que escoger la correcta siempre es complicado...a la mitad del proyecto, puedes darte cuenta de que no...esa no fué la decición más acertada...algún otro lenguaje puede ayudarte a hacer las cosas más rápido y mejor...o quizás aquella característica en especial no está disponible y no lo sabías porque nunca antes la habías necesitado...

Cuando comencé a aprender acerca de Blockchain y Ethereum...sabía que quería escribir Blagchain utilizándo una interface web...así que los primeros lenguages que vinieron a mi mente estaban fueran de la discusión...basicamente porque no tienen interface web o porque sería realmente complicado crear una aplicación web utilizándolos...además, también quería un lenguaje con pocas dependencias  y de instalación y extensión sencillas...quería un lenguaje sencillo pero potente y veloz...y fué así...casi de inmediato sabía cual era el lenguaje que tenía que utilizar...

Crystal es similar a Ruby pero más veloz...y elegante -;) Además...tiene a Kemal, un framework web parecido a Sinatra.

Cuando descubrí Crystal estaba impresionado por lo bien que está diseñado...especialmente porque...aún está en Alpha! Como un lenguaje tan joven puede ser tan bueno? No lo entiendo...pero Crystal es realmente impresionante...

En fín...veamos como trabaja Blagchain...

Por supuesto...no es una dapp...pero eso está bien porque solo vamos a usarlo de manera local...utiliza dos aplicaciones web que funcionan en puertos diferentes...uno trabajando como servidor y el otro trabajando como cliente...


Puedes agregar un nuevo producto...


Pueden ver aquí que tenemos un Genesis Block, un nuevo block porque hemos posteado un producto (Y estan conectados via el Previous Hash) y también puede ver que cada transacción cuesta 0.1 Blagcoin...


Ahora, podemos utilizar otro browser para crear un nuevo usuario...


Como este usuario no creo el producto el/ella...puede comprarlo...y agregar una nueva transacción a la cadena...


El dinero (Blagcoin) va de una cuenta a la otra. La cadena crece y todo queda registrado...


Que pasa cuando no tenemos suficiente Blagcoin para comprar algo?


Bueno...si te gustan este tipo de cosas...aquí están la cantidad de líneas que me tomo hacer la aplicación...

Blagchain.cr (Parte Servidor) --> 129 lineas
BlagchainClient.cr (Parte Cliente) --> 125 lineas
index.ecr (HTML, Bootstrap y JQuery) --> 219 lineas

Así que ni siquiera 500 lineas de código para toda la aplicación...impresionante, no? -;)

Y claro...se que aunque sea quieren ver un poco del código fuente, no? Bueno...por qué no? -:)

BlagchainClient.cr
post "/sellArticle" do |env|
  user = env.params.body["user"]
  article = env.params.body["article"]
  description = env.params.body["description"]
  price = env.params.body["price"]
  amount = (env.session.float("amount") - 0.1).round(2)
  env.session.float("amount", amount)
  HTTP::Client.post("http://localhost:3000/addTransaction", form: "user=" + user + 
                    "&article=" + article + "&description=" + description + "&price=" + price)
  env.session.bool("flag", true)
  env.redirect "/Blagchain"
end

Saludos,

Blag.
SAP Labs Network.

Wednesday, January 17, 2018

Wooden Puzzle - Mi primer juego en Amazon Sumerian

Si leyeron mi post anterior blog Amazon Sumerian - Primeras impresiones sabrán que no iba a parar ahí -;)

He podido jugar bastante con Sumerian y lo más importante...aprender mucho...los tutorials son muy buenos así que deberían leerlos así no tengan acceso a Sumerian aún...

Una cosa que simpre quize hacer...era animar mi modelo de Cozmo...que hice en Blender...


Inténte hacerlo en Blender (con rigging y haciendo la animación pero estaba funcionando de manera extraña puesto que funcionaba bien en Blender pero no en Sumerian...y ahora se porque...pero en su momento me frustré bastante) pero fallé...así que pensé hacerlo en Sumerian utilizándo sus herramientas...

Debo admitirlo...al inicio no funcionó...pero luego seguí explorándo y me di cuenta de que el Timeline era mi amigo...después de muchas pruebas e intentos...logré hacerlo funcionar -;)

Así es como se vé...


Así que vayan a Cozmo y hagan click en el robot para comenzar la animación y luego hagan click otra vez para reiniciar la animación...

Simple pero muy alucinante -:)

Luego de eso...comencé a pensar en hacer algo más...algo más interesánte y esta vez utilizándo algo de programación...la cual es en realidad JavaScript y no NodeJS como pensé en un inicio -:(

En fín...intenté hacer eso una vez en Unity y otra en Flare3D pero no tuve mucha suerte...aunque para ser sinceros...en esas épocas no conocía Blender...así que puse a trabajar en esto...


Diseñé un tablero de Wooden Puzzle utilizándo Blender y luego lo importe a Sumerian y le apliqué un Mesh Collision...de esa manera...la pelota puede avanzar por el tablero y caerse si es que hay un hueco...

Así es como se vé...




Para jugar...simplemente utiliza los cursores del teclado para mover el tablero y guiar a la pelota desde "Start" hasta "Finish". Presionando "r" reiniciamos el juego.

Aquí está el enlace para poder jugarlo "Wooden Puzzle"...

Fué difícil de hacer? No realmente -:) Sumerian es impresionante y bastante potente...encima de todo eso...el equipo de Sumerian es muy bueno y siempre están deseosos y dispuestos a ayudar...

Hasta ahora...mi experiencia con Sumerian no ha sido más que pura alegría y satisfacción...así que ya veo haciendo más y más proyectos...

Por supuesto...Ya estoy trabajándo en un par más -;) Especialmente uno que involucra al Oculus Rift...pero eso de hecho me va a tomar más tiempo....puesto que necesito hacer mucho trabajo con Blender..

Ya has probado Sumerian? Aún no? Por qué no vas y solicitas acceso?

Saludos,

Blag.
Development Culture.

Friday, December 22, 2017

Amazon Sumerian - Primer impresiones

Para aquellos que me conocen y para aquellos que no...como trabajo como Developer Evangelist...mi trabajo principal es aprender, explorar y evangelizar nuevas tecnologías y lenguajes de programación...y por supuesto...AR/VR han estado en mi bandeja desde hace un buen tiempo...

He jugado con Unity3D y Unreal Engine...y por supuesto he desarrollado parael Google Glass, Microsoft HoloLens y Oculus Rift...

Cuando los buenos muchachos de Amazon anunciaron el Amazon Sumerian podrán suponer que estaba totalmente emocionado -:D

Así que ayer, finalmente fuí aceptado dentro del Beta Programa, así que como era de esperárse comencé con un par de tutoriales para poder conocer la herramienta -;)

Por favor tomen en cuenta que recién estoy empezándo...así que no he probado o inténtado de todo...quiero ir paso a paso siguiendo los tutoriales y tratándo de entender todo de la forma más positiva posible...

He mencionado ya que Sumerian funciona en el browser? Qué tan loco es eso? No hay que instalar nada...solo lanzar tu browser y empezar a construir experiencias AR/VR...

Cuando lo lanzas por primera vez, vas a ver la siguiente pantalla...



Donde puedes crear una nueva pantalla o simplemente utilizar una plantilla.

Sumerian provee muchos tutoriales, y hasta el momento solo he seguido los primeros 3...


Así que, así es como se ve mi cuarto de TV...


Como pueden ver...Sumerian es un editor completo y complejo que provee todas las herramientas que puedes encontrar en otros editores...además de muchas más que yo pienso que son completamente nuevas y excitantes...

Por supuesto, puedes echar un vistazo para ver como va tu aplicación...


Con el tutorial del cuarto de TV...la idea es que debajo de la pantalla de televisión, hay un Amazon Echo, así que puedes hacerle click para cambiar los vidos que son presentados en la pantalla. Para esto necesitas utilizar un State Machine y también crear un script que va a controlar los diferentes videos. Para la parte de scripting debemos utilizar NodeJS...lo cual es muy bueno puesto que es el lenguage que uso principalmente cuando tengo que desarrollar aplicaciones para Alexa...



Así es como se ve mi cuarto de TV cuando está mostrándo un video en Render Mode -:)


Antes de seguir aprendiendo Sumerian...debo decir que el sistema de navegación no parece ser muy bueno aún...puedes utilizar los botones del mouse, Tab y Shift...pero las direccionales del cursor o AWSD no parecen funcionar como se esperaría en Unity3D o Unreal Engine...les he enviado esta pregunta al equipo de Sumerian Team en Slack...Así que voy a actualizar este post apenas tenga una respuesta -:)

*UPDATE* Siguiendo con el tutorial de "Lights and Camera" descubrí que mientras que la camara por defecto no permite una navegación fina...el FlyCam si lo hace! -:D Todo bien en el vecindario -;)

Hasta la próxima,

Blag.
Development Culture.

Tuesday, May 02, 2017

Blender Arte en Lego para el HoloLens

Este blog fue posteado originalmente en Blender Lego Art for HoloLens.


A quién no le gustan los Legos? Y si han usado Blender antes…a quién no le gusta Blender? -:)

Combinar ambos parecía una excelente idea, así que es fué lo que hice…Utilizándo Blender cree unas simples piezas de Lego que pueden ser utilizadas para construir modelos simples y complejos.


Una piece simple mide 0.25 por 0.25 y esta hecha con un simple vertice. En la imagen, los colores se usan simplemente para demostrar que las piezas son distintas.

El punto principal es simplemente crear un nuevo archivo en Blender, agregar las diferentes piezas y comenzas a construir.

Al inicio es un poco complicado puesto que tienes que tratar con coordenadasX, Y y Z…pero una vez que te acostumbras…se vuelve un poco adictivo -:)


Ahora, el nombre del blog es Arte en Lego, no? Entonces…si en vez de eso buscas en internet Pixel Art, vas a encontrar muchas imágenes interesántes…como esta…


El candidato perfecto para ser construído en Lego! Poniendo las piesas en orden y simplemente asignándoles el material correcto…podemos obtener esto…


Y con un poco más de tiempo y dedicación…podemos hacer esto…



En fín…con una colección de modelos…podemos pensar un poco y utilizárlos en una aplicación para el Microsoft HoloLens -;)

La aplicación en si es bastante sencilla…comienzas viendo a los modelos en una repisa…puedes seleccionar uno, hacerlo más pequeño, grande, girárlo a la derecha o izquiera o simplemente regresar a la vista de la repisa.

Aquí hay un video para que vea más o menos de que se trata.



Saludos,

Blag.
Development Culture.






Wednesday, March 29, 2017

Room with a View – HoloLens, Unity3D y Blender


Este blog fue posteado originalmente en Room with a View – HoloLens, Unity3D and Blender.





Desde el mes pasado más o menos he estado iluminándome con un impresionante curso de Blender…y aunque tenía algo de experiencia adquirida tras haber leído varios libros…nada podía traerme al punto en el que estoy como este curso…así que…sin nada más que decir…este curso es altamente recomendado 🙂

Entonces…uno de los retos was crear algo utilizándo solamente primitivos…esto significa…cubos, esferas, conos y demás…nada complicado…no modificadores…no experiencia previa…así que finalmente hice esto…


Era un buen comienzo…pero sabía que necesitaba algo más…además de utilizar texturas claro está 🙂 Se veía bastante simple…así que el siguiente paso era hacerlo más interesánte visualmente…y terminé haciendo esto…


Ahora…se ve bastante interesánte, no? Todo creado a mano en Blender -;)

Así que…el siguiente paso era determinar que hacer con esto…se veía muy bonito como para simplemente dejarlo descanzándo en mi disco duro…así que empecé a pensar y luego recordé que la Holographic Academy tiene un interesánte demo llamado Origami...en este demo tienes que seleccionar una pelota de origami que se va a resbalar por un avión de papel y luego chocar con un ventilador que va a explotar y este a la vez va a abrir un hueco en el piso donde un impresionante mundo subterráneo puede ser visto…realmente impresionante si me lo preguntan…entonces…tenía una idea 🙂 Por que no tener un cuadro del d-shop que explota cuando es seleccionado y luego abre un hueco en la pared donde el cuarto que diseñe en Blender puede ser visto?…eso para mi sonaba como una demo impresionánte…así que eso es exactamente lo que hice 😉

Aquí está el video para que lo disfruten…espero que les guste 🙂




Al inicio pensé que iba a ser mucho trabajo…pero no lo fué tanto realmente…aquí hay algunos puntos importantes…

* Encerré el cuarto en una caja negra con un agujero para que pueda ser visto por adentro…

* En Unity3D simplemente utilizé un Unlit shader…como el color negro es procesado como invisible en HoloLens, tener el modelo en una caja negra que no esta iluminada da la impresión de que es invisible…por lo tanto…se ve como un hueco en la pared…

* Utilicé spatial mapping para poder ajustar el cuadro y el cuarto en la pared…para que no aparezca volando en el espacio pero más bien como si hubiera un cuarto dentro de la pared…

* Cuando importé el modelo de Blender a Unity3D la primera vez…ninguna de mis texturas estaba disponible…lo cual me pareció muy extraño…puesto que estaban ahí y estaban realmente asignadas…resulta que necesitaba escoger cada parte del modelo y hacer un…para que el shader sepa como implementar la textura…

* Al principio hice pruebas con el emulador…el cual es muy bueno…pero realmente no implementa la misma unidad de medida que se utiliza en el dispositivo físico…así que mientras que se vería bien en el emulador…se veía muy lejos en el HoloLens…así que necesité hacer muchas pruebas para poder tenerlo en la posición correcta…

* Para filmar el video, al inicio intenté utilizándo Camtasia…pero por supuesto…el rendering no era lo que yo estaba esperándo…una cosa es verlo por el HoloLens y otra cosa es verlo por la laptop…así que en vez de eso hice una grabación del Live Streaming en el mismo HoloLens…y ese era el truco…

Como pueden imaginarse…esto trae un nuevo mundo de posibilidades y demos…

Ahora es su turno de mostrárnos…que es lo que ustedes pueden hacer 😉

Saludos,

Blag.
Development Culture.

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.

Tuesday, February 14, 2017

LED es mi nuevo Hello World - Tiempo de Prolog

Como lo prometí...aquí está mi aplicación de Números LED escrita en Prolog...me tomó bastante tiempo...bastante investigación...muchos dolores de cabeza...así que espero que les guste...aun soy un completo novato en Prolog...así que...no hay ningún tipo de garantía -;)

LEDNumbers.pl

number(0,[[' _  '],['| | '],['|_| ']]).
number(1,[['  '],['| '],['| ']]).
number(2,[[' _  '],[' _| '],['|_  ']]).
number(3,[['_  '],['_| '],['_| ']]).
number(4,[['    '],['|_| '],['  | ']]).
number(5,[[' _  '],['|_  '],[' _| ']]).
number(6,[[' _  '],['|_  '],['|_| ']]).
number(7,[['_   '],[' |  '],[' |  ']]).
number(8,[[' _  '],['|_| '],['|_| ']]).
number(9,[[' _  '],['|_| '],[' _| ']]).

digits(0,[]).
digits(X,[H|T]) :- (X/10 > 0 -> H1 is floor(X/10), H is X mod 10, digits(H1,T)), !.

accRev([],A,A).
accRev([H|T],A,R) :- accRev(T,[H|A],R). 

getDigits(L,R) :- digits(L,Y), accRev(Y, [], R).

show_records([]).
show_records([A|B]) :-
  print_records(A), nl,
  show_records(B).  

print_records([]).
print_records([A|B]) :-
  format('~w',A), 
  print_records(B).

merge([L], L).
merge([H1,H2|T], R) :- maplist(append, H1, H2, H),
    merge([H|T], R), !.

listnum([],[]).
listnum([H1|T1],[R|Y]) :- number(H1,R), listnum(T1,Y).

led(X) :- getDigits(X,Y), listnum(Y,Z), merge(Z,R), show_records(R).

Quieren verlo en acción? Yo también -;)


A seguir aprendiendo -;)

Saludos,

Blag.
Development Culture.

Mi primer post en Prolog

Como siempre...estaba buscando el próximo lenguaje de programación que quieo aprender...y de alguna manera...Prolog se metió en el camino...

Ya había jugado con Programación Lógica en el pasado cuando aprendí Mercury...pero realmente...cuando se trata de lógica...Prolog se gana el premio...

Ustedes sabían que el primer compilador de Erlang se construyó en Prolog? Yo tampoco -:P

Para aprender...Estoy utilizándo SWI-Prolog que parece ser el mejor y más usado...y debo admitirlo...me encanta -;)


Así que...a simple vista...Prolog me recuerda a Mercury obviamente...pero también un poco a Forth...y extrañamente a Haskell en el sentido de que la recursividad es un elemente muy importante...

Como sucede generalmente cuando aprendo un nuevo lenguaje de programación...Empecé con mi aplicación de lista de números Fibonacci...así que aquí está...

fibonacci.pl
fibo(NUM,A,B,[H|T]) :- (NUM > 1 -> H is A + B, X is NUM - 1, 
                        (A =:= 0 -> fibo(X,H,B,T); fibo(X,H,A,T))).
fibo(_,_,_,[]).

fibonacci(NUM,R) :- fibo(NUM,0,1,X), !, append([0,1], X, R).

extensión .pl? Sip...la misma que Perl...pero como pueden ver...no tiene nada que ver como Perl -;)

En fín...aquí está el resultado...


Mi aplicación de Números LED está felizmente terminada y van a poder verla justo después de este blog -;)

Saludos,

Blag.
Development Culture.

Monday, December 05, 2016

LED es mi nuevo Hello World - Tiempo de Rust

Como actualmente estoy aprendiendo Rust, tenía que publica mi aplicación de números LED otra vez -;)

Por favor tomen en cuenta...que..."Estoy aprendiendo Rust"...así que código puede ser flojo, redundante y nada idiomático...pero...suficiente para mostrar el lenguaje y permitirme aprender más -;)

Aquí está el código...

led_numbers.rs
use std::io;
use std::collections::HashMap;

fn main(){
 let mut leds:HashMap<&str, &str> = HashMap::new();

 leds.insert("0", " _  ,| | ,|_| ");
 leds.insert("1", "  ,| ,| ");
 leds.insert("2", " _  , _| ,|_  ");
 leds.insert("3", "_  ,_| ,_| ");
 leds.insert("4", "    ,|_| ,  | "); 
 leds.insert("5", " _  ,|_  , _| ");
 leds.insert("6", " _  ,|_  ,|_| ");
 leds.insert("7", "_   , |  , |  ");
 leds.insert("8", " _  ,|_| ,|_| ");
 leds.insert("9", " _  ,|_| , _| ");

 println!("Enter a number : ");
 let mut input_text = String::new();
 io::stdin().read_line(&mut input_text)
            .expect("failed to read");

 let split = input_text.split("");
 let vec: Vec<&str> = split.collect();
 let count = &vec.len() - 2;
 
 for i in 0..3{
  for j in 0..count{
   match leds.get(&vec[j]){
    Some(led_line) => { 
     let line = led_line.split(",");
     let vec_line: Vec<&str> = line.collect();
     print!("{}",&vec_line[i]);
     },
    None => println!("")
   }
  }
  print!("");
 }
 println!("");
}

Y aquí está el resultado...


Espero que les guste y si pueden mostrarme una manera más Rusty de hacer las cosas...por favor me avisan -:D

Saludos,

Blag.
Development Culture.