miércoles, 25 de mayo de 2016

Mejorando la reconstrucción

A partir del último punto en el cual se quedó la reconstrucción se han hecho varios avances, para empezar, se muestra la reconstrucción en color.

Se ha cambiado el umbral. En la siguiente imagen se puede ver la reconstrucción en color sin un umbral:


Uno de los umbrales con los que se ha probado se obtienen 5 mil correspondencias de 7mil puntos que tienen los bordes y se obtienen los siguientes resultados:



 

No se llega a preciar bien la reconstrucción, pero si que se nota que hay menos puntos que son ruido como los que salían del foco. A continuación se va a mostrar la reconstrucción con los puntos en negro porque creo que se aprecia mejor.



En conclusión, se en comparación con el post anterior la reconstrucción se hace en los ejes correctamente y no al revés, además de la reconstrucción en color.





martes, 24 de mayo de 2016

Continuamos con la reconstrucción

Para mejorar y que funcione se han hecho varios cambios en el código que se irán detallando uno a uno a continuación.

 Para empezar, el cálculo de puntos característicos se ha sustituido por utilizar los bordes de la imagen, ya que también son puntos característicos. Los motivos principales del cambio es que no se obtienen puntos característicos suficientes y que los puntos característicos de la imagen derecha no coincidían con los de la izquierda, por lo que se obtendría error al hacer la reconstrucción.

Los bordes se han calculado con canny y lo que se obtiene se puede ver en la siguiente imagen.

Que son un total de 7mil puntos en la imagen derecha y 7 mil puntos en la imagen izquierda.

Antes, para buscar correspondencias se utilizaba la ssd, pero probando, se ha decidido utilizar la función norm de opencv. Se obtienen al rededor de 7 mil correspondencias.

También se ha mejorado la búsqueda en la línea epipolar, el problema residía en que progeo nombra de manera diferente a python las filas y columnas en puntos.

Habiendo corregido estos y otros pequeños fallos se procede a hacer la reconstrucción, obteniéndose el siguiente resultado:



Como se puede ver en la imagen, la reconstrucción me sale del revés y no consigo obtener la combinación de [x,y,z] que consiga dibujarlos bien. También hay que cambiar el umbral en el calculo de puntos característicos ya que se muestran muchos puntos que son ruido y por último se va a tratar de mostrar los puntos en color.

Además de esas futuras mejoras, se va a modificar el umbralizado de canny para obtener más puntos bordes para hacer una reconstrucción más densa.

Continuamos trabajado.

jueves, 5 de mayo de 2016

Primer intento de reconstrucción.

Recordamos que la finalidad de esta práctica es realizar una reconstrucción 3D a partir de un escenario que es el siguiente:


Las decisiones y pasos que se han seguido para el desarrollo de la práctica son los siguientes:

1. Para ello, la primera decisión que se ha tomado es cómo obtener los puntos característicos de  la imagen. He decidido utilizar el algoritmo de FAST, por las ventajas que nos contaron en la charla de autolocalización. Los puntos característicos se obtienen del ambas imágenes, y son un total de 1242 puntos en la imagen izquierda y 1306 de la imagen derecha. En la siguiente figura está representado en el visor los puntos 2D que se captan de la imagen (siento que la imagen no se vea bien, pero no consigo llegar a manejar bien los movimientos de las vistas del visor). A primera vista parece que es una densidad suficiente de puntos.



2. El siguiente paso es buscar la correspondencia de un punto de la imagen izquierda entre los de la imagen derecha. Para ello se utiliza un tamaño de bloque de 22x22, es un tamaño grande, tarda más en computar pero es más preciso. Más adelante se reconsiderará el tamaño de la vecindad. Para restringir más la búsqueda se calcula la línea epipolar correspondiente en la imagen derecha del punto característico izquierdo, a la linea epipolar se le da un poco de holgura, buscando los puntos característicos en la franja epipolar. Para comparar los bloques se utiliza la suma de diferencias al cuadrado. Se guardan las correspondencias en una lista. En la siguiente imagen se van a representar las correspondencias obtenidas, es decir, los puntos característicos izquierdos a los cuales se les ha encontrado una correspondencia:


La imagen corresponde a la parte de los cubos, al mini-bowser y al puño del bowser. La imagen está un poco volteada porque no consigo manejar bien las vistas del visorn

3. Cuando se tienen todas las correspondencias, se procede a hacer la triangulación. Para ello se toma el punto característico de una imagen y la posición de esta y por otro lado, el otro punto característico correspondiente y la otra posición de esa cámara, a partir de la dos rectas que forman los puntos de cada cámara correspondientemente, se va a buscar el punto cuya distancia sea mínima entre las rectas, para ello se ha seguido esta expicación que he obtenido gracias a los compañeros. 

