Skip to content

feat(failsafe): v1.103 — promote single-rotor-out reconfiguration into production FlightCore#242

Merged
avrabe merged 1 commit into
mainfrom
feat/falcon-v1.103-rotor-out-in-flightcore
Jun 27, 2026
Merged

feat(failsafe): v1.103 — promote single-rotor-out reconfiguration into production FlightCore#242
avrabe merged 1 commit into
mainfrom
feat/falcon-v1.103-rotor-out-in-flightcore

Conversation

@avrabe

@avrabe avrabe commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

What

Rotor-loss recovery (FAULT-P02) was verified end-to-end only in the falcon-sitl-gz example; the production FlightCore — the controller the real WASM component runs — always used the full-attitude mix(). This wires the detect→reconfigure→land chain into FlightCore, reusing the existing verified pieces (no new detector — verify-first caught that a planned one would have duplicated relay-iekf::RotorFaultDetector).

  • FlightBackend::read_motor_rpm() -> Option<[i32;4]> (default None): the achieved-per-rotor source (ESC telemetry). A backend without ESC feedback runs unchanged.
  • FlightCore::step: forms the residual |commanded − achieved| from RPM → feeds RotorFaultDetector (CUSUM, the SITL-proven thresholds) → on isolation switches to relay-geo::moment_reduced (yaw relinquished) + mix_rotor_out (failed rotor → 0, MIX-P08) — the exact composition FV-FALCON-FAULT-002 verifies.
  • FlightSupervisor: on isolation, commands Land (have_position=false) — a 3-rotor quad can't navigate home, so RTL is unsafe.

Verification (deterministic — RPM is a direct backend input)

  • fdi_isolates_dead_rotor_and_reconfigures: healthy never isolated; a rotor at 0 RPM under command isolated in a few cycles → commanded 0, healthy in [floor,1].
  • motor_failure_commands_land: an airborne vehicle that loses a rotor → Land.

41 falcon-core tests; the SITL fault_tolerance chain still passes; falcon-mavlink/hitl unaffected. No new Kani (RotorFaultDetector + mix_rotor_out already proven; this is integration). rivet validate PASS, 0 error-gaps; FV-FALCON-FAULT-002 extended.

Arc

This completes the motor-failure thread: v1.102 enforced the orphaned mixer proofs, v1.103 promotes the SITL-demonstrated reconfiguration into the production controller. The remaining FlightBackend ESC plumbing on real hardware (DroneCAN esc.Status → read_motor_rpm) is a jess/bring-up binding.

🤖 Generated with Claude Code

…o production FlightCore

The rotor-loss recovery (FAULT-P02) was verified end-to-end only in the
falcon-sitl-gz example; the production FlightCore — the controller the real WASM
component runs — always used the full-attitude mix(). This wires the detect→
reconfigure→land chain into FlightCore, REUSING the existing verified pieces (no
new detector — verify-first caught that a planned one would have duplicated the
relay-iekf RotorFaultDetector).

- FlightBackend::read_motor_rpm() -> Option<[i32;4]> (default None): the
  achieved-per-rotor source (ESC telemetry, e.g. DroneCAN esc.Status). A backend
  without ESC feedback runs unchanged (no detection).
- FlightCore::step: forms the per-rotor effectiveness residual |commanded −
  achieved| from the RPM, feeds the relay-iekf RotorFaultDetector (CUSUM, the same
  thresholds the SITL chain proved), and on isolation latches failed_motor and
  switches the control law to relay-geo moment_reduced (reduced-attitude S²,
  yaw relinquished) + relay-mix-quad mix_rotor_out (failed rotor → 0, MIX-P08) —
  the exact composition FV-FALCON-FAULT-002 verifies.
- FlightSupervisor: on isolation, commands LAND (Failsafe with have_position=false)
  — a 3-rotor quad has no yaw authority to navigate home, so RTL is unsafe.

Tests (deterministic — RPM is a direct backend input, not estimator-derived, so
none of the wind/runaway estimator-corruption fragility):
  - fdi_isolates_dead_rotor_and_reconfigures: healthy never isolated; a rotor at
    0 RPM under command is isolated in a few cycles → commanded 0, healthy in
    [floor,1].
  - motor_failure_commands_land: an airborne vehicle that loses a rotor → Land.
41 falcon-core tests; the SITL fault_tolerance chain still passes; falcon-mavlink/
hitl unaffected. rivet FV-FALCON-FAULT-002 extended with the production-wiring
evidence. validate PASS, 0 error-gaps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@avrabe avrabe enabled auto-merge (squash) June 27, 2026 05:35
@avrabe avrabe merged commit 6df25ba into main Jun 27, 2026
39 checks passed
@avrabe avrabe deleted the feat/falcon-v1.103-rotor-out-in-flightcore branch June 27, 2026 05:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant