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.

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.