G1000 flüssiger machen

Das FG1000 läuft fast vollständig in Nasal und bremste bei mir die Cessna im Flug auf 1 bis 2 Bilder pro Sekunde. Zwei Fehler und ein Filter machen es deutlich flüssiger: im Reiseflug 18,5 bis 30 statt 11 Bilder pro Sekunde. Die Herleitung steht im Beitrag G1000: Zwei Fehler beheben.

G1000 der Cessna 172 im Reiseflug

Mit dem Patch

cd "$FG_BASIS/downloads"
curl -LO https://codemich.de/medien/fg1000/fg1000_patch.zip
unzip -o fg1000_patch.zip -d fg1000_patch
python3 fg1000_patch/fg1000_patch.py "$FG_BASIS/fgdata"

Das Skript sichert jede Datei als .orig und ändert nur Stellen, die es genau so findet. Die weiteren Aufrufe:

python3 fg1000_patch/fg1000_patch.py "$FG_BASIS/fgdata" --ohne-karte   # zusätzlich OSM-Karte im MFD aus
python3 fg1000_patch/fg1000_patch.py "$FG_BASIS/fgdata" --zurueck      # Originale zurück

Danach mit dem G1000 fliegen:

"$FG_BASIS/werkzeuge/starten.sh" --aircraft=c172p-fg1000-gfc --airport=EDDE

Von Hand

Die Dateien liegen unter fgdata/Aircraft/Instruments-3d/FG1000/Nasal/Interfaces/.

PropertyPublisher.nas: Der letzte Parameter von setlistener entscheidet. 1 heißt bei jedem Schreiben, 0 nur bei echter Änderung.

var listener = setlistener(propmap.getPropPath(), func(p) { me.publish(p); }, 1, 0);

Allein das bringt am Boden fast die doppelte Bildrate.

GFC700Publisher.nas: Die Sollwerte der Flight-Director-Balken kommen in einen eigenen Publisher mit 10 Meldungen pro Sekunde:

obj._fdPublisher = PeriodicPropertyPublisher.new(notifications.PFDEventNotification.FMSData, 0.1);
obj._fdPublisher.addPropMap("AutopilotTargetPitch", "/autopilot/settings/target-pitch-deg", 0.2);
obj._fdPublisher.addPropMap("AutopilotTargetRoll", "/autopilot/settings/target-roll-deg", 0.2);
start : func() {
    call(TriggeredPropertyPublisher.start, [], me);
    me._fdPublisher.start();
},
stop : func() {
    call(TriggeredPropertyPublisher.stop, [], me);
    me._fdPublisher.stop();
},

FG1000/GFC700.xml: Der ILS-Empfänger liefert beim Einfangen kurz unsinnige Werte, die Cessna sackte dadurch rund 200 ft durch. Vor die beiden GS-Regler kommt ein Filter, und der Regler nutzt dessen Ausgang als reference:

<filter>
  <name>GS-Sollsteigrate NAV1 begrenzt</name>
  <type>noise-spike</type>
  <input>
    <prop>/instrumentation/nav[0]/gs-rate-of-climb</prop>
    <min>-25.0</min>
    <max>5.0</max>
  </input>
  <output><prop>/autopilot/internal/gs-rate-of-climb-nav0</prop></output>
  <max-rate-of-change>4.0</max-rate-of-change>
</filter>

Selbst messen

Das Muster passt auf jedes Emesary-System: Das Skript legt sich um die Receive-Funktion jedes Empfängers und zählt Zeit und Nachrichten.

foreach (var r; emesary.GlobalTransmitter.Recipients) {
    r._orig = r.Receive;
    r.Receive = func(n) {
        var ts = maketimestamp();
        ts.stamp();
        var res = call(me._orig, [n], me);
        var key = me.Ident ~ " | " ~ n.NotificationType ~ " " ~ n.Event_Id;
        zeit[key] = (zeit[key] or 0) + ts.elapsedUSec();
        anzahl[key] = (anzahl[key] or 0) + 1;
        return res;
    };
}

Ein fgdata-Update überschreibt die Änderungen, dann das Skript noch einmal ausführen.