DIY Standalone-Drohne mit Kontrolle über das Internet. Teil 2 über Software

Dies ist eine Fortsetzung der Geschichte einer autonomen Drohne. Der erste Teil sprach über Hardware, dieser wird über Software sprechen. Zunächst ein kleines Schulungsprogramm über die Interaktion des Bedieners mit dem Hubschrauber. Hier ist ein typisches Layout für die meisten selbstmontierten Drohnen:

Bild

Und hier ist das Schema für fortgeschrittene Drohnen:

Bild

So funktionieren Spielzeugdrohnen, die von einem Smartphone aus gesteuert werden:

Bild

Sie können die Drohne über das Internet steuern (wenn Sie eine SIM-Karte mit einer statischen IP-Adresse haben):

Bild

Oder wenn die IP-Adresse dynamisch ist:

Bild

Für die Zuverlässigkeit und Redundanz von Kommunikationskanälen kann die letztere Option in einem solchen Zustand entwickelt werden:

Bild

Als nächstes beschreibe ich den Einrichtungsprozess für den Emlid Navio 2 Flugcontroller und den Raspberry Pi 3 Mikrocomputer.

Bild
Mit geringfügigen Änderungen sind diese Einstellungen jedoch für jeden Flugcontroller geeignet, mit dem Sie über das MAVLink- Protokoll in Verbindung mit jedem Computer einer Linux-Betriebssystemfamilie kommunizieren können.

Bild

Wichtig! Die Einstellung muss bei ausgeschaltetem Drehzahlregler erfolgen, damit die Motoren nicht versehentlich starten.

Drohnensteuerungssoftware für PC und Tablets


Zur Steuerung des UAV werden spezielle GCS-Programme (Ground Control Station) verwendet. Weiter im Text werde ich diese Abkürzung verwenden. Ich mochte das QGroundControl , ein Open-Source-GCS für mehrere Plattformen (Windows, Linux, MacOS, iOS, Android), das Teil des DroneCode- Projekts wurde. Es gibt jedoch kostenlose und kommerzielle Alternativen: APM-Planer , MissionPlanner , UgCS , LibrePilot , OpenPilot , Tower (DroidPlanner) für Android, MAVPilot (iOS), SidePilot (iOS). Sowie die Konsole MAVProxy .

Installieren Sie ein Betriebssystem-Image auf einer SD-Karte


Für den normalen Autopilotbetrieb wird dringend empfohlen, „schnelle“ SD-Karten (Klasse 10) zu verwenden. Langsame Speicherkarten haben auch bei niedriger Frequenz keine Zeit, Autopilot-Protokolle zu speichern, wodurch sie sich als schief oder gar nicht geschrieben herausstellen. Dies kann auf einen Fehler " Kein E / A-Herzschlag " zurückzuführen sein, der in der MAVLink-Konsole beobachtet werden kann (wie die MAVLink-Konsole überwacht wird, wird unten beschrieben). Achten Sie beim Kauf auf die Möglichkeit, 4K-Videos zu schreiben: Höchstwahrscheinlich handelt es sich um eine schnelle SD. Leider habe ich dies nach dem Fall der Drohne erfahren, als es notwendig war, die Protokolle zu analysieren und den Grund herauszufinden. Protokolle waren für mehrere GCS nicht lesbar. Der Grund für das Ausschalten der Motoren während des Fluges erwies sich als banal: Ich habe vergessen, die Mindestspannung an der Batterie in den Einstellungen für den ausfallsicheren Betrieb einzustellen.

Laden Sie also das fertige Raspbian Stretch-Image mit vorinstalliertem Ardupilot und ROS von Emlid von der ursprünglichen Anweisungsseite herunter. Und wir schreiben es mit Etcher oder einem ähnlichen Programm auf eine Speicherkarte.

