Im ersten Teil der Artikelserie zum Projekt Cockpit-Anwendung zur Ryze RoboMaster Tello Talent (TT) Drohne habe ich die Drohne und einige allgemeine Informationen vorgestellt. In diesem zweiten Teil der Artikelserie möchte ich nun auf meine selbst formulierten Anforderungen und Ziele für die Cockpit-Anwendung eingehen sowie erste vorbereitende Maßnahmen beschreiben.

Ziele und Anforderungen

Ziel dieses Projektes ist die Entwicklung einer alternativen Steuerungsmöglichkeit für die Drohne. Die bereitgestellte App ist zwar in Ordnung, aber mich stört die geringe Bildschirmgröße (ein Tablet wäre hier eine Alternative) und ich möchte die Gelegenheit nutzen, um meine Programmierfertigkeit zu verbessern.

Im Cockpit soll der Videostream der Drohne, allgemeine technische Daten wie Flughöhe, Fluggeschwindigkeit etc., Informationen zur Verbindung zwischen dem PC und der Drohne (Verbindungsaufbau erfolgt via W-LAN) und ggf. eine Ausgabe der Position auf einer Karte erfolgen. Die Steuerung der Drohne erfolgt dann entweder über die Tastatur oder über einem Gamepad (X-BOX 360-Controller).

Die letzte Zielstellung (Verbesserung der Programmierfertigkeit) kann konkretisiert werden, denn die Anwendung möchte ich in Python Versionszweig 3.x [1] entwickeln und mich intensiver mit dem Open-Source-Framework Kivy [2] auseinandersetzen. Die Kommunikation mit der Drohne wird zu Beginn über das UDP-Protokoll (vgl. SDK 3.0 Benutzerleitfaden im Downloadbereich [3]) erfolgen. Die Nutzung des Python-Packages robomaster [4] könnte zu einem späteren Entwicklungsstand herangezogen werden.

Für Python spricht die Plattformunabhänigkeit und die verbreitete Nutzung im Bereich der Datenanalyse (Data Science), wodurch die Sprache auch beruflich nicht uninteressant ist. Durch den Einsatz des Kivy-Frameworks ist ein Crossplattformeinsatz möglich, womit die Cockpit-Anwendung theoretisch auch unter iOS und Android genutzt werden könnte (keine Zielstellung!). Zielplattformen sind derzeit jedoch Windows und Linux.

Vorbereitung der Entwicklungsumgebung

Python kann auf verschiedenen Wegen installiert werden. Unter Linux sind i. d. R. in den Repositories der Distributionen entsprechende Pakete vorhanden und können über die Softwareverwaltung installiert werden. Unter Windows kann Python über das Installationspaket von der Python-Webseite oder über den Microsoft Store installiert werden. Alternativ kann auch eine Python-Distribution wie Anaconda [5] genutzt werden. Da ich gelegentlich auch Excel-Dateien via Python verarbeite, um diese für die Darstellung der Daten in Diagrammen aufzubereiten, nutze ich unter Windows die Anaconda-Distribution. Als Editor nutze ich Visual Studio Code [6] (kurz VSC). VSC kann über den Marktplatz mit verschiedenen Erweiterungen entsprechend angepasst werden. Für Python stellt Microsoft eine entsprechende Erweiterung mit Syntax-Highlighting bereit. Zudem kann via VSC auch das GitHub-Repository verwaltet werden, sodass ein bequemes Arbeiten an verschiedenen Rechnern möglich ist. Über den Marktplatz kann auch eine Erweiterung zu Kivy von BattleBas [7] gefunden werden, welche mit Syntax-Highlighting das Entwickeln von Kivy-Anwendungen erleichtert.

Die Installation von Kivy kann auf unterschiedlichen Wegen erfolgen und hängt von der genutzten Plattform und Python-Distribution ab. Ich beschreibe knapp die Installation unter Windows für die Anaconda-Distribution. Für die anderen Plattformen und/oder Python-Distributionen existiert eine Beschreibung in der Dokumentation von Kivy [8]. Kivy wird bei Anaconda nicht über den Standardkanal angeboten, sondern ist im conda-forge Kanal verfügbar. Die Installation kann über den Anaconda Navigator erfolgen, dazu muss jedoch der conda-forge Kanal als Quelle hinzugefügt werden. Alternativ kann die Installation auch über die Anaconda Prompt (Konsole) erfolgen. Der Befehl dazu lautet:

