viernes, 26 de marzo de 2010

Comportamiento choca-gira básico

En este primer intento he implementado una versión muy básica del comportamiento "choca-gira" en el que el robot se mueve por el mundo usando una máquina de estados finitos que tiene los siguientes tres estados:

  1. Estado "avanza": El robot avanza por el mundo en línea recta a velocidad constante. En el momento que se detecta un objeto más cercano de un umbral se pasa al estado "retrocede" para evitar la colisión.
  2. Estado "retrocede": El robot retrocede durante un número definido de iteraciones antes de pasar al estado "gira".
  3. Estado "gira": El robot gira un ángulo aleatorio para tratar de sortear el obstáculo. Una vez girado el ángulo deseado el robot volverá al estado "avanza".

La siguiente ilustración muestra gráficamente la relación entre los estados:

Estados

En el siguiente vídeo puede observarse el comportamiento del robot usando este algoritmo en su versión más básica:

En la siguiente versión trataré de optimizar el algoritmo con algunas mejoras como: velocidad variable dependiendo del entorno y giro hacia el lado con más espacio.

5 comentarios:

  1. Buenas, estoy empezando a usar jderobot por mi cuenta,y he visto que tu has trabajado bastante con el. Para empezar me gustaría hacer el choca gira, pero no me sale. Estoy buscando el código para el choca gira, aunque sea el mas simple, pero no lo encuentro. Podrías decirme donde encontrarlo.
    Gracias!

    ResponderEliminar
  2. Hombre, te puedo ayudar con las dudas que tengas ya que implementar una máquina de estados finitos no creo que sea un secreto para ti.

    Para empezar: ¿has logrado recompilar introrob con tu propia versión del archivo navegacion.c?

    Si has conseguido hacerlo entonces debes recordar que:

    * ACTUADORES: las variable "v" controla la velocidad lineal (avance o retroceso) y "w" la velocidad angular (giro a derecha o izquierda).

    * SENSORES: la matriz unidimensional laser, de 180 elementos, alberga las medidas de distancia que obtiene el sensor láser en cada iteración. El primer elemento (0) corresponde a la derecha, 90 corresponde al sensor frontal y 179 a la izquierda.

    Espero que te sirva.

    ResponderEliminar
  3. Ya lo he solucionado (lo explico por si a alguien le sirve), mi problema era que tenía instalado jderobot por paquetes debian, y no podia compilar el fichero de navegacion.c.
    Lo he solucionado bajandome y descomprimiendo en una carpeta el jderobot-4.3.0. He copiado en el directorio /introrob un fichero Makefile que he encontrado en el foro, y así lo he conseguido compilar. Luego lo he copiado en el directorio donde me instaló el paquete debian el jderobot(/usr/lib/jderobot/schemas/).
    No se si lo he hecho bien ¿hay otra forma de hacerlo?, pero funciona.
    Muchas gracias por las indicaciones y por contestar tan rápido.

    ResponderEliminar
  4. Sí, la hay, y por eso te pregunté antes de empezar a soltarte más detalles si podías compilar o no tu propio introrob.

    La manera correcta de hacerlo es bajarte el código tal y como lo has hecho y no sólo copiarte la carpeta introrob y sacar de algún sitio un Makefile que podría haberte valido o no (dependiendo de algunos aspectos de configuración).

    Lo ideal es que te generes el Makefile "perfecto" para tu sistema entrando en la carpeta de jderobot-4.3.0 y generando los makefiles con la siguiente instrucción:

    redstar@blackstar:~/src/jderobot-4.3.0$ autoreconf -i

    Con eso habrás generado un makefile a medida en el directorio introrob.

    Recuerda tener instalado el paquete libtool, build-essentials, etc o no te funcionará la autoconfiguración.

    ResponderEliminar
  5. Hola de nuevo,
    después de instalar lo que faltaba para poder compilar el fichero navegacion.c, realicé el choca-gira sin problemas. Le veo muchas posibilidades para simular, y me gustaría profundizar algo mas. El caso es que no he encontrado ningún manual de introrob, solo algún párrafo dentro del manual jderobot. Te agradecería que me dijeras si conoces algún manual de introrob, y de jderobot(aparte de la documentacion de la web).
    Muchas gracias de nuevo.

    ResponderEliminar