jueves, 25 de marzo de 2010

Filtros de partículas

Aquí venimos una vez más con prácticas de nuestro robot.

En esta ocasión hemos tratado de implementar un filtro de partículas en nuestro robot para poder llegar a auto-localizarnos en un mapa según nuestra posición.
Lamentablemente no hemos conseguido llegar a dar solución al problema.

El otro apartado de la práctica era relativamente más fácil ya que consistía en manejar el robot mediante una secuencia de coordenadas(x,y) y orientación.
Introducimos el punto final mediante incrementos a través de los botones LEFT/RIGHT del robot presionando ENTER para escribir el punto.
Igualmente introducimos la orientación final a través de los botones de nuestro robot.

Una vez introducidos el punto y la orientación el robot navega al lugar indicado.

La gracia de todo esto consiste en que si nuestro robot parte de un punto(0,0) el solo sabrá ir a cualquier punto del mapa volviendo al origen si se le indica.






Como se puede apreciar en el primer video indicamos a nuestro robot que se desplace a el punto (20,20) y finalice con la orientación inicial(0).

En el segundo video se indica al robot que se desplace al punto(0,0) partiendo del punto del video anterior, al final debe acabar con una orientación de -90 grados desde la posición inicial original, es decir desde la posición inicial del primer video.

Un saludo.

jueves, 11 de marzo de 2010

Navegación local evitando obstáculos

Hasta ahora el comportamiento de nuestro robot ha sido completamente iterativo y lineal. En esta última práctica hemos aprendido a programar el robot con varios comportamientos que compiten por controlarlo heredando de la clase Behavior.

Evitación de obstáculos usando sensores de contacto

El robot cuando choca con un objeto, retrocede, describe un arco a la derecha de él y vuelve a quedarse en el mismo ángulo de orientación. Con el "control" que poseemos ya sobre la clase TachoPilot no nos ha dado ningún quebradero de cabeza.



Evitación de obstáculos usando el sensor de ultrasonidos

En este apartado se suponía que el robot debía de evitar un obstáculo usando el algoritmo de VFF's, pero lo máximo que hemos llegado a conseguir es realizar un radar que escanea entre , y quedarnos con mal sabor de boca, al saber que estábamos muy cerca de que funcionase.

Comportamiento de ir hacia la luz

Gracias a este comportamiento, y a los dos sensores de luz de su primo el NCX el robot se orienta hacia la luz. No avanza ya que tenemos otro comportamiento básico "avanzar" que se encarga de ello. La función básica es eso, girar hasta encararse a la luz más fuerte.



Comportamiento de ir hacia la luz evitando obstáculos

Aquí nuestro pequeño artefacto ya tiene varios comportamientos compitiendo: el de avanzar, orientarse hacia la luz, y evitar un obstáculo. Para evitarlo hemos usado el comportamiento que se vale de los sensores de contacto, ya que el de UltraSonidos mediante VFF's no fuimos capaces.



miércoles, 3 de marzo de 2010

Navegando

Estamos implementando a base de comportamientos un programa para conseguir que el robot evite obstáculos pero yendo hacia la luz.

Como realizar tal hazaña?Con vectores de fuerzas.

Hay dos vectores:
Vector repulsión: Nos indica hacia donde alejarnos del objeto.
Vector atracción: Nos indica hacia donde ir.
Estos vectores se recalculan a tiempo real.
  1. Calcular vector de atracción.
  2. Calcular vector de repulsión.
  3. Calcular vector resultante.
  4. Traducir el vector resultante al movimiento del robot.
Para calcular un vector necesitamos saber dos cosas, el ángulo(teta) y el módulo(ro).
Luego mediante coordenadas polares podemos hallar nuestra (x,y):
x = ro · cos(teta)
y = ro · sen(teta)

Hasta aquí fácil,el problema esta en calcular ese ángulo y esa distancia.

Para el objeto es relativamente fácil,nosotros siempre partimos del (x=0,y=0), avanzamos y al chocar calculamos los vectores.La distancia al objeto nos la dará el sensor de ultrasonidos o el de contacto y el ángulo nos sera dado por la odometría de nuestros motores de empuje, la cual será reseteada para conseguir evitar los errores lo máximo posible.

Para la luz hay mas pegas.Necesitamos también el vector de atracción.

¿Cómo detectar la distancia a la que esta la luz?¿Como saber a que ángulo esta la luz?

De momento tenemos pensadas varias estrategias:

Para averiguar el ángulo de la luz podemos utilizar una estimación de los sensores de luz los cuales están en el frente del robot orientados con un ángulo de 45º a cada lado.El problema nos surge si cambiamos la intensidad de la luz ya que rompería muestras medidas previas.

El otro punto clave es la distancia a la luz para poder calcular el vector atractivo.
En un primer momento intentamos calcular la distancia con los sensores de luz pero había tan poca separación que la luz recibida a 60cm, 100cm, 200cm era prácticamente la misma y por si fuera poco cambiaría con el tipo de luz.Nos daba miedo fiarnos de una medida tan poco precisa.

Posteriormente nos dimos cuenta de que la luz solamente nos marca la dirección a seguir.Nos da igual la distancia a la que esté, entonces, ¿porque no fijar esta distancia a un valor constante?
Al fijar la distancia a la luz es posible obtener vectores resultantes que nos hicieran movernos hacia atrás y eso es de cobardes.
Pero podemos implementar que en el vector resultante de movimiento la componente y sea siempre positiva y así nunca llegar a retroceder.

Aún esta en pruebas,iremos informando.

One up!!

Hemos pensado algunas mejoras, ya que una vez todo implementado y probado salía a la fuerza una versión 2.0

En el Bump&Go nos dimos cuenta de que si por casualidad, y digo casualidad porque giraba aleatoriamente, el robot diera con un callejón se quedaría bloqueado.

Me explico; el "rastrillo" que accionaba el sensor al chocar era demasiado estrecho y si conseguía pasar el rastrillo no paraba a nuestro robot el cual se atascaba.Por ello dotamos a nuestro "esclavo" con un rastrillo más ancho de modo que cubriera con creces la longitud del eje de las ruedas.






Por otra parte en el Bum&Go de Ultrasonidos, nos dimos cuenta de que sobraban cosas.

A la hora de "chocar" con algo, el robot, reculaba para poder realizar el giro y no entorpecerse con el obstáculo.

Y ahora?No, al cambiar el tipo de sensor, también cambia el algoritmo.Ya no necesitamos andar hacia atrás.Ahora solo hay que preocuparse de "chocar" con el obstáculo a una distancia suficiente para no entorpecer el giro.

Ahora choca sin tocar,simplemente.

Midiendo tu marchita y al tran-tran,
Buscando la salida,porque si hay una salida por aquí tiene que estar.