Aktuelle Information
Hinweise rund um FlightGear


Joysticks unter Linux

sinnvolle Programme
Unter Linux gibt es ähnlich wie bei anderen Betriebssystemen ein integriertes Joystick-System, welches für die Kalibrierung und Auswertung der Signale verantwortlich ist.
Zur Kalibrierung und zum Testen von Joysticks muss das Paket "joystick" (unter Ubuntu) installiert sein. Um in einem grafischen Dialog die Achsen kalbirieren und testen zu können, empfehle ich das Programm "jstest-gtk"; hier kann man auch die Nummerierung der Achsen und Knöpfe ablesen.


Mit dem Programm kann man vor allem Informationen sammeln, um zu sehen, ob der Joystick vom System korrekt erkannt wird, ob er funktioniert - oder aber auch, ob ein scheinbar nicht korrekt funktionierender Joystick nach einer Kalibrierung doch korrekt funktioniert.
Bei mir funktioniert zum Beispiel der Saitek X45 nach dem Hochfahren nicht korrekt; die Achsenausschläge sind nicht zentriert und trotz voller Bewegung des Steuerknüppels gelangt das Fadenkreuz nicht annähernd auch nur in die Mitte. Damit ist der Joystick unbrauchbar.
Nach Kalibrierung mit jstest-gtk konnte ich sehen, dass alles korrekt funktioniert; es sich also um ein lösbares Problem handelt.



Kalibirierung dauerhaft speichern
Ein Problem ist, eine mittels jstest-gtk vorgenommene Kalibierung auch über einen Systemneustart hinaus zu speichern. Zwar bietet das Programm eine Speichermöglichkeit an; dies funktioniert bei mir jedoch nicht.
Um eine Kalibrierung vorzunehmen und dauerhaft anzuwenden, sind andere Schritte nötig. Man benötigt die Kommandozeilen-Programme, die im Paket "joystick" enthalten sind:
Zunächst kalibriert man seinen Joystick mittels
jscal -c /dev/input/js3
(Dabei steht "js3" für den vierten angeschlossenen Joystick; will man den ersten Joystick kalibrieren, muss stattdessen "js0" eingegeben werden, für den zweiten Joystick "js1" etc. Die Nummerierung lässt sich in jstest-gtk ablesen oder einfach ausprobieren)

Nun folgt man den Anweisungen des Programms jscal.
Anschließend muss die aktuelle Kalibierung in eine Datei geschrieben werden:
jscal -p /dev/input/js3 > /home/lucas/.fgfs/Saitek_X45.cal
(Dabei steht "js3" wieder für den gewünscten Joystick und die Zahl muss entsprechend angepasst werden.
Außerdem steht der Pfad nach dem ">" für die Datei, in die geschrieben werden soll. Der Speicherort ist völlig frei wählbar.)


Nun kann jederzeit die Kalibrierung mit dem folgenden Befehl aktiviert werden:
sh "/home/lucas/.fgfs/Saitek_X45.cal"
(Auch hier muss der Pfad natürlich durch den eigenen Speicherort ersetzt werden.)

Diesen Befehl kann man nun in den Autostart nehmen und so die Kalibierung ganz automatisiert beim Hochfahren aktivieren lassen. Schon funktioniert der Joystick völlig ohne weiteres Zutun jedes Mal nach dem Hochfahren.
Unter Xfce funktioniert das in den Einstellungen unter "Sitzung und Startverhalten" durch Hinzufügen einer weiteren "Automatisch gestarteten Anwendung":


(Auch hier muss der Pfad natürlich durch den eigenen Speicherort ersetzt werden.)

Hinweis zu CH Throttle Quadrant
Der CH Throttle Quadrant hat das Problem, dass er wohl einen Schlafmodus besitzt. Er funktioniert (wohl nach längerem Nichtbenutzen) erst wieder nach Ausführen des folgenden Befehls:
sudo lsusb -v
Ja - der Befehl muss tatsächlich mit sudo ausgeführt und das Administrator-Passwort eingegeben werden!


Joystickfunktionen in FlightGear zuweisen

Mittlerweile gibt es in FlightGear einen grafischen Dialog innerhalb des Simulators, mit dem Man die wichtigsten Funktionen des Joysticks ganz einfach festlegen kann. Man kann nur hoffen, dass dieser Dialog zukünftig weiter ausgebaut wird.
Für den Moment jedoch ist es notwendig, an Konfigurationsdateien zu arbeiten, wenn man speziellere Funktionen als nur die Ruder über en Joystick steuern will. Darum soll es in den folgenden Abschnitten gehen.

