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.

lunes, 4 de abril de 2016

Empezando a construir el controlador PID

Después de tomar la decisión de optar por la base del controlador en calcular varios centroides de la imagen, nada más que hay que ponerse manos a la obra.

Se han calculado 4 centroides de 4 zonas de la imagen adyacentes unas con las otras:

Desde el principio de la imagen hasta el 60% del alto de la imagen. Desde el 60% hasta el 70% de la imagen, del 70% al 80% de la imagen y del 80% de la imagen al final de ésta.

Hay que decir, que únicamente se calculan los centroides de la carretera principal que se sigue, es decir, la de mayor área, que cuando el robot la está siguiendo es la que tiene a sus pies.

A partir de los centroides, nos quedamos con su posición en el ancho de la imagen, y se realiza una media ponderada con pesos, donde se premia la posición más cercana al robot; y se penaliza la más lejana, la parte de la carretera que está más cerca del horizonte.

A partir del centroide general, se calcula el error, que es la referencia menos el centroide genral. La referencia se ha puesto como mitad de la imagen, es decir 320 ya que el ancho de la imagen es de 640.

Únicamente se ha calculado la parte proporcional del controlador, que está en función del giro máximo que se quiere dar y de la referencia y de un factor que es el que se va a modificar. Todo esto se multiplica del error obtenido.

En el siguiente video se puede ver el recorrido del robot con una velocidad constante de 0.3, dónde únicamente está el giro en función del controlador P. Es la primera prueba realizada dónde el robot da la vuelta completa por primera vez.



Como se puede ver en el vídeo. hay un momento dónde el robot se pierde aunque se recupera instantáneamente. Por lo demás se puede ver que en general el robot no oscila mucho salvo después de alguna curva.

El tiempo de recorrido del robot es de 8 minutos aproximado, es un tiempo muy (pero que muy) alto, que se ajustará con un controlador en un futuro. Hay que tener en cuenta que el robot a recorrido el circuito a menos de un tercio de su velocidad, por lo que construyendo el controlador de velocidad se espera disminuir en gran cantidad esa velocidad sin afectar al giro.

También, como siguiente paso se realizará la componente D (derivativa) del controlador para el giro y evitar las oscilaciones que en ocasiones se producen y mejorar el controlador del robot.

Seguimos trabajando.


martes, 29 de marzo de 2016

Práctica 'follow line'

Esta práctica consiste en que nuestro robot (un pioneer) bajo el simulador Gazebo, siga una línea en un circuito de fórmula uno, más concretamente, el circuito de Montmeló utilizando de herramienta un único sensor de visión, una cámara.

En la figura 1 se puede ver una vista aérea del circuito.

Figura 1: vista aérea del circuito


Se tiene como finalidad programar un PID para el funcionamiento del robot en Python.

Pero vayamos por partes, lo primero será realizar el preprocesado de las imágenes. Dado que únicamente se va a utilizar una (la cámara izquierda) de las dos cámaras que tiene el robot, únicamente se hará el procesado con la cámara que se va a utilizar.

El procesado consiste en pasar la salida del sensor al espacio de color HSV, para poder quedarnos únicamente con la parte roja de la pista, que es lo que se va  seguir. Cuando se tiene únicamente la pista, dado que el sensor puede captar varias partes del circuito distintas, nos quedaremos con la que sea de mayor área, como se puede ver en la figura 2.

Figura 2: Salida del sensor e imagen procesada


En función de la información que nos interesa que capta el sensor y que se puede extraer, ya se puede programar el robot.

El primer problema que se resolvió ha sido el de buscar la linea si se pierde, para ello se busca contornos sobre la imagen procesada, si no encuentra nada, que gire en función de buscar la línea para seguirla.

El siguiente problema a resolver es en qué se basa el robot para seguir la linea. La primera idea de programar el robot se basaba en  partir la imagen en dos, y contar la cantidad de píxeles rojos de cada mitad. Si en una mitad había más píxeles que en la otra, es que nos encontrábamos en una curva. El primer obstáculo que nos encontramos al utilizar este método es que el robot no va a estar en medio de la línea, ya que la cámara está en un lado del robot, no está centrada, por lo que eso supone que al tomar curvas cerradas el robot se va a salir de la línea.

Por lo que se ha decidido utilizar los centroides para hacer al robot que siga la línea.



miércoles, 3 de febrero de 2016

Entorno de trabajo: Hecho ✔

Gazebo y jderobot: Configurado

El primer paso para poder trabajar en las prácticas es tener el entorno de trabajo preparado.

Para ello se ha seguido el tutorial: http://jderobot.org/Programacion-de-drones

Donde se ha optado por instalar jderobot y gazebo en una distribución ubuntu 14.04 en lugar de instalar la máquina virtual que se proporciona.

Tras la instalación se puede lanzar un mundo de prueba como se puede ver en la imagen siguiente:




Se prueba la cámara y se tiene en funcionamiento correctamente ✔





miércoles, 27 de enero de 2016

Sobre el blog, sobre mí


Soy Beatriz Gómez. Nacida en Cuenca en el año 1992.


Gradudada en ingeniería de sistemas audiovisuales de Telecomunicación por la Universidad de Castilla La Mancha en el año 2015.


Actualmente soy estudiante del Máster Oficial de Visión Artificial por la Universidad Rey Juan Carlos.


Este blog va dedicado enteramente a la realización del seguimiento de las prácticas de la asignatura Visión Robótica del máster de MOVA.