En lineas generales esta práctica ha consistido en dejar al robot navegando en busca de un cierto punto de destino evitando los obtáculos que encontrase a su paso.
Para trabajar c
omodamente con los sensores hemos tenido que cambiar el aspecto de nuestro robot (Cigarro, la encuesta salió positiva!!). Como puede verse en la imagen, hemos situado el sensor de ultrasonido en la parte superior montado sobre un motor con el fin de poder realizar los barridos. A los dos lados del robot, en la parte delantera están los dos sensores de luz, formando un ángulo de unos 45 y -45º, y finalmente, el sensor de contacto con su parachoques.También cabe mencionar, que para esta práctica ha sido necesario implementar comportamientos (para ello es necesario usar la clase Behavior).
COMPORTAMIENTO DE EVITACIÓN DE OBSTÁCULOS USANDO SENSORES DE CONTACTO
Como describe el nombre del apartado, se trataba de esquivar los obstáculos usando sensores de contacto. En este caso los obstáculos eran latas con un cierto peso. No hay que olvidar que el objetivo final es llegar a la meta. Por tanto, es fácil distinguir los comportamiento que el robot tiene que llevar a cabo: Avanzar hacia delante y esquivar los obstáculos.
El robot tiene activado el comportamiento de ir para alante. Cuando el sensor de contacto advierte la presencia de un obstáculo salta el comportamiento esquivar, y una vez que el objeto ha sido sobrepasado se vuelve a activar el avanzar.
Avanzar:
action: navegador.forward().
supress: navegador.stop().
takeControl: siempre true (es el comportamiento principal).
Esquivar:
action: realizar el giro (travel, rotate,...)
supress: vacio.
takeControl: verdad si touch.isPressed().
Como describe el nombre del apartado, se trataba de esquivar los obstáculos usando sensores de contacto. En este caso los obstáculos eran latas con un cierto peso. No hay que olvidar que el objetivo final es llegar a la meta. Por tanto, es fácil distinguir los comportamiento que el robot tiene que llevar a cabo: Avanzar hacia delante y esquivar los obstáculos.
El robot tiene activado el comportamiento de ir para alante. Cuando el sensor de contacto advierte la presencia de un obstáculo salta el comportamiento esquivar, y una vez que el objeto ha sido sobrepasado se vuelve a activar el avanzar.
Avanzar:
action: navegador.forward().
supress: navegador.stop().
takeControl: siempre true (es el comportamiento principal).
Esquivar:
action: realizar el giro (travel, rotate,...)
supress: vacio.
takeControl: verdad si touch.isPressed().
COMPORTAMIENTO DE EVITACIÓN DE OBSTÁCULOS USANDO EL SENSOR DE ULTRASONIDOS.
Este aparto es sin duda el mayor reto al que nos hemos enfrentado hasta el momento, y al que le hemos dedicado mayor tiempo durante estas semanas. A pesar de ello los resultados hasta el momento no son tan buenos como a nosotros nos hubiera gustado.
La temática de este ejercicio es muy similar a la del anterior, solo que esta vez no será necesario chocar con el objeto para saber que está ahí, sino que usaremos métodos más sofisticados.
El robot deberá avanzar hacia delante realizando barridos con el sensor de ultrasonido. Si en ese barrido se detecta algún obstáculo hay que "guardar" su posición para no impactar con él. Es decir, de nuevo volvemos a tener dos comportamientos claramente diferenciados: Avanzar hacia delante (esta vez sensado con el ultrasonido) y esquivar.
Para llevar a cabo el comportamiento esquivar es necesario usar el método de navegación local conocido como VFF (Virtual Forces Field). Para este método hay que calcular la fuerza atractiva de tu punto de destino así como la fuerza repulsiva del obstáculo. Una vez que tienes los dos vectores puedes sumarlos, obteniendo así el vector resultante que determine el próximo movimiento del robot (evitando que impacte contra el obstáculo). Estos vectores deben actualizarse contínuamente, hasta que el objeto haya sido superado.
¿Problemas? Muchos. Para empezar la incertidumbre en el eje y del sensor nos juega malas pasadas por lo que tuvimos que tomar medidas como realizar un segundo barrido, a parte del que va haciendo el robot cuando viaja hacia delante, que en cada ángulo halle tres distancias y devuelva la menor de ellas. También da muchísimos problemas la actualización de las coordenadas a medida que nos vamos moviendo. Esto lo solucionamos separando las rotaciones de los desplazamientos en línea recta. En los desplazamientos hacia delante utilizamos prácticamente las mismas fórmulas que en la práctica 1 y en las rotaciones simplemente aumentamos el ángulo del vector en sus coordenadas polares.
Aquí podemos ver un esquemático del funcionamiento:
Y un vídeo en el que se ve la movida:
COMPORTAMIENTO IR HACIA LA LUZ

En este caso el robot tiene que avanzar hacia la luz, representada por un foco. Ahora nuestros comportamientos son avanzar y buscarluz. Pensando un poco en la solución reconocimos 4 posibles situaciones a las que deberíamos enfrentarnos:
1: El robot no encuentra la luz: en ese caso debe girar hasta que la detecte, y comenzar a avanzar hacia ella.
2: El sensor derecho detecta más luz que el izquierdo: La lámpara está a la derecha, hay que girar hacia ese mismo lado.
3:El sensor izquierdo detecta más luz que el derecho: Igual que en el caso anterior, pero girando en el sentido contrario.
4:Ambos sensores detectan la misma luz: El foco está en frente, hay que andar recto hacia el.
Avanzar:
action: navegador.forward().
supress: navegador.stop().
takeControl: siempre true (es el comportamiento principal).
BuscarLuz:
action: resolución de los casos anteriores.
supress: vacio.
takeControl: devolverá verdadero o falso según la luz captada por los sensores.
Tanto para este como para el siguiente apartado merece la pena dar una vuelta por la API de lejos, ya que estamos usando sensores de luz del modelo anterior, el RCX, y hay ciertos métodos de la clase RCXLightSensor que están obsoletos y conviene usar lo menos posible.
Además es necesario calibrar el robot cada vez que vaya a usarse, ya que la luz del ambiente puede variar, por lo que si no nos adaptamos al entorno, nuestro programa dejará de funcionar.
COMPORTAMIENTO IR HACIA LA LUZ EVITANDO OBSTÁCULOS
Una vez implementados los ejercicios anteriores, obtener realizar este apartado resulta relativamente sencillo, ya que solo es necesario unir el comportamiento de buscar luz, al de avanzar hacia delante y esquivar obstáculo. Para este apartado podíamos elegir entre usar el sensor de contacto o el de ultrasonido. Nosotros nos hemos decantado por el de contacto, ya que su implementación es más simple y controlamos mejor su funcionamiento.
Avanzar:
action: navegador.forward().
supress: navegador.stop().
takeControl: siempre true (es el comportamiento principal).
BuscarLuz:
action: resolución de los casos anteriores.
supress: vacio.
takeControl: devolverá verdadero o falso según la luz captada por los sensores.
Esquivar:
action: realizar el giro (travel, rotate,...)
supress: vacio.
takeControl: verdad si touch.isPressed().
No hay comentarios:
Publicar un comentario