Dron autónomo de bricolaje con control sobre Internet. Parte 2 sobre software

Esta es una continuación de la historia de un dron autónomo. La primera parte habló sobre hardware, esta hablará sobre software. Para empezar, un pequeño programa educativo sobre la interacción del operador con el helicóptero. Aquí hay un diseño típico para la mayoría de los drones autoensamblados:

imagen

Y aquí está el esquema para los drones avanzados:

imagen

Así es como funcionan los drones de juguete, que se controlan desde un teléfono inteligente:

imagen

Puede controlar el dron a través de Internet (si tiene una tarjeta SIM con una dirección IP estática):

imagen

O así, si la dirección IP es dinámica:

imagen

Para la confiabilidad y la redundancia de los canales de comunicación, la última opción se puede desarrollar a tal estado:

imagen

A continuación, describiré el proceso de configuración del controlador de vuelo Emlid Navio 2 y el microordenador Raspberry Pi 3.

imagen
Pero, con modificaciones menores, esta configuración es adecuada para cualquier controlador de vuelo, con el que puede comunicarse a través del protocolo MAVLink junto con cualquier computadora en una familia de sistemas operativos Linux.

imagen

Importante! El ajuste debe realizarse con la alimentación apagada en los controladores de velocidad para que los motores no arranquen accidentalmente.

Software de control de drones para PC y tabletas


Para controlar el UAV, se utilizan programas especiales GCS (estación de control de tierra). Más adelante en el texto usaré esta abreviatura. Me gustó el QGroundControl , un GCS multiplataforma de código abierto (Windows, Linux, MacOS, iOS, Android) que se convirtió en parte del proyecto DroneCode . Pero hay alternativas, gratuitas y comerciales: APM Planner , MissionPlanner , UgCS , LibrePilot , OpenPilot , Tower (DroidPlanner) para Android, MAVPilot (iOS), SidePilot (iOS). Así como la consola MAVProxy .

Instalar una imagen del sistema operativo en una tarjeta SD


Para el funcionamiento normal del piloto automático, se recomienda utilizar tarjetas SD "rápidas" (clase 10). Las tarjetas de memoria lentas no tienen tiempo para guardar los registros del piloto automático, incluso a baja frecuencia, como resultado de lo cual resultan torcidos o no están escritos en absoluto. La evidencia de esto puede ser un error de " No latido IO ", que se puede observar en la consola MAVLink (a continuación se describe cómo ver la consola MAVLink). Al comprar, observe la capacidad de escribir video 4K: lo más probable es que sea una SD rápida. Desafortunadamente, me enteré de esto después de la caída del avión no tripulado, cuando fue necesario analizar los registros y descubrir la razón. Los registros eran ilegibles para varios GCS. La razón para apagar los motores durante el vuelo resultó ser banal: olvidé ajustar el voltaje mínimo de la batería en la configuración para una operación a prueba de fallas.

Entonces, descargue la imagen de Raspbian Stretch terminada con Ardupilot y ROS preinstalados de Emlid desde la página de instrucciones original . Y lo escribimos en una tarjeta de memoria usando Etcher o cualquier programa similar.

Para conectar Raspberry a su red WiFi inmediatamente después de encenderlo, debe editar el archivo wpa_supplicant.conf en la raíz de la tarjeta SD. Debe contener las siguientes líneas:

network={ ssid="_wifi_" psk="_wifi_" } 

También puede configurarlo sin WiFi conectando una computadora de placa única al enrutador con un cable Ethernet. Ahora retire la tarjeta SD de la PC, insértela en la Raspberry y encienda la alimentación. Después de medio minuto, debería aparecer en el panel de administración del enrutador en la página de dispositivos conectados (nombre de host de navio).

Actualización del kit de distribución e instalación de los paquetes necesarios.


Abra el cliente SSH y conéctese a Raspberry (dirección IP de navegación local en lugar de RASPBERRY_IP_ADDRESS ):

 ssh pi@RASPBERRY_IP_ADDRESS 

Contraseña estándar: frambuesa . En primer lugar, es necesario expandir el sistema de archivos del sistema operativo a todo el volumen de la tarjeta SD:

 sudo raspi-config --expand-rootfs 

y reiniciar:

 sudo reboot 

Después de reiniciar, conéctese nuevamente y actualice la distribución:

 sudo apt-get update && sudo apt-get dist-upgrade -y 

Instalar paquetes adicionales:

 sudo apt-get install autoconf automake libtool pkg-config libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libraspberrypi-dev gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad 

y compile el contenedor gst-rpicamsrc para gstreamer y la cámara nativa Raspicam:

 git clone https://github.com/thaytan/gst-rpicamsrc.git rpicamsrc cd rpicamsrc chmod +x autogen.sh ./autogen.sh --prefix=/usr --libdir=/usr/lib/arm-linux-gnueabihf/ make sudo make install 

Compruebe si la cámara funciona (se crea el archivo de video test.h264):

 gst-launch-1.0 rpicamsrc bitrate=1000000 ! filesink location=test.h264 

Si se inicia gstreamer, espere un par de segundos para que se grabe el video. Puede interrumpir el proceso presionando Ctrl + C. Si hay video, entonces la cámara está funcionando.

Configurar y ejecutar Ardupilot


Los lanzamientos de nuevas versiones de Ardupilot están un poco retrasados ​​en el montaje de Emlid. Si la funcionalidad necesaria está disponible en la última versión, puede instalarla desde la fuente utilizando estas instrucciones .

Los desarrolladores de Navio agregaron una herramienta de herramienta Emlid simple y conveniente a sus sensores para verificar los sensores y configurar Ardupilot. Primero, verifique si Raspberry ve el controlador Navio:

 emlidtool info 

Si en respuesta a este comando produce algo como:

 Vendor: Emlid Limited Product: Navio 2 Issue: Emlid 2018-06-05 831f3b08594f2da17dccae980a2e3659115ef71f Kernel: 4.14.34-emlid-v7+ RCIO firmware: 0xcaec2284 

significa que él ve. Verifique el estado de los sensores (muestre la lista y el estado):

 emlidtool test 

y controladores de controlador PWM en el kernel de Linux:

 cat /sys/kernel/rcio/status/alive 

0 = no funciona, 1 = funciona.

El firmware del controlador PWM se actualiza de la siguiente manera:

 sudo emlidtool rcio update 

Ahora configure Ardupilot:

 sudo emlidtool ardupilot 

Se abrirá una GUI de texto con menús paso a paso en el terminal. Seleccionamos el helicóptero de la última versión, escribimos arducopter , inicio automático al inicio (al iniciar: habilitar ), iniciamos después de la configuración ( Ardupilot: inicio ).

imagen

Salimos a través del elemento de menú Salir .

Comprueba si Ardupilot ha comenzado:

 sudo systemctl status arducopter 

Tenga en cuenta que el archivo de inicio en systemd se llama arducopter , ya que se configuró la opción de helicóptero .

Ahora necesitamos configurar el Ardupilot para que nos envíe telemetría. Para hacer esto, edite el archivo de configuración:

 sudo nano /etc/default/arducopter 

Debe contener las siguientes líneas:

 TELEM1="-A udp:127.0.0.1:14550" ARDUPILOT_OPTS="$TELEM1" 

Guarde el archivo ( Ctrl + X , luego Y ) y reinicie Ardupilot:

 sudo systemctl daemon-reload sudo systemctl restart arducopter 

Puede verificar el estado del proceso Ardupilot con el siguiente comando:

 sudo systemctl status arducopter 

Con esta configuración, Ardupilot transmitirá telemetría (paquetes MAVLink ) al puerto UDP local 14550. Luego, el script MAVProxy (descripción a continuación) tomará telemetría desde allí y lo enviará a GCS o al script, así como también enviará paquetes con comandos en la dirección opuesta.

