Projektziel: Funkverkehr mit dem Tower in FlightGear, mit sprechendem Lotsen. Dafür gibt es das
Addon Red Griffin ATC (Version 2.3.0, GPL v3, von Antonello Biancalana): Man ruft per Menü oder Tastatur
Ground, Tower oder Approach, der Lotse antwortet mit Stimme und Text. Ich wollte zusätzlich, dass meine
Autopilot-Skripte selbst funken: Anlassen anmelden, Rollfreigabe holen, ILS-Anflug anfordern. Dabei sind zwei
kleine Fehler im Addon und drei Stolperfallen beim Funken aus Skripten aufgetaucht.
Bild 1 - Erfurt: Der Lotse erteilt der Dash 8 (D-BTOX) die Anlassfreigabe für Bahn 10
Download:
redgriffin_patch.zip
(korrigierte rgatc.nas für Version 2.3.0, Lizenz, Funk-Helfer als Beispiel)
Einrichten
Red Griffin gibt es auf SourceForge. Der Ordner wird als Addon eingebunden, entweder im Launcher unter
„Add-ons“ oder beim Start mit --addon. Drei Einstellungen haben bei mir geholfen:
--addon="C:\Users\...\FlightGear\Addons\RedGriffinATC"
--prop:/rgatc/include-manufacturer=No # sonst ruft der Lotse "De D-BTOX" (De Havilland)
"--prop:/rgatc/atc-text-position=Bottom Center" # Lotsentext unten in der Mitte
--prop:/sim/sound/atc/enabled=false # eingebauten KI-Funk aus, damit nichts doppelt spricht
Fehler 1: „Leipzig/halle“
Red Griffin schreibt Stationsnamen in Kleinbuchstaben und macht nur den ersten Buchstaben jedes Wortes groß.
Aus Leipzig/Halle wird so „Leipzig/halle“. Die Korrektur schreibt auch nach „/“ und „-“ groß und macht aus „/“
einen Bindestrich:
# vorher: stationName ~= string.uc(left(w, 1)) ~ substr(w, 1) ;
var cw = "";
var up = 1;
for(var k = 0; k < size(w); k += 1)
{
var c = chr(w[k]);
if(c == "/")
c = "-";
cw ~= up ? string.uc(c) : c;
up = (c == "-");
}
stationName ~= cw;
Jetzt heißt es „Leipzig-Halle Tower“.
Fehler 2: Nasal-Fehler im Anflug
Während eines langen Fluges von Grönland nach Erfurt meldete das Log einen Nasal-Fehler in rgatc.nas,
Zeile 222. Dort prüft Red Griffin regelmäßig, ob das Flugzeug zu tief fliegt, und vergleicht dafür den
Kontrollbezirk, für den die Freigabe gilt, mit dem aktuellen. Gibt es einen davon nicht (zum Beispiel weil gar keine
Freigabe erteilt wurde), ist die Variable nil, und der Zugriff auf .ident bricht ab:
# vorher:
# if(approvedCtr.ident == currentCtr.ident and radioIsTunedToApprovedCtrRadio == 1)
if(approvedCtr != nil and currentCtr != nil and approvedCtr.ident == currentCtr.ident
and radioIsTunedToApprovedCtrRadio == 1)
Funken aus eigenen Skripten
Red Griffin hat keine offizielle Schnittstelle für Skripte, aber alle Funktionen liegen im Namensraum
RgATC. Ein Funkspruch ist ein Aufruf von RgATC.pilotRequest(nummer); die Nummern stehen
in globals.nas (2 Anlassen, 4 Rollen, 5 startbereit, 8 ILS-Anflug, 12 ILS established). Drei Dinge
musste ich dabei selbst erledigen:
-
Die richtige Station einstellen. Ohne eingestellte Frequenz nimmt Red Griffin die nächste Station
aus seiner Liste, bei mir in Erfurt einmal „Hildesheim INFO“.
RgATC.getAirportRadio(flughafen, art)
liefert die Station eines bestimmten Flughafens: am Boden Ground, im Anflug Approach, sonst Tower.
-
Die Stimme anmelden. Red Griffin legt Stimmen nur für Stationen aus seiner Nah-Liste an. Für eine
andere Frequenz kommt „ERROR: Aircraft radio use inconsistent frequency settings“. Abhilfe: für die eingestellte
Frequenz selbst eine Stimme eintragen.
-
„Contact … on …“ beachten. Schickt der Lotse einen weiter, wechselt der Helfer die Frequenz und
wiederholt den Funkspruch einmal.
# Stimme fuer die eingestellte Frequenz anmelden (sonst "inconsistent frequency settings")
var funk_stimme = func(f0) {
foreach (var f; [f0, getprop("/instrumentation/comm[0]/frequencies/selected-mhz")])
if (f != nil and f > 0 and !contains(RgATC.stationVoice, f))
RgATC.stationVoice[f] = RgATC.getSynthVoice(f);
};
# Station des gewuenschten Flughafens einstellen, dann funken
var art = RgATC.radio_station_type_tower;
if (t == 2 or t == 3 or t == 4) art = RgATC.radio_station_type_ground;
if (t == 7 or t == 8) art = RgATC.radio_station_type_approach;
var r = RgATC.getAirportRadio(airportinfo(icao), art);
if (r != nil) {
RgATC.setCurrentComRadioFrequency(r.frequency);
setprop("/instrumentation/comm[0]/frequencies/selected-mhz", r.frequency);
funk_stimme(r.frequency);
}
settimer(func { funk_stimme(0); RgATC.pilotRequest(t); }, 3);
Der vollständige Helfer liegt als funk_helfer.nas im Download. Er wird in fgdata/Nasal/
abgelegt und reagiert auf zwei Properties: /funk/flughafen (ICAO-Code) und /funk/anfrage
(Nummer des Funkspruchs). Meine Python-Skripte setzen diese Werte über die Telnet-Schnittstelle von FlightGear.
Ein Ablauf in Erfurt: Anlassen anmelden („Start up approved, departure runway 10, QNH 1014“), dann Rollen
anfordern („Taxi to hold short of runway 10. Contact Erfurt Tower at 121.150 when ready.“).
Zwei letzte Fallstricke beim Rufzeichen: Red Griffin liest es aus /rgatc/callsign, übernimmt eine
Änderung aber erst nach RgATC.applySettings(). Und RgATC.initRgATC() lädt beim ersten
Funkspruch das zuletzt im Addon gespeicherte Rufzeichen und schreibt es auch nach
/sim/multiplay/callsign. Nach einem Flug mit der Dash 8 meldete sich so der Airbus plötzlich als
„D-BTOX“. Der Helfer liest das gewünschte Rufzeichen deshalb vor initRgATC() aus
/funk/rufzeichen (sonst aus /sim/multiplay/callsign) und stellt es danach mit
applySettings() ein.
Fazit
Mit den Korrekturen funkt mein Dash-8-Skript einen ganzen Flug: Anlassen, Rollen, startbereit, ILS-Anflug und
„established“; das A320-Skript meldet sich im Anflug. Die beiden Änderungen in rgatc.nas sind klein; wer das Addon in einer
anderen Version benutzt, übernimmt sie am besten von Hand statt die Datei zu ersetzen.