Um Raspberry sofort nach dem Einschalten mit Ihrem WiFi-Netzwerk zu verbinden, müssen Sie die Datei wpa_supplicant.conf im Stammverzeichnis der SD-Karte bearbeiten. Es sollte die folgenden Zeilen enthalten:

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

Sie können es auch ohne WLAN konfigurieren, indem Sie einen Einplattencomputer mit einem Ethernet-Kabel an den Router anschließen. Entfernen Sie nun die SD-Karte aus dem PC, legen Sie sie in die Himbeere ein und schalten Sie das Gerät ein. Nach einer halben Minute sollte es im Admin-Bereich des Routers auf der Seite der verbundenen Geräte (Navio- Hostname ) angezeigt werden.

Aktualisieren des Distributionskits und Installieren der erforderlichen Pakete


Öffnen Sie den SSH-Client und stellen Sie eine Verbindung zu Raspberry her (lokale Navio-IP-Adresse anstelle von RASPBERRY_IP_ADDRESS ):

 ssh pi@RASPBERRY_IP_ADDRESS 

Standard Passwort: Himbeere . Zunächst muss das Dateisystem des Betriebssystems auf das gesamte Volume der SD-Karte erweitert werden:

 sudo raspi-config --expand-rootfs 

und neu starten:

 sudo reboot 

Stellen Sie nach dem Neustart erneut eine Verbindung her und aktualisieren Sie die Distribution:

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

Installieren Sie zusätzliche Pakete:

 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 

und kompilieren Sie den gst-rpicamsrc-Wrapper für gstreamer und die native Raspicam-Kamera:

 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 

Überprüfen Sie, ob die Kamera funktioniert (Videodatei test.h264 wird erstellt):

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

Wenn gstreamer startet, warten Sie einige Sekunden, bis das Video aufgenommen wurde. Sie können den Vorgang unterbrechen, indem Sie Strg + C drücken . Wenn es ein Video gibt, funktioniert die Kamera.

Konfigurieren und starten Sie Ardupilot


Die Veröffentlichung neuer Versionen von Ardupilot erfolgt etwas spät in der Montage von Emlid. Wenn die erforderliche Funktionalität in der neuesten Version verfügbar ist, können Sie sie mithilfe dieser Anweisung von der Quelle installieren.

Navio-Entwickler haben ihren Sensoren ein einfaches und praktisches Emlid-Tool hinzugefügt, mit dem sie Sensoren überprüfen und Ardupilot einrichten können. Überprüfen Sie zunächst, ob die Himbeere den Navio-Controller sieht:

 emlidtool info 

Wenn als Antwort auf diesen Befehl etwas erzeugt wird wie:

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

es bedeutet, dass er sieht. Überprüfen Sie den Status der Sensoren (Liste und Status anzeigen):

 emlidtool test 

und PWM-Controller-Treiber im Linux-Kernel:

 cat /sys/kernel/rcio/status/alive 

0 = funktioniert nicht, 1 = funktioniert.

Die Firmware des PWM-Controllers wird wie folgt aktualisiert:

 sudo emlidtool rcio update 

Konfigurieren Sie nun Ardupilot:

 sudo emlidtool ardupilot 

Im Terminal wird eine Text-GUI mit schrittweisen Menüs geöffnet. Wir wählen den Copter der neuesten Version aus, geben arducopter ein , starten beim Start automatisch (beim Booten: aktivieren ) und starten nach der Konfiguration ( Ardupilot: start ).

Bild

Wir verlassen den Menüpunkt Beenden .

Überprüfen Sie, ob Ardupilot gestartet wurde:

 sudo systemctl status arducopter 

Bitte beachten Sie, dass die Startdatei in systemd als arducopter bezeichnet wird , da die Copter- Option konfiguriert wurde.

Jetzt müssen wir den Ardupilot so konfigurieren, dass er uns Telemetrie sendet. Bearbeiten Sie dazu die Konfigurationsdatei:

 sudo nano /etc/default/arducopter 

Es sollte die folgenden Zeilen enthalten:

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

