Das Problem: Rollen über die Wiese
Mein Autopilot-Skript rollt die Dash 8 in FlightGear selbstständig von der Parkposition zur Startbahn. Den Weg
sucht es im Rollwegnetz des Flughafens, dem groundnet, das FlightGear mit der Landschaft aus
TerraSync lädt. An den meisten Flughäfen passt das genau. In Aberdeen (EGPD) fuhr die Dash 8 auf dem Weg zur
Bahn 16 aber plötzlich quer über die Wiese – im Twitch-Stream gut zu sehen.
Die Flugdaten zeigten: Das Flugzeug fuhr exakt auf den Linien des Rollwegnetzes. Der Fehler lag also nicht im
Skript, sondern in den Daten. Nur wo genau?
Bild 1 - Vorher: Die Dash 8 folgt dem Rollwegnetz und steht auf dem Gras, der Asphalt liegt links daneben
Erster Versuch: Schätzen nach Bildern
Mit Bildern von oben (Hubschrauber-Ansicht, alle 15 Sekunden aufgenommen) sah es zunächst nach einer einzelnen
falschen Kante aus: Rollweg M ist im Netz eine gerade Linie über 531 m, in der Landschaft gabelt er sich. Zwei
geschätzte Zwischenpunkte reichten aber nicht – beim nächsten Test stand die Dash 8 wieder im Gras. Der ganze
nördliche Teil des Netzes liegt neben dem Asphalt, auch die Knoten selbst.
Die Lösung: den Untergrund abtasten
FlightGear kann für jeden Punkt sagen, welches Material dort liegt: Die Nasal-Funktion
geodinfo(lat, lon) liefert Höhe und Material, zum Beispiel Grass oder
pa_taxiway (Asphalt, „pa“ = paved). Ein kleiner Helfer tastet damit ein Raster ab und legt das
Ergebnis in einer Eigenschaft ab, die ein Python-Skript über die Telnet-Schnittstelle abholt:
setlistener("/claude/scan/start", func(n) {
if (!n.getBoolValue()) return;
var lat0 = getprop("/claude/scan/lat0"); var lon0 = getprop("/claude/scan/lon0");
var nx = getprop("/claude/scan/nx"); var st = getprop("/claude/scan/step-m");
var dlon = st / (111320 * math.cos(lat0 * D2R));
var zeile = [];
for (var x = 0; x < nx; x += 1) {
var info = geodinfo(lat0, lon0 + x * dlon);
append(zeile, (info != nil and info[1] != nil) ? info[1].names[0] : "?");
}
setprop("/claude/scan/result", string.join(",", zeile));
setprop("/claude/scan/start", 0);
}, 0, 0);
Abgetastet habe ich ein Gebiet von etwa 520 × 760 m im 4-m-Raster, Zeile für Zeile (eine einzige lange Antwort
kommt über Telnet nicht durch). Asphalt, Markierungen (lf_…) und Gras ergeben zusammen mit dem
Rollwegnetz ein klares Bild:
Bild 2 - Abgetasteter Untergrund in Aberdeen: Nach Knoten 75 biegt der Asphalt in einem Bogen nach rechts zur Bahn 16 ab, das Rollwegnetz (gelb) fährt geradeaus über das Gras. Magenta: der korrigierte Weg
Den neuen Weg sucht ein Dijkstra-Algorithmus direkt auf dem Raster: nur über Asphalt-Zellen, und je näher eine
Zelle am Rand liegt, desto teurer – so läuft der Weg in der Mitte des Rollwegs. Danach vereinfacht der
Douglas-Peucker-Algorithmus die Zellen auf sechs Zwischenpunkte.
Die Korrektur im Rollskript
Die Dateien von FlightGear bleiben unverändert. Das Rollskript lädt das Rollwegnetz wie bisher und wendet danach
eine kleine Korrekturliste an: Die falsche Kante kommt heraus, die neue mit den abgetasteten Zwischenpunkten
kommt hinein.
GROUNDNET_KORREKTUR = {
"EGPD": {"weg": [(75, 134)],
"neu": [(75, 130, [(57.205512, -2.203570), (57.207740, -2.205428), (57.208171, -2.205428),
(57.208710, -2.204963), (57.209249, -2.203902), (57.209249, -2.203437)], "M")]},
}
Der Weg zur Bahn wird damit auch kürzer: 929 statt 1105 m. Im Test von der Parkposition aus rollte die Dash 8
durch den ganzen Bogen auf dem Asphalt und stand danach genau auf der Mittellinie der Bahn 16.
Bild 3 - Nachher: im Bogen auf dem Asphalt, vorne die Schwelle der Bahn 16
Bild 4 - Startbereit auf der Mittellinie
Fazit
Das Rollwegnetz und die Landschaft in FlightGear entstehen getrennt und passen nicht überall zusammen. Wer
automatisch rollt, sollte dem Netz deshalb nicht blind vertrauen. Mit geodinfo lässt sich der echte
Untergrund in wenigen Minuten abtasten, und das Verfahren funktioniert an jedem Flughafen. Aufgefallen ist mir der
Fehler übrigens im Live-Stream – ein Blick auf die Wiese hat gereicht.