feat(falcon): v0.20 — relay-pos thrust calibration + RC#3 estimator-divergence proof#55
Conversation
…ivergence proof
First rung of the roadmap to v1.0 (docs/ROADMAP-AUTONOMOUS-FLIGHT.md).
Two honest outcomes:
(1) Thrust calibration (correct + necessary). relay-pos's
PosGains::DEFAULT.hover_thrust=0.5 targets a 500 g quad; the gz
falcon-quad is 2 kg and hovers at 0.72. Since the v0.19.8 mixer floor is
0.5, hover_thrust=0.5 sat AT the floor → the body could not climb. The
full-cascade bench now constructs PosController with hover_thrust=0.72.
The body climbs cleanly to the -2 m setpoint and stays physically level
(true_tilt < 2°).
(2) Decisive RC#3 proof (the falsification). With the body physically
level (true_tilt < 2°), the Mahony EKF attitude estimate diverges to
est_tilt=51° over ~5 s; the cascade tracks this phantom attitude and the
body drifts away (~206 m / 30 s). Position-hold is IMPOSSIBLE on the
attitude-only complementary filter. "Estimation before control", proven
not asserted — this mandates the v0.21 Invariant EKF.
The 50° divergence exceeds inherent-Mahony limits at near-hover, hinting
at a relay-ekf gyro-bias/integration issue too; the IEKF rebuild + its
NEES consistency checks resolve which, either way.
Ships:
- examples/falcon-sitl-gz: full-cascade hover_thrust calibration (0.72)
+ POS_DEBUG true-vs-est tilt diagnostic (the RC#3 measurement tool,
retained env-gated for the v0.21 IEKF work).
- docs/ROADMAP-AUTONOMOUS-FLIGHT.md: the v0.20→v1.0 plan (IEKF keystone,
geometric SE(3), certified-floor-then-agile-ceiling).
- FV-FALCON-POS-002 + rollout v0.20 entry.
- bench-evidence/gz-sim/2026-05-30-v0.20-*.md.
Honestly NOT claimed: position-hold (diverges). v0.20 is the thrust fix +
the RC#3 mandate, nothing more.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s falcon-hitl-rfspoof: backend=stub duration=5s running 17 tests test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 55 tests test result: ok. 55 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Filename Regions Missed Regions Cover Functions Missed Functions Executed Lines Missed Lines Cover Branches Missed Branches Covercoverage_subjects/geofence_subject_rs/src/lib.rs 48 48 0.00% 5 5 0.00% 23 23 0.00% 0 0 -
|
| count | |
|---|---|
| Passed | 36 |
| Failed | -11 |
| Skipped (bench-only — needs hardware / sim) | 7 |
| Skipped (no steps) | 11 |
Failed artifacts
Bench-only artifacts (not run by CI)
FV-FALCON-GEO-003— Geofence safety path — miri UB/overflow check (v0.12, AI substitute)FV-FALCON-COV-001— witness MC/DC structural coverage — falcon pipeline wired (v0.13)FV-FALCON-SIM-005— gz-transport NavSat + Home projection — position-dependent loops (v0.18.1)FV-FALCON-ARCH-002— spar codegen --format wit recheck — works at v0.10.0 (v0.15.0)FV-FALCON-SIM-001— PX4-SITL end-to-end loop — recipe + preset + smoke (v0.14.0)FV-FALCON-COV-003— witness MC/DC on real Rust source — Geofence subject (v0.14.1)FV-FALCON-ARCH-001— spar AADL architectural model — falcon cascade (v0.13)
Source of truth: artifacts/verification/FV-FALCON-*.yaml.
First rung of the roadmap to v1.0 (
docs/ROADMAP-AUTONOMOUS-FLIGHT.md). Two honest outcomes.(1) Thrust calibration — correct + necessary
relay-pos'sPosGains::DEFAULT.hover_thrust = 0.5targets a 500 g quad; the gz falcon-quad is 2 kg (hovers at 0.72). Since the v0.19.8 mixer floor is 0.5,hover_thrust=0.5sat at the floor → the body couldn't climb. The full-cascade bench now useshover_thrust=0.72. The body climbs cleanly to −2 m and stays physically level (true_tilt< 2°).(2) Decisive RC#3 proof — the falsification
With the body genuinely level (
true_tilt< 2°), the Mahony EKF estimate diverges toest_tilt=51° over ~5 s; the cascade tracks this phantom attitude and drifts (~206 m / 30 s):Position-hold is impossible on the attitude-only complementary filter — the controllers track a fiction. "Estimation before control", proven not asserted. This mandates the v0.21 Invariant EKF (full-state, consistency-guaranteed).
NOT claimed
Position-hold (it diverges). v0.20 ships the thrust fix + the RC#3 mandate + the roadmap doc, nothing more.
Traceability:
FV-FALCON-POS-002.rivet validatePASS;cargo test --workspacegreen.🤖 Generated with Claude Code