Wednesday, September 09, 2015

Fuego! (BeagleBone Black, WebCam, Missile Launcher y OpenCV)

Este post fué posteado originalmente en Firing Up (BeagleBone Black, WebCam, Missile Launcher and OpenCV).



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


Mi buen amigo John Astill vino a visitarnos al d-shop hace algún tiempo…y vió el Thunder Missile Launcher que compré como un regalo de navidad Christmas para la cena de mi equipo. El me dijo…”Blag…deberías hacer una aplicación que hace que el lanza misiles dispare cuando pones un color u objeto en frente de la camara”…eso me dejó pensándo por supuesto -;)

Así que John…este post es para ti...

Así que, vamos a comenzar…

Vamos a necesitar tener el OpenCV instalado…así que la manera regular debería funcionar…

sudo apt-get install opencv

Y OpenCV debería estar instalado y listo para usarse…

Después…necesitaba hackear el Missile Launcher para poder hacer que dispare…así que aquí es donde la diversión comienza…conecté el Missile Launcher a mi Linux en VMWare he hice un comando lsusb -vv para obtener la información del dispositivo USB…


Aquí podemos ver que el IdVendor es 0x2123 y que el idProduct es 0x1010. Esto en realidad no ayuda en nada puesto que no sabemos cual es la información que debemos pasar para hacer que esto funcione…así que el siguiente paso es "olfatear" el dispositivo para poder obtener los comandos USB…para esto utilicé el SnoopyPro un USB Sniffer para Windows…y me di cuenta de que no podía hacerlo funcionar bien en Windows 7, así que tuve que utilizar mi querido y ya viejo Windows XP en VMWare…e instalar el Dream Cheeky software...


Una vez que tuve el SnoopyPro ejecutándose, tuve que conectar el Missile Launcher y presionar en File --> Unpack Drivers…


Luego, tuve que buscar el IdVendor y IdProduct correctos y presionar click derecho y seleccionar Install and Restart.


Esto nos permite registrar todo lo que pasa cuando utilizámos el dispositivo USB. Por defecto, por lo menos para el Missile Launcher…va a hacer un log de 14 líneas que realmente no nos interesan mucho…pero cuando presionamos por el ejemplo el botón Up…entonces obtenemos información más interesánte…


Esto nos dice basicamente que para hacer que el lanza misiles se mueva para arriba, debemos pasar lo siguiente…

0x02 0x02 0x00 0x00 0x00 0x00 0x00 0x00

Ahora…la parte que nos interesa es la de disparar…así que vamos a explorarla…


Esta es

0x02 0x10 0x00 0x00 0x00 0x00 0x00 0x00

Perfecto!…ahora nos estamos acercándo…pero…hay una parte que nos está faltándo…como enviamos este comando? Fácil…solo debemos ver el comándo de transferencia…


Este comándo nos dice que debemos pasar la información así…

0x21 0x09 0 0

Seguido de la acción que queremos realizar…

Para poder utilizar este dispositivo en nuestro BeagleBone…debemos instalar algo primero…

pip install pysub

Esta librería nos permite conectárnos y más importánte, enviar comándos al dispositivo.

Como vamos a utilizar el lanza misilies y la camara, ambas al mismo tiempo…necesitamos un Hub USB con corriente externa…de otra manera, nunca va a funcionar…yo compré este de Amazon.

Así que…conectamos el Hub USB y conectamos la camara Web y el lanza misiles, conectamos el Hub al BeagleBone Black y luego conectamos el BeagleBone a nuestra laptop…

Utilicen Nano u otro editor de su preferencia y creen el archivo Thunder.py

Thunder.py
import cv2
import numpy as np
import usb.core

cam = cv2.VideoCapture(-1)
cam.set(3, 960)
cam.set(4,720)
s, img = cam.read()

dev = usb.core.find(idVendor=0x2123,idProduct=0x1010)
try:
            dev.detach_kernel_driver(0)
except Exception, e:
            pass

winName = "Thunder"
cv2.namedWindow(winName, cv2.CV_WINDOW_AUTOSIZE)
while s:
        s, img = cam.read()
        key = cv2.waitKey(10)
        if key == 27:
                cv.destroyWindow(winName)
                break
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
              lower_green = np.array([38, 100, 50])
              upper_green = np.array([75, 255, 255])

        mask = cv2.inRange(hsv, lower_green, upper_green)
        res = cv2.bitwise_and(img,img, mask=mask)
        cv2.imshow(winName, res)

        if cv2.countNonZero(mask) > 61000:
                dev.ctrl_transfer(0x21, 0x09, 0, 0,
                                  [0x02, 0x010, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])


Este código va a basicamente abrir la conexión de la camara, y mostrar un fondo negro para que solo el color que queremos sea mostrado. En este caso, queremos disparar el lanza misilies solamente cuando veamos algo “verde”. Como pueden ver estamos pasándo el comándo de transferecia como un parámetro simple pero el comando de fuego como un arreglo.

Ahora…el BeagleBone no tiene una pantalla…así que puedes agregar un monitor y un teclado o puedes hacer algo más interesánte y astuto…

Vamos a instalar el Tight VNC Server

sudo apt-get install tightvncserver

La primera vez que lo ejecutas, te va preguntar por un password para el usuario actual, así que proporcionale uno…

Y va a comenzar a ejecutarse…así que vamos a poder abrir una conexión de escritorio remoto para nuestro BeagleBone…ahora solo necesitamos un cliente para poder conectarnos...

Si estás utilizándo Windows puedes descargar el cleinte TightVNC de aquí…

http://www.tightvnc.com/download/2.7.10/tightvnc-2.7.10-setup-64bit.msi

http://www.tightvnc.com/download/2.7.10/tightvnc-2.7.10-setup-32bit.msi

Si estás utilizándo Linux simplemente puedes descargarlo utilizándo apt-get install así…

sudo apt-get install xtightvncviewer

Ejecútalo en el terminal...

Solo debes proporcionar el IP de tu BeagleBone que debería de ser 192.168.7.2:1 en la pequeña pantalla que va a aparecer, provee el password que creaste para el VNCServer en la pantalla siguiente y estaremos listos…




Si estás utilizándo Windows…simplemente haz doble click en el tightvnc-jviewer.jar e introduce la siguiente información…




Para poder probar esto, solo necesitamos imprimir una bonita caja verde…


Luego, podemos ejecutar la aplicación…


Y poner la caja verde en frente de la camara -;)


Disculpen por la foto media movida…pero el lanza misiles estaba disparándo y tenía mi celular en una mano y la hoja con la caja verde en la otra -;)

Saludos,

Blag.
Development Culture.

No comments: