Silvia Calvo Cabello
El objetivo principal de este proyecto es desarrollar un sistema autónomo que permita a un dron localizar y rescatar personas en zonas donde se ha perdido el contacto con el barco de rescate. Este dron deberá ser capaz de identificar caras humanas en imágenes capturadas por su cámara, navegar a las posiciones correspondientes, y así proporcionar ayuda en entornos hostiles o de difícil acceso.
Para lograr este objetivo, se emplea un algoritmo de detección de rostros basado en el método de Haar, combinado con un sistema de control de movimiento autónomo para el dron. El sistema debe ser capaz de interpretar coordenadas globales, detectar las caras en las imágenes y orientar al dron hacia el lugar exacto donde se encuentra la persona que necesita ayuda. El algoritmo de detección de rostros de Haar es un método popular en visión por computadora para localizar y reconocer objetos dentro de imágenes. Este enfoque se basa en el uso de características simples que describen la diferencia en la intensidad de píxeles en una imagen, lo cual permite detectar patrones como rostros, ojos, sonrisas, entre otros. El modelo de Haar es entrenado previamente para identificar estas características a través de un conjunto de imágenes etiquetadas.
En este proyecto, el sistema utiliza Haar específicamente para detectar caras humanas, lo que resulta útil en situaciones de rescate donde la identificación de personas es crucial. Sin embargo, una de las limitaciones del detector Haar es que funciona de manera óptima cuando las caras están orientadas rectamente (con una inclinación de hasta ±10 grados). Por esta razón, cada imagen capturada por el dron es sometida a una rotación para asegurarse de que el sistema detecte las caras sin importar su orientación, aumentando así la probabilidad de éxito del rescate. El entorno en el que opera el dron está modelado en un sistema de coordenadas bidimensionales (X, Y) con el barco de rescate como punto de referencia. El eje X es positivo hacia el norte, y el eje Y es negativo hacia el este. Para garantizar que el dron pueda navegar de manera eficiente, las posiciones geográficas del barco de rescate y de las personas perdidas están representadas en el sistema de coordenadas UTM (Universal Transverse Mercator).
Dado que las coordenadas en las imágenes están en píxeles y las coordenadas del mundo real están en unidades geográficas, es necesario realizar una conversión de coordenadas entre estos dos sistemas para poder ubicar al dron correctamente. En este proceso, se utiliza un offset de referencia (por ejemplo, (40, 30)) que permite al dron calcular las posiciones de las personas con respecto al barco. Además, cuando se detecta una cara en una imagen, se deben transformar las coordenadas del píxel donde se encuentra la cara en coordenadas geográficas, teniendo en cuenta la orientación del dron en ese momento.
Esta transformación es crucial para que el dron pueda navegar correctamente hacia el lugar exacto donde se encuentra la persona a rescatar.Se hace de la siguiente manera: se crea un vector desde el centro de imagen(dron) hasta el pixel y se proroga hasta detectar z = 0 El dron utiliza un algoritmo de movimiento en zig-zag para cubrir de manera eficiente el área en busca de personas. El patrón de movimiento es diseñado para cubrir una gran extensión del terreno, desplazándose hacia el norte, girando hacia el este, avanzando unos pasos y luego girando hacia el sur, repitiendo este proceso continuamente hasta asegurar que toda la zona esté inspeccionada.
Esta estrategia de movimiento garantiza que el dron recorra un área amplia, minimizando la posibilidad de pasar por alto una persona. Además, al ser un algoritmo simple, el dron puede operar de manera eficiente en entornos desconocidos sin necesidad de realizar cálculos complejos sobre el terreno.
Se ha creado una bateria virtual que va bajando y en caso de descargarse acude a cargarse al barco de vuelta.
Explicaion del programa
Este programa implementa un sistema de búsqueda y rescate autónomo con un dron, que utiliza visión por computadora para localizar personas en una zona determinada. El dron despega, se dirige a un punto de inicio predefinido y realiza un recorrido sistemático en zigzag sobre el área de búsqueda. Durante su vuelo, captura imágenes desde su cámara ventral y analiza cada fotograma para detectar rostros humanos utilizando un clasificador Haar Cascade entrenado con ejemplos de caras frontales.Para mejorar la detección, el código ajusta el contraste de las imágenes mediante el algoritmo CLAHE (Contrast Limited Adaptive Histogram Equalization), que resalta los detalles de la cara sin sobreexponer el resto de la imagen. Además, se aplica una rotación progresiva de la imagen (en pasos de 10 grados) con el fin de detectar rostros aunque estén inclinados o girados respecto a la cámara.
Cuando se detecta un rostro, el programa calcula su posición real en el terreno en función de la altura y orientación del dron, el campo de visión de la cámara y las coordenadas de la imagen. A partir de esa información, convierte las coordenadas locales del dron a coordenadas geográficas UTM, de modo que se pueda registrar la ubicación exacta del posible “superviviente”.
El sistema evita registrar la misma persona varias veces mediante una comparación de posiciones. Si la nueva detección está muy cerca de una anterior, se considera repetida y no se guarda.
Mientras ejecuta su misión, el dron monitoriza constantemente su nivel de batería: si baja de un umbral (55%), interrumpe la búsqueda, regresa a un punto seguro, aterriza para simular una recarga, y luego despega de nuevo para continuar. Durante todo el proceso, el programa muestra en la interfaz del WebGUI tanto la imagen de la cámara frontal como la ventral, junto con información del vuelo, detecciones y estado del sistema.
Cuando la búsqueda termina al alcanzar el límite del área asignada, el dron aterriza y el programa muestra en consola las posiciones detectadas de las caras y sus correspondientes coordenadas UTM, completando así la misión de exploración y rescate.
Funciones del programa
get_yaw(target_x, target_y)
Calcula el ángulo de orientación yaw que el dron debe girar para mirar hacia un punto objetivo en el plano, utilizando su posición actual y las coordenadas de destino. Devuelve el ángulo en radianes, que luego se usa para orientar el dron correctamente durante el desplazamiento.
get_utm(coordinate)
Convierte las coordenadas locales del dron (en metros) a coordenadas geográficas UTM basadas en un punto de referencia inicial (latitud y longitud definidas en el código). Esto permite ubicar con precisión en el mapa las posiciones donde se detectaron rostros.
get_pose_face(centre_face)
Determina la posición real de un rostro detectado en la imagen en relación con el terreno, suponiendo un fov (el básico de cámaras) Utiliza la altura del dron, su orientación yaw y los parámetros del campo de visión (FOV) de la cámara para convertir la posición del rostro en la imagen (en píxeles) a coordenadas métricas sobre el suelo.
is_new_face(centre_face)
Comprueba si una nueva cara detectada corresponde a una detección ya registrada previamente. Si la nueva posición está dentro de un rango de 3 metros respecto a una detección anterior, se considera la misma persona. En caso contrario, se añade la nueva posición a la lista de rostros detectados y se guarda su ubicación en coordenadas UTM.
go_to(pos_x,pos_y,altura)
Mueve el dron hasta una posición objetivo especificada por las coordenadas (pos_x, pos_y) y una altura determinada. Durante el desplazamiento, el dron ajusta su orientación (yaw) para dirigirse correctamente hacia el destino. Mientras avanza, se actualizan las imágenes del entorno en la interfaz WebGUI, se reduce progresivamente el nivel de batería y se muestra por consola la información de estado, incluyendo el número de personas detectadas y sus posiciones UTM. El bucle termina cuando el dron se encuentra a menos de 0.2 metros de la posición objetivo en los ejes X e Y.
detectAndDisplay(frame)
Procesa un fotograma de la cámara ventral para detectar rostros. Convierte la imagen a escala de grises, mejora el contraste usando el algoritmo CLAHE, y aplica rotaciones de la imagen en intervalos de 10 grados para detectar caras que estén inclinadas. Cuando encuentra una, calcula su posición original en la imagen sin rotar, la muestra medianteWebGUI, y llama a las funciones correspondientes para registrar la detección en el entorno del dron.
- VIDEO DE MUESTRA
El siguiente video está acelerado x4 porque el dron va muy lento, se puede ver como despepga, va a la zona de busqueda, encuentra a personas y luego vuelve a cargar la bateria y aterriza y vuelve con su vuelo de busqueda encontrando a otra persona.
Ver el video