En lugar de la dirección local y el puerto, puede grabar la dirección IP de una PC o tableta en la red local y los paquetes se transmitirán inmediatamente allí.

imagen

Sin embargo, este enfoque se justifica si los datos de telemetría no se utilizan en ningún otro lugar y el dispositivo con GCS tiene una dirección IP estática. De lo contrario, cada vez que tenga que registrar un nuevo Ardupilot en la configuración. Para comunicarse con el piloto automático a través de TCP, varios GCS con direcciones dinámicas y algunos otros scripts en la computadora de a bordo podrían simultáneamente, es más conveniente usar MAVProxy.

imagen

Este script (escrito en Python) puede recibir paquetes MAVLink a una dirección UDP local y retransmitirlos a varias direcciones IP locales o remotas, tanto a través de UDP como de TCP. Los paquetes se envían en ambas direcciones al Ardupilot ⇔ GCS. Además, MAVProxy es un GCS completo, pero con una interfaz de texto.

MAVProxy


MAVProxy ya está instalado en la imagen de Navio. También se puede instalar en una PC (Windows, Linux, MacOS) para una mayor comunicación con el piloto automático en modo consola.

Después de asegurarse de que Ardupilot está funcionando, ejecute el script MAVProxy en Raspberry con este comando:

 mavproxy.py --master=udp:127.0.0.1:14550 

El parámetro --master = udp: 127.0.0.1: 14550 establece la fuente de datos para el script. Este es el puerto UDP local que se registró en el archivo de configuración de Ardupilot. Después de ejecutar el comando, MAVProxy se conectará a este puerto y mostrará mensajes de piloto automático, similar al mío:

 pi@navio:~ $ mavproxy.py --master=udp:127.0.0.1:14550 Connect udp:127.0.0.1:14550 source_system=255 Failed to load module: No module named adsb. Use 'set moddebug 3' in the MAVProxy console to enable traceback Log Directory: Telemetry log: mav.tlog Waiting for heartbeat from 127.0.0.1:14550 MAV> online system 1 STABILIZE> Mode STABILIZE fence breach GPS lock at 0 meters APM: APM:Copter V3.5.5 (88a1ecdd) APM: Frame: UNKNOWN APM: PreArm: RC Roll not configured APM: PreArm: Compass not calibrated APM: PreArm: 3D Accel calibration needed APM: PreArm: check firmware or FRAME_CLASS APM: PreArm: Throttle below Failsafe 

Dado que el piloto automático aún no se ha calibrado y no está totalmente sintonizado, los mensajes también hablan elocuentemente de esto. En este modo, puede comunicarse con el piloto automático a través de comandos. Si el dron estaba completamente sintonizado, tal secuencia de dos comandos conduciría al arranque de los motores y al dron para despegar a una altura de 20 m:

 arm throttle takeoff 20 

Un piloto automático no calibrado no volará, pero mostrará mensajes con los motivos por los que no puede hacerlo.

Establecer comunicación con el dron en la red local.


Detenga el script ( Ctrl + C ) y ejecútelo nuevamente de esta forma:

 mavproxy.py --master=udp:127.0.0.1:14550 --out=tcpin:0.0.0.0:5762 

Con el parámetro adicional --out = tcpin: 0.0.0.0: 5762, MAVProxy escuchará en el puerto 5762 las conexiones TCP entrantes de GCS. Tan pronto como el GCS se conecte, los paquetes de datos comenzarán a moverse entre el dron y el GCS. Intentemos conectarnos desde una PC:

imagen

Si la conexión es exitosa, GCS mostrará un montón de mensajes con una solicitud para calibrar los sensores y cargar los parámetros a bordo con sus valores actuales:

imagen

imagen

Calibración de sensores y ajuste de los parámetros del piloto automático.


La calibración del piloto automático se puede hacer en casi cualquier GCS. La documentación de Ardupilot lo describe con todo detalle. En primer lugar, establecemos el tipo de marco. Tengo un diseño estándar de 4 motores, así que este es Quad X.

