viernes, 30 de enero de 2009

derrotado otra vez

Retomando mi última creación.

Estaba totalmente seguro de que el problema era que las paredes estaban muy lejos, por lo que situaba al nxt en un entorno mucho más reducido (un "corral" hecho con libros), obtendría mejores resultados. También incluí algunas mejoras en el programa, como por ejemplo la normalización de datos

Nada más lejos de la realidad.

Esto es lo que detectaba si el robot estaba totalmente encerrado dentro de un cuadrado hecho de libros. Hay puntos repartidos por todo el contorno. ¡¡¡ Pero no equidistantes del centro !!!



Y esto lo que detectaba si quitaba una pared del cuadrado. En la parte de abajo de la gráfica no hay ningún punto detectado.



Como veis con mucha mucha imaginación ... algo se puede sacar. Pero visto que rodeando al robot con libros tampoco obtengo buenos resultados, voy a desistir de este modelo y cambiar la construcción del robot.

Lo único que girará será el sensor de rotación y extremadamente lento.

No obstante, esto me ha servido para probar la facilidad con que en matlab puedo representar gráficas, eliminar ruido, calcular medias ...

A ver si tengo tiempo y pongo un pequeño video del robot dando vueltas ... no hace nada, casi me da verguenza enseñarlo.



domingo, 18 de enero de 2009

primera aproximación a un robot que detecta su entorno

En este nuevo proyecto, quiero abordar la construcción de un robot que "vea" el entorno en el que se encuentra, e intente alejarse lo más posible de su punto de partida. Para ello aprovecharé el modelo de robot que presenté en este mismo blog y sustituiré el sensor de intensidad de luz por el sensor de ultrasonidos. El modelo resultante lo podeis ver aquí mismo.




El funcionamiento que tengo en mente es el siguiente: que el robot gire 360º sobre sí mismo a la vez que recopila información sobre su entorno mediante el sensor. Esta información es la distancia a los objetos que existen a su alrededor. 

Lo que pretendo es averiguar el punto que más alejado esté del origen y desplazar el robot hacía allí, y repetir el proceso otra vez. Teniendo en cuenta de que no vuelva por donde haya venido.

Este proyecto en nxtprograms hace algo muy similar a lo que yo quiero, por lo que bajaré el programa para el nxt-g y estudiaré las partes que me puedan venir bien.

Lo más interesante del programa es lo siguiente. Se puede ver que si se encuentra un objeto, a una distancia menor que un objeto que ya tuvieramos localizado, guardamos este nuevo objeto como el más cercano, a la vez que también guardamos la nueva posición.

Es interesante ver como la posición se guarda reseteando la cuenta de grados recorridos por el motor, de este modo al rotar el motor a su posición inicial tendremos el objeto más cercano delante.

También se puede ver como no hay ninguna medida estándar para que el robot gire 360º sobre si mismo. Haciendo pruebas he calculado que unos 600º de giro de una rueda equivalen a 360º del robot.





A continuación esbozo un pseudocódigo de lo que hace el robot mientras gira

variable distanciaMasLejana <- 0
variable gradosDistanciaMasLejana <- 0 

mientras el robot gira
variable valorRecogido <- recojo medición del sensor de ultrasonidos
si valorRecogido > distanciaMasLejana // es decir, hay un punto más lejano al que puedo ir que el que tenía almacenado
distanciaMasLejana <- valorRecogido
reseteamos motor
fin si
fin mientras el robot gira

Una vez que haya finalizado el giro del robot, en la posición inicial de giro tendremos el camino más largo para andar.

Teniendo en cuenta todo lo anterior ... vamos a entrar en harina. Un poco de matlab por aquí y por allá, un par de maldiciones ... y más o menos ya lo tengo. Antes de todo unas consideraciones

  • Como he hecho en robots anteriores, tomar varias medidas y luego hacer la media, no funciona aquí. Se podría pensar que si el robot en vez de dar una vuelta, diera cinco se tendría mucha más precisión. Se obtiene todo lo contrario. Como los grados que se recorren no son exactamente múltiplos de 360º, y el sensor está moviéndose contínuamente mientrasa hace mediciones ... a más vueltas, lo que se obtiene el que es robot está rodeado de todos los obstáculos.



  • Es bastante complicado interpretar el dibujo resultante. El que se ve a continuación es el del robot situado en medio de un pasillo. Con paredes cerca a los lados y paredes al principio y al final del pasillo que no se ven. Se puede ver que con cada ejecución del programa, obtenemos un resultado bastante diferente.




  • Voy a filtrar en el resultado los valores muy altos, para ello no voy a mostrar en el resultado aquellos valores que estén muy por encima de la media. Se puede ver como ahora el resultado es un poco más intuitivo.



  • Aqui vemos el resultado con una botella. La verdad es que no se ve nada ... por lo que deduzco que sólo podrá detectar objetos pequeños.



Más que suficiente para una entrada en el blog. Voy a titularla primera aproximación a un robot que detecta su entorno. Es una primera aproximación por que intuyo que esto no va a funcionar realmente.

  • Es incapaz de localizar objetos pequeños en distancias medias.
  • Los gráficos resultantes son extremadamente dificiles de interpretar.
  • A parte que hay como dos tipos de gráficos: unos con los puntos bien delineados y otros con grupitos curvados. Ignoro a qué se debe eso todavía.
  • El robot no puede girar excesivamente lento, ya que necesita algo de potencia para mover todo su peso. Esa es la razón de los gráficos tan extraños.

La solución podría ser cambiar totalmente el diseño del robot. Montando el sensor sobre un servo, que gire extremadamente lento y consiga unos resultados más precisos con muchas más mediciones por giro. Pero eso ya será en otra ocasión.

También este robot podría tener otro ámbito de actuación, como por ejemplo un laberinto de paredes estrechas. Sería interesante probar su desarrollo en un campo de esas características.

En la próxima entrada acabaré el programa, probaré el robot en varios entornos y subiré algún video.

Un saludo a todos.