Presentación

Este blog ha sido crado para la asignatura de Visión en Robótica del máster de Visión Artificial. El objetivo principal es ir subiendo los avances que vaya haciendo en las prácticas de esta asignatura. Tenemos tres prácticas que hacer. La primera es la práctica 0 en la que hay que instalar Gazebo y los componentes GazeboServer e Introrob del software JdeRobot que serán con los que trabajemos. En la práctica 1 hay que hacer el seguimiento de una línea de color con una sóla cámara y en la práctica 2 se realizará una reconstrucción 3D mediante un sistema estereoscópico.

viernes, 22 de marzo de 2013

Práctica 1

La práctica 1 consiste en programar un robot para seguir una línea azul. Concretamente el robot es un pioneer 2dx equipado con dos cámaras, aunque sólo podemos usar la izquierda. Por lo que nuestra información de entrada es algo como esto.


Lo primero que he hecho ha sido un filtro del color azul sobre los canales RGB, pero sólo de la mitad inferior de la imagen, ya que esto hace que el tiempo de cómputo sea menor y quita el cielo directamente. En vez de usar sólo un umbral por canal, tal y como venía en el ejemplo de MyAlgorithms.cpp, he usado dos. El resultado es el siguiente.


Como el resultado es muy bueno, he decidido no hacer (por lo menos de momento) el filto sobre los canales HSV, ya que tendría que transformar la imagen a este espacio de color y eso lleva consigo un cómputo extra. Sin embargo si se quisiese llevar la aplicación a un entorno más real, con cambios de iluminación, el filtro tendría que hacerse en el espacio HSV, ya que es más robusto a estos cambios.

Para controlar del robot, de momento e implementado dos sistemas reactivos, uno para la velocidad de avance y otro para el giro. El primero contiene una línea vertical centrada en el medio  y que cuenta el número de píxeles que se encuentran dentro de la línea a seguir (son de color blanco). La velocidad del robot es proporcional a este número de píxeles. Por lo tanto, el sistema de control no es proporcional a un error, sino al "acierto".
El segundo contiene dos líneas horizontales que se encuentran a la misma altura. Empiezan en cada uno de los dos extremos de la imagen y terminan en el punto donde se cortan con la línea vertical.  El sistema consiste en contar el número de píxeles de estas líneas que pertenecen a la línea a seguir (píxeles blancos) y restarlos entre ellos. Por lo que el error en este control reactivo sería la diferencia de píxeles entre el lado derecho y el izquierdo. De esta forma se mide cuánto esta el robot desviado hacia uno de los lados respecto a la línea a seguir.
Las líneas que miden el número de píxeles son las que se muestran en rojo en la siguiente imagen (aunque no se ve en la imagen, cada línea llega hasta los laterales izquierdo, inferior y derecho de la imagen).



El robot tarda un poco más de 4 minutos y medio en dar una vuelta al circuito. Los resultados obtenidos con este sistema pueden verse en el siguiente vídeo, en el que se ve al robot haciendo una parte del circuito (hasta que se me cierra introrob).



No se si se ve muy bien pero en las curvas hacia la izquierda se desvía un poco del centro de la línea a seguir. Ésto se debe a que la cámara que usamos es la izquierda y las líneas que extraen información de la imagen están centradas en la imagen. Por lo tanto tengo que desplazarlas un poco hacia la derecha.
El siguiente paso será subir la velocidad a la que se mueve el robot, ver hasta dónde puede llegar y convertir el sistema de control en un sistema PD o PID para mejorarlo.











No hay comentarios:

Publicar un comentario