Konfigurationsdateien anlegen
FlightGear verwendet XML-Dateien für die Zuweisung von Funktionen zu Knöpfen und Achsen eines Joysticks. Für jeden Joystick muss dafür eine eigene XML-Datei angelegt werden.
Die Datei muss dabei unter
/home/lucas/.fgfs/Input/Joysticks/Saitek_X45.xml
gespeichert werden, damit FlightGear sie verwendet.
(Dabei muss "lucas" durch den eigenen Linux-Benutzernamen ersetzt werden und der Dateiname je nach Joystick-Typ angepasst werden.)

Dabei ist zu beachten, dass der Ordner ".fgfs" von FlightGear (wohl beim ersten Starten des Simulatiors) angelegt wird und dass es sich dabei um ein verstecktes Verzeichnis handelt - meist durch die Tastenkombination Strg+H anzeigbar.

Der Dateiname der einzelnen XML-Dateien ist praktisch egal und dient eher einem selbst, um den Überblick zu behalten. FlightGear liest alle XML-Dateien in diesem Ordner ein und welche datei für welchen Joystick Verwendung findet, wird im Inhalt der XML-Datein festgelegt.

Aufbau der Konfigurationsdatei
Ist die XML-Datei nun angelegt, muss man sie mit Inhalt füllen. Der grundsätzliche Aufbau sieht wie folgt aus:


Dabei muss beachtet werden, dass der Name des Joysticks genau so angegeben wird, wie das System ihn empfängt. In diesem Fall sind es Großbuchstaben und vor allem steht am Ende noch ein Leerzeichen!
Den exakten Namen eines Joysticks kann man über den folgenden Befehl ermitteln:
cat /proc/bus/input/devices
Hier wird für jedes angeschlossene Eingabegerät ein Block an Informationen angezeigt. Unter "Name" findet man dann den exakten Namen; zum Glück in Anführungszeichen, sodass man auch das Leerzeichen am Ende bei einigen CH-Produkten sieht.

Grundsätzlich wird in XML-Dateien jedes Elemnt mit spitzen Klammern definiert und ebenfalls in spitzen Klammern - jedoch mit einem Slash - wieder geschlossen.

Achsen
Die Zuordnung einer Funktion auf eine Joystick-Achse erfolgt so:


Eine Achse wird mit dem Element "axis" definiert. Innerhalb der eröffnenden spitzen Klammern muss angegeben werden, welche Joystick-Achse gemeint ist. Dazu muss die Nummer der Achse angegeben werden. In diesem Beispiel ist es die erste Achse des Joysticks. Die Achsennummern lassen sich in jstest-gtk ablesen.

Als Nächstes wird eine Beschreibung ("desc") angegeben; in den öffnenden spitzen Klammern wird der Datentyp angegeben; "string" bedeutet hier, dass es sich um Text handelt. Die Beschreibung dient lediglich der Lesbarkeit der Konfigurationsdatei für den Menschen und erfüllt sonst keine Funktion. Hier sollte man also möglichst kurz angeben, welche Funktion man auf diese Achse programmiert, damit man sich später in der Konfigurationsdatei noch zurecht findet. In diesem Fall wird das Querruder (engl. Aileron) definiert.

Wenn der Joystick in der Mittelstellung etwas unsauber arbeitet und nicht immer exakt den selben Wert an das System meldet, kann man eine Nullzone definieren. Mittels des elements "dead-band" gibt man eine Dezimalzahl ("double") an. In diesem Beispiel ist keine Nullzone gewollt; der Simulator soll auf jede noch so kleine Bewegung am Steuerküppel reagieren. Würde man beispielsweise anstatt der Null den Wert "0.3" eingeben, so würde die Nullzone 30% des Bewegungsumfanges des Steuerknüppels betragen; der Simulator also erst reagieren, wenn man den Knüppel um mehr als 30% des Bewegungsspielraumes bewegt hat. Natürlich machen 30% eher keinen Sinn; ein Wert von "0.05" dürfte meist ausreichen. Das muss man ausprobieren. Man beachte, dass die Dezimalzahlen wie im englischsprachigen Raum üblich mit einem Punkt anstelle eines Kommas angegeben werden.
Noch etwas: Die Definition einer Nullzone muss vor der Definition der "Bindings" erfolgen, sonst funktioniert das Ganze nicht!