imagen

El primer vuelo aún se hace mejor en modo manual. Conectamos y calibramos el control de radio (receptor y transmisor).

imagen

Queda por calibrar el acelerómetro y la brújula.

imagen

Para que Ardupilot vea y tenga en cuenta los datos de sensores externos, configure los parámetros necesarios:

Para PX4Flow ( calibración del sensor en sí y actualización del firmware )

FLOW_ENABLE = 1 (Enabled)
FLOW_ADDR = 0 (0 = 042)


Para altímetro láser VL53L0X ( instrucción )

RNGFND_TYPE = 16 (VL53L0X)
RNGFND_ORIENT = 25 ( )
RNGFND_ADDR = 41 (I2C- ). - 0x29, = 41.
RNGFND_SCALING = 1
RNGFND_MIN_CM = 5
RNGFND_MAX_CM = 120
RNGFND_GNDCLEAR = 15 ( , )


Para IRLock ( instrucciones detalladas , wiki IR-Lock )

PLND_ENABLED = 1
PLND_TYPE = 2
PLND_BUS = 1


Para sonar de vista frontal ( instrucción )

RNGFND2_TYPE = 2 (MaxbotixI2C sonar)
RNGFND2_ORIENT = 0 ( )
RNGFND2_MAX_CM = 700 ( )


Lista completa de opciones de Ardupilot.

Ahora reinicie Ardupilot desde el menú GCS, vuelva a conectarse a la placa y abra la ventana del Inspector MAVLink para ver los datos de los sensores.

imagen

Desafortunadamente, las lecturas de IR-Lock no son visibles aquí, para el análisis de su trabajo tendrá que mirar los registros a bordo. Cómo hacer esto se describe aquí .

Queda por configurar los ajustes de seguridad y puede iniciar el dron:

imagen

Cómo configurar la suspensión giroscópica y controlar la cámara principal en detalle Escribiré en uno de los siguientes artículos, los puntos principales se describen aquí .

Transmisión de video


Veamos cómo funciona la transmisión de video en la red WiFi. Con este comando, puede ejecutar video en un puerto TCP en Raspberry usando la utilidad raspivid nativa para la cámara Raspicam:

 raspivid -t 0 -hf -fps 25 -w 640 -h 480 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=0.0.0.0 port=5001 

Pero este comando hace lo mismo, solo usa el contenedor rpi-camsrc compilado previamente para gstreamer:

 gst-launch-1.0 rpicamsrc sensor-mode=4 ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=0.0.0.0 port=5001 

En ambos casos, la transmisión h264 está disponible en la dirección IP de Raspberry en el puerto 5001.

Puede verlo ejecutando dicho comando en su PC ( gstreamer debe estar instalado), en lugar de RPI_ADDRESS, especifique la dirección Raspberry en la red:

 gst-launch-1.0 -v tcpclientsrc host=RPI_ADDRESS port=5001 ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink sync=false 

Como resultado, la ventana con el video debería abrirse.

Casi cualquier GCS tiene un reproductor de video incorporado que puede mostrar una transmisión de video RTSP. Para hacer un servidor RTSP desde una Raspberry, puede usar el reproductor de consola VLC . Instalación:

 sudo apt-get install vlc 

La transmisión de video comienza de la siguiente manera:

 raspivid -o - -t 0 -n -w 320 -h 240 -fps 25 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/live}' :demux=h264 

El video está disponible en (en lugar de RPI_ADDRESS , dirección de frambuesa):

rtsp://RPI_ADDRESS:8554/live

Configuración de GCS:

imagen

imagen

La dirección de transmisión se puede usar para conectar varios reproductores en diferentes dispositivos, pero dado que la captura y transmisión de video para Raspberry es un proceso que consume mucho tiempo, es mejor que varios consumidores de video usen un servidor externo (descripción a continuación).

Telemetría por internet


