Runway Awareness and Advisory System: Difference between revisions
No edit summary |
No edit summary |
||
Line 15: | Line 15: | ||
The Runway Advisory and Awareness System can give a number of advisories: | The Runway Advisory and Awareness System can give a number of advisories: | ||
{| class="wikitable" | |||
|- | |||
! Feature !! RAAS | |||
|- | |||
| On runway and alignment < 20 degrees || {{Progressbar|100}} | |||
|- | |||
| On short runway, announcing remaining distance || {{Progressbar|100}} | |||
|- | |||
| On runway (reminder) || {{Not done}} | |||
|- | |||
| Approaching runway when taxiing and groundspeed < 40 knots || {{Progressbar|100}} | |||
|- | |||
| Approaching runway (airborne) when distance < 3 nm, alignment < 20 degrees, AFE is 300 - 450 ft or 550 - 750 ft || {{Progressbar|100}} | |||
|- | |||
| Approaching runway, announcing available distance || {{Progressbar|100}} | |||
|- | |||
| Distance remaining (during rollout) || {{Progressbar|100}} | |||
|- | |||
| Distance remaining after rejected takeoff, past 50 % of runway and 7 knots below maximum groundspeed || {{Progressbar|100}} | |||
|- | |||
| Runway end when distance remaininig < 100 feet and groundspeed < 40 knots || {{Not done}} | |||
|- | |||
| Taxiway takeoff when groundspeed > 40 knots while not on runway || {{Not done}} | |||
|} | |||
https://www.youtube.com/watch?feature=player_detailpage&v=59ymnKUi49A#t=117 | https://www.youtube.com/watch?feature=player_detailpage&v=59ymnKUi49A#t=117 | ||
Line 33: | Line 48: | ||
Currently RAAS is only used in the [https://github.com/dogsaysmoo/747-8i/ 747-8i]. | Currently RAAS is only used in the [https://github.com/dogsaysmoo/747-8i/ 747-8i]. | ||
{{tip| | {{tip|Ask the developer of your favorite aircraft if you want it to support RAAS.}} | ||
== TODO == | == TODO == | ||
Line 40: | Line 55: | ||
|- | |- | ||
| Use *.groundnet.xml to detect when the aircraft is near a holding point to more accurately emit "approaching-runway" signal || {{Not done}} | | Use *.groundnet.xml to detect when the aircraft is near a holding point to more accurately emit "approaching-runway" signal || {{Not done}} | ||
|- | |- | ||
| Give "Long landing" caution when aircraft has less than a specified distance/percentage remaining || {{Not done}} | | Give "Long landing" caution when aircraft has less than a specified distance/percentage remaining || {{Not done}} | ||
|} | |} | ||
Revision as of 23:21, 28 September 2014
Started in | 08/2014 |
---|---|
Description | System to give advisories about runways |
Contributor(s) | onox |
Status | Under active development as of 08/2014 |
Subforum | http://forum.flightgear.org/viewtopic.php?f=66&t=21266 |
Features
The Runway Advisory and Awareness System can give a number of advisories:
https://www.youtube.com/watch?feature=player_detailpage&v=59ymnKUi49A#t=117
https://www.youtube.com/watch?feature=player_detailpage&v=0jkRhIMZAZo#t=171
Aircraft
Currently RAAS is only used in the 747-8i.
Tip Ask the developer of your favorite aircraft if you want it to support RAAS. |
TODO
Signals
In order to give these advisories, callbacks for a number of signals can be registered to two announcers. Depending on the current mode of each announcer they will emit certain signals:
Takeoff announcer
Mode | Emitted signals |
---|---|
taxi-and-takeoff | approaching-runway, on-runway, on-short-runway |
taxi | approaching-runway |
takeoff | on-runway, on-short-runway |
approach | approaching-runway, approaching-short-runway |
Landing announcer
Mode | Emitted signals |
---|---|
takeoff | remaining-distance, vacated-runway |
landing | remaining-distance, landed-runway, vacated-runway, landed-outside-runway |
Installation
In case logger.nas and runway_announcer.nas have not been added to FlightGear's fgdata project yet, add the following to the beginning of the <nasal> element in your aircraft's -set.xml file:
<logger>
<file>Aircraft/$YOUR_AIRCRAFT_FOLDER/Nasal/logger.nas</file>
</logger>
<runway>
<file>Aircraft/$YOUR_AIRCRAFT_FOLDER/Nasal/runway_announcer.nas</file>
</runway>
Add the following to the <nasal> element below the previous two:
<file>Aircraft/$YOUR_AIRCRAFT_FOLDER/Nasal/runway.nas</file>
Add the file runway.nas to your aircraft's Nasal folder. The following example listens to /gear/on-ground and overrides a number of properties of the takeoff_config object so that it can be used for large airliners.
Functions
First, create a number of functions to format and print messages, and to execute certain actions when some signals are emitted:
# Copyright (C) 2014 onox
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
var copilot_say = func (message) {
setprop("/sim/messages/copilot", message);
logger.info(sprintf("Announcing '%s'", message));
};
var on_short_runway_format = func {
var distance = getprop("/sim/runway-announcer/short-runway-distance");
return sprintf("On runway %%s, %d %s remaining", distance, takeoff_config.distances_unit);
};
var approaching_short_runway_format = func {
var distance = takeoff_announcer.get_short_runway_distance();
return sprintf("Approaching runway %%s, %d %s available", distance, takeoff_config.distances_unit);
};
var remaining_distance_format = func {
return sprintf("%%d %s remaining", landing_config.distances_unit);
};
var stop_announcer = func {
landing_announcer.stop();
logger.warn("Stopping landing announcer");
takeoff_announcer.set_mode("taxi-and-takeoff");
logger.warn(sprintf("Takeoff mode: %s", takeoff_announcer.mode));
};
var switch_to_takeoff = func {
# Switch to takeoff mode so that the "approaching-runway" signal
# is not emitted for any runways that are crossed during takeoff
if (takeoff_announcer.mode == "taxi-and-takeoff") {
takeoff_announcer.set_mode("takeoff");
logger.warn(sprintf("Takeoff mode: %s", takeoff_announcer.mode));
landing_announcer.set_mode("takeoff");
landing_announcer.start();
logger.warn(sprintf("Starting landing (%s) announcer", landing_announcer.mode));
}
};
Connecting signals
Second, create configuration objects, override some of their parameters, and then connect the various signals to callbacks:
var takeoff_config = { parents: [runway.TakeoffRunwayAnnounceConfig] };
# You can modify this setting from a GUI during runtime
takeoff_config.distances_unit = "meter";
# Will cause the announcer to emit the "on-runway" signal if the
# aircraft is at most 15 meters from the center line of the runway
takeoff_config.distance_center_line_m = 15;
# Let the announcer emit the "approaching-runway" signal if the
# nose of the aircraft comes within 120 meters of the runway
takeoff_config.distance_edge_max_m = 150;
var takeoff_announcer = runway.TakeoffRunwayAnnounceClass.new(takeoff_config);
takeoff_announcer.connect("on-runway", runway.make_betty_cb(copilot_say, "On runway %s", switch_to_takeoff));
takeoff_announcer.connect("on-short-runway", runway.make_betty_cb(copilot_say, on_short_runway_format, switch_to_takeoff));
takeoff_announcer.connect("approaching-runway", runway.make_betty_cb(copilot_say, "Approaching runway %s"));
takeoff_announcer.connect("approaching-short-runway", runway.make_betty_cb(copilot_say, approaching_short_runway_format));
var landing_config = { parents: [runway.LandingRunwayAnnounceConfig] };
landing_config.distance_center_nose_m = 30;
# You can modify this setting from a GUI during runtime
landing_config.distances_unit = "meter";
var landing_announcer = runway.LandingRunwayAnnounceClass.new(landing_config);
landing_announcer.connect("remaining-distance", runway.make_betty_cb(copilot_say, remaining_distance_format));
landing_announcer.connect("vacated-runway", runway.make_betty_cb(copilot_say, "Vacated runway %s", stop_announcer));
landing_announcer.connect("landed-runway", runway.make_betty_cb(copilot_say, "Touchdown on runway %s"));
landing_announcer.connect("landed-outside-runway", runway.make_betty_cb(nil, nil, stop_announcer));
Listeners
Finally, set up a listener to detect when the aircraft is on the ground and when it is airborne. Depending on this conditions, you need to start, stop, or change the modes of the announcers:
var have_been_in_air = 0;
var test_on_ground = func (on_ground) {
if (on_ground) {
takeoff_announcer.start();
logger.warn("Starting takeoff announce");
if (have_been_in_air == 1) {
have_been_in_air = 0;
takeoff_announcer.set_mode("");
landing_announcer.set_mode("landing");
landing_announcer.start();
logger.warn(sprintf("Starting landing (%s) announcer", landing_announcer.mode));
}
else {
takeoff_announcer.set_mode("taxi-and-takeoff");
logger.warn(sprintf("Takeoff mode: %s", takeoff_announcer.mode));
}
takeoff_announcer.start();
logger.warn(sprintf("Starting takeoff (%s) announcer", takeoff_announcer.mode));
}
else {
takeoff_announcer.set_mode("approach");
logger.warn(sprintf("Takeoff mode: %s", takeoff_announcer.mode));
landing_announcer.stop();
logger.warn("Stopping landing announcer");
if (have_been_in_air == 0) {
have_been_in_air = 1;
}
}
};
var init_announcers = func {
setlistener("/gear/on-ground", func (node) {
test_on_ground(node.getBoolValue());
}, startup=1, runtime=0);
};
setlistener("/sim/signals/fdm-initialized", func {
var timer = maketimer(5.0, func init_announcers());
timer.singleShot = 1;
timer.start();
});
Note In this example the /gear/on-ground property is used to detect whether the aircraft is on the ground or in the air. Make sure to use a <logic> element in a <autopilot> XML file to set this to true or false depending on your gears' wow values. |
Note It is your responsibility to start and stop the announcers and to set the correct modes. Therefore it is necessary to connect to signals like landed-outside-runway and vacated-runway, even if they appear to be useless for your specific aircraft. The example of runway.nas above already does this for you. |
Tip You might want to replace copilot_say(). |
Configuring the announcers
The configuration object takeoff_config has a number of properties with default values. These properties can be modified if you want to change when certain signals are emitted. For example, in the example of runway.nas above, distance_center_line_m and distance_edge_max_m where overridden for large airliners. The defaults are:
distance_start_m: nil,
# The maximum distance in meters from the starting position
# on the runway. Large runways are usually 40 to 60 meters wide
# to give you an idea of the scale. If nil then the distance is
# not taken into account, which means the aircraft can be anywhere
# on the runway for the on-runway signal to be emitted.
diff_runway_heading_deg: 20,
# Difference in heading between runway and aircraft in order to
# get an announcement that the aircraft is on the runway for takeoff.
diff_approach_heading_deg: 40,
# Maximum angle at which the aircraft should approach the runway.
# Must be higher than 0 and lower than 90.
distance_center_line_m: 10,
# The distance in meters from the center line of the runway
distance_edge_min_m: 20,
distance_edge_max_m: 80,
# Minimum and maximum distance in meters from the edge of the runway
# for announcing approaches.
nominal_distance_takeoff_m: 3000,
# Minimum distance in meters required for a normal takeoff. If
# remaining distance when entering the runway is less than the distance
# required for a normal takeoff, then the on-short-runway instead of
# on-runway signal will be emitted.
nominal_distance_landing_m: 2000,
# Minimum distance in meters required for a normal landing. If
# runway length when approaching the runway is less than the distance
# required for a normal landing, then the approaching-short-runway
# instead of approaching-runway signal will be emitted.
distances_unit: "meter",
# The unit to use for the remaining distance of short runways. Can
# be "meter" or "feet".
groundspeed_max_kt: 40,
# Maximum groundspeed in knots for approaching runway callouts
The same applies to the configuration object landing_config:
distances_meter: [ 30, 100, 300, 600, 900, 1200, 1500],
distances_feet: [100, 300, 1000, 2000, 3000, 4000, 5000],
distances_unit: "meter",
# The unit to use for the remaining distance. Can be "meter" or "feet"
distance_center_nose_m: 0,
# Distance from the center to the nose in meters
diff_runway_heading_deg: 15,
# Difference in heading between runway and aircraft in order to
# detect the correct runway on which the aircraft is landing.
groundspeed_min_kt: 40,
# Minimum groundspeed in knots for remaining distance callouts
agl_max_ft: 100,
# Maximum AGL in feet for remaining distance callouts