roll-doublet.nas
2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
var target_bank_deg = 0;
var target_speed_kt = 50;
var target_alt_ft = 500;
var time = 0;
var last_time = 0.0;
var converge_time = 10000000.0; # a really big number of seconds we'd
# never make it to in a real run of
# the sim
var timer1 = 0.0;
var update_state = func( dt ) {
if ( dt < 0.000001 ) {
return;
}
var state = getprop("/flight-test/state");
var bank_deg = getprop("/orientation/roll-deg");
var speed_kt = getprop("/velocities/airspeed-kt");
var alt_ft = getprop("/position/altitude-ft");
if ( state == "init" ) {
# turn on wing leveler
setprop("/autopilot/locks/heading", "bank-hold");
setprop("/autopilot/settings/target-bank-deg", target_bank_deg);
# turn on altitude hold
setprop("/autopilot/locks/altitude", "altitude-hold");
# var target_alt_ft = int((alt_ft + 550) / 100) * 100;
setprop("/autopilot/settings/target-altitude-ft", target_alt_ft );
# turn on auto-throttle
setprop("/autopilot/locks/speed", "speed-with-throttle");
setprop("/autopilot/settings/target-speed-kt", target_speed_kt);
setprop("/flight-test/state", "converging");
} elsif ( state == "converging" ) {
var bank_diff = abs( bank_deg - target_bank_deg );
var speed_diff = abs( speed_kt - target_speed_kt );
var alt_diff = abs( alt_ft - target_alt_ft );
#printf("bank=%.1f spd=%.1f alt=%.1f t=%.1f ct=%.1f\n", bank_diff,
# speed_diff, alt_diff, time, converge_time);
if ( (bank_diff < 0.1) and (speed_diff < 0.5) and (alt_diff < 5) and (time >= 20.0) )
{
if ( converge_time > time ) {
converge_time = time;
}
} else {
converge_time = 10000000.0;
}
if ( time - converge_time > 10 ) {
setprop("/flight-test/state", "doublet1");
setprop("/autopilot/locks/heading", "");
setprop("/autopilot/locks/altitude", "");
setprop("/autopilot/locks/speed", "");
setprop("/controls/flight/aileron", "0.5");
timer1 = time;
}
} elsif ( state == "doublet1" ) {
if ( time - timer1 > 1 ) {
setprop("/flight-test/state", "doublet2");
setprop("/controls/flight/aileron", "-0.5");
timer1 = time;
}
} elsif ( state == "doublet2" ) {
if ( time - timer1 > 2 ) {
setprop("/flight-test/state", "done");
setprop("/autopilot/locks/heading", "bank-hold");
#setprop("/autopilot/locks/altitude", "altitude-hold");
#setprop("/autopilot/locks/speed", "speed-with-throttle");
}
}
}
var main_loop = func {
time = getprop("/sim/time/elapsed-sec");
var dt = time - last_time;
last_time = time;
if ( getprop("/flight-test/master-switch") == 1 ) {
update_state( dt );
}
settimer(main_loop, 0);
}
setlistener("/sim/signals/fdm-initialized",
func {
props.globals.initNode("/flight-test/master-switch", 1,
"BOOL", 1);
setprop("/flight-test/state", "init");
main_loop();
});