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:

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

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

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

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

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

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

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.
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 ).

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í.

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.

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:

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:


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.
El primer vuelo aún se hace mejor en modo manual. Conectamos y calibramos el control de radio (receptor y transmisor).

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

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.

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:

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:


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.

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.

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

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á ...