- Gijs de Rooy: Generic pushback.
This commit is contained in:
parent
7b24684016
commit
36bad881f0
3 changed files with 82 additions and 16 deletions
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
READ ALLOW $FG_ROOT/*
|
READ ALLOW $FG_ROOT/*
|
||||||
READ ALLOW $FG_HOME/*
|
READ ALLOW $FG_HOME/*
|
||||||
|
READ ALLOW /home/alexis/fgfs/*
|
||||||
|
|
||||||
WRITE ALLOW $FG_HOME/*.sav
|
WRITE ALLOW $FG_HOME/*.sav
|
||||||
WRITE ALLOW $FG_HOME/*.log
|
WRITE ALLOW $FG_HOME/*.log
|
||||||
|
|
26
Nasal/pushback.nas
Normal file
26
Nasal/pushback.nas
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# Properties under /sim/model/pushback:
|
||||||
|
# + position-norm - Position of pushback. 1 if connected.
|
||||||
|
|
||||||
|
# =====
|
||||||
|
# Pushback
|
||||||
|
# =====
|
||||||
|
|
||||||
|
Pushback = {};
|
||||||
|
|
||||||
|
Pushback.new = func {
|
||||||
|
obj = { parents : [Pushback],
|
||||||
|
pushback : aircraft.door.new("sim/model/pushback", 10.0),
|
||||||
|
};
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
Pushback.pushbackexport = func {
|
||||||
|
me.pushback.toggle();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# ==============
|
||||||
|
# Initialization
|
||||||
|
# ==============
|
||||||
|
|
||||||
|
# objects must be here, otherwise local to init()
|
||||||
|
pushbacksystem = Pushback.new();
|
|
@ -73,6 +73,33 @@ var identity = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# functions to indicate the course [deg] (heading/ground) for a given heading [deg] (true heading) and ktas [kt]
|
||||||
|
# just adding wind.
|
||||||
|
|
||||||
|
var heading_to_course_dev = func(ktas, heading) {
|
||||||
|
var alpha = (getprop("/environment/wind-from-heading-deg") - heading - 180) * D2R;
|
||||||
|
var wind_speed = getprop("/environment/wind-speed-kt");
|
||||||
|
return math.atan2(math.sin(alpha) * wind_speed, ktas + math.cos(alpha) * wind_speed) * R2D;
|
||||||
|
}
|
||||||
|
|
||||||
|
var heading_to_course = func(ktas, heading) {
|
||||||
|
return geo.normdeg(heading + heading_to_course_dev(ktas, heading));
|
||||||
|
}
|
||||||
|
|
||||||
|
# functions to calculate the needed heading [deg] (true heading) to have a desired course on ground [deg]
|
||||||
|
# for a given ktas [kt] the speed is speed on the heading, not on the course.
|
||||||
|
# need some improvement to indicate that it's impossible if the wind is too strong, but don't know what to do for this :)
|
||||||
|
|
||||||
|
var course_to_heading_dev = func(ktas, course) {
|
||||||
|
var alpha = (getprop("/environment/wind-from-heading-deg") - course) * D2R;
|
||||||
|
var rapport = math.sin(alpha) * getprop("/environment/wind-speed-kt") / ktas;
|
||||||
|
if (rapport > 1) return 1000; # not sure what to return here to indicate wind will be too strong to achieve course
|
||||||
|
else return math.asin(rapport) * R2D;
|
||||||
|
}
|
||||||
|
|
||||||
|
var course_to_heading = func(ktas, course) {
|
||||||
|
return geo.normdeg(course + course_to_heading_dev(ktas, course));
|
||||||
|
}
|
||||||
|
|
||||||
var Tanker = {
|
var Tanker = {
|
||||||
new: func(aiid, callsign, tacan, type, kias, heading, coord) {
|
new: func(aiid, callsign, tacan, type, kias, heading, coord) {
|
||||||
|
@ -92,6 +119,7 @@ var Tanker = {
|
||||||
m.mode = "leg";
|
m.mode = "leg";
|
||||||
m.rollrate = 2; # deg/s
|
m.rollrate = 2; # deg/s
|
||||||
m.maxbank = 25;
|
m.maxbank = 25;
|
||||||
|
m.drift_angle = 0;
|
||||||
|
|
||||||
var n = props.globals.getNode("models", 1);
|
var n = props.globals.getNode("models", 1);
|
||||||
for (var i = 0; 1; i += 1)
|
for (var i = 0; 1; i += 1)
|
||||||
|
@ -150,13 +178,22 @@ var Tanker = {
|
||||||
|
|
||||||
if ((me.interval += dt) >= 5) {
|
if ((me.interval += dt) >= 5) {
|
||||||
me.interval -= 5;
|
me.interval -= 5;
|
||||||
me.headwind = aircraft.wind_speed_from(me.course);
|
if (me.mode == "leg")
|
||||||
|
me.headwind = aircraft.wind_speed_from(me.course);
|
||||||
me.ktas = aircraft.kias_to_ktas(me.kias, alt);
|
me.ktas = aircraft.kias_to_ktas(me.kias, alt);
|
||||||
}
|
}
|
||||||
|
|
||||||
var distance = dt * (me.ktas - me.headwind) * NM2M / 3600;
|
if (me.roll) {
|
||||||
var deviation = me.roll ? 0.5 * dt * 1085.941 * math.tan(me.roll * D2R) / me.ktas : 0;
|
me.headwind = aircraft.wind_speed_from(me.course);
|
||||||
|
me.heading = me.heading - dt * 1085.941 * math.tan(me.roll * D2R) / me.ktas;
|
||||||
|
me.drift_angle = me.heading - me.course;
|
||||||
|
} else {
|
||||||
|
me.drift_angle = course_to_heading_dev(me.ktas, me.course);
|
||||||
|
me.heading = me.course + me.drift_angle;
|
||||||
|
}
|
||||||
|
var deviation = me.roll ? me.course - heading_to_course(me.ktas, me.heading) : 0;
|
||||||
|
var distance = dt * (me.ktas * math.cos(me.drift_angle * D2R) - me.headwind) * NM2M / 3600;
|
||||||
|
|
||||||
if (me.mode == "leg") {
|
if (me.mode == "leg") {
|
||||||
if (me.lastmode != "leg") {
|
if (me.lastmode != "leg") {
|
||||||
me.lastmode = "leg";
|
me.lastmode = "leg";
|
||||||
|
@ -170,7 +207,7 @@ var Tanker = {
|
||||||
me.roll_target = 0;
|
me.roll_target = 0;
|
||||||
me.leg_warning = 0;
|
me.leg_warning = 0;
|
||||||
}
|
}
|
||||||
if ((me.leg_remaining -= distance) < 0)
|
if ((me.leg_remaining -= distance) > 0)
|
||||||
me.mode = "turn";
|
me.mode = "turn";
|
||||||
|
|
||||||
} else { # me.mode == "turn"
|
} else { # me.mode == "turn"
|
||||||
|
@ -183,17 +220,20 @@ var Tanker = {
|
||||||
if (!me.full_bank_turn_angle and me.roll >= me.roll_target)
|
if (!me.full_bank_turn_angle and me.roll >= me.roll_target)
|
||||||
me.full_bank_turn_angle = geo.normdeg(180 - me.turn_remaining);
|
me.full_bank_turn_angle = geo.normdeg(180 - me.turn_remaining);
|
||||||
|
|
||||||
if (me.turn_remaining < me.full_bank_turn_angle)
|
#if (me.turn_remaining < me.full_bank_turn_angle)
|
||||||
me.roll_target = 0;
|
# me.roll_target = 0;
|
||||||
|
|
||||||
if ((me.turn_remaining -= deviation) < 0) {
|
#if ((me.turn_remaining -= deviation) < 0) {
|
||||||
if (me.goal[1] == nil) # define tanker exit point (opposite of anchor point/ARCP)
|
# if (me.goal[1] == nil) # define tanker exit point (opposite of anchor point/ARCP)
|
||||||
me.goal[1] = geo.Coord.new(me.coord).apply_course_distance(me.track_course - 180,
|
# me.goal[1] = geo.Coord.new(me.coord).apply_course_distance(me.track_course - 180,
|
||||||
me.length);
|
# me.length);
|
||||||
me.mode = "leg";
|
# me.mode = "leg";
|
||||||
}
|
#}
|
||||||
|
me.headwind = aircraft.wind_speed_from(me.course);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
me.coord.apply_course_distance(me.course -= deviation, distance);
|
me.coord.apply_course_distance(me.course -= deviation, distance);
|
||||||
|
|
||||||
me.ac = geo.aircraft_position();
|
me.ac = geo.aircraft_position();
|
||||||
|
@ -206,7 +246,7 @@ var Tanker = {
|
||||||
me.latN.setDoubleValue(me.coord.lat());
|
me.latN.setDoubleValue(me.coord.lat());
|
||||||
me.lonN.setDoubleValue(me.coord.lon());
|
me.lonN.setDoubleValue(me.coord.lon());
|
||||||
me.altN.setDoubleValue(alt * M2FT);
|
me.altN.setDoubleValue(alt * M2FT);
|
||||||
me.hdgN.setDoubleValue(me.heading = me.course);
|
me.hdgN.setDoubleValue(me.heading);
|
||||||
me.pitchN.setDoubleValue(0);
|
me.pitchN.setDoubleValue(0);
|
||||||
me.rollN.setDoubleValue(-me.roll);
|
me.rollN.setDoubleValue(-me.roll);
|
||||||
me.ktasN.setDoubleValue(me.ktas);
|
me.ktasN.setDoubleValue(me.ktas);
|
||||||
|
@ -261,7 +301,6 @@ var Tanker = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var request = func {
|
var request = func {
|
||||||
var tanker = values(Tanker.active);
|
var tanker = values(Tanker.active);
|
||||||
if (size(tanker))
|
if (size(tanker))
|
||||||
|
@ -276,7 +315,7 @@ var request = func {
|
||||||
var hdg = getprop("orientation/heading-deg");
|
var hdg = getprop("orientation/heading-deg");
|
||||||
var course = hdg + (rand() - 0.5) * 60;
|
var course = hdg + (rand() - 0.5) * 60;
|
||||||
var dist = 6000 + rand() * 4000;
|
var dist = 6000 + rand() * 4000;
|
||||||
var alt = int(10 + rand() * 15) * 1000; # FL100--FL250
|
var alt = int(10 + rand() * 22) * 1000; # FL100--FL320
|
||||||
alt = skip_cloud_layer(alt * FT2M);
|
alt = skip_cloud_layer(alt * FT2M);
|
||||||
var coord = geo.aircraft_position().apply_course_distance(course, dist).set_alt(alt);
|
var coord = geo.aircraft_position().apply_course_distance(course, dist).set_alt(alt);
|
||||||
Tanker.new(aiid, callsign, tacanid, type, 250, hdg, coord);
|
Tanker.new(aiid, callsign, tacanid, type, 250, hdg, coord);
|
||||||
|
|
Loading…
Add table
Reference in a new issue