Resumen del proyecto 4




descargar 419.67 Kb.
títuloResumen del proyecto 4
página6/14
fecha de publicación28.11.2015
tamaño419.67 Kb.
tipoResumen
med.se-todo.com > Derecho > Resumen
1   2   3   4   5   6   7   8   9   ...   14

2.4Localización mediante visión artificial

2.4.1Introducción


Uno de los defectos que presentaba el robot en su versión inicial era que acumulaba un error en el cálculo de la posición mediante los encoders. Esto suponía que cuando llevaba un tiempo en movimiento terminaba perdiéndose, ya que la posición que calculaba no se correspondía con la posición en la que se encontraba realmente.

Para solucionar este problema existían diversas alternativas. Entre ellas se encuentra la que desarrollamos en nuestro proyecto y que explicamos a continuación.

Se pensó en incorporar una webcam al sistema que fuese complementaria con los encoders en la obtención de la posición y la orientación del robot en cada momento.

Aprovechamos que el techo de las plantas de la facultad y, por tanto, el de la planta que alberga el museo y donde se ubicará en un futuro próximo nuestro robot está formado por placas que forman rectángulos, como podemos ver en las fotos que se muestran debajo:



Fijándonos en las líneas que delimitan las distintas placas es posible calcular la posición y la orientación en la que se encuentra el robot en cada momento a partir de una posición y orientación iniciales de referencia.

En la actualidad existen multitud de robots móviles que están dotados de visión artificial. Sin embargo, la idea de localizarse con la ayuda de líneas en el techo es innovadora, lo que hizo que tuviésemos que llevar a cabo un gran trabajo de investigación y desarrollo.

Pensamos que la mejor opción para la elaboración de esta parte del proyecto era diseñar e implementar un sistema autónomo de navegación. El hecho de que el sistema sea autónomo tiene la ventaja de que se puede utilizar de forma independiente y puede ser integrado en otras arquitecturas en las que resulte útil.

Además, las distintas funciones que utiliza este sistema se ofrecen en forma de API para poder ser usadas de forma independiente por cualquiera que lo considere oportuno. De esta forma no se tiene que utilizar obligatoriamente la aplicación completa, sino que puede utilizarse sólo la parte que sea necesaria. Esto hace que este sistema sea bastante versátil y adaptable a distintos entornos con distintas finalidades.

Una vez que tuvimos claro cuales eran las funcionalidades que debía ofrecer este sistema de localización, el siguiente paso fue pensar que lenguaje utilizaríamos para resolverlo. La elección fue C/C++, ya que es uno de los lenguajes más potentes en la actualidad, además de ser un lenguaje con el que se pueden llevar a cabo tareas de bajo nivel, algo que nos vendrá muy bien para el acceso a la webcam. Otra de las razones para elegir este lenguaje, fue que los anteriores proyectos realizados sobre el robot también lo utilizaban.

Después sentar unas bases iniciales, ya podíamos comenzar con el diseño del sistema. Para mayor claridad y sencillez, dividimos el problema en tres partes bien diferenciadas:

  • Captación de la imagen

  • Preprocesamiento e interpretación de la imagen

  • Cálculo de la posición y la orientación

    En los apartados siguientes se especifican con mayor detalle cada una de ellas.




2.4.2Captación de imágenes


Esta es la tarea de más bajo nivel dentro de la visión por computador. Consiste en capturar imágenes con la cámara y almacenarlas en memoria con una determinada estructura (digitalización) para que posteriormente puedan ser tratadas por los algoritmos necesarios.



En nuestro caso, el objetivo es obtener una imagen cada cierto periodo de tiempo a través de la webcam. Este tiempo no debe ser demasiado pequeño, ya que se sobrecargaría demasiado el sistema. Sin embargo, tampoco puede ser excesivo, porque se podría llevar a perder alguna línea y que el cálculo de la posición y la orientación fuese incorrecto. Por ello, pensamos que la mejor forma de resolverlo, es que este periodo fuese configurable mediante un archivo XML. Así, el sistema es más flexible y robusto y dependiendo de la utilidad que se le quiera dar puede ser configurado de una u otra forma.

El siguiente paso es almacenar la imagen en memoria con una estructura adecuada para que pueda ser procesada. Es importante no olvidarse de eliminarla cuando ya no sea necesaria, pues de lo contrario se podría sobrepasar la capacidad de almacenamiento de la memoria y podrían aparecer problemas.