Los resultados que obtengo no son buenos, por no decir que no obtengo resultados. Por lo que hay que revisar:

- La parte de buscar correspondencias, ya que no se encuentran todas.
- Corregir la triangulación, ya que las que se han encontrado no son proyectadas.

jueves, 28 de abril de 2016

Práctica 2 - reconstrucción geométrica

En la práctica 2, se va a utilizar el simulador Gazebo con el robot pioneer, utilizando su par de cámaras estéreo y con el robot estático frente a un escenario. Se desea reconstruir la escena en 3D.

Para reconstruir la escena se desean seguir los siguientes pasos:


  • Con un algoritmo de búsqueda de puntos característicos (SIFT, ORB, FAST..) se van a buscar puntos característicos en ambas imágenes.
  • Se va a buscar el homólogo de una imagen en la otra. La búsqueda se hará con una vecindad 11x11 del punto. Para minimizar es espacio de búsqueda y hacer menos pesado el cómputo se va a restringir la búsqueda:


    • Búsqueda en los puntos característicos de la otra imagen
    • Se buscará en la franja epipolar. Para calcular la línea epipolar se calcula el rayo de retroproyección del punto y su proyección en la otra imagen es la linea epipolar. Para darle un poco de holgura dado a que la calibración no es perfecta, se busca en una franja.
  • Se calculan lo parecidas que son la s vecindades con la correlación. El par de puntos que mayor correlación tenga será el candidato.
  • El candidato tiene que superar un umbral que se definirá posteriormente. Si no lo supera se considerará que es ruido. Si no, se puede proyectar en el espacio ese punto.

martes, 26 de abril de 2016

Vuelta en 1' 47"

Se ha mejorado el controlador del robot de tal manera que ahora consigue dar la vuelta en 1 minuto 47 segundos.

En el siguiente vídeo se puede ver el comportamiento del robot dando la vuelta al circuito.



Las mejoras que se han hecho desde la versión anterior ha sido mejorar el controlador de velocidad y añadirle una pila  FIFO que hace de memoria. Esta pila permite cambiar de velocidad una vez que se ha corregido el error.


lunes, 18 de abril de 2016

Práctica 1 - Cerca de los dos minutos

A partir del trabajo realizado anteriormente, se han mejorado varios aspectos del código que permiten que el robot de la vuelta al circuito en 2 minutos 10 segundos. Los tres cambios realizados más importantes son los siguientes:

- Se ha cambiado el pre-procesamiento de  la imagen, de tal modo, que ahora los contornos con los que se juegan son 3 en una parte de la imagen más restringida.

- El controlador de velocidad PID se ha cambiado por un controlador reactivo. Dónde a partir del error se decide qué velocidad debe de tomar.

- Se ha añadido componente derivativa e integral al controlador de giro.

Aquí se puede ver un vídeo del robot dando una vuelta al circuito en un tiempo de 2 minutos 10 segundos.



Seguimos mejorando.

martes, 5 de abril de 2016

Practica 1 - Controlador de velocidad

Recordamos por donde nos habíamos quedado...

Se había construido un controlador que controlaba el giro, este controlador únicamente tenía la parte proporcional. La base del controlador de giro estaba en el cálculo de los centroides y cuánto diferían de la referencia (la mitad de la imagen) en el eje de la x, el ancho de la imagen. Con los ajustes realizados y una velocidad constante de 0.3 se obtenía un tiempo de reloj de 8 minutos, sí, demasiado.

Para ajustar la velocidad se ha construido otro controlador, que también depende de la misma referencia, el centro de la pantalla.

En este caso el error se ha tomado en valor absoluto, nos da igual que la curva sea hacia la derecha o la izquierda (error positivo cuando es mayor que la referencia la posición media ponderada de los centroides, o error negativo cuando el la posición ponderada total de los centroides está a la izquierda de la mitad de la imagen horizontalmente), lo único que se quiere es que cuando haya curva, baje la velocidad para poder girar.

El controlador se ha hecho en función de dos puntos:

- Cuando la desviación sea 320 en valor absoluto, que la velocidad sea 0.2
- Cuando la desviación sea 0, no hay error, que la velocidad sea 1

Esta parte del controlador luego se regula con Kp.

En el siguiente video se puede ver el comportamiento del robot dando una vuelta completa la circuito con los nuevos cambios en un tiempo de reloj de 3 minutos y 50 segundos.



Lo primero que hay que mejorar es la velocidad en las rectas, que lo máximo que alcanza es 0.5 de 1. Hay que añadirle la componente derivativa para que la velocidad sea más constante.

Seguimos trabajando.