Aerosoft official retail partner for Microsoft Flight Simulator !! 
Click here for more information

Jump to content

Archived

This topic is now archived and is closed to further replies.

X-Friese

Tutorial: Zwei Achsen steuern gemeinsam das Seitenruder (unpassende Hardware nutzen)

Recommended Posts

Wir stellen uns folgendes Problem vor. Wir haben aus unserem Hardwarearsenal zwar eine Pedalerie für die Simulation eines PKW, jedoch nicht für ein Flugzeug. Die Pedale am "PKW-Bodenteil" stellen aber drei eigenständige Achsen dar (Kupplung, Bremse, Gas). Bei Automatik PKW sind es zwei Achsen, denn dann wird nicht gekuppelt. Binden wir nun eine dieser Achsen an das Seitenruder, so müssen wir dieses immer halb treten, um das Seitenruder in die Neutralstellung zu bringen. Das jeweils andere Pedal bleibt ohne Funktion. Man kann sie nicht kombiniert an das Seitenruder binden. Oder doch?

Nun kommt Lua ins Spiel und (leider) auch eine ganze Portion Wissen um die internen Abläufe des Simulators. Der Ausschlag des Seitenruders wird intern in einem DataRef abgebildet. Es ist das DataRef sim/joystick/joystick_yoke_heading_ratio. Wenn wir den DataRefEditor (ab jetzt DRE genannt) öffnen, dann können wir dieses DataRef beobachten. Es zeigt Werte von -1.0 bis +1.0 an. Die Neutralstellung ist beim Wert 0.0 (Null).

Übung 1: Lege das Seitenruder auf eine Achse, starte den DRE und beobachte das DataRef sim/joystick/joystick_yoke_heading_ratio während du die Achse bewegst.

Den DRE bekommst du hier: http://www.xsquawkbox.net/xpsdk/mediawiki/DataRefEditor

Übung 2: Halte die Achse still und ändere den Wert direkt über den DRE.

Nichts passiert? Keine Panik, das ist richtig so. Es gibt Werte, die sind von X-Plane nicht zum Schreiben freigegeben, außer man fordert es explizit. Dazu wird ein weiteres DataRef verwendet, es ist sim/operation/override/override_joystick_heading was vom Wert 0 auf 1 gestellt werden muss, um Kontrolle über das Seitenruder zu bekommen.

Übung 3: Kopiere den folgenden Code in eine Datei "yaw_nonsense.lua" (oder irgend einen anderen Namen mit der Endung ".lua") und kopiere die Datei in das Scripts Verzeichnis. Lade dann die Standard Beechcraft Baron und beobachte das Seitenruder. 

-- define the DataRef connectors
local override_yaw = dataref_table("sim/operation/override/override_joystick_heading")
local yaw_axis_value = dataref_table("sim/joystick/yoke_heading_ratio")

function yaw_nonsense()
    -- get control to the yaw axis
    override_yaw[0] = 1
    -- set the yaw axis to some nonsense value
    yaw_axis_value[0] = math.sin(os.clock())
end

-- do this every frame
do_every_frame("yaw_nonsense()")

Cool, nicht wahr? Das Seitenruder pendelt nun hin und her. Auch das Bugrad dreht sich passend dazu mit. Das macht zwar überhaupt keinen Sinn, hilft uns aber zu verstehen wie wir vorgehen müssen.

Zunächst definieren wir die Variablen, die wir an die passenden DataRefs koppeln wollen. Da wir bereits FlyWithLua 2.4 oder höher verwenden, nehmen wir die aktuellste Form über die magischen Tabellen. Das klappt, obwohl beide DataRefs gar keine Tabellen sind. Wir müssen nur jeweils das Tabellenelement Nr. 0 (Null) ansprechen.

Wir realisieren unser Vorhaben durch eine Funktion, die wir mit jedem Frame aufrufen. Die Funktion schreibt nun immer den Wert 1 in das DataRef, das uns die Herrschaft über das Seitenruder zugesteht. Das machen wir mit jedem Frame, da andere Plugins dieses DataRef auch anfassen, und wir aber unter allen Umständen die Hoheit erlangen möchten, auch wenn ein anderes Plugin (oder Script) diesen Wert vielleicht auf 0 setzt. So bedienen sich z. B. die Trimm-Scripte, die FlyWithLua mitbringt, dieser Variable.

Dann verändern wir den Wert über die Zeile

    yaw_axis_value[0] = math.sin(os.clock())

Die Funktion os.clock() liefert die Sekunden seit dem Start von Lua als Fließkommazahl. Mit math.sin() errechnen wir den Sinus aus diesem Wert. Der Sinus liefert Werte von -1.0 bis +1.0, was genau dem Wertebereich entspricht, den wir für das Seitenruder verwenden können. Beide Funktionen bringt Lua mit.

