X-Friese 34 Posted September 6, 2015 Share Posted September 6, 2015 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. Please login to display this image. 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 VerfahrensDas 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). Link to comment Share on other sites More sharing options...
Zupper 0 Posted September 8, 2015 Share Posted September 8, 2015 Erstmal vielen Dank für das erstellen so weit kapiere ich alles außer Schritt 4wen ich die 2 Achsen bewegen muss wen ich aber mit dem neben close durchscroll kommen verschiedene Nummern (mehr als 2) danke im voraus;)) Link to comment Share on other sites More sharing options...
X-Friese 34 Posted September 8, 2015 Author Share Posted September 8, 2015 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. Link to comment Share on other sites More sharing options...
Zupper 0 Posted September 9, 2015 Share Posted September 9, 2015 Jetzt funktioniert es einwandfrei Vielen Dank nochmals;) Link to comment Share on other sites More sharing options...
Tutchalamun 0 Posted October 27, 2015 Share Posted October 27, 2015 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. Link to comment Share on other sites More sharing options...
X-Friese 34 Posted October 27, 2015 Author Share Posted October 27, 2015 ...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. Link to comment Share on other sites More sharing options...
Tutchalamun 0 Posted October 27, 2015 Share Posted October 27, 2015 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 Link to comment Share on other sites More sharing options...
Tutchalamun 0 Posted October 30, 2015 Share Posted October 30, 2015 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. Link to comment Share on other sites More sharing options...
X-Friese 34 Posted November 1, 2015 Author Share Posted November 1, 2015 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 DankCarsten Link to comment Share on other sites More sharing options...
Guest Posted November 1, 2015 Share Posted November 1, 2015 Hallo,ja, Carsten hat Recht. Bitte unbedingt für ein neues Thema auch ein neues Topic aufmachen. Das erleichtert das wiederfinden sehr. Danke.Heinz Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.