Showing posts with label dshop. Show all posts
Showing posts with label dshop. Show all posts

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.

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, August 09, 2016

Microsoft HoloLens en el SAP’s d-shop

Este post fué posteado originalmente en Microsoft HoloLens on SAP’s d-shop.


Una de las metas principales del SAP’s d-shop es recolectar, aprender y compartir conocimientos en las últimas tecnologías y el Microsoft HoloLens no ha estado fuera de nuestro radar -;)

Pero…que es HoloLens?


HoloLens es un dispositivo de Mixed Reality…que es basicamente una mezcla de Virtual (Oculus Rift) y Augmented (Google Glass) Realities.

Una de las capacidades más importantes del Mixed Reality es que te permite crear Hologramas que pueden ser mezclados con el mundo real e interactuar con el.

HoloLens hace un mapeo de tu cuarto y puede reconocer que tienes una mesa de café, un sofá, una lámpara, y demás…cuando posicionas tus Hologramas en la mesa o en el sofá, el Holograma no va pasar a través de el, más bien va a "sentarse" encima…y esto te permite hacer cosas asombrosas como crear una Holograma de una lampara que va a ser posicionada al costado del sofá para ver como se vería. Y este es solo uno de los múltiples casos de uso que el HoloLens puede proporcionar.

En el d-shop Silicon Valley, creemos que utilizar y programar el HoloLens es una experiencia asombrosa.

Así que…que necesitas para comenzar a programar y crear experiencias asombrosas?

En esta página encontrarás todas las herramientas que necesitas, las cuales incluyen Visual Studio, una versión a la medida de Unity3D y el emulador del HoloLens.

Además, también sería excelente para ti echarle un vistazo a los videos del Holographic Academy…los cuales te guía a través de los conceptos básicos de la programación en HoloLens…

Pero…con este blog queremos mostrarte un video con algunos de los demos/proyectos que hemos creado en el d-shop Silicon Valley.

Word Clock Con esta aplicación, puedes literalmente leer la hora -;) Esto demuestra el de texo en Unity y fué adaptado de una aplicación escrita en Python.

d-shop Robot Esta aplicación utiliza un model del robot del d-shop diseñado utilizándo Blender. Esto demuestra el uso de Spatial Mapping y comandos simples de voz.

SAP Puzzle Game Esta aplicación muestra un juego de rompecabeza deslizable que tiene dos modos…fácil y dificil…demuestra como recortar una imagen y distribuirla en multiples cubos, también demuestra el uso de comandos de voz simples y física.

HoloHouse Esta aplicación es un proyecto diseñado para un banco en Dubai para ser utilizado como aplicación de Bienes Raices. Los modelos fueron diseñados utilizándo 3ds Max por una compañía externa. Esta aplicación demuestra el uso del Scripting en Unity para rotar las casas, decolorar las luces, levantar el techo y los pisos de las casas y mostrar señalizaciones.




Ahora que has visto lo que se puede hacer en un par de semanas…por que no te unes a nosotros en el d-shop y nos muestras que es lo tú puedes hacer! -:D

Saludos,

Blag.
Development Culture.

Monday, September 28, 2015

Amazon Alexa y Philips Hue

Este post fué posteado originalmente en Amazon Alexa and Philips Hue.



Si eres un empleado de SAP, por favor siguenos en Jam.


Desde que llegó el Amazon Alexa al d-shop aquí en SAP Labs Silicon Valley...estaba buscándo la forma de hacerla interactuar con diferentes cosas...así que hace un par de días mi buen amigo y colega Aaron Williams me preguntó sobre el Philips Hue...

Al inicio...no estaba seguro de que fuera a funcionar, porque como todo el mundo sabe...el Hue necesita estar en la misma red para poder trabajar...y Amazon Lambda está en un servidor quien sabe donde...así que comenzé a investigar...

Cuando utilizamos el app de Amazon Alexa podemos enlazar el Hue para permitirle a Alexa prender o apagar las luces...pero nada más...

Debemos ir a Settings --> Connected Home --> Discover Devices (Te va a pedir que presiones el botón en el Hue Bridge).

Por supuesto...esto no era suficiente para mi...así que seguí pensándo en esto y me di cuenta de que "Hey!...el app de Philips Hue funciona cuando quieres cambiar el color de las luces...y lo hace de forma remota...así que debe de haber una manera de hacerlo"...

Afortunadamente...encontré este blog...Philips Hue Remote API Explained...donde el autor basicamente explica como puedes "engañar" al Hue para hacerle pensar que te estás conectándo desde tu IPhone...entonces...estás haciendo una conexión remota...un genio si me lo preguntan -;)

Para que esto funciones debemos crear una cuenta en meethue...si solo nos logeamos con nuestra cuenta de Google no va a funcionar...por lo menos no me funcionó a mí...


Por cierto...si encuentras algo como esto a final "%3D" simplemente cambialo por "="

Teniendo ambos el BridgeId y el AccessToken deberíamos estar listos para continuar -;)

Debemos crear una Función y un Skill...por favor vean este blog Amazon Alexa y SAP HANA para poder crearlas...

