Semana 7 - PilotoExperto sigue líneas
Índice
Solución de error de ruta del mundo
Como mencioné en semanas anteriores, vi un fallo al cargar el mundo en Gazebo. Por lo tanto, hice un pull request con el cambio, siendo mi primer pull request aceptado en un proyecto en el que no había participado directamente.
Problemas encontrados
Tardanza en el arranque
Para solucionar la tardanza producida por PX4, me puse en contacto de nuevo con el equipo de Aerostack2 en el siguiente issue, donde gracias a los desarrolladores conseguí solucionar el fallo.
Lo que se hizo principalmente fue cambiar las coordenadas del dron al origen del mapa y desactivar el parámetro COM_DISARM_PRFLT.
Drone no cambia de velocidad reactivamente
Después de lograr despegar el dron en un tiempo razonable, comencé con la implementación del sigue líneas. El problema era que los temporizadores de ROS no funcionaban al enviar comandos de velocidad al dron. Sin embargo, logré hacerlo funcionar llamando constantemente a la función dentro de un bucle. El problema era que si no se “descansa” el procesador, este se saturará y no publicará las imágenes a tiempo. La solución fue sencilla: añadir un “sleep”.
También se capturó la interrupción de ctrl+c para que, cuando se presione, el dron aterrice y el programa se cierre adecuadamente.
Sistema más “nervioso” y consideración de la altura
El dron es un sistema más nervioso que el coche, por lo que lo primero que se hizo fue alinear el punto más alto estimado de la línea con el centro, haciendo lo mismo con el más bajo, dándole igual o más importancia para que el robot siga satisfactoriamente la línea.
Problema de la altura
El siguiente problema fue la altura. Primero, la línea se hizo más fina; con una dilatación de imagen no es suficiente, ya que si el filtro de color falla, estos defectos se harán más grandes. Por lo tanto, se realizó una apertura. Primero se erosionó la imagen ligeramente, ya que una apertura excesiva eliminaría la parte próxima de la línea, dejando al dron poco tiempo de reacción. La dilatación se hizo grande para poder tener una línea considerable.
Dado que el dron tiene una vista mayor que la del coche, puede ver más allá de sus siguientes pasos. Esto puede provocar que, al seguir la línea, detecte el rojo de otra curva y se vaya hacia ella. Si erosionamos demasiado, perderemos información y tiempo de respuesta, por lo que será más ideal usar algún método donde obtengamos la distancia de la línea.
Overshoot en altura con configuración por defecto
Se aplicó un PID al control normal de velocidad. Dado que con los primeros valores del PID se obtuvo un buen resultado, no se cambió el de Aerostack, pero se grabó un video de cómo funciona el control de velocidad de un dron sin PID.
Frecuencia de publicación y suscripción
Inicialmente, el dron tenía una frecuencia de 10 Hz para recibir la imagen, lo que resultaba en una respuesta muy lenta y complicaba el control. Una vez corregido esto.
Midas
Midas es una red neuronal que, a partir de imágenes 2D, infiere la imagen de profundidad. Se logró usar para imágenes externas:
Pero para ROS, no se logró inferir en tiempo real, y el paquete disponible no es de ROS2, por lo que será necesario migrar la versión del nodo. Se ha planteado o bien pasar la versión de C++ a ROS2 con C++, o usar la versión con TensorFlow en Python junto a un nodo.
-
Resultado con modelo de alta calidad:
-
Resultado con modelo liviano computacionalmente:
Conda
Para activar Conda:
source ~/anaconda3/bin/activate
Conclusión
Se logró implementar el sigue líneas a una velocidad aceptable pero a baja altura; para alturas más altas, se necesitará la distancia del dron a la imagen.
También se me ocurrió que al tener alineados los 2 puntos se podría mover el dron en el eje y para alinearse.