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!