Nun kommt die Definition der Zuordnungen zu Funktionen des Simulators Das Element "binding" steht für eine Funktion und hat mehrere Unterlemente. Es sei erwähnt, dass mehrere "binding"-Elemente aufeinander folgen können; man kann also mehrere Funktionen gleichzeitig durch ein und diesselbe Achse steuern, wenn man das sinnvoll findet.
Innerhalb des "binding"-Elements folgt nun zunächst das "command" element. Der Datentyp ist hier "string", also ein Text. Es gibt vordefinierte Befehlstypen; in diesem Fall macht am ehesten "property-scale" Sinn. Denn mit einer Achse will man meist einen internen Parameter des Simulators (eine "property") über einen ganzen Bereich von Werten verändern.
Nun folgt die eigentliche Zuordnung; das Element "property" definiert, welche Werte nun durch die Achse verändertw erden sollen. In diesem Beispiel ist es das Querruder "Aileron", welches sich in FlightGear unter "/controls/flight/aileron" findet.
Welche "Properties" es gibt, kann man in FlightGear selbst zum Glück gut sehen. Nach dem Start des Simulators findet man im Menü unter "Entwickler" und "Browse Internal Properties" ein Verzeichnis, in dem man mit der Maus navigieren kann. Man sieht hier auch in Echtzeit die gerade aktiven Werte und kann zusehen, wie sie sich verändern, während man die Achsen des Joysticks bedient. So kann man sehr gut ausprobieren.


Außerdem kann man im Menü unter "Entwickler" und "Reload Input" jederzeit die Konfigurationsdateien für die Joysticks im laufenden Betrieb des Simulators neu einlesen lassen...
Es sei erwähnt, dass die meisten Steuerflächen über Werte von 0 bis 1 gesteuert werden, wobei 1 der Vollausschlag ist.

Nun folgt noch die Angabe eines "factor", der die Empfindlichkeit der Achse angibt (sowie durch das Vorzeichen die Richtung) und eines "offset", womit der Nullpunkt der Achse angegeben wird. In unserem Beispiel ist der Faktor 1 und der Nullpunkt ("offset") bei Null. Das heißt, dass der Nullpunkt in der MItte der Achse liegt und es sowohl positive als auch negative Ausschläge gibt (entsprechend links und rechts).
Bei anderen Funktionen wie zum Beispiel bei einer Bremse oder einem Schubhebel, gibt es keine negativen Werte. Hier würde also nur die jeweils obere Hälfte der Achse genutzt werden. Deshalb verschiebt man dann den Nullpunkt auf "-1" und damit nicht bereits in der Mitte der Hebelstrecke voller Schub anliegt, muss der Faktor auf 0,5 reduziert werden. Damit die Richtung auch stimmt, muss der Faktor auf "-0.5" eingestellt werden. Hier das Beispiel eiens Schubhebels:


Anschließend werden nur noch die noch offenen Elemente "binding" und "axis" wieder geschlossen.

Tasten
Prinzipiell funktionieren Zuordnungen bei Joystick-Tasten ganz ähnlich. Natürlich heißt das Element hier dann nicht "axis", sondern "button". Der Aufbau ist sonst zunächst gleich. Ein paar Unterschiede gibt es dennoch:


Hier wird der Taste Nummer 10 die Funktion "Fahrwerk einfahren" zugeordnet.
Es handelt sich um eine Funktion, die nur einmal ausgeführt wird und bei der es keinen Sinn macht, die Taste gedrückt zu halten, um den Befehl mehrfach auszuführen. Deshalb folgt das Element "repeatable", welches mit "false" deaktiviert wird. Ähnlich wie bei der Nullzone von Achsen muss diese Einstellung vor dem "binding"-Element stehen, um Wirkung zu zeigen.

In diesem Fall wollen wir keine Zahlenwerte verändern, sondern mit dem Tastendruck einen ganz bestimmten wert setzen, daher lautet unser Befehl in diesem Fall wie bei fast allen Tasten "property-assign".
Dann folgt die Angabe der "property", die geändertw erden soll. Da es intern in FlightGear nur die Eigenschaft "Fahrwerk ausgefahren" gibt, müssen wir diese verneinen. Deshalb setzen wir den Wert ("value") "false". Es handelt sich um den Datentyp Boolean ("bool") - das bedeutet, dass es nur ein ja oder nein gibt; keine Zwischenwerte.

Es gibt neben der Veränderung interner werte ("Properties") von FlightGear auch eine zweite Möglichkeit, Steuerbefehle zuzuordnen. Dies erfoglt mit der Programmiersprache Nasal. damit kann man im Prinzip sehr komplexe Abläufe programmieren, sodass beispielsweise ein tastendruck im Flug etwas anderes auslöst als am Boden. Dies erfordert dann genauere Einarbeitung in die Möglichkeiten von FlightGear und Nasal. Aber einige nützliche Befehle lassen sich auch mit nur einer Zeile Nasal-Programmierung leicht umsetzen, während sie sonst kaum umsetzbar wären. Dazu ein weiteres Beispiel:


Hier wird der Taste Nummer 1 die Funktion zugeordnet, die Sicht zu steuern; genauer gesagt die Sicht zu vergößern.
Die Eigenschaft "repeatable" wird zunächst aktiviert, damit die Sicht solange immer wieter vergrößert wird, wie die Taste gedrückt wird; je länger man drückt, desto öfter wird der Befehl ausgeführt.

