Archivo etiqueta Slam

Conociendo coordenadas reales con Kinect

Hola!
En el marco del proyecto de SLAM que estamos desarrollando en este grupo de investigación (Ver aquí), les mostraré un extracto del trabajo en proceso.

Kinect nació como un periférico para la consola de juegos Xbox 360 de Microsoft. Llegaba dispuesto a cambiar la forma de jugar a los videojuegos, transformándonos en el «mando» con el que controlar a los personajes y demás movimientos virtuales, con movimientos corporales.
Rápidamente, dado su éxito, este dispositivo ha ampliado sus horizontes, convirtiéndose en un sistema de visión artificial muy utilizado por investigadores de todo el mundo, para lo cual la propia Microsoft decidió lanzar un SDK (software development kit) para facilitar el desarrollo de aplicaciones basados en Kinect.
Cuenta con una cámara RGB, un sensor de profundidad y un micrófono, que nos proporciona mucha información.

De las imágenes tomadas con la cámara RGB, podemos conocer las coordenadas “virtuales” de un punto (pixel) visible, como se muestra a continuación:
Visión Kinect

Además de estos datos, el Kinect nos otorga información sobre la profundidad de cada pixel (depth), gracias a su cámara infrarroja.
De esta manera, utilizando trigonometría, podemos calcular las coordenadas reales del punto reflejado en cada pixel.
Tomando como ejes cartesianos las rectas perpendiculares que pasan por el centro geométrico de la imagen, obtenemos las coordenadas virtuales en 2 dimesiones (Xo;Yo) del plano de la imagen.

Para esto, conociendo los ángulos de visión del Kinect y las medidas –en pixeles- de la imagen, podemos calcular a qué ángulo corresponde cada pixel.
El ángulo de cada pixel se calcula así: 57º/Width = xAngle; y 43º/Height = yAngle. Por lo que multiplicando por Xo e Yo respectivamente, obtenemos los ángulos en X e Y (desde el centro) del punto virtual, que coincidirá con los ángulos del punto real.
Una vez obtenidos estos ángulos, y conociendo la distancia real al punto en cuestión: Depth (proporcionada por el Kinect), calculamos las coordenadas del punto real.
Zr = Depth;
Estos valores se pueden obtener gracias a las razones trigonométricas que surgen de un triángulo rectángulo. En particular que: tan(«ángulo») = Opuesto / Adyacente

Triángulo rectángulo

En nuestro caso, consideramos que la cámara (Kinect) se encuentra en el vértice correspondiente al ángulo «tita» (ángulo que ya hemos calculado), y también conocemos la distancia del lado “Adyacente” (Depth), por lo que la única incógnita por calcular es la distancia del lado “Opuesto”, que corresponderá a la distancia real de nuestro punto desde el centro de la imagen o visión de la cámara (coordenadas reales: Xr e Yr).
Xr = Tg(xAngle) x Depth;
Yr = Tg(yAngle) x Depth;

, , ,

No hay Comentarios

SLAM: Preparando el ER1

Hola a todos!
Anteriormente «Tera» les había contado sobre el proyecto de su tesis doctoral, que tratará sobre SLAM (Leer aquí).
Pensando en ello, estamos preparando lo que va a ser el robot base del proyecto: el ER1 (que alguna vez nos donó Microsoft). El mismo estaba sin uso hace un largo tiempo porque se había roto la placa controladora, así que tuvimos que diseñar una nueva.

Por lo tanto solo usaremos el chasis y los motores del robot original.
ER1

El manejo de los motores no fue fácil, ya que son unos paso a paso que funcionan a solo 2,4V, pero con un consumo alto de 2,8A, lo que producía demasiada temperatura para los controladores de motores que solíamos utilizar, y se ponían tan calientes que no había disipador/cooler que lo enfriara debidamente.
En consecuencia, tuvimos que implementar un regulador de voltaje que maneja mayor corriente que un simple LM7805; se trata del LM338 que soporta hasta 5A de consumo.
El control de los motores lo haremos con una placa Arduino Uno (aunque tal vez mas adelante la reemplacemos por nuestra propia «Mendieta«)

En la parte superior del chasis del ER1 fijaremos el Kinect, para lo cual hemos diseñado en SketchUp e impreso en nuestra impresora 3D, la pieza adaptadora, la que podrán observar en las siguientes entradas del tema.

Con estos avances apuntamos a cumplir la primera parte del proyecto, que tiene como objetivo específico: «Desarrollar la estructura, mecánica, electrónica y suministro de energía de un robot que transporte una notebook, un sensor de profundidad por infrarrojo y una cámara (kinect).»

Muy pronto les seguiremos contando los avances del proyecto, así que estén atentos.
Saludos,

Gabriel

, ,

No hay Comentarios