La función se va a llamar getLights y el skill Lights. El nombre de invocación será "lights".

Aquí esta el Interaction Model que vamos a utilizar...

Intent Schema
{
  "intents": [
    {
      "intent": "GetLightsIntent",
      "slots": [
        {
          "name": "color",
          "type": "LITERAL"
        }
      ]
    },
    {
      "intent": "HelpIntent",
      "slots": []
    }
  ]
}

Sample Utterances
GetLightsIntent color {red|color}
GetLightsIntent color {blue|color}
GetLightsIntent color {green|color}
GetLightsIntent color {pink|color}
GetLightsIntent color {purple|color}
GetLightsIntent color {aqua|color}
GetLightsIntent color {white|color}
GetLightsIntent color {yellow|color}
GetLightsIntent color {black|color}

HelpIntent help
HelpIntent help me
HelpIntent what can I ask you
HelpIntent get help
HelpIntent to help
HelpIntent to help me
HelpIntent what commands can I ask
HelpIntent what commands can I say
HelpIntent what can I do
HelpIntent what can I use this for
HelpIntent what questions can I ask
HelpIntent what can you do
HelpIntent what do you do
HelpIntent how do I use you
HelpIntent how can I use you
HelpIntent what can you tell me
HelpIntent how do i change colors

Ahora...lo más importante es el código -:P

Vamos a crear una carpeta y la llamaremos “Lights” o algo así…luego creamos una carpeta llamada “src”. Copiamos el código que esta aquí...y creamos un archivo llamado “AlexaSkills.js”

Vamos a necesitar instalar el paquete request para nuestra función, así que hagamos esto en el terminal

sudo npm install --prefix=~/Alexa/Lights/src request

Esto va a crear una carpeta llamada “node_modules” con el paquete es nuestra carpeta del proyecto…luego creamos un archivo llamado “index.js” y copiamos y pegamos el siguiente código…

index.js
var request = require("request")
  , AlexaSkill = require('./AlexaSkill')
  , APP_ID     = 'YourAPPId'
  , TOKEN = 'YourAccessToken';

var error = function (err, response, body) {
    console.log('ERROR [%s]', err);
};

var getJsonFromLights = function(color,callback){
switch(color){
 case 'red':
  x = 0.674; y = 0.322; break;
 case 'green':
  x = 0.408; y = 0.517; break;
 case 'blue':
  x = 0.168; y = 0.041; break;
 case 'white':
  x = 0.3227; y = 0.329; break;
 case 'yellow':
  x = 0.4317; y = 0.4996; break;
 case 'purple':
  x = 0.2725; y = 0.1096; break;
 case 'orange':
  x = 0.5562; y = 0.4084; break;
 case 'pink':
  x = 0.3944; y = 0.3093; break;
 case 'black':
  x = 0.168; y = 0.041; break;    
 case 'aqua':
  x = 0.2858; y = 0.2747; break;
 default:
  x = 0.3227; y = 0.329; break;
}

var options = { method: 'POST',
                url: 'https://www.meethue.com/api/sendmessage',
                qs: { token: TOKEN},
                headers: { 'content-type': 'application/x-www-form-urlencoded' },
                body: 'clipmessage={ bridgeId: "YourBridgeId", 
                                     clipCommand:  {url:"/api/0/lights/1/state", 
                                     method: "PUT", body: {xy:[' + x + ',' + y + ']}}}' };

var error_log = "";

request(options, function (error, response, body) {
 if (!error) {
  error_log = color;
 }else{
  error_log = "There was a mistake";
 }
 callback(error_log);
    });
}

var handleLightsRequest = function(intent, session, response){
  getJsonFromLights(intent.slots.color.value, function(data){
 var text = 'The color has been changed to ' + data;
    var cardText = 'The color has been changed to ' + intent.slots.color.value;

    var heading = 'The color has been changed to ' + intent.slots.color.value;
    response.tellWithCard(text, heading, cardText);
  });
};

var Lights = function(){
  AlexaSkill.call(this, APP_ID);
};

Lights.prototype = Object.create(AlexaSkill.prototype);
Lights.prototype.constructor = Lights;

Lights.prototype.eventHandlers.onSessionStarted = function(sessionStartedRequest, session){
  console.log("onSessionStarted requestId: " + sessionStartedRequest.requestId
      + ", sessionId: " + session.sessionId);
};

Lights.prototype.eventHandlers.onLaunch = function(launchRequest, session, response){
  // This is when they launch the skill but don't specify what they want.

  var output = 'Welcome to Hue Lights. Please say a color';

  var reprompt = 'Which color would you like?';

  response.ask(output, reprompt);

  console.log("onLaunch requestId: " + launchRequest.requestId
      + ", sessionId: " + session.sessionId);
};

Lights.prototype.intentHandlers = {
  GetLightsIntent: function(intent, session, response){
    handleLightsRequest(intent, session, response);
  },

  HelpIntent: function(intent, session, response){
    var speechOutput = 'Change your Hue Light to any color. Which color would you like?';
    response.ask(speechOutput);
  }
};

