Drone autonome bricolage avec contrôle sur Internet. Partie 2 sur les logiciels

Il s'agit d'une continuation de l'histoire d'un drone autonome. La première partie a parlé de matériel, celle-ci parlera de logiciel. Pour commencer, un petit programme pédagogique sur l'interaction de l'opérateur avec l'hélicoptère. Voici une disposition typique pour la plupart des drones auto-assemblés:

image

Et voici le schéma des drones avancés:

image

Voici comment fonctionnent les drones jouets, qui sont contrôlés depuis un smartphone:

image

Vous pouvez contrôler le drone via Internet (si vous avez une carte SIM avec une adresse IP statique):

image

Ou alors si l'adresse IP est dynamique:

image

Pour la fiabilité et la redondance des canaux de communication, cette dernière option peut être développée dans un tel état:

image

Ensuite, je décrirai le processus de configuration du contrôleur de vol Emlid Navio 2 et du micro-ordinateur Raspberry Pi 3.

image
Mais, avec des modifications mineures, ces paramètres conviennent à tout contrôleur de vol, avec lequel vous pouvez communiquer via le protocole MAVLink en conjonction avec n'importe quel ordinateur sur une famille de systèmes d'exploitation Linux.

image

Important! Le réglage doit être effectué hors tension sur les régulateurs de vitesse afin que les moteurs ne démarrent pas accidentellement.

Logiciel de contrôle des drones pour PC et tablettes


Pour contrôler l'UAV, des programmes spéciaux GCS (Ground Control Station) sont utilisés. Plus loin dans le texte, j'utiliserai cette abréviation. J'ai aimé le QGroundControl , un GCS multi-plateforme open source (Windows, Linux, MacOS, iOS, Android) qui est devenu une partie du projet DroneCode . Mais il existe des alternatives, gratuites et commerciales: APM Planner , MissionPlanner , UgCS , LibrePilot , OpenPilot , Tower (DroidPlanner) pour Android, MAVPilot (iOS), SidePilot (iOS). Ainsi que la console MAVProxy .

Installer une image de système d'exploitation sur une carte SD


Pour un fonctionnement normal du pilote automatique, il est fortement recommandé d'utiliser des cartes SD «rapides» (classe 10). Les cartes mémoire lentes n'ont pas le temps de sauvegarder les journaux du pilote automatique même à basse fréquence, ce qui fait qu'elles s'avèrent tordues ou pas écrites du tout. La preuve de cela peut être une erreur « Pas de battement de cœur IO », qui peut être observée dans la console MAVLink (comment regarder la console MAVLink est décrite ci-dessous). Lors de l'achat, regardez la possibilité d'écrire des vidéos 4K: ce sera très probablement une SD rapide. Malheureusement, je l'ai découvert après la chute du drone, alors qu'il était nécessaire d'analyser les journaux et d'en découvrir la raison. Les journaux étaient illisibles pour plusieurs GCS. La raison de l'arrêt des moteurs pendant le vol s'est avérée être banale: j'ai oublié de régler la tension minimale sur la batterie dans les paramètres de fonctionnement à sécurité intégrée.

Alors, téléchargez l'image Raspbian Stretch terminée avec Ardupilot et ROS pré-installés d'Emlid à partir de la page d'instructions d'origine . Et nous l'écrivons sur une carte mémoire en utilisant Etcher ou tout autre programme similaire.

Afin de connecter Raspberry à votre réseau WiFi immédiatement après la mise sous tension, vous devez modifier le fichier wpa_supplicant.conf à la racine de la carte SD. Il doit contenir les lignes suivantes:

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

Vous pouvez également le configurer sans WiFi en connectant un ordinateur à une seule plaque au routeur avec un câble Ethernet. Retirez maintenant la carte SD du PC, insérez-la dans le Raspberry et allumez-la. Après une demi-minute, il devrait apparaître dans le panneau d'administration du routeur sur la page des appareils connectés ( nom d'hôte navio).

Mise à jour du kit de distribution et installation des packages nécessaires


Ouvrez le client SSH et connectez-vous à Raspberry (adresse IP navio locale au lieu de RASPBERRY_IP_ADDRESS ):

 ssh pi@RASPBERRY_IP_ADDRESS 