Dann wird als Befehl "nasal" angegeben und es folgt eine Zeile Nasal-Code im Element "script". Die Funktion "view.increase()" wird mit FlightGear mitgeliefert. Welche Funktionen möglich sind, lässt sich nicht so leicht herausfinden. Man kann die Nasal-Dateien im FlightGear Installationsverzeichnis durchsehen, um sie zu finden. Aber ganz so einfach ist das nicht. Daher folgen unten ein paar Beispiele unter anderem von Nasal-Funktionen.

Zunächst aber noch ein Beispiel, welches eine weitere grundsätzliche Funktion von Tasten zeigt:


Hier wird einer Taste die Schubumkehr zugeordnet. Dies muss für jedes Triebwerk einzeln geschehen, weshalb mehrere "binding"-Elemente aufeinander folgen.
Anschließend jedoch folgt noch ein weiterer Abschnitt mit dem Element "mod-up", in dem erneut Zuordnungen vorgenommen werden. Der "mod-up"-Abschnitt wird immer dann ausgeführt, wenn die Taste wieder losgelassen wird. Die "binding"-Elemente im "mod-up"-Abschnitt machen genau das rückgängig, was bei Tastendruck passiert. Auf diese Weise wird bei Tastendruck der Umkehrschub für die Triebwerke 1 und 2 (also "0" und "1") aktiviert und beim Loslassen der Taste wieder deaktiviert.
Somit wird Umkehrschub nur bei Festhalten der Taste zur Verfügung stehen die Stärke des nach hinten gerichteten Schubs kann mittels des Schubhebels reguliert werden.

Beispiele
Die folgenden Beispiele ziegen sozusagen Code-Schnipsel, mit denen speziellere Funktionen in FlightGear über den Joystick bedient werden können. Die Liste wird hin und wieder erweitert, wenn ich selbst neue Funktionen realisiere. Die Schnipsel müssen natürlich an eigene Gegebenheiten angepasst werden (Nummerierung der Achsen und Tasten etc.)

Brems-/Störklappen:

(Aus irgendeinem Grund muss Klappenstellung und Hebelstellung separat gesteuert werden. Die Schrittanzahl bei der Hebelstellung weicht wohl je nach Flugzeug ab. Hier die Einstellung für die Boeing 757, die aber bei vielen anderen Flugzeugen auch funktioniert.)

Parkbremse:

(zwei Tasten; Aktivierung und Lösen.)

Fahrwerk:

Landeklappen (Flaps):

(zwei Tasten; je eine Stufe mehr Ausfahren und Einfahren.)

Sicht horizontal schwenken:

(Sicht wird mit einer Achse geschwenkt; maximal nach 135° in beide Richtungen, denn die Cockpit-Rückwand braucht man ja nicht ständig mal schnell zu sehen.
Für die vertikale Veränderung der Sichtrichtung lautet die Property: "/sim/current-view/goal-pitch-offset-deg")

Sichtrichtung mittels Coolie Hat:

(Coolie Hats funktionieren als Tasten, werden dem System aber als Achsen gemeldet. Dabei können die Achsen aber nur Extremwerte melden, die wiederum hier mittels der Abschnitte "low" und "high" angesprochen werden. Dieser Code-Schnipsel ist auch mir jedoch nicht völlig klar, da ich ihn auch nur aus dem Netz gefischt habe. Funktioniert aber für alle vier Richtungen.)

Sichtmodus wechseln:

(Schaltet die Sichtmodi nacheinander durch. Mittels "view.stepView(-1)" kann man auch zurück blättern, braucht dann aber eine zweite Taste dafür.)

Betrachtungspunkt verschieben:



Cockpitsicht ansteuern:

(Wechselt direkt in die Cockpitsicht.)

Propellerverstellung:



Gemischverstellung:

(Aus irgendwelchen Gründen müssen "mixture" und "condition" verstellt werden.)


Weitere Codeschnipsel für Joystick-Programmierung sind im FlightGear Wiki zu finden unter [Writing Joystick Code: Part 2]



Nützliche Verweise ins Netz rund um FlightGear


FlightGear Wiki

Im FlightGear Wiki in deutscher Sprache findet man alle Informationen, die zum Einstieg nötig sind. Unter anderem wird hier erklärt, wie man das Programm startet und dabei auch gleich das richtige Flugzeug auswählt etc.

Das FlightGear Wiki ist erreichbar unter [wiki.flightgear.org/De/Hauptseite]
letzte Änderung: 23.12.2022
Die Seite wurde bisher 129517 mal besucht.
(seit Dezember 2014)