Speichern Sie die Datei ( Strg + X , dann Y ) und starten Sie Ardupilot neu:

 sudo systemctl daemon-reload sudo systemctl restart arducopter 

Sie können den Status des Ardupilot-Prozesses mit dem folgenden Befehl überprüfen:

 sudo systemctl status arducopter 

Mit diesen Einstellungen überträgt Ardupilot Telemetrie ( MAVLink- Pakete) an den lokalen UDP-Port 14550. Als Nächstes übernimmt das MAVProxy- Skript (Beschreibung unten) die Telemetrie von dort und sendet sie an GCS oder das Skript sowie Pakete mit Befehlen in die entgegengesetzte Richtung.

Anstelle der lokalen Adresse und des Ports können Sie die IP-Adresse eines PCs oder Tablets im lokalen Netzwerk aufzeichnen, und die Pakete werden sofort dort gesendet.

Bild

Dieser Ansatz ist jedoch gerechtfertigt, wenn Telemetriedaten nirgendwo anders verwendet werden und das Gerät mit GCS eine statische IP-Adresse hat. Andernfalls müssen Sie jedes Mal einen neuen Ardupiloten in den Einstellungen registrieren. Um mit dem Autopiloten über TCP, mehrere GCSs mit dynamischen Adressen und einigen anderen Skripten auf dem Bordcomputer gleichzeitig zu kommunizieren, ist es bequemer, MAVProxy zu verwenden.

Bild

Dieses Skript (in Python geschrieben) kann MAVLink-Pakete an eine lokale UDP-Adresse empfangen und diese über UDP und TCP an mehrere lokale oder Remote-IP-Adressen weiterleiten. Pakete werden in beide Richtungen an das Ardupilot ⇔ GCS gesendet. Darüber hinaus ist MAVProxy ein vollwertiges GCS, jedoch mit einer Textschnittstelle.

MAVProxy


MAVProxy ist bereits im Navio-Image installiert. Es kann auch auf einem PC (Windows, Linux, MacOS) für die weitere Kommunikation mit dem Autopiloten im Konsolenmodus installiert werden.

Nachdem Sie sichergestellt haben, dass Ardupilot funktioniert, führen Sie das MAVProxy-Skript auf Raspberry mit dem folgenden Befehl aus:

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

Der Parameter --master = udp: 127.0.0.1: 14550 legt die Datenquelle für das Skript fest. Dies ist der lokale UDP-Port, der in der Ardupilot-Konfigurationsdatei registriert wurde. Nach dem Ausführen des Befehls stellt MAVProxy eine Verbindung zu diesem Port her und zeigt Autopilot-Meldungen an, ähnlich wie bei mir:

 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 

Da der Autopilot noch nicht kalibriert und nicht vollständig eingestellt ist, sprechen auch Nachrichten beredt darüber. In diesem Modus können Sie über Befehle mit dem Autopiloten kommunizieren. Wenn die Drohne vollständig abgestimmt wäre, würde eine solche Folge von zwei Befehlen zum Starten der Motoren und zum Abheben der Drohne bis zu einer Höhe von 20 m führen:

 arm throttle takeoff 20 

Ein nicht kalibrierter Autopilot fliegt nicht, zeigt jedoch Meldungen mit Gründen an, warum dies nicht möglich ist.

Herstellen der Kommunikation mit der Drohne im lokalen Netzwerk


Stoppen Sie das Skript ( Strg + C ) und führen Sie es erneut in folgender Form aus:

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

Mit dem zusätzlichen Parameter --out = tcpin: 0.0.0.0: 5762 überwacht MAVProxy Port 5762 auf eingehende TCP-Verbindungen von GCS. Sobald das GCS eine Verbindung herstellt, werden Datenpakete zwischen der Drohne und dem GCS verschoben. Versuchen wir, eine Verbindung von einem PC aus herzustellen:

Bild