Mot de passe standard: framboise . Tout d'abord, il est nécessaire d'étendre le système de fichiers de l'OS à l'ensemble du volume de la carte SD:

 sudo raspi-config --expand-rootfs 

et redémarrez:

 sudo reboot 

Après le redémarrage, connectez-vous à nouveau et mettez à jour la distribution:

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

Installez des packages supplémentaires:

 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 

et compilez le wrapper gst-rpicamsrc pour gstreamer et la caméra native 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 

Vérifiez si la caméra fonctionne (le fichier vidéo test.h264 est créé):

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

Si gstreamer démarre, attendez quelques secondes que la vidéo soit enregistrée. Vous pouvez interrompre le processus en appuyant sur Ctrl + C. S'il y a de la vidéo, alors la caméra fonctionne.

Configurer et lancer Ardupilot


Les sorties de nouvelles versions d'Ardupilot sont un peu en retard dans l'assemblage d'Emlid. Si la fonctionnalité nécessaire est disponible dans la dernière version, vous pouvez l'installer à partir de la source à l' aide de cette instruction .

Les développeurs de Navio ont ajouté un utilitaire d'outil Emlid simple et pratique à leurs capteurs pour vérifier les capteurs et configurer Ardupilot. Tout d'abord, vérifiez si le Raspberry voit le contrôleur Navio:

 emlidtool info 

Si en réponse à cette commande produit quelque chose comme:

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

