Custom fixed-wing controller on a lift+cruise QuadPlane

Hi all,

I’ve built a custom fixed-wing controller for a lift+cruise QuadPlane (4 lift rotors + a pusher, with ailerons and a V-tail) and I’m getting close to flight testing it. It’s a 3-mode cascade - LQR inner loop, LQI energy/altitude outer loop, and NPFG lateral path follower - running in Lua at about 50 Hz. The VTOL side stays 100% ‘‘stock’’.

It reads state from the EKF and drives the surfaces directly via Scripting servo functions + set_output_pwm_chan_timeout (stock mixer bypassed). In energy-hold mode it drives the cruise ESC the same way. We measured the per-surface PWM mapping (slope/neutral/sign) from bench tests. Offline it’s solid… the Lua matches my Python controller to rounding and it holds in a 6-DOF SITL loop across all three modes… so these are integration questions, not control-law ones:

Three things I’d really appreciate some feedback:

1. If I drive the cruise ESC with ‘‘set_output_pwm_chan_timeout’’ on a Scripting servo function, does the normal arming/throttle interlock still apply, or can the prop spin while disarmed (safety off)? I want to be certain it can’t come alive on the bench.

2. While the script is holding a surface with a timed ‘‘set_output_pwm_chan_timeout’’ override, does an RC-loss or GCS failsafe still reach that channel, or does the override mask it until it lapses? Basically, if my RC drops out mid-engage, who wins?

3. For a script targeting 50 Hz on an H7-class FC under normal load, what real rate and jitter do people actually see? My inner loop is delay-margin-limited (needs to stay under roughly 90 ms total including EKF and servos), so I’m treating the rate as best-effort and folding the measured jitter into the budget rather than assuming it’s deterministic… curious how that’s held up for others.

Happy to share the servo-write and engage code as a snippet if it helps. Thanks!

Guys, we will soon be testing this on my Kite VTOL. Carlos has been working on this in spare time from Airbus.

I’d very much appreciate if devs could venture an opinion before we test.

  1. You should check that with a simple test script. It may depend if you are using safety switch.
  2. Overrides will be applied until they timeout or are overriden again
  3. Achievable loop rate depends on load, I have ran fast tasks (setting GPIO state) with 2ms interval using simple scheduler I implemented in Lua so I could have different loops running at different rates.