Wenn die Verbindung erfolgreich hergestellt wurde, zeigt GCS eine Reihe von Meldungen mit der Aufforderung an, die Sensoren zu kalibrieren und die integrierten Parameter mit ihren aktuellen Werten zu laden:

Bild

Bild

Kalibrierung von Sensoren und Abstimmung der Autopilot-Parameter


Die Autopilot-Kalibrierung kann in nahezu jedem GCS durchgeführt werden. In der Ardupilot-Dokumentation wird dies ausführlich beschrieben. Zunächst legen wir den Rahmentyp fest. Ich habe ein Standard-4-Motor-Layout, das ist also Quad X.

Bild

Der erste Flug wird noch besser im manuellen Modus durchgeführt. Wir verbinden und kalibrieren die Funksteuerung (Empfänger und Sender).

Bild

Beschleunigungsmesser und Kompass müssen noch kalibriert werden.

Bild

Stellen Sie die erforderlichen Parameter ein, damit Ardupilot Daten von externen Sensoren sehen und berücksichtigen kann:

Für PX4Flow ( Kalibrierung des Sensors selbst und Firmware-Update )

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


Für Laserhöhenmesser VL53L0X ( Anleitung )

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


Für IRLock ( detaillierte Anleitung , Wiki IR-Lock )

PLND_ENABLED = 1
PLND_TYPE = 2
PLND_BUS = 1


Für Vorderansicht Sonar ( Anleitung )

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


Vollständige Liste der Ardupilot- Optionen .

Starten Sie nun Ardupilot über das GCS-Menü neu, stellen Sie die Verbindung zur Karte wieder her und öffnen Sie das MAVLink Inspector-Fenster, um die Daten von den Sensoren anzuzeigen.

Bild

Leider sind die Messwerte von IR-Lock hier nicht sichtbar. Für die Analyse seiner Arbeit müssen Sie sich die Protokolle an Bord ansehen. Wie das geht, wird hier beschrieben.

Die Sicherheitseinstellungen müssen noch konfiguriert werden, und Sie können die Drohne starten:

Bild

Wie man die Kreiselaufhängung konfiguriert und die Hauptkamera im Detail steuert Ich werde in einem der folgenden Artikel schreiben, die Hauptpunkte werden hier beschrieben .

Videoübertragung


Lassen Sie uns überprüfen, wie Videoübertragungen im WiFi-Netzwerk funktionieren. Mit diesem Befehl können Sie Videos in einem TCP-Port auf Raspberry mit dem nativen Dienstprogramm raspivid für die Raspicam-Kamera ausführen:

 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 

Dieser Befehl macht jedoch dasselbe und verwendet nur den zuvor kompilierten rpi-camsrc-Wrapper für 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 

In beiden Fällen ist h264 Broadcast unter der Raspberry IP-Adresse an Port 5001 verfügbar.

Sie können es sehen, indem Sie einen solchen Befehl auf Ihrem PC ausführen ( gstreamer muss installiert sein). Geben Sie anstelle von RPI_ADDRESS die Himbeeradresse im Netzwerk an:

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

Infolgedessen sollte sich das Fenster mit dem Video öffnen.

Fast jedes GCS verfügt über einen integrierten Videoplayer, der einen RTSP-Videostream anzeigen kann. Um einen RTSP-Server aus einer Himbeere zu erstellen, können Sie den VLC- Konsolenspieler verwenden. Installation:

 sudo apt-get install vlc 

Die Videoübertragung beginnt wie folgt:

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

Das Video ist verfügbar unter (anstelle von RPI_ADDRESS , Himbeeradresse ):

rtsp://RPI_ADDRESS:8554/live

GCS-Setup:

Bild

Bild

Die Stream-Adresse kann verwendet werden, um mehrere Player auf verschiedenen Geräten zu verbinden. Da die Videoaufnahme und -übertragung für Raspberry jedoch sehr zeitaufwändig ist, ist es für mehrere Videokonsumenten besser, einen externen Server zu verwenden (Beschreibung unten).