Una vez tenemos la imagen en memoria el siguiente paso es la aplicación de diversas técnicas para tratar la imagen y conseguir nuestro objetivo. Lo explicamos en el siguiente apartado.

2.4.3Preprocesamiento e interpretación de imágenes


Como ya comentamos anteriormente, nuestro sistema se basa en localizar las líneas que se encuentran en el techo para, a partir de ellas, calcular la posición y la orientación en que nos encontramos. Para conseguir nuestro objetivo es necesario aplicar a las imágenes técnicas de procesamiento tales como filtros, detectores de bordes, cálculos de histogramas,…

Al final de esta etapa, tenemos que tener una estructura donde se almacenen todas las líneas rectas que aparecen en la imagen para que en etapas posteriores seamos capaces de deducir la posición y la orientación actuales.

La visión por computador y más concretamente el tratamiento de imágenes digitales es un campo muy amplio y poco tratado a lo largo de la titulación. Es por ello que tuvimos que llevar a cabo una gran labor investigadora de recopilación de información para poder llegar a proponer una solución a este problema.

En un principio, cuando tuvimos unos conocimientos suficientes para diseñar una primera solución al problema decidimos que para llegar a ella teníamos que seguir los siguientes pasos:

  • Convertir la imagen a escala de grises. Este paso es necesario porque las imágenes en color utilizan 3 matrices para su representación (R, G, B). Cómo en nuestro caso, nos es indiferente el color, trataremos con una imagen en escala de grises que ocupa menos espacio y es más sencillo su tratamiento.

  • Obtener el histograma de la imagen y la varianza asociada a éste (para obtener más información sobre el concepto de histograma consultar Apéndice A) para distinguir entre tipos de imágenes

  • Clasificar la imagen según su varianza. Dependiendo del tipo de imagen, los parámetros elegidos para llamar a las siguientes funciones (umbral de borde, tamaño de matriz de suavizado,…) variarán para así poder ajustarse mejor a las propiedades de la imagen. Después de realizar un estudio exhaustivo con multitud de imágenes tomadas en techos que reunían las características que requiere nuestro sistema llegamos a la conclusión de que existían cuatro tipos principales de imágenes según la varianza de su histograma:

  • Varianza <= 250: Imágenes con poco contraste y que al ser tomadas no les afecta la luz, es decir, no están debajo de ninguna fuente de luz ni lo suficientemente cerca como para que ésta pudiera ser tenida en cuenta.



  • 250 < Varianza <= 2000: Imágenes tomadas cerca de una ventana o de alguna fuente de luz que hace que aparezcan partes de la imagen (en los extremos) muy claras debido a ello. Esto hace que la varianza sea mayor.



  • 2000 < Varianza <= 6900: Imágenes tomadas casi debajo de alguna fuente de luz.



  • Varianza > 6900: Imágenes tomadas debajo de una fuente intensa de luz.



  • Aplicar algoritmos de suavizado a la imagen para reducir el ruido y así facilitar la labor del algoritmo detector de bordes.

  • Modificar el brillo y el contraste de la imagen si fuese necesario.

  • Aplicar un algoritmo de detección de bordes.

  • Detectar y almacenar las líneas rectas que se encuentran en la imagen mediante la transformada de Hough (se puede encontrar más información sobre la transformada de Hough en el Apéndice A).

Este primer diseño fue abandonado al cabo de un tiempo por los problemas que nos causaba en la implementación. El principal problema fue que era un diseño demasiado dependiente de las características de la imagen por lo que había que distinguir multitud de casos y en función de ellos tratar a cada imagen de una forma u otra. Para ello, había que ser muy fino en la clasificación de las imágenes porque existen multitud de casos minoritarios que teníamos que tener en cuenta. Además, muchas imágenes presentaban características tan similares que complicaban su distinción. Por eso pensamos retocar el diseño anterior para hacerlo más robusto y menos dependiente de las características concretas de cada imagen. De esta forma el sistema será más sencillo, por lo que si fuese necesaria su ampliación por personas ajenas al proyecto, éstas no tendrían excesivas dificultades en su comprensión. Esto también ayuda a la localización de errores en caso de que se produjesen, sin olvidarnos de que hacen que la aplicación sea más flexible y versátil.

