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.