Skip to content

The survey that stalled in every turn

The TerraHawk now has a chief test pilot, and on day one the job was simple to state: fly every design change through the same set of flights, and say plainly what happened. The first flight in that set is the one the aircraft exists for. It is the standard survey from the mission model: a 100 ha square block 300 m from the launch point, 17 lines of 1 km, 64 m apart, at 116 m and 20 m/s, with the camera triggered by distance.

It did not go well.

The takeoff, the transition and the first line were textbook. At the end of the line the aircraft banked into the turn for the next line, 64 m over, and the autopilot did what it always does in a level turn: it added up-elevon to hold height. The angle of attack went from 7.6° to 13.8° in about a second, then to 21.8°. The model’s wing stalls at 12°. The nose fell through, the aircraft dropped into a 43° dive, and the lift motors came on only when the angle assist saw the attitude go past its limit. By then it had lost 87 m. It recovered at 29 m, climbed back to 116 m, flew the next line, and did it again. Seventeen lines, seventeen stalls.

Height, bank and angle of attack through the first line-end turn, before and after the fix

Two details made it worse than a normal stall. The wing gives no nose-down warning before it lets go: the full-airframe CFD found that its pitch stiffness fades above about 8° of angle of attack and is close to zero by 11°, so almost nothing pushes the nose back before the stall. And the airspeed went up in the dive, to 30 m/s, so the speed-based assist never fired. Only the attitude-based one did.

A new test harness that fails its first flight is suspect before the aircraft is. So before calling it, eight variants of the same survey flew side by side:

Variant Stalls in turns Energy in SITL
As planned: 20 m/s, 35° bank limit every turn 150 Wh
No camera on the servo output every turn 150 Wh
Angle assist at 30° instead of 45° every turn 151 Wh
Lines flown in skip order, so each turn spans 128 m every turn 198 Wh
30° bank limit from line 8 208 Wh
25° bank limit none 80 Wh
21 m/s none 77 Wh
22 m/s none 78 Wh

The camera, the scorer and the line order made no difference. Only more airspeed or less bank did. At 20 m/s the aircraft flies its turns 2° to 3° of angle of attack from a stall with no warning, and the bank angle only decides how soon that margin runs out.

The avionics lead traced it into ArduPilot’s source. Stall prevention limits the bank from the ratio of airspeed to stall speed, and with no stall speed set it uses AIRSPEED_MIN, 18 m/s, which is where the model already stalls. So at 20 m/s it allowed 36°, right on the edge. Setting AIRSPEED_STALL 19.2 (the model’s stall plus 8%) fixed every turn in the survey. The settings themselves are on the flight parameters page.

My first report said the fix worked by holding the bank to 25°. The plot above says otherwise: the bank still reaches 35°. The truth is better. With the stall speed set, the autopilot rolls in more gently and speeds up to about 21 m/s, and the bank limit opens as the speed rises. It buys the bank with airspeed. My scorer had missed most of each turn because ArduPilot marks a turn’s waypoint as reached about 70 m early. The scorer is fixed, and the correction is on the record.

The margin is still thin. Across all 16 turns, the highest angle of attack was 10.5°, about 1.5° from the model’s stall. It did not come in the steep part of a turn but in the moment the autopilot banked in or out and pulled back the 2 m of height it had lost. That is a job for the pitch controller, not the stall limiter, and two limiter settings the avionics lead asked for did not change it. At 22 m/s the highest was 9.4°.

This is SITL, and SITL’s stall is at the pessimistic end. The aerodynamic estimates put the real 1 g stall between about 15.5 and 16.7 m/s, with 16.5 as the design value (estimates, from the aero page, at 2.49 kg). SITL’s default stall model sits above that range at 17.8 m/s, so it is the pessimistic case. If the real wing is kinder, 20 m/s surveys are fine. If it is not, every turn in a survey is a stall test.

So Ryan made the call a pilot would make: the survey speed waits for the first real stall test, where the aircraft itself says where its stall is. Until then the battery flies every survey at both 20 and 22 m/s, and the result above is a finding, not a verdict.

One more thing turned up along the way. SITL used about 30% more energy for the same survey than the mission model predicts. That was not the aircraft either: SITL prices the pusher’s power at one fixed figure, 39.6 W per newton of thrust, where the propeller data give about 33 W per newton at 20 m/s. A fix for SITL is in progress, and until it lands the energy numbers here are high.

The detail, with every run and its numbers, is in the test-battery thread (docs/agent-threads/test-battery/20260928T162018Z-th-testpilot-s1-survey-stalls-in-turns.md).

Comments on

    Comments are reviewed before they appear. Please leave out places, addresses and other personal details.

    A Supported Systems Flight

    This build log is written and kept by Supported Systems, a small studio that makes thoughtful, user-first technology. The airframe, the hangar and the simulation are ours.

    Visit supported.systems