Hola!!
En esta semana hemos tenido que desarrollar la "Navegación local evitando obstáculos". Engranando varios programas con distintas acciones definiendo el comportamiento en módulos:
takeControl(). Si se cumplen unas condiciones se toma el control del robot.
action(). Este método se ejecuta cuando el comportamiento se activa.
suppress(). Este método termina el código que ejecuta el método action().
...que aplicados al entorno de la navegación local y con la ayuda de varios de nuestros sensores evitamos los obstaculos que se interponían en el camino.
Pasamos a describir las cuatro partes de esta practica:
1.- Comportamiento de evitacion de obstáculos. Sensor contacto.
En este programa nuestro robot camina hacia adelante y en el caso de que choquemos con algun objeto, retrocedemos y lo sortearemos rodeandolo por uno de sus lados. Detallamos su partes:
Adelante.java -> programa que avanza en linea recta. Prioridad BAJA
Hit.java -> programa que se activa al chocar el sensor con algún objeto. Prioridad ALTA.
Touch.java -> Encargado de gestionar ambos módulos y sus prioridades.
Video demostrativo:
2.- Comportamiento de evitacion de obstáculos. Sensor ultrasonido.
Evitar obstaculos usando el sensor de ultrasonidos. Similar al ejercicio anterior solo que sin llegar a impactar sobre el objeto implicado. Lo evita cuando esta a una distancia aproximada de 40cm o menor. Detallamos sus partes:
Adelante.java -> programa que avanza en linea recta siempre que puede. Prioridad BAJA
Adel_I.java -> programa que al detectar con el sensor de US un objeto cercano próximo a él, realiza los cálculos para evitar el golpe girando la cabeza 180º y viendo la distancia minima y el ángulo al que se encuentra el objeto para después hacer el cálculo de la fuerza resultante entre la atractiva y la repulsiva y sacar el giro que tiene que hacer para esquivar el objeto y la distancia que tiene que recorrer para volver a sittuarse hacia su destino. Prioridad ALTA.
USVFF.java -> Encargado de gestionar ambos módulos y sus prioridades.
Video demostrativo:
3.- Comportamiento ir hacia la luz
En este apartado hemos usado dos sensores de luz del primo de nuestro robot el RCX colocados a 45º sobre el eje central. En caso de que uno de los sensores reciba más luz que en el otro se ira hacia ese lado.
IrAdelante.java -> programa que avanza en linea recta. Prioridad BAJA
Orientar.java -> programa que gracias a la informacion recogida por los 2 sensores de luz detecta en que direccion hay mas luz y va hacia ella. Prioridad ALTA.
SigueLuz.java -> Encargado de gestionar ambos módulos y sus prioridades.
Video demostrativo:
4.- Comportamiento ir hacia la luz evitando obstaculos
En este apartado vamos evitando obstaculos y siguiendo la luz. Para ello utilizamos todos los programas detallados anteriormente.
IrAdelante.java -> programa que avanza en linea recta. Prioridad BAJA
Adel_I.java-> Como hemos comentado antes, programa que al detectar con el sensor de US un objeto cercano próximo a él, realiza los cálculos necesarios para sortear el objeto y seguir hacia su destino. Prioridad MEDIA.
Orientar.java -> programa que detecta un en que direccion hay mas luz y va hacia ella. Prioridad ALTA.
Orientar.java -> programa que detecta un en que direccion hay mas luz y va hacia ella. Prioridad ALTA.
USLuz.java -> Encargado de gestionar ambos módulos y sus prioridades.
Video demostrativo:
CALCULO DE DATOS FUERZAS REPULSIVAS:
Tanto para el apartado 2 como para el apartado 4 hemos tenido que hacer una serie de cálculos para poder sacar el vector resultante hacia donde tiene que ir el robot.
Por una parte tenemos un punto donde queremos ir (x,y) con la fuerza atractiva que nos llevara el robot hacia ese punto. Y por otra parte tenemos la fuerza repulsiva, dada cuando el robot encuentra un obstáculo cerca. El robot calculará la distancia mínima al objeto y el ángulo en el que se encuentra, para pasar estas coordenadas polares a cartesianas. Una vez tengamos estas fuerzas, las sumaremos la xatrac con la xrepuls y la yatrac con la yrepuls, para poder hayar sobre ellas la fuerza resultante en la que el robot girará con el ángulo de esa fuerza y se desplazará con su modulo, para mas tarde volver a tomar el rumbo definido.