El concepto

Antes de empezar a programar nuestra torreta debemos tener claro qué debe hacer, conceptualmente hablando.

Sí, vale, su función será la de disparar a objetivos humanos, pero una descripción tan genérica no nos sirve…

En primer lugar, tenemos una cámara que detecta una imagen. Después la envía al “cerebro” de nuestra torreta que puede ser un ordenador, un portátil, una Odroid o una Raspberry Pi. El “cerebro” analizará la imagen y buscará caras humanas. (al menos en un principio, después podemos cambiarlo a torsos, perros, pájaros, plátanos o lo que queramos).

bananur

Podemos preparar la torreta para reconocer cualquier objeto

Si sabemos en qué posición se encuentran los objetivos dentro de la imagen podemos mover y apuntar las torretas hacia ellos primero calculando la diferencia entre la posición actual (en píxeles) que se encuentran las torretas y el objetivo.

calculo_posicion

Para calcular el desplazamiento restamos el objetivo del origen: (x’-x, y’-y)

Después habrá que convertir estos píxeles a grados con una sencilla regla de tres: si el ancho de la página (digamos 640 px) equivale a 45º (o un valor arbitrario), ¿cuantos grados son 1px? Así pues, para convertir los píxeles de la diferencia a grados, deberíamos utilizar:

regla_tresSin embargo, nuestras torretas tienen un problema: no podemos darles una posición exacta ni un número de grados a rotar. Tampoco podemos saber de antemano la posición de la torreta. “Vaya”, pensarás, “pero Glare, ¿cómo podemos construir una torreta con estas limitaciones?”

Lo que sí se puede hacer es dar la orden de mover, esperar un tiempo, y dar la orden de parada. Si sabemos cuántos grados se mueve por segundo nuestra torreta se puede convertir los grados que hemos calculado anteriormente a segundos.

Para saber la posición de las torretas a cada momento, hay que hacer un “reset” al inicio de cada programa. Movemos la torreta al máximo a la derecha y arriba, y después al centro. Su posición será la [0,0], un array de dos enteros. A cada movimiento actualizaremos este array con la posición de las caras.

Para disparar, como solo tenemos 4 proyectiles, esperaremos a que el objetivo esté quieto.

Así pues, nuestro algoritmo en pseudocódigo made in Robologs sería algo así:

configurar las torretas

resetear torretas

iniciar webcam

funcion principal()
{
   captura Imagen
   buscar Caras
   tiempo = calcular desplazamiento XY

   mover Torretas
   esperar(tiempo)
   parar Torretas

   actualizar posicion Torretas

}

while(!comando_parada)
{
   principal()
}

Es decir: la webcam pasa una imagen al ordenador, que detecta una cara en la posición (225, 177). Las torretas están en la posición (144, 32), por lo que deberán moverse 81 px en el eje X y 145 px en el Y. Convertimos los píxeles a grados y los grados a segundos, guardando el resultado en la variable tiempo (en realidad son dos, una para el tiempo del eje X y otra para el eje Y). Después movemos la torreta, esperamos y damos la orden de parada.

Finalmente actualizamos el array de posición de las torretas con las coordenadas iniciales de la cara detectada: (225, 177). Y volvemos a empezar. Fácil, ¿no?

2 Comentarios

Leave a Reply