exports.handler = function(event, context) {
    var skill = new Lights();
    skill.execute(event, context);
};

Cuando está listo...simplemente comprimimos la carpeta node_module,  y los archivos AlexaSkills.js y index.js en un archivo .zip llamado Lights.zip y lo subimos a Amazon Lambda...

Para llamar a este skill en Alexa...podemos hacer lo siguiente...
  • Alexa, turn on lamp 1 (Tomándo en cuenta que la luz se puede llamar de otra manera)
  • Alexa, ask lights for color blue
  • Alexa, turn off lamp 1
Pueden ver los colores disponibles en el código...pero por siacaso deberían ser...
  • Red
  • Green
  • Blue
  • Aqua
  • Pink
  • White
  • Black
  • Yellow
  • Purple
  • Orange

Y por supuesto...aquí está el video  -:D


Saludos,

Blag.
Development Culture.

Thursday, September 24, 2015

Únete al Geeky Thursday en Octubre

Qué es Geeky Thursday?

Es un evento que sucede cada Jueves de la semana. Una hora y un poco más de una sesión "hands-on" donde lenguajes de programación no muy comunes (ej: Lua, Julia, R, Haskell) y Paradígmas de Programación (Funcional, Basado en Stack, Lógico, Orientado a Objetos) son presentados.

Por qué Geeky Thursday?

Porque desarrolladores...porque saber solo unos cuantos lenguajes de programación no es suficiente...porque aprender otro paradígma puede expandir tus horizontes y hacerte un mejor desarrollador.

Geeky Thursday es hands-on...necesito my laptop?

Bueno...en realidad depende de ti...el código fuente va a estar disponible...va a ser explicado y ejecutado en vivo...no va a ver codificación en vivo...pero siempre es mejor si puedes compilar y ejecutar los códigos por ti mismo...

Geeky Thursday es sólo acerca de Programación?

No...sin ánimos de querer crear un "Brown Bag Session"...Geeky Thursday intenta convertirse en un espacio de "Mini Meetup"...donde cosas interesántes y novedosas pueden ser exploradas.

Es el Geeky Thursday dado sólo en el Silicon Valley?

Por ahora...sí lo es...pero...si tu or tu manager están en contacto con un manager del d-shop, pidele que se ponga en contacto conmigo (a.tejada.galindo@sap.com)...estaré más que feliz de compartir mis diapositivas y ayudar a expandir Geeky Thursday en otras locaciones.

Hay alguna limitación en cuanto a espacio?

Sí, podemos invitar hasta 10 personas de SAP y tenemos espacio para 5 personas que sea externas a SAP. Dependiendo del nivel de asistencia podríamos aumentar este límite.

Puedo yo presentar un Geeky Thursday?

Por supuesto! Estás más que invitado! Solo ponte en contacto conmigo y te asignaré una fecha!

Geeky Thursdays Programados

R Programming Language --> Octubre 8 de 1:00 a 2:00pm (d-shop en Edificio 9 en SAP Labs Silicon Valley)

Para Empleados de SAP

https://jam4.sapjam.com/groups/sh2Kp26QQkHwkMPFAEqAD9/events/K7BJsIiucH7XjLszzcO0Eh

Para Externos a SAP

https://www.eventbrite.com/myevent?eid=18783268261

R es un lenguaje de programación y entorno de software para computación estadística y gráficos.

Puedes descargar R en https://cran.r-project.org/

Puedes descargar RStudio en https://www.rstudio.com/

Julia Programming Language --> Octubre 25 de 1:00 a 2:00pm (d-shop en Edificio 9 en SAP Labs Silicon Valley)

Para Empleados de SAP

https://jam4.sapjam.com/groups/sh2Kp26QQkHwkMPFAEqAD9/events/5FieiznXF6EgaGfg34qKdd

Para Externos a SAP

https://www.eventbrite.com/myevent?eid=18783317408

Julia es un lenguaje dinámico de alto nivel diseñado para resolver los requerimientos de computaciones científicas y de alto performance numérico siendo al mismo tiempo efectivo para programación de propósito múltiple, tanto como para programación web y lenguaje de especificación.

Puedes descargar Julia en http://julialang.org/

Clojure Programming Language --> Octubre 29 de 1:00 a 2:00pm (d-shop en Edificio 9 en SAP Labs Silicon Valley)

Para Empleados de SAP

https://jam4.sapjam.com/groups/sh2Kp26QQkHwkMPFAEqAD9/events/RoZ8dId4NGqxzWCys2hMN4

Para Externos a SAP

https://www.eventbrite.com/myevent?eid=18783402663

Clojure es un lenguaje de programación dinámico que apunta a la Máquina Virtual de Java (y el CLR, y JavaScript). Está diseñado para ser un lenguaje de propósito multiple, combinándo la interoperabilidad y fléxibilidad de un lenguaje script con la eficiencia y e infraestructura robusta de la programación de hilos múltiples. Clojure es un dialecto de Lisp, y comparte con Lisp la filosofía de "El código es data" y el poderoso systemas de macros.

Puedes descargar Clojure en http://clojure.org/

Saludos,

Blag.
Development Culture.