Telemetrie über das Internet


Damit GCS über das Internet eine Verbindung zu einer Drohne mit einer dynamischen IP-Adresse herstellen kann, ist ein Zwischenserver mit einer statischen IP erforderlich, auf dem das MAVProxy-Skript gestartet wird. Zu diesem Zweck nutzte ich einen Cloud-Server-Verleih von einem der bekanntesten Anbieter. Für MAVProxy ist die minimalste Konfiguration geeignet, aber da ich denselben Server zum Weiterleiten von Videos verwenden werde, habe ich die Option mit etwas mehr Speicher gewählt (ein Kern und 1 GB Speicher, Ubuntu 18.04). Für die minimale Verzögerung bei der Datenübertragung zwischen der Karte und dem GCS sollte sich der Server in der maximalen geografischen Nähe zur Drohne und zum GCS befinden.

Bild

Installieren Sie MAVProxy auf dem Server. Erste Abhängigkeiten:

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

und dann das Skript selbst über PIP:

 sudo pip install MAVProxy 

schreibe den Pfad:

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

und führen Sie das Skript mit den folgenden Parametern aus:

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

MAVProxy überwacht Port 15001 auf eingehende Telemetriepakete von der Drohne über UDP und Port 15002 auf eingehende TCP-Verbindungen von GCS.

Führen Sie MAVProxy auf Raspberry mit einem weiteren Parameter aus, damit die Telemetrie auch an den Server gesendet wird (anstelle von SERVER_IP die Adresse Ihres Servers):

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

Nach dem Starten des Skripts auf dem Bordcomputer werden Meldungen vom Autopiloten in der Serverkonsole angezeigt. Wie oben erwähnt, ist MAVProxy ein vollwertiges GCS mit einer Textschnittstelle. In diesem Zustand ist es bereits möglich, Parameter zu bearbeiten und die Drohne über Befehle in der Serverkonsole zu steuern.

Verbinden Sie das GCS auf dem PC oder Tablet mit dem Server. Die Verbindungseinstellungen sind dieselben wie für das lokale Netzwerk, nur dass anstelle der Raspberry-IP-Adresse die Serveradresse und der Port 15002 angegeben werden.

Bild

Jetzt können Sie ein 4G-USB-Modem an Raspberry anschließen und die Verzögerung bewerten, mit der der Horizont auf dem Bildschirm reagiert.

Internetvideo


Bild

Installieren Sie den VLC-Player auf dem Server, um das Video weiterzuleiten:

 sudo apt-get install vlc 

Führen Sie es nach der Installation als Relay vom UDP-Port 5001 im RTSP-Kanal SERVER_IP: 8554 / live :

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

An Bord starten wir die Videoübertragung von der Kamera über UDP zum Server (anstelle der Serveradresse 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 

Die Stream-Adresse kann jetzt in den GCS-Einstellungen als Videoquelle verwendet oder in jedem Player geöffnet werden, der dieses Protokoll unterstützt.

Jetzt können Sie die Flugroute planen und die Drohne über das Internet starten, nachdem Sie sie zuvor beispielsweise mit dem Telefonassistenten eingeschaltet haben.

Aufgrund der relativ langen Reisezeit von Video und Telemetrie über das Netzwerk ist diese Methode offensichtlich kaum für FPV-Flüge im manuellen Modus zwischen Hindernissen geeignet.



Themen für spätere Veröffentlichungen:

  • Optionen zum automatischen Laden der Drohne in meinem Vogelhaus und bei welcher ich angehalten habe.
  • Implementieren von webbasiertem GCS mit MAVProxy, NodeJS, socket.io und einem Medienserver zur gleichzeitigen Verwaltung mehrerer Drohnen.
  • Redundante Kommunikationskanäle und Drohnenrettungssysteme
  • Bildverarbeitung und Lidars zur Vermeidung von Kollisionen mit Hindernissen

Fortsetzung folgt…

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


All Articles