Fly the Stall Test
This card is the procedure for the first stall test of the real aircraft, in FBWA. The test
measures the 1 g stall speed and the stall speed in a bank. AIRSPEED_STALL and the survey
speed come from this measurement.
The parameter setup is from th-avionics. The expected values and the recovery come from a SITL
rehearsal of this card on 2026-09-28 (sim/battery/handling.py, flights T1 and XT1). All SITL
values are estimates. The SITL stall model is the pessimistic case: the aerodynamic estimates put
the real 1 g stall at 15.5 to 16.7 m/s (aero), and SITL stalls at 17.9 m/s.
Before the test day
Section titled “Before the test day”- Complete the first transition flights. The stall test is the next item after them.
- Make sure that the flush side static ports are fitted and teed to the MS4525’s static nipple
(the first build’s nose ring, th-blender W77 e5c82146; Ryan, 2026-10-06; Y 40, Z -10 each side, the
height matters), that the plumbing check of the first-flight card’s step 21 passed, that
its cone check passed after the last nose cone fit, and that the pitot mouth was covered at
the last power-up until “Airspeed 1 calibrated” (step 21). Do not
calibrate the airspeed sensor in flight (
ARSPD_AUTOCAL0, th-avionics b1b5ed6f):ARSPD_RATIOstays 2.3, which reads about 17 % low near the stall. Every Fuselage C nose has the ports: they are part of the Fuselage Front, and our total tube has no static holes of its own. - Do a check of the CG. The CG must be in the envelope in cg.md. For this test, aim at 266 mm. The measured CG must be at or forward of 267 mm (Ryan, 2026-10-19). Measure it before the flight. Record it. An aimed value is not enough. On Fuselage C with our wing and its fence, the wing softens between 9.5 and 10 degrees of angle of attack, where the earlier wing went neutral, but much less: the static margin there is about 5.3% at 267 mm, and 4.0% at the soft end of the uncertainty (th-aeronautics’ fine CFD pair, 5d15e8b1, estimates; the earlier wing had about 2% at 265 to 266 mm). The measured stall speed reads a little high at the forward CG. Record the CG with the result. Fly the test without the Survey3 (decided 2026-10-01 with th-aeronautics and th-avionics; confirmed by both and jbsim-b3 on 2026-10-06): there is no taped trim weight to get wrong or lose, the aircraft is the lighter case, the floor margin to the soft band nearly doubles (0.78 against 0.41 m/s, below), and the Survey3W adds nothing to the test; its trigger test flies separately.
CAUTION: On Fuselage C the slider’s aft stop puts the CG at about 272.4 mm, aft of the 270 mm hard limit, on the day and the night builds. The slider’s stop pin and the TAKEOFF arming check are what hold it (cg.md, th-aeronautics 6d23206a, estimates).
The first build is Fuselage C v2.4B with the CG slider (cg.md, th-aeronautics
6d23206a, estimates until the balance). The day build is about 3,025 g and balances at 268 mm
with the pack front at Y 75.6, 1.6 mm aft of the slider’s forward stop, with no trim. For this
test, put the pack at the forward stop and add M3 brass fender washers to the trim bracket on
the port chine of the Fuselage Front (th-blender W100.1): about 4 washers give 267 mm
(266.98 mm, 3,033.7 g), and 12 reach the 266 mm aim (265.95 mm). The night build (the
lighting battery fitted, about 3,198 g) also needs 4 washers for 267 mm (266.88 mm). Count the
washers from the weigh-in, not from these figures (th-aeronautics 6d23206a, with the ASA
payload cover). Record the pack’s position and the washer count.
Where the balance puts the pack is TAKEOFF: set CGS_SET 1 there (first-flight card, step 3),
and keep CGS_CRUISE_MM 0 for this test. The Survey3W case cannot fly on Fuselage C as built:
its trim (about 69 g) is more than the row holds. Camera off stays the configuration to fly it
in. Measure the CG on the balance in the test configuration, with the
pack in its pocket. Do not compute it from the table: the build-up is an estimate of about
20 mm until the aircraft is on the balance. Weigh the aircraft and record the mass. After-test
step 7 refers the result to the heaviest mass. At arming, write “no Survey3” in the log
(a STATUSTEXT or the pilot’s note) so that the referral reads the configuration from the
log. No parameter changes for the lighter aircraft: Q_M_HOVER_LEARN takes the lighter
hover as it goes.
4. Set a transmitter switch position to QHOVER. QHOVER is the recovery in this card.
5. Practise the entry and the recovery in SITL. Fly the level deceleration in FBWA, then QHOVER
at the break (sim/battery, flights XT1-decel). Refer to Fly it in SITL.
6. Measure the lift motor start time on the thrust stand. Step one lift motor from braked stop
to hover throttle. Record the time to 90% of hover thrust. Film the step: the folded blades
must open before the rotor gives thrust, and the thrust log does not show that delay.
7. Find the break floor for the start time in the table below. Use it in procedure step 9.
8. If the start time is more than 1.1 s, do not fly the test.
9. If the start time is more than 1.0 s, send it to th-avionics and th-eda. A slow start also
slows every assist and every QRTL from the cruise.
10. Load sim/scripts/stall_cue.lua (th-avionics, 0546151) for the test flight only. It warns
when the pitch command saturates, which is the forward-CG limit. Unload it after the test.
| Start time to 90% of hover thrust | Break floor (procedure step 9) |
|---|---|
| 0.9 s or less | 60 m |
| 1.0 s | 61 m |
| 1.1 s | 64 m |
| More than 1.1 s | Do not fly the test |
The floor keeps the lowest point 10 m above Q_ASSIST_ALT (30 m): floor = 50 m + 22 m for each
second of start time above 0.5 s, and 60 m or more. The entry cannot go higher than 120 m. With
the level entry below, the SITL break came within 10 m of the entry height (fixed pusher,
2026-10-01). The floor is a safety net, not a limit on the entry.
The lift motors are braked with the propellers folded in the cruise. The QHOVER recovery must
wait for the ESC to start, the blades to open and Q_M_SPOOL_TIME. SITL does not model the
start, so the rehearsal used a longer Q_M_SPOOL_TIME as a stand-in (estimate):
| Delay before the lift motors give thrust | Height lost, QHOVER recovery | Lowest point from a break at 66 m |
|---|---|---|
0.5 s (Q_M_SPOOL_TIME default) |
10 m | 56 m |
| 1.0 s | 21 m | 45 m |
| 1.5 s | 32 m | 34 m |
| 2.0 s | 44 m | 22 m, below Q_ASSIST_ALT |
Parameters for the test
Section titled “Parameters for the test”For the test flight, load params/test-stall.parm after the airframe file: it sets the
Q_ASSIST_SPEED test value (th-avionics b53f79d4; 12 since 8c5e9f9d). Set LCK_ENABLE 0 by hand. Keep all other
parameters at their service values. The test
flight has no lift motor check (LCK_ENABLE 0), so fly a normal flight on the same day first. Its
log must show “lift: check passed”. If it does not, do not fly the test.
| Parameter | Test value | Service value | Why |
|---|---|---|---|
Q_ASSIST_SPEED |
12 | 18 | Below the expected stall, so the speed assist does not hide the break. The assist reads the indicated airspeed, and on Fuselage C the side ports put the break at about 14.1 m/s indicated, so 12 (about 14.4 m/s EAS) keeps the assist below it; at 14 the assist ended every SITL wings-level point first (th-avionics 8c5e9f9d, th-testpilot ee6d217f). From params/test-stall.parm, not by hand |
Q_ASSIST_ANGLE |
30 | 30 | Safety net. Keep it on. 30 is ArduPilot’s default, lower than the manual’s 45 (th-avionics, 7aa3779 and e197fc5, 2026-10-01): the CFD gives a wing-drop tendency near 17 degrees of angle of attack, and at 45 the angle assist would act only past 80 degrees of bank in a 35 degree turn, at 30 past 65 |
Q_ASSIST_ALT |
30 | 30 | Safety net. Keep it on |
LCK_ENABLE |
0 | 1 | lift_check.lua checks the lift motors near the assist triggers. On the approach to the stall that check turns Q-assist off for about 11.5 s and turns the lift motors, so two of three SITL points ended before a break (run t1-with-lck151, 2026-10-12). With 0 the points match the rehearsals: 18.69, 19.53 and 19.37 m/s against 18.68, 19.54 and 19.37 (run t1-lck-off). The script still passes its own arming check (th-avionics, 2026-10-12) |
AIRSPEED_STALL |
20.0 | 20.0 | In FBWA it limits only the bank angle. 20.0 is a margin setting until this test (th-avionics, 0634db5, 2026-10-01; it was 19.2). The break speeds in the results tables are measured, not this setting; re-flown at 20.0 (run t1-stall20, 2026-10-01) the three points moved 0.1 m/s or less (18.3, 19.4, 19.3) |
Conditions
Section titled “Conditions”- Wind: 5 m/s or less, with no gusts.
- Entry height: 120 m. The SITL rehearsal held the height to within 10 m until the break. The recovery lost 4 to 6 m.
- A second person watches the aircraft and calls the height.
- The pack: full at takeoff.
Procedure
Section titled “Procedure”WARNING: Stay clear of the area below the test point. The aircraft can lose 30 m or more in a stall.
- Take off in QHOVER. Transition to CRUISE and climb to 120 m.
- Make sure that the GCS shows 0 rpm for the four lift motors. This is the brake check.
- If a lift motor turns in the cruise, stop the test and land.
- Fly into the wind. Set FBWA.
- Set the wings level. Let the speed become stable at the cruise speed.
- Reduce the throttle in small steps. Hold the height with the elevon. Let the airspeed fall at 0.5 to 1 m/s each second. Do not let the height change by more than 10 m.
- At 3 m/s EAS above the expected break, close the throttle: on Fuselage C that is about 16.8 m/s indicated (19.8 m/s EAS, wings level). Hold the height with the elevon to the break. Do not add nose-up while the pitch is still in motion. Expect the nose to become light, and the pitch slightly unsteady, at about 14.9 to 15.2 m/s indicated (17.5 to 17.9 m/s EAS), in the last 1 m/s before the break (th-aeronautics 5d15e8b1, estimates). Expect the break at about 14.1 m/s indicated, which is about 16.8 m/s EAS at the test mass: the side ports read about 16 % low near the stall, so 14 on the OSD is not an early stall (th-aeronautics, estimates; the two 16.8 figures are a coincidence of the two readings).
- Monitor the airspeed, the height, the attitude and the elevon cue.
- If the height decreases below the break floor before the break, select QHOVER and stop the point. The break floor is 60 m, or more for a slow lift motor start (refer to the table above). If the bank passes 30 degrees during the entry or the break, select QHOVER and stop the point. If the elevon cue sounds (the pitch command saturated) with no break, select QHOVER and end the point. Record that airspeed as the elevon-limited minimum. Do not push past it. The stall cue ends a point only if it sounds before the break. If it sounds at or after the break, continue the recovery and record the point as a wing break. In the stalled wing, FBWA pulls the pitch command to full before QHOVER takes over, and the cue can sound then.
WARNING: Do not recover with the pitch stick at centre. In FBWA, centre stick holds a level pitch and keeps the wing stalled. In SITL, with the elevons trimmed as on the aircraft, this lost 99.5 m from 150 m and the aircraft hit the ground. A stall recovered this way can kill a person below the aircraft.
- At the break, select QHOVER at once. The break is a nose drop, a wing drop or a fast sink.
- Hold QHOVER until the aircraft is stable in a hover.
- Record the airspeed, the throttle and the height lost at the break. Record the bank at the break from the log (ATT roll). Near the stall the limiter holds the bank below the stick. In SITL a 30 degree command broke at 26 degrees.
- Read the log of the break before the next point. Find the first 1 s after the elevons return to neutral. If the pitch rate is not nose-down in that second, stop the test. The wing’s pitch behaviour past the stall is unknown, and a nose-up tendency there makes a stall a mush that airspeed-based protection cannot see (SITL, 2026-09-28: 18 to 21 deg AoA at 28 m/s with the nose level).
- Read the wings-level break before the banked points. If a wing dropped more than 20 degrees, or the recovery took more than 2 s, land and stop the test. The banked points wait for a later day. The lift motors’ roll authority in a wing drop is marginal (th-avionics: about 6 N m against the CFD’s 7 N m), and SITL cannot rehearse an asymmetric stall.
- Climb to 120 m in QHOVER. Transition to CRUISE.
- Do steps 2 to 15 again with 20 degrees of bank. Keep the stall limiter on. The banked points are a check of the wings-level number, not the measurement. Near the break the limiter reduces the bank below the stick on this point too (the SITL point broke at 22 degrees); read the bank and the load factor from the log.
- Do steps 2 to 15 again with 30 degrees of bank. For this point set
ROLL_LIMIT_DEGto 30 and do not save it. Full stick is then 30 degrees, the bank the point tests. Set it back to 35 after the point. Near the break the stall limiter reduces the bank below the limit: the SITL point broke at 26 degrees. Read the bank from the log and refer the point (after the test, step 4). - Land in QHOVER.
If the QHOVER switch position does not work, recover with the stick. Push the stick forward for 1 s, then set it to centre. Set the throttle to full. Level the wings only after the push, when the angle of attack is below the stall. Do not roll against a wing drop while the wing is stalled: that deepens the stall on the low wing. In SITL the push recovery lost 22 to 29 m.
Expected values (SITL rehearsal, 2.853 kg, estimates)
Section titled “Expected values (SITL rehearsal, 2.853 kg, estimates)”9e1e451, no wind. How it was flown, and the other films. Soundtrack, off until you unmute the player: Dvořák, Symphony No. 9, Largo (Musopen; public domain), from Wikimedia Commons. Flown by ArduPilot; the logo on the title card is the project's own, used under CC BY-SA 3.0.Fuselage C (c24b-w78, 3.034 kg at 268 mm, the side-port sensor model at ARSPD_RATIO 2.3,
Q_ASSIST_SPEED 12 and LCK_ENABLE 0 as this card sets them; run t1q12, 2026-10-19, ×3 each,
with and without the flight scripts): every point ends when ArduPilot’s angle-of-attack estimate
passes 15 degrees (in the stall film’s wings-level flight the true angle was then 14.7 degrees,
at 13.6 m/s indicated), with no
assist before it. The figures are indicated airspeed, as the OSD shows it:
| Bank | Indicated airspeed 1 s before the break | Up elevon 1 s before the break | Height lost to QHOVER |
|---|---|---|---|
| 0 degrees | 14.20 to 14.27 m/s | 12.7 to 12.9 degrees | 2.7 to 3.1 m |
| 20 degrees | 14.49 to 14.64 m/s | 13.2 to 13.4 degrees | 5.4 to 5.6 m |
| 30 degrees | 14.79 to 14.86 m/s | 13.1 to 13.2 degrees | 3.7 to 4.4 m |
The wings-level break agrees with th-aeronautics’ 14.1 m/s indicated and 12.5 degrees of up elevon. c24b-w78’s pitching moment is linear, with no fence break, so SITL’s break is the alpha trigger and not the real stall. The real test is the first look at the break itself. The keel-era figures below are kept for their method.
On the F8041 3-blade props (th-aeronautics 107bdf8 and ac24336, 2026-10-08: keel B 2.853 kg at
269.5 mm, keel A 2.886 kg at 267.3 mm; Q_M_SPIN_MAX 0.82 and Q_M_THST_EXPO 0.33, th-avionics
9391676) the points are, from run b3-standard, keel B 18.7, 19.5 and 19.4 m/s at 0, 20 and
30 degrees of bank (18.65, 19.54 and 19.36), and from run b3a-standard, keel A 19.1, 19.5 and
20.8 m/s (19.13, 19.54 and 20.82; the 30 degree point broke at 30.8 degrees of bank against 28.8
on the 2-blade run, worth about +0.2 m/s through the load factor). Against the 2-blade runs below
the points moved +0.07, -0.01 and +0.08 on keel B and +0.14, -0.02 and +0.14 on keel A; the 15 g of
propeller predicts +0.05. th-simulator’s five repeats of the wings-level point on each model and its
2-blade parent (2026-10-10, runs stallrep-*) settle it: keel A’s +0.14 was the probe’s own spread
(2-blade 19.07 +- 0.06, 3-blade 19.11 +- 0.03, a difference of +0.04 against the +0.05 the mass
predicts, within its standard error), and keel B’s +0.08 is the mass’s +0.05 plus about 0.03 m/s not
attributed, under this card’s 0.1 m/s resolution (2-blade 18.60 +- 0.02, 3-blade 18.68 +- 0.01). A
single pair at this test moves about 0.1 m/s by chance. The lift motors are stopped in
every stall point, so the propeller changes nothing in the stall itself; the history below is on the
2-blade models and stands as the record of how the points were reached.
The SITL model is the first build as it flies: nose rev C with the CG slider (the SITL keeps the
pack at its drawn place, Y 86, and does not model sliding), both ESCs flat in the belly between the
spars, keel B all-in with the Walksnail in the nose, 2.838 kg with no ballast at 269.5 mm
(th-aeronautics 5856776, th-simulator b14e8ac, 2026-10-06), on the CFD cruise drag. The points
below are from run rc-standard on that model (the forward-CG row from rc-fwdcg on the
placeholder). The keel A model of the same build-up (2.871 kg at 267.2 mm) gave 18.8, 19.5 and
19.5 m/s with its aerodynamics referred to the 270 mm design CG (run rca-rows), and 19.0, 19.5
and 20.6 with them referred to the CG it flies, 267.2 mm (th-aeronautics 0995458, th-simulator
cbd7c94, 2026-10-07, run cgrefa-standard; c_m_a +11%): on that model the 30 degree point breaks
at 20.6 m/s smoothed (20.1 raw), over the AIRSPEED_STALL 20.0 floor, with 27 degrees of bank at
the break and a lift coefficient of 0.40 against 0.43 on the other points. th-aeronautics reads it
as the model’s physics, newly visible: at 267.2 mm the wing needs about 1.15 degrees more up elevon
than at 270, and up elevon costs lift (about 0.012 of trimmed lift coefficient), which is the 0.404
and about +2% on the break speed; the keel A points before 0995458 were optimistic, not this one
pessimistic. Two things set it in context: the real keel A takes off at 268 mm (the slider), about
0.8 mm aft of the model, worth about 0.5% less on the break; and in AUTO the survey turns never fly
at 21, since TECS holds AIRSPEED_STALL times the square root of the load factor, 21.5 m/s at
30 degrees, so the margin to the banked break is about 0.9 m/s there, and 0.4 only for a pilot
holding 21 in a 30 degree bank in FBWA, which is this test. At the 268 mm the aircraft takes off at
(th-aeronautics’ terrahawk-keela-notips-to268.json, a0e84da; run keela-to268) keel A reads
18.9, 19.6 and 20.2 m/s (raw at the break 18.6, 19.4 and 19.7; lift coefficient 0.43, 0.43 and
0.40; 9.15 degrees of trim left at 18 m/s): the 30 degree point sits 0.2 over the floor smoothed and
0.3 under it raw. Its 0.4 m/s difference from the 267.2 mm flight is within the 30 degree point’s own
spread, which follows the load factor at the break as the limiter takes the bank off (0.93 against
0.98 here, the same 0.40 lift coefficient and bank on both); the 0.8 mm of CG is worth under 0.1 m/s,
and the wings-level and 20 degree points are the cleaner CG comparison (th-aeronautics). Keel B
referred to its 269.5 mm
(run cgref-standard) reads 18.6, 19.5 and 19.3, unchanged. The models before it gave: 2.804 kg at 270 mm (run ai-standard) 18.6,
19.4, 19.3 and 17.1; 2.680 kg at 267.9 mm (run np-standard) 18.1, 19.2, 19.2 and 16.7. The wings-level
point moved up 0.5 m/s, as the mass predicts (the square root of the mass ratio is 1.023); the
banked points moved less, because the stall limiter sets their bank at the break, not the stick:
as the airspeed nears AIRSPEED_STALL ArduPlane reduces the roll demand (29.9 degrees at 21.9 m/s,
25.0 at 20.1, 16.4 at 18.9 on the 30 degree point), the heavier aircraft reaches those speeds
sooner, and the load factor at the break falls with the bank (0.93 to 1.00 from the accelerometer
against 1.08 to 1.11 for the held bank). The lift coefficient at the break is 0.42 to 0.44 and
the angle of attack 10.4 to 10.8 degrees on every point, mass and gear (th-aeronautics,
th-simulator, 2026-10-06), so the aerodynamics are consistent and the banked points measure the
limiter, which is what they do on the aircraft too. Until 2026-10-06 the SITL “20 degree” point
flew at 26 degrees: the harness mapped the stick over 500 µs instead of the channel’s range above
its deadzone (th-simulator; fixed in c461c50 and 14a5306). The 30 degree point was not affected: its
stick saturated at the limit, and the corrected harness flew it again at full stick (29.6 degrees
held before the slowdown, runs ai-t130 and aia-t130): 19.4 and 19.3 m/s, with the first
flights’ 19.2 and 19.4. The rows above are from the corrected points. The test flies camera off; all-up at 268 mm with the Survey3W is about 2.84 kg on keel B and
2.87 kg on keel A (th-aeronautics on 27d29b4: the slider’s 49 g replaces the trim weight), so
camera off it is about 0.1 kg under that, within 2% of the table’s 2.853 kg. After-test step 7 refers the measured values
to about 2.9 kg. The level deceleration
entry at half rate (0.3 m/s per second) closed the throttle at 21 m/s on every point. SITL reads the
drag low below 18.5 m/s (6.6% at 18), so the throttle at the break is optimistic.
| Point | Stall airspeed | Bank at the break | AoA 1 s before | Up elevon 1 s before | Throttle at the break | Height lost, QHOVER recovery (0.5 s delay) |
|---|---|---|---|---|---|---|
| Wings level, power off at 21 m/s | 18.6 m/s | 0 deg | 9.6 deg | 11.9 deg | 42% | 4.4 m |
| 20 deg bank | 19.5 m/s | 22 deg | 9.6 deg | 12.0 deg | 45% | 4.2 m |
30 deg bank (ROLL_LIMIT_DEG 30 for the point) |
19.3 m/s | 26 deg (the limiter) | 9.5 deg | 12.0 deg | 47% | 4.0 m |
| Wings level, CG 265 mm (placeholder stall at 16.2) | 17.1 m/s | 0 deg | 11.7 deg | 16.3 deg | 39% | 4.3 m |
On the model before the drag change (154ab6b, the same mass) the points were 18.3, 19.2, 19.8 and
16.8 m/s at 57, 60, 62 and 52% throttle, with the 30 degree point capped at 28 degrees of bank. The
lower drag moved the throttle, not the break speed. With ROLL_LIMIT_DEG at 35, the 30 degree point
broke at 36 degrees on this model, because full stick is the roll limit and the stall limiter, which
reduces the bank against AIRSPEED_STALL from the smoothed airspeed, lags a deliberate deceleration
(th-avionics, 2026-10-01). That is why the point sets the limit to 30 (step 17): with it, the SITL
point broke at 19.2 m/s and 26 degrees, the limiter at work.
At 2.59 kg (the Tattu build, 2026-10-01) the same points broke at 17.8, 18.7, 18.7 and 16.3 m/s. The ratio to the table is 1.027 on each point, which is the square root of the mass ratio (1.026). The push recovery of the first card (idle entry, 2026-09-28) lost 22 m wings level and 29 m at 30 degrees of bank, against 4.6 and 3.3 m here. It is not the recovery in this card.
The level entry held the height to within 10 m until the break. The EAS fell 0.4 to 0.7 m/s each second. The power-off close at 21 m/s cost 2.3 m of height over 2.6 seconds. The idle-throttle entry of the first card (2026-09-28) lost 54 m on the old pusher model and 78 m on the fixed one. It is gone.
The bank at the break is not the stick demand. The limiter capped a 30 degree command at 26 degrees near the stall. Read the bank from the log. Refer the point to wings level (after the test, step 4).
With the optimistic SITL stall model (sim/terrahawk-keel-notips-mc100.json), the wings-level
stall is 17.1 m/s.
Before the stall, the pitch stiffness drops. The source is the fine CFD sweep with the 9.5 and
10 degree points (estimate, aero/cfd/NOTES.md and cg.md). th-aeronautics, th-avionics
and jbsim-b3 agreed the figures on 2026-09-30 at 2.59 kg, with no credit for an estimated elevon
fade; jbsim-b3 recomputed them for the first build on 2026-10-06 (keel B, trimmed and level, angle
of attack 8 to 10 degrees, no elevon-fade credit; th-aeronautics and th-avionics agreed the set,
threads 20261006T210914Z and 20261006T211019Z). The masses below carry the F8041 3-blade props
(+15 g, th-aeronautics ac24336, 2026-10-08) and the speeds are jbsim-b3’s scaled by the square
root of the mass ratio, +0.05 m/s (th-testpilot). In trimmed level flight the soft band is:
| Configuration | Mass, CG | Soft band | CFD-neutral part | Margin, neutral / 8 to 9.5 deg | AIRSPEED_STALL 20.0 above the top |
|---|---|---|---|---|---|
| Takeoff, the first build as it flies | 2.853 kg, 268 mm | 17.69 to 19.30 m/s | 17.69 to 18.02 | about 0.9 % / 2.2 % | 0.70 m/s |
| This test, camera off (the slider alone) | 2.777 kg, 265 mm | 17.67 to 19.27 m/s | 2.2 % / 3.5 % | 0.73 m/s | |
| This test, camera on (forward stop plus about 33 g) | 2.885 kg, 265 mm | 18.01 to 19.64 m/s | 2.2 % / 3.5 % | 0.36 m/s |
(The set before it, 2026-10-03, read 17.25 to 18.75 at 2.733 kg and 16.75 to 18.1 at 2.59.) The
forward CG of this test is the conservative case for the band: it raises the band’s speeds through
the trim lift it costs while adding margin (th-aeronautics). The light nose starts at about
19.2 m/s on the deceleration, before Q_ASSIST_SPEED: 18 m/s is inside the band, not at its edge,
so the assist at 18 is a net inside the band, not a fence at its edge. AIRSPEED_MIN is 20 since
2026-10-18 (7a2d664c), above every band top in the table, so the forward transition now ends above
the band. TECS’s straight-line floor,
AIRSPEED_STALL 20.0, is 0.75 m/s above the takeoff band’s top (22.1 m/s in a 35 degree turn), so
the automatic modes do not fly in the band; the exposure is this test’s deceleration in FBWA, and
gusts (the S2 survey’s low point in SITL, 18.0 to 18.1 m/s, is inside it). AIRSPEED_STALL stays
20.0 for the first flights; the camera-on test case tops out over the 19.5 line where it would be
reconsidered, one more reason the test flies camera off.
The softest point is between 9.5 and 10 degrees of angle of attack, in the CFD-neutral part of the band, 17.64 to 17.97 m/s at the takeoff mass (17.25 to 17.5 at 2.733 kg). It is locally neutral: the CFD gives dCm/dCL of 0.000. The static margin in the band is about 0% at a CG of 270 mm. It is about 2% at 265 to 266 mm. Those are the earlier wing’s figures. On Fuselage C with our wing and its fence the fine CFD pair (th-aeronautics 5d15e8b1, estimates) finds a milder softening in the same half degree: dCm/dCL is -0.111 from 6.7 to 9.5 degrees and -0.040 (plus or minus 0.013) from 9.5 to 10, against the earlier wing’s 0.000. That leaves about 5.3% of static margin at 267 mm and 4.0% at 270 mm (4.0% and 2.6% at the soft end of the uncertainty), and the test requires a measured CG at or forward of 267 mm, aiming at 266.
On the earlier wing, at 265 to 266 mm, the elevons can reach full up before a clean break. The aircraft then stops slowing with the nose high, or mushes. This is an elevon-limited minimum speed, not a stall. In the SITL rehearsal at 265 mm (2026-10-01) the wing broke at 16.3 m/s with 16.9 degrees of up elevon from neutral, and on the 2.73 kg model at 16.8 m/s with the same 16.8 degrees. The pitch command was below the 96% cue at the break on both; the cue sounded about 1 s later, in the QHOVER transition. That is about 3 degrees inside the most up elevon the autopilot can command. The maximum is the servo trim plus 0.75 of the travel left to the end stop (cg.md). On Fuselage C the trimmed stall at 266 mm needs about 12.5 degrees of up elevon, with more than 7 degrees in hand (th-aeronautics, estimate).
Expect a light, less stable pitch feel just before the break. Expect a tendency to overshoot in pitch on the entry. SITL’s linear model does not show this. The JSBSim tables do. On Fuselage C the flow in that half degree is also unsteady: the fine CFD’s pitching moment fluctuates about 40 times more than at 6.7 degrees (rms about 0.0016), with lift steady to about 0.003. On the trimmed curve at the test mass that is about 17.5 to 17.9 m/s EAS, 14.9 to 15.2 indicated, the last metre per second before the break. The rate loop flies through it (th-aeronautics 5d15e8b1, estimates).
The short period at the softest point is not a reliable number. JSBSim with the fade gives 3.1 rad/s at 17.75 m/s. On the earlier wing the forward CG limit is 258 mm at 2.85 kg (cg.md, 4964a02, 2026-10-06; 256 mm at 2.75 kg, aefa9c5). It is the CG where the trim at 18 m/s leaves only 5 degrees of up elevon for control. On Fuselage C the forward limit is about 249 mm (cg.md, 876a2e09), and the test CG of 266 to 267 mm is about 17 mm inside it. A CFD sweep at −10 degrees of elevon is proposed (pending Ryan). It can improve these margins later.
Past the stall, the fine-mesh CFD (estimate, aero, “Pitch through the stall”) gives a pitching moment that becomes more nose-down from 11 to 14 degrees, with maximum lift near 14 degrees, and more nose-down again at 17 degrees. Expect a mush at about 14 degrees and a possible wing drop from about 17 degrees (th-aeronautics, 2026-10-01). SITL cannot show the drop. The real stall test, at height, is the first look at it. Thus the expected result of step 13 is a nose-down pitch rate. The same CFD gives a rolling moment at 17 degrees that changes sign as the separation moves from one wing to the other. Expect a wing drop at the break, to either side. The size is a low-confidence estimate; the tendency is the usual one for a swept wing. SITL’s behaviour past the stall changes with the model build (a mush in one, a dive in the next) and is not a prediction for the aircraft.
The first build’s pusher propeller is a fixed APC 10x7E (Ryan, 2026-10-04) that freewheels at
zero throttle with the ESC’s brake disabled. SITL carries that drag since 472e697
(pusher_windmill_cda 0.0020 m², about 0.6 N at 22 m/s at closed throttle; th-aeronautics, an
estimate; before that SITL folded the pusher at idle, ed22d64). The rehearsal rows on this card did
not move with it (th-simulator’s paired runs windmill-before and windmill-after, 2026-10-04:
the three break speeds within 0.02 m/s, the same entry pitch), because the card’s entry is a
deceleration held at the card’s rate with the throttle still on, where the propeller gives thrust,
not drag. The drag counts where the throttle is closed: descents, idle turns and a power-off
glide. On the real aircraft, more idle drag means less nose-up at the card’s deceleration rate, a
steeper glide; the break speed is set by the maximum lift coefficient and the load factor and does
not move with the idle drag. It reads lower only if the deceleration rate is not held and the
faster deceleration adds a dynamic overshoot.
After the test
Section titled “After the test”- Set
LCK_ENABLEback to 1 at once after landing, before any other flight. Download the flight log. - Read the stall airspeed from the log. Use the airspeed 1 s before the break. Known bias: on
the side static ports at
ARSPD_RATIO2.3 the sensor reads about 17 % low near the stall (th-aeronautics’ CFD, estimate; th-avionics b1b5ed6f). The flight’s own airspeed carries the same bias at the same angle of attack, soAIRSPEED_STALLset from this reading acts at the same true speed; no allowance is needed. - Record the measured CG, the flight mass from the scale, the configuration (no Survey3), the throttle, the bank and the elevon position at the break. Send them to th-aeronautics. The elevon reading checks the CFD elevon term directly. If the log shows the pitch command saturated at the minimum speed (the stall cue sounded), record the result as elevon-limited. Use that speed as the stall speed in the steps below. Do not move the CG aft to get a clean break. An elevon-limited minimum speed is above the aerodynamic stall, so the floor comes out conservative. The nose-down authority for the recovery is untouched.
- For a banked point, refer the speed to wings level. Multiply it by the square root of (1 divided by the load factor at the break). Read the load factor from the log’s accelerometer (the norm of the IMU acceleration, in g, in the 0.3 s before the break), not from the cosine of the bank: at the break the limiter is taking the bank off and the two differ by 10 to 15% (th-aeronautics, 2026-10-06). The three points must then agree. A difference is a measurement error, not a result.
- If the throttle was not closed at the break, refer the speed to power off. Multiply it by the square root of (W divided by (W − T sin α)). W is the weight. T is the pusher thrust from th-aeronautics’ propulsion model at the logged throttle. α is the angle of attack. The pusher current is the PM02 total less the avionics baseline (th-avionics). This is the fallback. The procedure closes the throttle so that it is not needed.
- Refer the stall speed to a CG of 265 mm, forward of anything flown. Multiply the measured speed by (1 + 0.0035 for each mm that the CG is aft of 265). A test flown at 266 to 267 mm needs a correction of 0.7% at most. The factor is th-aeronautics’ estimate from the CFD elevon terms.
- Refer the result to the heaviest flight mass. Multiply it by the square root of (heaviest mass divided by the test mass). The heaviest mass is about 3.20 kg, the night build: the lights and their 2S battery fitted, 3,197.6 g (th-aeronautics 6d23206a, estimate). From the 4-washer test mass (3,033.7 g) this is +2.7%, and about +2.4% from 12 washers. If a later payload makes a heavier case that can fly, that mass is the referral (th-aeronautics; the earlier figures, 2.9 kg on keels A and B and 2.80 kg with the earlier nose are superseded).
- Set
AIRSPEED_STALLto the referred wings-level stall multiplied by 1.08. One value covers every airframe and pack. So it must cover the worst case, the forward CG and the heaviest mass. - Load
params/terrahawk-common.parmagain: it setsQ_ASSIST_SPEEDback to 18. If the referred wings-level stall (step 7) plus 1 m/s is higher, setQ_ASSIST_SPEEDto that value instead. If the newQ_ASSIST_SPEEDis higher than 18, setAIRSPEED_MINandTECS_LAND_ARSPDtoQ_ASSIST_SPEEDplus 2 m/s.lift_check.luakeys its checks onQ_ASSIST_SPEED. Then fly S2 again in SITL with the model’s stall at the referred value. S2’s lowest airspeed belowQ_ASSIST_SPEEDis a cost note, not a fail (params/README.md). - Unload
sim/scripts/stall_cue.lua. - Send the log and the three stall airspeeds to th-testpilot and th-aeronautics.
Source: docs/stall-test.md in the repo. Edit it there; this page is generated.
Comments
Comment on the whole page here, or on one section or step with the button beside it.