El nuevo diseño se divide en las siguientes partes:

  • Convertir la imagen a escala de grises

  • Obtener el histograma de la imagen y la varianza asociada a éste para distinguir entre tipos de imágenes. Este paso tiene menos relevancia en este nuevo diseño que en el anterior. Se realiza simplemente para distinguir casos concretos como por ejemplo que nos encontramos debajo de una fuente de luz que podría actuar como baliza absoluta a la hora de calcular la posición y la orientación

  • Aplicar algoritmos de suavizado a la imagen para reducir el ruido

  • Aplicar un algoritmo de detección de bordes. Para este segundo diseño buscamos un algoritmo que fuese menos dependiente de la imagen concreta y donde no hubiese que modificar apenas sus umbrales para distinguir los bordes de forma correcta. Finalmente nos decantamos por el detector de bordes de Canny (puede conocerse más a fondo el funcionamiento de este algoritmo en el Apéndice A)

  • Detectar y almacenar las líneas rectas que se encuentran en la imagen mediante la transformada de Hough. Este paso también se ve influenciado con el nuevo diseño y se hace más sencillo, pues el umbral utilizado será prácticamente el mismo para todas las imágenes.

Asimismo, como ya explicamos en la introducción, para conseguir que nuestro sistema sea lo más independiente posible y que en un futuro pueda ser ampliado o integrado dentro de otros sistemas mayores pensamos en desarrollar un conjunto de funciones básicas para el procesamiento de la imagen que especificamos aquí en forma de API:

  • funHistograma (imagen) » Calcula el histograma de una imagen y su varianza asociada.

  • funUmbrales (imagen) » Clasifica la imagen en función de su varianza y adapta los valores de los umbrales utilizados en funciones posteriores a la imagen en cuestión.

  • funBordes (imagen, umbralCanny1, umbralCanny2) » Forma una imagen con los bordes extraídos de otra mediante el detector de Canny con los umbrales pasados por parámetro.

  • funHough (imagen, umbralHough) » Extrae las ecuaciones de las rectas de la imagen mediante la transformada de Hough y las almacena en una estructura.

  • funDibujarLineas (imagen, rectas) » Dibuja sobre la imagen las rectas extraídas por la función de Hough y calcula la orientación en base a ellas.

  • funPosicion (rectas, referenciaAnterior, rectasAnteriores, orientacionActual) » Devuelve una posición calculada a partir de un punto de referencia y una orientación anteriores y las rectas de la imagen actual.

  • lineaMasCercanaRobot (rectas, rectaReferencia) » Devuelve la línea mas cercana al robot. Opcionalmente se puede pasar una referencia a otra recta, con lo cual se devolverá la siguiente recta más cercana al robot a partir de esa referencia, formando con ella un ángulo de aproximadamente 90º.

  • obtenerRectaSimilar (rectas, rectaReferencia, error) » Devuelve una recta similar a la de referencia, teniendo en cuenta el error pasado por parámetro.

  • obtenerCoeficientesRecta (recta) » Devuelve los coeficientes de la recta de la forma Ax+By+C=0, a partir de los coeficientes polares θ y ρ.

  • bajoFoco () » Devuelve un booleano que indica si estamos bajo un foco o no, y las coordenadas absolutas del foco de luz más cercano al robot.

  • setPosicion (X conocida, Y conocida) » Configura la posición actual del robot a las coordenadas pasadas en los parámetros, reseteando la fiabilidad del algoritmo del cálculo de la posición al 100%.

  • funBrilloContrast (imagen, brillo, contraste) » Modifica el brillo y el contraste de una imagen.

  • distancia_euclidea(punto1, punto2) » Calcula la distancia Euclídea entre dos puntos del plano.

2.4.4Cálculo de la posición y la orientación


Los objetivos de este apartado son calcular la orientación y la posición en la que nos encontramos respecto a la posición inicial de la que partimos. Para conseguirlo tenemos que analizar las líneas rectas que hemos obtenido como resultado en el apartado anterior.

Esta es la función principal de nuestro sistema. Todos los pasos anteriores eran necesarios para que esta fase se pudiese llevar a cabo con garantías.

2.4.4.1Cálculo de la orientación


La orientación es la forma en la que conocemos el espacio que nos rodea, guiándonos por unos puntos ya conocidos que actúan como referencia.

