viernes, 19 de junio de 2015

Reconstrucción 3D

El objetivo de la segunda práctica de la asignatura es hacer una reconstrucción 3D valiéndonos del par estéreo con el que viene equipado nuestro robot. Se posee la información de calibración de las cámaras.



El primer paso que se hace, debido a restricciones de procesamiento, es una reducción de la cantidad de pixeles que tomaremos en cuenta para hacer la reconstrucción. En este caso se hizo esto utilizando un detector de bordes de Canny, aunque se podría haber utilizado FAST u otro tipo de puntos de interés.



Se registran todos los puntos de borde de la imagen izquierdad y vamos uno por uno ejecutando el siguiente algoritmo:

  1. Se retroproyecta el pixel al espacio, obteniendo un punto de la recta que pasa por todos los puntos del espacio que proyectan a ese pixel.
  2. Buscamos un segundo punto dentro de esta recta, como por ejemplo un punto intermedio entre el centro óptico de la cámara y el punto que obtuvimos retroproyectando.
  3. Proyectamos ambos puntos (3D) a la cámara derecha.
  4. Se resuelve la ecuación de la recta para este par de puntos en la imagen de la cámara derecha. Con esto podemos obtener la recta que junta estos dos puntos, la cual sería nuestra línea epipolar.
  5. Se crean dos máscaras: una que representa nuestra restricción epipolar y otra que representa una restricción de proximidad. Para validar que un punto en la imagen izquierda corresponde a otro punto en la imagen derecha se debe cumplir tanto que ese punto este sobre la línea epipolar como que se encuentre en una coordenada cercana. La aplicación de estas restricciones dan como resultado una lista de puntos candidatos a ser pareja del punto seleccionado.
  6. A continuación se toma un parche de la imagen centrado en el punto que estamos estudiando y se compara mediante correlación con parches centrados en cada uno de los puntos candidatos y se toma el punto que obtiene la mejor correlación (siempre y cuando sea una correlación lo suficientemente alta)
  7. El punto obtenido se retroproyecta al espacio, con lo cual podemos obtener otra recta con todos los puntos del espacio que proyectan sobre este pixel.
  8. Buscamos el punto en el que la distancia entre estas dos rectas es menor y se toma el punto intermedio entre ambas líneas. Este será nuestro punto de reconstrucción.
  9. Junto a ese punto en 3D se registra también el color del píxel en la imagen izquierda.
  10. Finalmente se dibujan todos los puntos obtenidos en el 3D, con su color.


En este caso las cámaras del robot se encuentran en configuración canónica, por lo que todas las líneas epipolares son horizontales, a la misma altura que el pixel que estamos estudiando. Sin embargo el algoritmo trabajaría exactamente igual con una configuración distinta de cámaras.

El tiempo de reconstrucción es alto, aproximadamente 45 segundos. El cálculo de las líneas epipolares toma un tiempo considerable, por lo que se recomienda hacer una rectificación de la imagen derecha para garantizar que nuestras epipolares siempre serán horizontales y ahorrar cálculo.

Otra mejora posible es que se reconstruyen puntos falsos detrás del robot. Esto se debe a que al buscar el punto en el que la distancia entre las rectas de retroproyección es mínimo no se está haciendo una restricción de distancia entre las rectas.

Control visual - One more time

El control visual implementado anteriormente en el robot resultó dar malos resultados cuando se cambiaba el sentido de circulación en la pista y actuar de forma inesperada en algunas casos, por lo que se rehizo el control visual, esta vez con un controlador PD para controlar el giro y un control por casos para la aceleración.

Para el control de giro se tomó la franja inferior de la imagen y se calculó su centro de masas.

Para el control de velocidad se tomó una franja vertical de 30 píxeles de grosor y desplazada a la izquierda para compensar la posición de la cámara. Se calcula el porcentaje de píxeles blancos (camino) en esta franja y se decide según este porcentaje en cual de los 4 casos cae el control, cada uno correspondiente a una velocidad constante.





Este sistema implementado logra mejores resultados que el anterior tanto en estabilidad como en velocidad, logrando hacer el circuito en aproximadamente 2:40 en ambos sentidos.

jueves, 9 de abril de 2015

Control visual con JdeRobot

JdeRobot es un framework para desarrollo de aplicaciones de robótica y visión artificial. Junto a Gazebo nos permite simular robots que interactúan con un escenario 3D.

Como primera práctica para familiarizarnos con el entorno se ha desarrollado un control visual PID para un robot terrestre que recorre autónomamente una modelo del circuito Montmeló. El robot utilizado en la simulación es un robot Pioneer, que cuenta con un sensor láser para estimar profundidad, además de un par estéreo de cámaras. En este caso, como queríamos que nuestro control fuera solamente visual 2D, se utilizó únicamente una de las cámaras.

Lo primero que se hizo fue tomar varias imágenes de muestra del escenario para saber como veía el robot una recta, una curva abierta, una curva cerrada o una chicana. Con estas imágenes se determinó en donde estaba la información que nos interesaba.


Como las cámaras vienen configuradas en un par estéreo la imagen no se encuentra centrada, así que se recortó la imagen por la izquierda para tratar de obtener un mejor punto de referencia central. Con las imágenes de rectas se determinó hasta que altura veía el robot el camino para recortar el exceso hacia arriba. También se eliminó un poco más por arriba para que los segmentos de pista que se empiezan a ver cuando se llega a una curva tampoco influyeran en el control visual.

Ya que se tiene una imagen con la información que nos interesa se hace un filtrado para quedarnos solo con el camino. Como teníamos una línea roja de guía la forma más fácil de hacer esto es llevar la imagen de entrada al modelo de color HSV y filtrar el matiz rojo.


A esta imagen se le calcula el centro de masa (el punto que se ve en el centro) y se utilizan sus coordenadas (x,y) como entradas de los controladores.

Para controlar al robot se implementaron dos controles independientes:

  • Control P para la velocidad, que usa como error la diferencia entre la coordenada 'y' del centro de masa de la imagen y una coordenada de referencia (la coordenada 'y' del centro de masa de la imagen cuando el robot se encuentra en una línea recta).
  • Control PID para el ángulo, que en este caso utiliza como error la diferencia entre la coordenada 'x' del centro de masa de la imagen y la coordenada 'x' del centro de masa en una línea recta.


Esta simulación se está ejecutando sobre una máquina virtual y no se ejecuta en tiempo real, por lo que parece que va mas lento de lo que en realidad va. El robot hace el circuito en aproximadamente 2:50. El control visual aún se puede mejorar mucho más.