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:

Und hier ist das Schema für fortgeschrittene Drohnen:

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

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

Oder wenn die IP-Adresse dynamisch ist:

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

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

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

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.

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.

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:

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:


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.
Der erste Flug wird noch besser im manuellen Modus durchgeführt. Wir verbinden und kalibrieren die Funksteuerung (Empfänger und Sender).

Beschleunigungsmesser und Kompass müssen noch kalibriert werden.

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.

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:

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:


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.

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.

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

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…