Es muy importante conocer la orientación en un sistema de navegación. En nuestro caso particular, utilizaremos un conjunto de líneas rectas extraídas de una imagen para realizar este cálculo. Este conjunto de líneas rectas las obtenemos del modo indicado en el apartado previo. También es indispensable conocer la orientación anterior, para poder calcular la nueva orientación en referencia a ésta.

La orientación devuelta por este sistema, siempre utiliza una orientación de referencia inicial y es que el sistema se encontrará en orientación 0º nada más iniciarse, a no ser que se le introduzca otro valor. De esta forma, la orientación del sistema va a estar siempre referida a esta orientación inicial. Si el móvil que utilice nuestro sistema gira hacia la derecha, y por lo tanto las líneas hacia la izquierda, la orientación irá disminuyendo hasta alcanzar el mínimo de -180º y si gira hacia la izquierda, girando las líneas hacia la derecha, la orientación aumentará hasta alcanzar un máximo de 180º. En vez de esto, podíamos haber decidido que la orientación estuviese comprendida entre 0º y 360º, pero decidimos hacerlo del modo anterior.



Aprovechamos que la transformada de Hough devuelve la ecuación de las rectas en forma paramétrica (Apéndice A) y utilizamos θ para realizar nuestro cálculo.

Hay que tener en cuenta, que cada recta tiene dos posibles orientaciones con respecto a la orientación inicial, una positiva (θ) y otra negativa -(180º - θ).


θ

-(180º-θ)


Por tanto, para calcular la orientación con respecto a la orientación anterior, se recorren todas las líneas devueltas por la transformada de Hough y se calcula la diferencia entre el valor absoluto de la orientación de cada línea y el valor absoluto de la orientación anterior. La orientación de la línea que minimice esta distancia será la escogida como nueva orientación. Esta es una buena solución siempre que el móvil que usa este sistema no gire a una velocidad excesiva, ya que entonces la orientación actual no será la que esté a una distancia mínima con respecto a la orientación anterior. Si esto ocurriese, se podría aumentar la frecuencia con la que son tomadas las capturas con la cámara quedando resuelto el problema. Hay que tener cuidado con el paso de orientación negativa a positiva y viceversa. Para ello es imprescindible darnos cuenta de que existen tres casos fundamentales:

  • -10 <= Orientación anterior <= 10 ó 170 <= Orientación anterior <= -170: En este caso, la orientación podría cambiar de signo, por lo que es necesario comprobar la diferencia de la orientación anterior con θ y con (180º - θ)

  • Orientación anterior no se encuentra en el caso anterior y además es > 0: En este caso, sabemos que la nueva orientación va a seguir siendo positiva, por lo que únicamente se realiza la diferencia entre θ y la orientación anterior

  • Orientación anterior no se encuentra en el primer caso y además es < 0: En este caso, sabemos que la nueva orientación va a seguir siendo negativa, por lo que únicamente se realiza la diferencia entre (180º – θ) y la orientación anterior

    La razón fundamental por la que decidimos que la orientación estuviese comprendida entre 0º y +/-180º en vez de entre 0º y 360º, es que resultaba más sencillo realizar el paso por 0º. Esto es debido a que la diferencia entre los ángulos próximos a 360º con los ángulos próximos a 0º es muy elevada y el método de calcular la orientación en función de la distancia mínima a la orientación anterior no funcionaría directamente, sino que habría que realizar algún tipo de conversión.

2.4.4.2Cálculo de la posición


Como podemos observar, la cámara toma capturas del techo de la habitación en la que se encuentre el robot. La visión de alto nivel de nuestro sistema se ha diseñado de modo que se aproveche la cuadricula de líneas obtenidas con la transformada de Hough como si fuera la cuadricula formada por unos ejes de coordenadas.

De este modo, tomando puntos de referencia y sumando incrementos en X y en Y, podremos tener las coordenadas absolutas de la habitación, en las que se encuentra el Robot en cada momento.

Es necesario por lo tanto, definir un sistema de coordenadas fijas en el mundo en que el móvil se desenvuelve. La representación del mapa que se hacía en el proyecto anterior ya definía un sistema de coordenadas. Como vemos en la siguiente imagen, el sistema de coordenadas del mapa que almacena el Robot es “levógiro”, es decir, si giramos desde X hacia Y, el ángulo de giro disminuye.



