4. QL 1 dron N puntos - alvvazort/AIDrone GitHub Wiki

Introducción

Se plantea el problema inicial partiendo de N puntos que tendrán que ser supervisados por 1 dron.

Preconfiguración

Realizar la preconfiguracón descrita en el apartado MDP 2 puntos.

Si queremos establecer un número de puntos (Sin contar el punto de carga PC), deberemos cambiar la constante por un valor N.

Ejecución

Para la ejecución, deberemos tener una terminal apuntando a la carpeta Firmware donde ejecutaremos el siguiente código:

./Tools/simulation/gazebo/sitl_multiple_run.sh -n 1 -w baylands

Esto abrirá Gazebo con un dron en un mapa de un parque (Baylands Park, California), además, si abrimos QGroundControl podremos ver que las coordenadas de ese parque corresponden con las reales.

Apuntando a la carpeta wildfire de nuestro repositorio y ejecutamos el archivo “wildfire_q-learning_MP.py”. Al ejecutar el archivo, se conectará al dron, inicializará los puntos, los tiempos en los que han sido vigilado cada punto, la tabla q_values, y demás datos necesarios. Tras ello, empezará un entrenamiento, en caso de que no exista uno previo, o continuará el anterior entrenamiento aprendiendo que debe y que no debe hacer dependiendo del estado en el que se encuentre.

Como se mencionó en el anterior modelo (apartado QL 1 dron 2 puntos)) , el algoritmo cada vez que toma la decisión de qué acción debe tomar, tiene la posibilidad de o realizar una fase de explotación o una de exploración, siendo la opción de explotación la más probable (en nuestro caso 90%). En el caso de explotación, va a ejecutar la acción con mayor puntuación, siendo esta la acción que en ese momento se ha calculado que tendrá una mayor recompensa en un futuro cercano. En el caso de que se realice la fase de exploración, se escogerá de manera aleatoria una acción y se calculará la puntuación de haber tomado esa acción.

En esta imagen se puede ver algunas entradas (que corresponden a estados) la tabla q_values, en las cuales se almacena las puntuaciones que corresponden por cada acción posible que se pueda tomar. Valores de la tabla q_values tras breve entrenamiento

Si es la primera vez que ejecutamos el entrenamiento con el número de puntos que hayas especificado, se creará un archivo “q_values_NP.json” donde se almacenará y se actualizará por cada época los valores de la tabla q_values. En caso de que exista un entrenamiento anterior se cargaran los datos correspondientes. En las primeras iteraciones del entrenamiento podremos ver en Gazebo y QGroundControl como el dron se queda cargando batería aunque esté al 100%, ya que no conoce el rendimiento de las otras acciones, por lo que lo más probable es que se quede cargando ya que es su primera opción. Esto se repetirá hasta que de manera pseudoaleatoria con un 10% de posibilidad ejecute la fase de exploración. Entonces de manera aleatoria escogerá una acción y calculará la puntuación de haber realizado esa acción. Es así como descubrirá que en los puntos de interés, si actúa en ellos es recompensado o que existe recompensa negativa por viajar hacia el punto donde se encuentra. De esta manera se quedará vigilando algún punto al ser lo más eficiente hasta que quede sin batería o descubra de nuevo mediante la fase de exploración que, ir a otro punto que lleva más tiempo sin vigilar te recompensa más. El dron será penalizado altamente por quedarse sin batería y volverá a PC para cargar la batería al 100% y volver a empezar una nueva época. Para la próxima iteración habrá aprendido que no debe quedarse vigilando hasta quedar sin batería y actuará de otra forma posible. Tras varias épocas aprenderá que volver a PC aunque no le otorgue recompensa, le permite seguir actuando y obtener una recompensa mayor en un futuro. Además, aprenderá que viajar de un punto a otro le otorgará mayor recompensa, cuanto más tiempo esté sin ser vigilado ese punto.

Funcionamiento

Para este problema, se ha creado una función de recompensa que se calcula en el momento que el dron realiza la acción. Esta función corrige el aprendizaje en varios casos, por ejemplo, si el dron está en el punto X y viaja de nuevo al punto X es penalizado. Por otra parte, se recompensa actuar en un punto de vigilancia, pero se recompensa más según el tiempo que lleve sin ser monitorizado o si este es un punto de interés incendiado, aunque vigilar continuamente un punto incendiado reducirá progresivamente la recompensa extra. Esto hará que al dron le interese ir vigilando de punto en punto y así tener una monitorización más general de la zona.

Todas las acciones, estados, recompensas obtenidas y matrices del mapa son recopiladas durante el entramiento en logs, estos permitirán al usuario poder recopilar información relativa o errores producidos.

Como se ha comentado anteriormente, q_values_NP. es el archivo donde se guarda la información relativa a los anteriores entrenamientos. Específicamente este archivo está formado por un gran diccionario en el que la clave serían los estados posibles, y el valor, una lista con la puntuación que corresponde a cada posible acción, esta puntuación es calculada con las fórmulas de Bellman que se explican más adelante. Los estados están formados por la combinación de niveles de batería en un punto, en nuestro caso 10 niveles totales por cada punto, formando así estados como A10 (Punto A con 100% de batería). Además existen los estados M (Muerte) y F (Final) para declarar que el dron se ha quedado sin batería. Por otra parte, las acciones relativas a cada estado siguen el orden, actuar y go_to a cada punto existente. Para actualizar este archivo, se utilizan las fórmulas de Bellman que veremos a continuación:

new_q_value = old_q_value + (LEARNING_RATE * temporal_difference)

Siendo old_q_value el antiguo valor que se encuentra para una determinada acción y estado en la tabla q_values (current value), α la tasa de aprendizaje que en nuestro proyecto es 0.9 y temporal_difference la diferencia del estado más óptimo futuro y el valor actual más la recompensa. Más específicamente:

temporal_difference = reward + (DISCOUNT_FACTOR *np.max(Wildfire.q_values[status])) - old_q_value

Siendo reward la recompensa actualizada para un determinado estado. ɣ (tasa de descuento) es un valor que recorre el rango (0,1] que permite al algoritmo centrarse en un futuro más cercano, en nuestro caso el valor de ɣ es de 0.9. El valor maxQ(s,a) se corresponde con el valor máximo de la tabla q_values para un determinado estado futuro y old_q_values obtiene el mismo valor que el old_q_values anteriormente mencionado.