Dronlab es un laboratorio de investigación de drones para la integración de automatismos avanzados, logística y comunicaciones. Dronlab permite la validación para cualquier tipo de aplicación profesional o desarrollo de tecnología relacionada con la logística basada en drones, la operación automática y la explotación de las comunicaciones 4G, 5G e IOT. Tiene unas dimensiones de 90 x 45 metros, con una altura máxima de 15 metros. Está ubicado en el Parque Mediterráneo de la Tecnología, en Castelldefels. Dispone de espacios de preparación del vuelo con puntos de corriente y red de comunicaciones wifi y 4G, con opción de videograbación para grabar la operación.
Dispone de:
Vehículos de alta capacidad: dos vehículos DJI Matrice 600 Pro y DJI Wind 4 disponibles para realizar integración de sistemas.
Comunicación baseline 4G: disponible diversa infraestructura de comunicaciones basada en tecnología 4G, en tierra y en los drones.
Comunicación basada en NB-IOT: Constelación de 30 dispositivos básicos y servidores NB-IOT basados en tecnología LPWAN (Low-Power Wide Area Network), para su integración tanto como dispositivos pasivos como activos (a bordo de los drones).
Infraestructura SDN/NFV terrestre: Compuesta por cuatro multiplexores troncales SDN cada uno cuatro QSFP + a 100 Gbps, 48x10GE mas cuatro multiplexores de acceso SDN de seis puertos a 1/10 Gbps, cuatro puertos RJ a 1 Gbps, dos puertos SFP 1/10 Gbps. Un Cloud Privado para la gestión y control virtual de la red 5G dispone de cinco Intel Core: 4 PowerEdge R440.
Infraestructura de generación y análisis de señal: Compuesta por un generador de señal vectorial en la banda 250 kHz hasta 31.8 GHz, para testear el comportamiento de la red 5G no sólo en las bandas de frecuencias actualmente en uso (hasta 5GHz) sino que permite llegar a las bandas de 28 GHz adecuadas para célula. Un emulador de estación base de 5G y pre-5G y que incorpora tecnología de Internet of Things/Smart cities. (LTE-M y NB-IOT). Dispositivos de "software radio" que permitan operar al menos hasta los 6 GHz y con un ancho de banda mayor a 100 MHz y con un peso reducido que permita embarcarlos en los drones.
DronLink es una librería que pretende facilitar el desarrollo de aplicaciones de control del dron. Ofrece una amplia variedad de funcionalidades y se está diseñando con la mente puesta en las posibles necesidades del Drone Engineering Ecosystem (DEE).
En este repositorio puede encontrarse el código de la librería y varias aplicaciones que demuestran su uso, en una variedad de contextos. Es importante tener presente que DronLink está en desarrollo y, por tanto, no exenta de errores.
1. Alternativa a DroneKit
Los primeros módulos del DEE se implementaron usando la librería DroneKit, que es la más usada y documentada. Sin embargo, DroneKit ya no está en mantenimiento y se han observado problemas de compatibilidad con las versiones más actuales de los interpretes de Python. Esta ha sido la motivación principal para iniciar el desarrollo de una librería alternativa, junto con la intención de que la nueva librería sea más simple de usar y orientada a las necesidades del DEE. No obstante, DroneKit es operativa y existe mucha documentación. Además, existen soluciones sencillas para resolver algunos de los problemas de compatibilidad encontrados. En particular, el siguiente gif muestra cómo resolver el primer problema de compatibilidad que se observa al intentar usar DroneKit con versiones actuales del intérprete de Python.
2. Modelo de programación de DronLink
DronLink esta implementada en forma de clase (la clase Dron) con sus atributos y una variedad de métodos para operar con el dron. La clase con los atributos está definida en el fichero Dron.py y los métodos están en los diferentes ficheros de la carpeta modules (connect.py, arm.py, etc.).
Muchos de los métodos pueden activarse de forma bloqueante o de forma no bloqueante. En el primer caso, el control no se devuelve al programa que hace la llamada hasta que la operación ordenada haya acabado. Si la llamada es no bloqueante entonces el control se devuelve inmediatamente para que el programa pueda hacer otras cosas mientras se realiza la operación.
Un buen ejemplo de método con estas dos opciones es takeOff, que tiene la siguiente cabecera:
def takeOff(self, aTargetAltitude, blocking=True, callback=None , params = None)
Al llamar a este método hay que pasarle como parámetro la altura de despegue. Por defecto la operación es bloqueante. Por tanto, el programa que hace la llamada no se reanuda hasta que el dron esté a la altura indicada. En el caso de usar la opción no bloqueante se puede indicar el nombre de la función que queremos que se ejecute cuando la operación haya acabado (función a la que llamamos habitualmente callback). En el caso de takeOff, cuando el dron esté a la altura indicada se activará la función callback. Incluso podemos indicar los parámetros que queremos que se le pasen a ese callback en el momento en que se active. Recuerda que self no es ningún parámetro. Simplemente indica que este es un método de una clase (en este caso, la clase Dron).
Los siguientes ejemplos aclararán estas cuestiones.
Ejemplo 1
from Dron import Dron
dron = Dron()
dron.connect ('tcp:127.0.0.1:5763', 115200) # me conecto al simulador
print (‘Conectado’)
dron.arm()
print (‘Armado’)
dron.takeOff (8)
print (‘En el aire a 8 metros de altura’)
En este ejemplo todas las llamadas son bloqueantes.
Ejemplo 2
from Dron import Dron
dron = Dron()
dron.connect ('tcp:127.0.0.1:5763', 115200) # me conecto al simulador
print (‘Conectado’)
dron.arm()
print (‘Armado’)
dron.takeOff (8, blocking = False) # llamada no bloqueante, sin callback
print (‘Hago otras cosas mientras se realiza el despegue’)
En este caso la llamada no es bloqueante. El programa continua su ejecución mientras el dron realiza el despegue.
Ejemplo 3
from Dron import Dron
dron = Dron()
dron.connect ('tcp:127.0.0.1:5763', 115200) # me conecto al simulador
print (‘Conectado’)
dron.arm()
print (‘Armado’)
def enAire (): # esta es la función que se activa al acabar la operación (callback)
print (‘Por fin ya estás en el aire a 8 metros de altura’)
# llamada no bloqueante con callback
dron.takeOff (8, blocking = False, callback= enAire)
print (‘Hago otras cosas mientras se realiza el despegue’)
De nuevo una llamada no bloqueante. Pero en este caso le estamos indicando que cuando el dron esté a la altura indicada ejecute la función enAire, que en este caso simplemente nos informa del evento.
Ejemplo 4
from Dron import Dron
dron = Dron()
dron.connect ('tcp:127.0.0.1:5763', 115200) # me conecto al simulador
print (‘Conectado’)
dron.arm()
print (‘Armado’)
def informar (param):
print (‘Mensaje del dron: ‘, param)
# Llamada no bloqueante, con callback y parámetro para el callback
dron.takeOff (8, blocking = False, callback= informar, params= ‘En el aire a 8 metros de altura’)
print (‘Hago otras cosas mientras se realiza el despegue. Ya me avisarán’)
En este caso, en la llamada no bloqueante añadimos un parámetro que se le pasará al callback en en el momento de activarlo. De esta forma, la misma función informar se puede usar como callback para otras llamadas no bloqueantes. Por ejemplo, podríamos llamar de forma no bloqueante al método para aterrizar y pasarle como callback también la función informar, pero ahora con el parámetro 'Ya estoy en tierra', que es lo que escribiría en consola la función informar en el momento del aterrizaje.
Ejemplo 5
from Dron import Dron
dron = Dron()
# conexión con identificador del dron
dron.connect ('tcp:127.0.0.1:5763', 115200, id=1)
print (‘Conectado’)
dron.arm()
print (‘Armado’)
# La función del callback recibirá el id del dron como primer parámetro
def informar (id, param):
print (‘Mensaje del dron ‘+str(id) + ‘: ‘ + param)
dron.takeOff (8, blocking = False, callback= informar,
params= ‘En el aire a 8 metros de altura’)
print (‘Hago otras cosas mientras se realiza el despegue. Ya me avisarán’)
En este ejemplo usamos la opción de identificar al dron en el momento de la conexión (podríamos tener varios drones, cada uno con su identificador). Si usamos esa opción entonces el método de la librería va a añadir siempre ese identificador como primer parámetro del callback que le indiquemos.
La modalidad no bloqueante en las llamadas a la librería es especialmente útil cuando queremos interactuar con el dron mediante una interfaz gráfica. Por ejemplo, no vamos a querer que se bloquee la interfaz mientras el dron despega. Seguramente querremos seguir procesando los datos de telemetría mientras el dron despega, para mostrar al usuario, por ejemplo, la altura del dron en todo momento.
En esta lista de distribución pueden encontrase varios vídeos que muestran estos conceptos en acción. Es importante tener en cuenta que en el momento de grabar esos vídeos la librería tenía el nombre provisional de DronLib, y no DronLink, que es el nombre actual. Incluso es posible que alguno de los métodos que se usan en los vídeos hayan cambiado. En la siguiente sección hay una descripción detallada de los métodos de la versión actual.
DronePilot
DronePilot es una aplicación móvil desarrollada en Kotlin, diseñada para enriquecer el ecosistema de ingeniería de drones. Su objetivo es demostrar la perfecta integración de Android nativo en este ecosistema mediante la implementación de dos funcionalidades que permiten controlar el dron.
A continuación se muestra el video Demostración DronePilot con MissionPlanner. El vídeo explica las principales funcionalidades de la aplicación y detalla todos sus componentes, como botones, barra de herramientas, iconografía y las diferentes pantallas que la componen. Finalmente, se muestra una demostración del funcionamiento de la aplicación en un entorno de simulación con Mission Planner.
Proporciona control del dron mediante reconocimiento de gestos. Se ha creado un modelo de 9 gestos, que al ser reconocidos por la aplicación, envía el dron a la dirección asociada a ese gesto.
También se puede tener el control del dron a través de los movimientos del teléfono móvil, utilizando el giroscopio para reconocer los movimientos del mismo y pilotar el dron en función de esos movimientos.
Si se desea instalar esta aplicación en el ordenador primeramente se ha de instalar Android Studio en el ordenador y clonar este repositorio. Una vez descargado, se ha de abrir el proyecto en Android Studio y, para ejecutarlo, se debe generar un dispositivo móvil en el emulador y pulsar el botón "Ejecutar". Se recomienda instalar la aplicación en un dispositivo físico para acceder a todas sus funciones, ya que en un emulador no se podrá probar ninguna de ellas. Para conectar un dispositivo móvil con Android Studio, primero debe tener el sistema operativo Android y se debe activar las opciones de desarrollador; cada móvil tiene una configuración diferente. Una vez activadas las opciones de desarrollador, solo se tiene que conectar el móvil al ordenador mediante su cable y seleccionar el dispositivo físico al ejecutar la aplicación.
Ecosistema de ingeniería de drones
1. Descripción general
El Ecosistema de Ingeniería de Drones es una herramienta de software que permite controlar el funcionamiento de una plataforma de drones de diferentes maneras y mediante distintos tipos de dispositivos y aplicaciones. Observe la figura para ver la arquitectura del software y las tecnologías y herramientas involucradas.
Algunos de los módulos se ejecutan a bordo (el recuadro rojo en la figura). Estos módulos controlan los diferentes dispositivos de la plataforma del dron (el piloto automático, la cámara, los LED, el servo, etc.). El software a bordo está empaquetado en un contenedor Docker para facilitar su instalación.
Otros módulos son aplicaciones front-end que permiten al usuario controlar el dron (especificando planes de vuelo, mostrando las imágenes enviadas por el dron, etc.). Existe una variedad de frameworks y herramientas para implementar aplicaciones front-end, incluyendo Python + tkinter (para aplicaciones de escritorio), Vue + Ionic (para aplicaciones web) y Android Studio, Java, Kotlin o Flutter (para aplicaciones nativas). Algunas de estas aplicaciones front-end pueden controlar un enjambre de drones.
Finalmente, algunos módulos son el back-end para el almacenamiento y recuperación de datos.
Además de estos módulos, el ecosistema utiliza:
Un broker interno (Mosquitto) que se ejecuta a bordo para facilitar la comunicación entre los servicios a bordo.
Un broker externo (Mosquitto) que se ejecuta en Internet para facilitar la comunicación entre los módulos front-end y back-end y la plataforma de drones.
El Mission Planner, que se utiliza para fines de desarrollo, ya que proporciona un simulador de piloto automático, de modo que el ecosistema se puede desarrollar y probar sin necesidad de una plataforma de drones real.
Los módulos se organizan en bloques, según las tecnologías empleadas en su desarrollo. Cada bloque cuenta con un repositorio de GitHub donde se puede encontrar el código de los diferentes módulos que lo componen, junto con información sobre las tecnologías empleadas (instrucciones de instalación, tutoriales, demostraciones, etc.). Estos son los repositorios de los diferentes bloques:
A bordo: Módulos que se ejecutan a bordo (mostrados en el cuadro rojo de la figura).
Aplicaciones de escritorio: Módulos front-end desarrollados con Python y Tkinter (o CustomTkinter) como GUI.
WebApps: Módulos front-end en forma de WebApp, desarrollados utilizando Vue e Ionic.
Aplicaciones de Android: Módulos front-end desarrollados para Android nativo usando Java o Kotlin.
Aplicaciones Flutter: Módulos front-end desarrollados con Flutter.
Back End: Módulos que sirven como back end en casa para computación y almacenamiento y recuperación de datos.
Los módulos complementarios son módulos que no están integrados en el ecosistema pero que contienen información, demostraciones y código que pueden ser relevantes para el desarrollo en diferentes marcos.
Reconocimiento de objetos con redes neuronales: Tutoriales y demostraciones sobre cómo usar Yolov5 para entrenar una red neuronal para el reconocimiento de objetos e integrarla en el ecosistema
Vuelo en interiores: Cómo configurar el dron para volar en interiores con estabilidad y navegabilidad. Incluye una aplicación de panel para controlar el dron.
Librería DronLink: Nuestra propia librería para controlar los drones destinada a sustituir a DroneKit.
Biblioteca CameraLink y webSockets: Nuestra propia biblioteca para controlar la cámara. Incluye material para aprender a comunicar la transmisión de vídeo mediante websockets.
2. Un ejemplo de caso
La mejor manera de comprender el funcionamiento del ecosistema de ingeniería de drones es con un ejemplo. Imaginemos a un usuario que desea que el dron escanee una superficie y tome fotos en puntos específicos. Mediante el panel de control, el usuario puede preparar la misión indicando los puntos de referencia a visitar y los puntos donde se debe tomar la foto. Desde el panel de control, el plan de vuelo se enviará al servicio de piloto automático y las instrucciones al servicio de cámara sobre cuándo tomar las fotos. Posteriormente, ya en el lugar donde se realizará la misión, el usuario puede usar la aplicación móvil para dar la orden de inicio del plan de vuelo. Desde esta aplicación, el usuario también puede tomar decisiones en caso de emergencia (parar, aterrizar, regresar a casa, etc.). Además, en el teléfono móvil, el usuario puede ver las fotos que el dron está tomando. Estas fotos también se envían al servicio de datos, que las almacena en la base de datos para su posterior análisis.
Imaginemos ahora que el usuario no quiere recibir todas las fotos, sino solo aquellas en las que aparece un objeto determinado (por ejemplo, un coche). Además, desea que las fotos seleccionadas se almacenen a bordo y se descarguen y procesen una vez que el dron haya aterrizado. Estas funcionalidades adicionales pueden requerir el desarrollo de módulos adicionales, como un servicio de procesamiento de imágenes y un servicio de almacenamiento y recuperación de datos, ambos a bordo.
3. La plataforma de drones
La plataforma del dron se puede ver en la figura. Utiliza un kit HexSoon para la estructura y los motores, un Orange Cube Pixhawk como controlador de vuelo y una Raspberry Pi como ordenador de a bordo (la caja roja). La plataforma también incluye una cámara, un servo, un botón y un conjunto de LED.
Puede encontrar una guía detallada sobre cómo ensamblar, configurar y poner a punto la plataforma del dron aquí: TransversalProjectGuide.pdf
Guía para el Montaje, configuración y preparación para pruebas de vuelo de un dron Hexsoon EDU 450 (versión 2)
Tello Engineering Ecosystem es una herramienta de software que permite controlar el funcionamiento de un dron Tello de diferentes maneras y mediante distintos tipos de dispositivos y aplicaciones. Observe la figura para ver los módulos de software incluidos en el ecosistema, así como las tecnologías y herramientas involucradas. Los módulos son aplicaciones front-end y servidores que permiten al usuario controlar el dron. Existen diferentes frameworks y herramientas para implementar estos módulos, incluyendo Python + tkinter (para aplicaciones de escritorio) y Vue + Ionic (para aplicaciones Webb). Algunos de estos módulos pueden controlar un enjambre de drones. Otros módulos se comunican entre sí mediante intermediarios MQTT, utilizando un protocolo de publicación/suscripción. Los módulos del ecosistema están en desarrollo. Cada uno cuenta con un repositorio en GitHub con el código e información detallada. A continuación, se presenta una breve descripción de cada módulo:
Tello Drone Circus: una aplicación de escritorio (Python + tkinter) que permite al usuario interactuar con el dron de una manera divertida (por ejemplo, guiar el dron con poses corporales o con la voz).
Your Own Poses: una aplicación de escritorio (Python + tkinter) que permite al usuario definir sus propias poses (mano y cuerpo) y guiar el dron con estas poses.
Tello Web App: una aplicación web (Vue + Ionic) para guiar el dron, tomar fotografías, videos, etc. Envía comandos a través del broker al servidor Tello Drone.
Tello Drone Server: un servidor en Python que recibe comandos de la aplicación web Tello y los envía al dron.
Aplicación web Swarm: una aplicación web (Vue + Ionic) para guiar un enjambre de drones. Envía comandos a través del intermediario al servidor Tello Swarm.
Tello Swarm Server: un servidor en Python que recibe comandos de la aplicación web Swarm y los envía al enjambre de drones.
El dosier de esta actividad se encuentra aquí.






No hay comentarios:
Publicar un comentario