Debemos tener en cuenta también, que el Robot tiene su propio sistema de coordenadas que normalmente no coincidirá con el eje de coordenadas fijo. La siguiente ilustración muestra la posible captura de una imagen en la cuadrícula del techo en un mapa, y como los ejes móviles o del Robot (en rojo), se encuentran girados con respecto a los ejes fijos (en negro). En este caso el robot se encuentra con orientación absoluta 0º.



La siguiente captura muestra una fotografía real, tomada durante la realización de las pruebas:



El sistema de posición se basa en las coordenadas absolutas del mapa, pero las coordenadas que se pueden obtener de la fotografía son relativas a la posición y orientación del robot. Para ello debemos aplicar una matriz de transformación a las coordenadas relativas, para pasarlas a los ejes fijos.





Se hace evidente la importancia de la orientación “θ”, calculada previamente mediante el diseño del apartado anterior.

Como comentábamos en el primer párrafo de este apartado, es esencial obtener una referencia inicial. En la primera captura tomada, se escoge un punto de referencia, que será el punto de corte entre dos rectas, más cercano al centro de la foto, ya que suponemos que es donde se encontrará el robot.

En las siguientes capturas, se buscará el mismo punto que se tomo como referencia anteriormente, para así calcular el incremento que se ha producido en la posición, pudiendo así sumarlo a la posición absoluta.



Como el Robot avanza en el espacio, puede darse la situación en la que no se pueda realizar el seguimiento de las rectas que produjeron el punto de corte anterior, ya que pueden encontrarse fuera de la fotografía. Llegados a este punto debemos renovar el punto de referencia. Para ello buscamos de nuevo el punto de corte de dos rectas más cercano al Robot, y despreciamos el incremento que se haya podido provocar en el cambio del punto de corte.

Al despreciar este incremento cuando cambiamos el punto de referencia, se comete un error, con lo cual la fiabilidad de la medición disminuye. Nos vemos obligados por lo tanto a llevar una medición de fiabilidad.

Puede ocurrir, que la transformada de Hough no consiga extraer rectas de una imagen debido a unas condiciones de iluminación peculiares, y que por lo tanto, no existan líneas con las que calcular una nueva referencia, o hacer un seguimiento de una referencia anterior. En este caso la fiabilidad disminuirá en mayor medida que cuando se pierde un punto de referencia, por no aparecer las rectas de las que surgió en la imagen.

Si se da una situación de error como las comentadas en los párrafos anteriores, no se puede sumar ningún incremento a la posición calculada por el algoritmo, y esto puede ocurrir durante varios segundos. Cuando se reanuda el cálculo de la posición tras solucionarse esta situación, se debe leer la posición de una fuente externa para partir de un nuevo punto inicial más fiable y no acumular el error cometido por la pérdida de incrementos. En nuestro caso, se obtendrá la posición calculada por los encoders y la brújula del Robot.

Hemos visto que los errores de cálculo debidos a la pérdida del punto de referencia, pueden hacer que la fiabilidad disminuya hasta ser igual a cero.

En este punto sería interesante la localización de balizas absolutas, con las que renovar la posición real, y por tanto el 100% de fiabilidad para los siguientes cálculos de posición.

El pasillo del museo, tiene fluorescentes repartidos de forma uniforme y conocida. Además sabemos cuándo nos encontramos justo debajo de uno de ellos, ya que la varianza de la imagen es mayor que 6900.

Utilizando la función “bajoFoco” podremos conocer si nos encontramos o no justo debajo de un foco, y la posición del foco más cercano.
1   2   3   4   5   6   7   8   9   ...   14

similar:

Resumen del proyecto 4 iconResumen del proyecto

Resumen del proyecto 4 iconResumen del proyecto

Resumen del proyecto 4 iconResumen del proyecto

Resumen del proyecto 4 iconResúmen del Proyecto

Resumen del proyecto 4 iconResumen ejecutivo del proyecto 7

Resumen del proyecto 4 iconResumen del proyecto y caracteristicas del sitio

Resumen del proyecto 4 iconResumen el proyecto de investigación se centró en el estudio del aceite esencial de

Resumen del proyecto 4 iconResumen El diseño, desarrollo y divulgación de cocinas solares de...

Resumen del proyecto 4 iconEsquema de proyecto feria de ciencias denominación del proyecto (nombre)

Resumen del proyecto 4 iconResumen El presente proyecto surge como una necesidad de aplicar...


Medicina



Todos los derechos reservados. Copyright © 2015
contactos
med.se-todo.com