Alle allgemeinen Lua Funktionen findet man hier: http://www.lua.org/manual/5.1/

Übung 4: Jetzt nimm deine Hardware und bewege die Achsen, die gemeinsam dein Seitenruder steuern sollen. Im DRE beobachte das DataRef sim/joystick/joystick_axis_values und identifiziere deine Achsen mit dem großen Schieber rechts neben der Schaltfläche Close.

DRE.thumb.JPG.d73351e5cd187796b4651f21aa

In diesem Fall sind es die Achsen 10 und 11, in deinem Fall wird es vermutlich jeweils ein anderer Wert sein!

Übung 5: Jetzt ersetze das vorherige Script durch folgenden Code. Achte darauf, den Achsen den passende Index zu geben (statt [10] oder [11] deine gerade ermittelten Werte nehmen!).

-- define the DataRef connectors
local override_yaw = dataref_table("sim/operation/override/override_joystick_heading")
local yaw_axis_value = dataref_table("sim/joystick/yoke_heading_ratio")
local axis_values = dataref_table("sim/joystick/joystick_axis_values")

function yaw_control()
    -- get control to the yaw axis
    override_yaw[0] = 1
    -- set the yaw axis from two other axis
    yaw_axis_value[0] = axis_values[10]-axis_values[11]
end

-- do this every frame
do_every_frame("yaw_control()")

Wow, das klappt ja!

Hier noch schnell die Erklärung. Die Achsen liefern Werte von 0.0 bis 1.0. Wir benötigen einen Seitenruderausschlag von -1.0 bis +1.0 mit 0.0 als Neutralstellung. Dazu subtrahieren wir einfach einen Achsenwert vom anderen. Ist keine Achse getreten, so haben beide den Wert 0.0 oder 1.0 (je nach Beschaffenheit deiner Hardware). Ziehen wir das voneinander ab, so erhalten wir die Neutralstellung. Treten wir nun ein Pedal, so verändern wir einen Wert, jedoch maximal mit dem Betrag 1.0 bei vollem Durchtreten. Dabei wandert der berechnete Wert von 0.0 nach -1.0 oder +1.0 und wir können das Seitenruder nun durch Treten jeweils eines Pedals bedienen.

Schwächen dieses Verfahrens

Das Verfahren hat zwei Schwachpunkte. Der eine ist, dass wir durch Treten des rechten Pedals das Seitenruder nach links bewegen könnten. Das ist natürlich nicht so sinnvoll beim Fliegen und die Füße über Kreuz auf die Pedale zu stellen auf die Dauer auch nicht sehr bequem. Aber wir tauschen im Code einfach die Achsen, also aus z. B.

    yaw_axis_value[0] = axis_values[10]-axis_values[11]

wird einfach 

    yaw_axis_value[0] = axis_values[11]-axis_values[10]

und das Problem ist behoben.

Der zweite Schwachpunkt sind andere Scripte oder Plugins, die ebenfalls das Seitenruder beeinflussen wollen. Hier kann es zu Konflikten kommen, bei denen wir dann doch leider eine neue Hardware kaufen müssen (oder mit sehr viel Geschick das Vorhaben eleganter programmieren, falls der "störende" Code ebenfalls von uns stammt).

Share this post


Link to post
Share on other sites

Erstmal vielen Dank für das erstellen 

so weit kapiere ich alles außer Schritt 4

wen ich die 2 Achsen bewegen muss 

 

wen ich aber mit dem neben close durchscroll kommen verschiedene Nummern (mehr als 2)

 

danke im voraus;))

Share this post


Link to post
Share on other sites

Ja, da müssten die Nummern von 0 bis 99 kommen und man kann sehen ob sich der resultierende Wert synchron mit der Bewegung der Achse ändert. Die eingestellte Zahl ist der Index des DataRef Arrays, den wir dann auch als Index für die magische Tabelle verwenden müssen. Das lässt sich viel schwerer beschreiben als es in der Handhabung ist.

Falls andere Achsen nicht in einer Endstellung sind, schwanken die Werte auch dort. Das ist normal, da in der Hardware verbaute Schiebe- oder Drehpotentiometer immer etwas flattern. Wir reden hier ja von Spielzeug, nicht von Hightech. Aber sie flattern nur und bewegen sich nicht synchron zur Bewegung der Achse. Somit kann man mit etwas Geschick den passenden Index der Achse finden. Abzählen im Menü von X-Plane geht leider nicht mehr, in X-Plane 9 war das noch möglich. 

Share this post


Link to post
Share on other sites

Ich bin gerade am Anfang meiner ersten Programmierschritte in LUA. Und prompt bekomme ich hier ein Problem, was ich nicht selber geschaffen habe, jedoch mit meinen derzeitigen Kenntnissen nicht beseitigen kann.

Problem:

1. Habe das Script Copilot (z.Z. noch Beta) aktiviert mit der A330 von Jar. Nicht alles hat funktioniert, jedoch ist folgendes nun eingetreten, was über die Joystick-Konfiguration in X-Plane nicht mehr beseitigt werden kann.

2. Also, mit der Nutzung dieses Skriptes wurde eine zusätzliche Achsbelegung in X-Plane eingetragen. Die zoom in map efis und zoom out map efis Funktionen liegen nun fest auf der Achse für roll. Konfiguriere ich nun die Achsen des Joystick neu, dann bleibt diese Belegung für efis map zoom in und zoom out erhalten.

Frage:

Gibt es eine Möglichkeit, diese störende zusätzliche Achsbelegung wieder los zu werden? Erstaunlicherweise tritt dies nur bei Airbusmodellen auf, und zwar Hersteller-übergreifend. Boing-Modelle bleiben hiervon unberührt.

Für einen Tipp wäre ich sehr dankbar.

Share this post


Link to post
Share on other sites

...

2. Also, mit der Nutzung dieses Skriptes wurde eine zusätzliche Achsbelegung in X-Plane eingetragen. Die zoom in map efis und zoom out map efis Funktionen liegen nun fest auf der Achse für roll. Konfiguriere ich nun die Achsen des Joystick neu, dann bleibt diese Belegung für efis map zoom in und zoom out erhalten.

...

Das müsstest du mal näher erläutern oder besser dein Script als Anhang posten.

Vermutlich musst du nur den Code, der die Achse verwendet, löschen und alle Scripte neu laden lassen. Dann sollte nur noch die Zuordnung über das Menü von X-Plane funktionieren. Üblich wäre es, die Codezeilen über eine Bedingung (if PLANE_ICAO == "A320" then ... end) an ein bestimmtes Flugzeug zu binden, damit es nicht global für alle Flugzeuge ausgeführt wird.

Share this post


Link to post
Share on other sites

Das müsstest du mal näher erläutern oder besser dein Script als Anhang posten.

Vermutlich musst du nur den Code, der die Achse verwendet, löschen und alle Scripte neu laden lassen. Dann sollte nur noch die Zuordnung über das Menü von X-Plane funktionieren. Üblich wäre es, die Codezeilen über eine Bedingung (if PLANE_ICAO == "A320" then ... end) an ein bestimmtes Flugzeug zu binden, damit es nicht global für alle Flugzeuge ausgeführt wird.

Ich habe mit DRE sim/cockpit/switches/EFIS_map_range_selector und sim/cockpit2/EFIS/map_range anzeigen lassen, wenn der Joystick von links über Nullstellung nach rechts bewegt wird. Es ändern sich dann die Werte von 6 nach 0. In Nullstellung sind beide Werte 3. Nun weiß ich allerdings nicht, wie ich den Code löschen soll, der die Roll-Achse verwendet. Für einen Hinweis bin ich sehr dankbar. Ich muß vielleicht noch erwähnen, dass das Skript nicht von mir erstellt wurde. Ich habe es nur verwendet. Es lag die Vermutung nahe, dass die Achszuweisung mit diesem Script zustande kam, weil das Problem vorher nicht bestand. Nun habe ich mir den Script genauer angesehen und keinen Bezug zu meinem Problem gefunden. Habe ihn trotzdem mal angehängt.

CPT.lua

Share this post


Link to post
Share on other sites

sorry, aber ich konnte das Problem der Achsen-Doppelbelegung bei Roll-Bewegung am Joystik und gleichzeitiger Veränderung des EFIS-Range nicht beheben und brauche hierzu Eure Hilfe. Ich würde mich sehr freuen, wenn mir jemand behilflich ist.

Share this post


Link to post
Share on other sites

sorry, aber ich konnte das Problem der Achsen-Doppelbelegung bei Roll-Bewegung am Joystik und gleichzeitiger Veränderung des EFIS-Range nicht beheben und brauche hierzu Eure Hilfe. Ich würde mich sehr freuen, wenn mir jemand behilflich ist.

Hallo,

bitte erstelle für diese Frage ein neues Thema in diesem Unterforum, denn hier geht es um die Programmierung eines Rennspiel-Lenkrades für die Verwendung in X-Plane, nicht um Belegungskonflikte einer Achse. Dein Anliegen wird dann auch gefunden und man kann gezielt helfen, lange bevor jemand durch Zufall hier über deine Frage stolpert.

Sobald du ein neues Thema eröffnet hast werde ich die Beiträge hier ab einschließlich Nr. 5 löschen (lassen).

Vielen Dank

Carsten

Share this post


Link to post
Share on other sites
Guest

Hallo,

ja, Carsten hat Recht. Bitte unbedingt für ein neues Thema auch ein neues Topic aufmachen. Das erleichtert das wiederfinden sehr. Danke.

Heinz

Share this post


Link to post
Share on other sites

×
×
  • Create New...