cela signifie qu'il voit. Vérifiez l'état des capteurs (affichez la liste et l'état):

 emlidtool test 

et pilotes de contrôleur PWM dans le noyau Linux:

 cat /sys/kernel/rcio/status/alive 

0 = ne fonctionne pas, 1 = fonctionne.

Le micrologiciel du contrôleur PWM est mis à jour comme suit:

 sudo emlidtool rcio update 

Configurez maintenant Ardupilot:

 sudo emlidtool ardupilot 

Une interface graphique texte avec des menus pas à pas s'ouvrira dans le terminal. Nous sélectionnons l'hélicoptère de la dernière version, type arducopter , démarrage automatique au démarrage ( Au démarrage: activer ), démarrer après la configuration ( Ardupilot: démarrer ).

image

Nous quittons via l'élément de menu Quitter .

Vérifiez si Ardupilot a démarré:

 sudo systemctl status arducopter 

Veuillez noter que le fichier de démarrage dans systemd s'appelle arducopter , car l'option copter a été configurée.

Nous devons maintenant configurer l'Ardupilot pour qu'il nous envoie de la télémétrie. Pour ce faire, modifiez le fichier de configuration:

 sudo nano /etc/default/arducopter 

Il doit contenir les lignes suivantes:

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

Enregistrez le fichier ( Ctrl + X , puis Y ) et redémarrez Ardupilot:

 sudo systemctl daemon-reload sudo systemctl restart arducopter 

Vous pouvez vérifier l'état du processus Ardupilot avec la commande suivante:

 sudo systemctl status arducopter 

Avec ces paramètres, Ardupilot transmettra la télémétrie (paquets MAVLink ) au port UDP local 14550. Ensuite, le script MAVProxy (description ci-dessous) prendra la télémétrie à partir de là et l'enverra à GCS ou au script, ainsi que des paquets avec des commandes dans la direction opposée.

Au lieu de l'adresse et du port locaux, vous pouvez enregistrer l'adresse IP d'un PC ou d'une tablette sur le réseau local et les paquets y seront immédiatement diffusés.

image

Cependant, cette approche est justifiée si les données de télémétrie ne sont utilisées nulle part ailleurs et que le périphérique avec GCS a une adresse IP statique. Sinon, chaque fois que vous devez enregistrer un nouvel Ardupilot dans les paramètres. Pour communiquer avec le pilote automatique via TCP, plusieurs GCS avec des adresses dynamiques et certains autres scripts sur l'ordinateur de bord pourraient simultanément, il est plus pratique d'utiliser MAVProxy.

image

Ce script (écrit en Python) peut recevoir des paquets MAVLink vers une adresse UDP locale et les relayer vers plusieurs adresses IP locales ou distantes, à la fois via UDP et TCP. Les paquets sont envoyés dans les deux directions à l'Ardupilot® GCS. De plus, MAVProxy est un GCS à part entière, mais avec une interface texte.

MAVProxy


MAVProxy est déjà installé dans l'image Navio. Il peut également être installé sur un PC (Windows, Linux, MacOS) pour une communication ultérieure avec le pilote automatique en mode console.

Après vous être assuré que Ardupilot fonctionne, exécutez le script MAVProxy sur Raspberry avec cette commande:

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

Le paramètre --master = udp: 127.0.0.1: 14550 définit la source de données du script. Il s'agit du port UDP local qui a été enregistré dans le fichier de configuration Ardupilot. Après avoir exécuté la commande, MAVProxy se connectera à ce port et affichera les messages du pilote automatique, comme le mien:

 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 

Étant donné que le pilote automatique n'a pas encore été calibré et n'est pas entièrement réglé, les messages en parlent également avec éloquence. Dans ce mode, vous pouvez communiquer avec le pilote automatique via des commandes. Si le drone était entièrement réglé, une telle séquence de deux commandes conduirait au démarrage des moteurs et au drone de décoller à une hauteur de 20 m:

 arm throttle takeoff 20 

Un pilote automatique non calibré ne volera pas, mais affichera des messages avec les raisons pour lesquelles il ne peut pas le faire.

Etablir la communication avec le drone sur le réseau local


Arrêtez le script ( Ctrl + C ) et exécutez-le à nouveau sous cette forme:

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

Avec le paramètre supplémentaire --out = tcpin: 0.0.0.0: 5762, MAVProxy écoutera sur le port 5762 les connexions TCP entrantes de GCS. Dès que le GCS se connecte, les paquets de données commenceront à se déplacer entre le drone et le GCS. Essayons de nous connecter depuis un PC:

image

Si la connexion est réussie, GCS affichera un tas de messages avec une demande de calibrer les capteurs et charger les paramètres embarqués avec leurs valeurs actuelles:

image

image

Calibration des capteurs et réglage des paramètres du pilote automatique


L'étalonnage du pilote automatique peut être effectué dans presque tous les GCS. La documentation Ardupilot le décrit en détail. Tout d'abord, nous définissons le type de cadre. J'ai une configuration standard à 4 moteurs, c'est donc le Quad X.

image

Le premier vol est encore mieux fait en mode manuel. Nous connectons et calibrons la radiocommande (récepteur et émetteur).

image

Reste à calibrer l'accéléromètre et la boussole.

image

Pour qu'Ardupilot puisse voir et prendre en compte les données des capteurs externes, définissez les paramètres nécessaires:

Pour PX4Flow ( étalonnage du capteur lui-même et mise à jour du firmware )

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


Pour altimètre laser VL53L0X ( instruction )

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 ( , )


Pour IRLock ( instructions détaillées , wiki IR-Lock )

PLND_ENABLED = 1
PLND_TYPE = 2
PLND_BUS = 1


Pour sonar vue de face ( instruction )

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


Liste complète des options d' Ardupilot.

Redémarrez maintenant Ardupilot à partir du menu GCS, reconnectez-vous à la carte et ouvrez la fenêtre MAVLink Inspector pour voir les données des capteurs.

image

Malheureusement, les lectures d'IR-Lock ne sont pas visibles ici, pour l'analyse de son travail, vous devrez consulter les journaux de bord. La procédure à suivre est décrite ici .

Il reste à configurer les paramètres de sécurité et vous pouvez démarrer le drone:

image

Comment configurer la suspension gyroscopique et contrôler la caméra principale en détail J'écrirai dans l'un des articles suivants, les principaux points sont décrits ici .

Diffusion vidéo


Vérifions le fonctionnement de la diffusion vidéo sur le réseau WiFi. Avec cette commande, vous pouvez exécuter la vidéo dans un port TCP sur Raspberry en utilisant l'utilitaire natif de raspivid pour la caméra 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 

Mais cette commande fait la même chose, en utilisant uniquement le wrapper rpi-camsrc précédemment compilé pour 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 

Dans les deux cas, la diffusion h264 est disponible à l'adresse IP Raspberry sur le port 5001.

Vous pouvez le voir en exécutant une telle commande sur votre PC ( gstreamer doit être installé), au lieu de RPI_ADDRESS, spécifiez l'adresse Raspberry sur le réseau:

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

En conséquence, la fenêtre avec la vidéo devrait s'ouvrir.

Presque tous les GCS ont un lecteur vidéo intégré qui peut afficher un flux vidéo RTSP. Pour créer un serveur RTSP à partir d'un Raspberry, vous pouvez utiliser le lecteur de console VLC . Installation:

 sudo apt-get install vlc 

La diffusion vidéo commence comme suit:

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

La vidéo est disponible à (au lieu de RPI_ADDRESS , adresse Raspberry):

rtsp://RPI_ADDRESS:8554/live

Configuration de GCS:

image

image

L'adresse de flux peut être utilisée pour connecter plusieurs lecteurs sur différents appareils, mais comme la capture et la diffusion vidéo pour Raspberry sont un processus très long, il est préférable pour plusieurs consommateurs de vidéo d'utiliser un serveur externe (description ci-dessous).

Télémétrie sur Internet


Pour que GCS se connecte via Internet à un drone avec une adresse IP dynamique, un serveur intermédiaire avec une IP statique est requis sur lequel le script MAVProxy sera lancé. À ces fins, j'ai profité d'une location de serveur cloud auprès d'un des fournisseurs bien connus. Pour MAVProxy, la configuration la plus minimale convient, mais comme je vais utiliser le même serveur pour relayer la vidéo, j'ai choisi l'option avec un peu plus de mémoire (un cœur et 1 Go de mémoire, Ubuntu 18.04). Pour un délai minimum dans le passage des données entre la carte et le GCS, le serveur doit être situé à la proximité géographique maximale du drone et du GCS.

image

Installez MAVProxy sur le serveur. Premières dépendances:

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

puis le script lui-même via PIP:

 sudo pip install MAVProxy 

écrivez le chemin:

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

et exécutez le script avec les paramètres suivants:

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

MAVProxy écoute sur le port 15001 pour les paquets de télémétrie entrants du drone via UDP, et le port 15002 pour la connexion TCP entrante de GCS.

Exécutez MAVProxy sur Raspberry avec un paramètre de plus, afin que la télémétrie soit également diffusée sur le serveur (au lieu de SERVER_IP l' adresse de votre serveur):

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

Après avoir démarré le script sur l'ordinateur de bord, les messages du pilote automatique apparaîtront dans la console du serveur. Comme mentionné ci-dessus, MAVProxy est un GCS à part entière avec une interface texte et dans cet état, il est déjà possible de modifier les paramètres et de contrôler le drone via des commandes dans la console du serveur.

Connectez le GCS sur le PC ou la tablette au serveur. Les paramètres de connexion sont les mêmes que pour le réseau local, mais au lieu de l'adresse IP Raspberry, nous spécifions l'adresse du serveur et le port 15002.

image

Vous pouvez maintenant connecter un modem USB 4G à Raspberry et évaluer le délai de réaction de l'horizon à l'écran.

Vidéo Internet


image

Pour relayer la vidéo, installez le lecteur VLC sur le serveur:

 sudo apt-get install vlc 

Après l'installation, exécutez-le en tant que relais à partir du port UDP 5001 dans le canal RTSP SERVER_IP: 8554 / live :

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

À bord, nous allons commencer la diffusion vidéo de la caméra vers le serveur via UDP (au lieu de l'adresse du serveur 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 

L'adresse de flux peut désormais être utilisée comme source vidéo dans les paramètres GCS ou ouverte dans n'importe quel lecteur prenant en charge ce protocole.

Vous pouvez maintenant planifier l'itinéraire de vol et lancer le drone via Internet, après l'avoir allumé, par exemple, à l'aide de l'assistant téléphonique.

De toute évidence, en raison du temps de trajet relativement long de la vidéo et de la télémétrie sur le réseau, cette méthode ne convient guère aux vols FPV en mode manuel entre les obstacles.



Sujets pour les publications suivantes:

  • Options pour charger automatiquement le drone dans mon nichoir et auquel je me suis arrêté.
  • Implémentation de GCS basé sur le Web en utilisant MAVProxy, NodeJS, socket.io et un serveur multimédia pour gérer plusieurs drones simultanément.
  • Canaux de communication redondants et systèmes de sauvetage par drone
  • Vision industrielle et lidars pour éviter les collisions avec des obstacles

À suivre ...

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


All Articles