Para que GCS se conecte a través de Internet a un dron con una dirección IP dinámica, se requiere un servidor intermedio con una IP estática en el que se lanzará el script MAVProxy. Para estos fines, aproveché el alquiler de un servidor en la nube de uno de los proveedores más conocidos. Para MAVProxy, la configuración mínima es adecuada, pero como usaré el mismo servidor para retransmitir video, elegí la opción con un poco más de memoria (un núcleo y 1 GB de memoria, Ubuntu 18.04). Para el retraso mínimo en el paso de datos entre la placa y el GCS, el servidor debe ubicarse en la máxima proximidad geográfica al dron y al GCS.

imagen

Instale MAVProxy en el servidor. Primeras dependencias:

 sudo apt-get install python-dev python-opencv python-wxgtk3.0 python-pip python-matplotlib python-pygame python-lxml python-yaml 

y luego el script en sí a través de PIP:

 sudo pip install MAVProxy 

escribe el camino:

 echo "export PATH=$PATH:$HOME/.local/bin" >> ~/.bashrc 

y ejecute el script con los siguientes parámetros:

 mavproxy.py --master=udp:0.0.0.0:15001 --out=tcpin:0.0.0.0:15002 

MAVProxy escucha en el puerto 15001 los paquetes de telemetría entrantes del dron a través de UDP, y el puerto 15002 para la conexión TCP entrante desde GCS.

Ejecute MAVProxy en Raspberry con un parámetro más, de modo que la telemetría también se transmita al servidor (en lugar de SERVER_IP la dirección de su servidor):

 mavproxy.py --master=udp:127.0.0.1:14550 --out=tcpin:0.0.0.0:5762 --out=udpout:SERVER_IP:15001 

Después de iniciar el script en la computadora de a bordo, aparecerán mensajes del piloto automático en la consola del servidor. Como se mencionó anteriormente, MAVProxy es un GCS completo con una interfaz de texto y en este estado ya es posible editar parámetros y controlar el dron a través de comandos en la consola del servidor.

Conecte el GCS en la PC o tableta al servidor. La configuración de conexión es la misma que para la red local, solo que en lugar de la dirección IP de Raspberry, especificamos la dirección del servidor y el puerto 15002.

imagen

Ahora puede conectar un módem USB 4G a Raspberry y evaluar el retraso con el que reacciona el horizonte en la pantalla.

Video de internet


imagen

Para retransmitir el video, instale el reproductor VLC en el servidor:

 sudo apt-get install vlc 

Después de la instalación, ejecútelo como un relé desde el puerto UDP 5001 en el canal RTSP SERVER_IP: 8554 / live :

 cvlc -vvv udp://@:5001 --sout '#rtp{sdp=rtsp://:8554/live}' :demux=h264 

A bordo, comenzaremos la transmisión de video desde la cámara al servidor a través de UDP (en lugar de la dirección del servidor SERVER_IP ):

 gst-launch-1.0 rpicamsrc bitrate=1000000 ! video/x-h264,width=640,height=480,framerate=25/1 ! h264parse ! udpsink host=SERVER_IP port=5001 

La dirección de transmisión ahora se puede usar como fuente de video en la configuración de GCS o se puede abrir en cualquier reproductor que admita este protocolo.

Ahora puede planificar la ruta del vuelo e iniciar el dron a través de Internet, habiéndolo encendido previamente, por ejemplo, utilizando el asistente telefónico.

Obviamente, debido al tiempo de viaje relativamente largo de video y telemetría a través de la red, este método no es adecuado para vuelos FPV en modo manual entre obstáculos.



Temas para publicaciones posteriores:

  • Opciones para cargar automáticamente el dron en mi casita para pájaros y en cuál me detuve.
  • Implementando GCS basado en la web usando MAVProxy, NodeJS, socket.io y un servidor de medios para administrar múltiples drones simultáneamente.
  • Canales de comunicación redundantes y sistemas de rescate con drones.
  • Visión artificial y lidares para evitar colisiones con obstáculos.

Continuará ...

Source: https://habr.com/ru/post/es414587/


All Articles