conda install -c conda-forge kivy

Zu beachten ist, dass je nach Installationsverzeichnis für die Anaconda Distribution administrative Berechtigungen für die Installation notwendig sein können, also die Anaconda Prompt via Rechtsklick --> Mehr --> Als Administrator ausführen gestartet werden muss. Die Abhängigkeiten zu anderen Packages wird durch Anaconda aufgelöst und die fehlenden Packages zusätzlich installiert.

Vorüberlegungen zur GUI

Die GUI als Schnittstelle zwischen Mensch und Gerät sollte möglichst aufgeräumt sein und trotzdem alle wesentlichen Informationen anzeigen können. Die primäre darzustellende Information ist der von der Drohne aufgezeichnete und übertragene Videostream.

Angezeigt werden sollen in der GUI ein Bereich für das eingehende Videosignal (zur Navigation mit der Drohne) und ein Bereich für allgemeine Flugdaten (u. a. Höhe, Geschwindigkeit, Achsen-Koordinaten, Abstand zu Gegenständen etc.) sowie technische Informationen (u. a. Akkustand, Wi-Fi-Signalstärke, Temperatur, Beschleunigung etc.). Zudem ist eventuell ein Bereich für die Darstellung der Karte, auf welcher die Position der Drohne angezeigt wird, vorzusehen. Für das Debugging bietet sich eine Konsole zum Anzeigen von weiteren Informationen an, welche ggf. in einem eigenen Fenster eingeblendet werden kann.

skizze gui

Zusätzlich soll später auch die Möglichkeit bestehen, dass die Benutzer aus verschiedenen Themes wählen können. Daher sollen die für die GUI notwendigen Dateien in einer entsprechenden Unterverzeichnisstruktur abgelegt sein. Das entsprechende Unterverzeichnis soll lauten:

templates/themes/**<Theme Name>**

Das Basis-Theme wird schlicht mit basic bezeichnet. Die GUI Dateien (.kv-Endung) werden daher im folgenden Unterverzeichnis abgelegt:

templates/themes/basic/

Aufbau des Hauptskripts in Python

Für eine erste lauffähige Version der Cockpit-Anwendung reichen eine Python-Datei für den Programmcode und eine kv-Datei für die Beschreibung der GUI aus.

Die Python-Datei rmttCockpitApp.py beinhaltet neben den Import-Anweisungen eine Klasse zum Initialisieren der Anwendung und Laden der GUI:

# imports
import kivy
kivy.require( '2.1.0' )

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.lang.builder import Builder
import os

# Main Class
class RmttCockpitMainWidget( GridLayout ):
    pass

class RmttCockpitApp( App ):
    def build( self ):
        kv_directory    = 'templates/themes/basic/'
        Builder.load_file( kv_directory + 'RmttCockpit.kv' )
        return RmttCockpitMainWidget()

# Start directive
if __name__ == '__main__':
    RmttCockpitApp().run()

Bei build() handelt es sich um eine Standardmethode des Kivy-Frameworks zum Erzeugen der Instanz des App-Objektes, in welchem zu Beginn nur das Stammverzeichnis für die kv-Dateien festgelegt und die GUI anhand der kv-Datei angelegt wird. Die GUI ist vom Typ RmttCockpitMainWidget und wird von der build()-Methode schlussendlich zurückgegeben. Die Klasse RmttCockpitMainWidget wird erst in späteren Schritten ausgebaut werden.

Um die Anwendung zu starten, muss noch eine entsprechende Startdirektive am Ende der Python-Daten hinzugefügt werden. Die Startdirektive sorgt für die Initialisierung und Instanziierung des App-Objekts, von welchem die run()-Methode (ebenfalls eine Standardmethode) aufgerufen und über welche die Anwendung gestartet wird.

Die Python-Datei rmttCockpitApp.py wird im Stammverzeichnis der der Anwendung abgelegt.

Grundgerüst für die GUI der Kivy-Anwendung in kv-Datei

Der Aufbau der GUI wird in der kv-Datei RmttCockpit.kv hinterlegt. In einer ersten simplen Version kann der Aufbau wie folgt aussehen:

#:kivy 2.1.0

<RmttCockpitMainWidget>:
    cols: 2

    BoxLayout:
        orientation: 'horizontal'
        spacing: 10

        Label:
            text: "Bereich für Video-Signal"

    BoxLayout:
        orientation: 'vertical'
        spacing: 10

        Label:
            text: "Bereich für die Karte"

        Label:
            text: "Bereich für die technischen Daten"

Das Grundgerüst der GUI ist ein Grid-Layout bestehend aus zwei Spalten. Die erste Spalte nimmt ein Box-Layout für das Videosignal auf und wird in späteren Schritten ca. 65 % bis 75 % der Fenstergröße einnehmen. In der zweiten Spalte ist wiederum ein Box-Layout hinterlegt. Während für den Videosignalbereich die Orientierung egal ist, werden die GUI-Elemente für den Datenbereich vertikal angeordnet, sodass Karte und technische Daten untereinander platziert werden können. Für den Anfang wird für alle drei Bereiche zunächst ein Label-GUI-Element als Platzhalter platziert.

Die Datei RmttCockpit.kv wird im Basis-Theme-Verzeichnis abgelegt und kann dort vom Python-Hauptskript aufgerufen werden.

Erster Testlauf der Anwendung

Die Anwendung selbst kann über die Python-Datei rmttCockpitApp.py gestartet werden. Der Aufruf erfolgt wie bei Python-Skripten üblich über den Start des Python-Interpreters, welcher die Python-Datei als Parameter übergeben bekommt. Aus dem Projektverzeichnis heraus würde der Aufruf unter Windows beispielsweise so aussehen:

python rmttCockpitApp.py

Wenn alles korrekt installiert wurde und der Aufruf aus dem Projektverzeichnis heraus erfolgt, sollte das Programm ein Anwendungsfenster erzeugen und in etwa dem Aussehen des in den unteren Screenshots dargestellten Anwendungsfensters ähneln:

fotoKivyGui

Ausblick

In den nächsten Schritten werden die einzelnen Bereiche ausgebaut. Zudem wird in einem späteren Schritt auch eine Menü-Leiste aufgenommen werden, um beispielsweise die Einstellungen zur Anwendung ansteuern zu können.

Weitere Artikel der Artikelserie

Die Artikelserie zum Projekt Cockpit-Anwendung zur Ryze RoboMaster Tello Talent (TT) Drohne besteht derzeit aus den folgenden Teilen:

Links und Quellen

[1] Webseite der Python Software Foundation zu Python, Python Software Foundation, https://www.python.org/ (Zugriff am 11. Juni 2023).

[2] Kivy Open Source Python App development Framework, Kivy Project, https://kivy.org/ (Zugriff am 11. Juni 2023).

[3] RoboMaster TT Downloads, SZ DJI Technology Co., Ltd., https://www.dji.com/de/robomaster-tt/downloads (Zugriff am 11. Juni 2023).

[4] PiPy.org Package Beschreibung zum RoboMaster Python SDK, DJI RoboMaster Product Development Team, https://pypi.org/project/robomaster/ (Zugriff am 11. Juni 2023).

[5] Python Distribution Anaconda, Anaconda Inc., https://anaconda.org (Zugriff am 11. Juni 2023).

[6] Webseite zu Microsoft Visual Studio Code, Microsoft Corp., https://code.visualstudio.com/ (Zugriff am 11. Juni 2023).

[7] Kivy Erweiterung für Microsoft VisualStudio Code von BattleBas, https://marketplace.visualstudio.com/items?itemName=BattleBas.kivy-vscode (Zugriff am 11. Juni 2023).

[8] Installationsanleitung des Open-Source-Frameworks Kivy, Kivy Project, https://kivy.org/doc/stable/gettingstarted/installation.html (Zugriff am 11. Juni 2023).