feat(falcon): v0.4.0 — attitude controller + mixer + cascade SITL#15
Conversation
Full inner control cascade closes in pure-Rust SITL. Attitude controller cascades into rate PID into mixer into plant; commanded 20° tilt reached in 0.352 s with 0.029° steady-state error. What lands: Crates - relay-att — quaternion-error proportional attitude controller. 250 Hz outer loop. Shortest-arc selection; small-angle linearised output within ~1.5 % of exact for |θ| < 30°; rate command clamped to rate_max; NaN-safe sanitisation. no_std + no_alloc; in-tree Newton sqrt avoids libm dependency. 10 unit + proptest cases. - relay-mix-quad — X-config 4-motor mixer for falcon-quad. Standard PX4 quad-x convention (motors 1-4 CW from front-right, diagonal pairs CW/CCW). Priority-preserving saturation (thrust first, yaw sacrificed last); negative outputs clipped; NaN sanitised. 10 unit + proptest cases. Example - examples/falcon-sitl-hover gains an `attitude` scenario: full ATT(250 Hz) → RATE(1 kHz) → MIX → plant cascade for a 20° tilt setpoint. Achieved: convergence 0.352 s, RMS-steady 0.029°, peak 19.989° (initial), loop wall 545 µs for 5000 samples. 2 added integration tests. Rivet - FV-FALCON-ATT-001 — 5 extractable fields.steps covering relay-att unit + proptest + cascade bench. - FV-FALCON-MIX-001 — 3 extractable fields.steps for relay-mix-quad. - FEAT-FALCON-v0.4 bumped pending → approved with achieved metrics. Verification posture - cargo test --workspace: 59 test suites green (was 55 in v0.3) - python3 scripts/run-falcon-verification.py: ✅ 7/7 artifacts, 26/26 steps green - rivet validate: 0 broken cross-references - cargo run -p falcon-sitl-hover --release: PASS on all 4 scenarios (step, disturbance, hover, attitude) Test math note (caught during dev) - ATT-P01 shortest-arc test reformulated: my first cut tangled the direction of the short-arc through ±180° wraparound. The property under test is "q_err scalar non-negative after correction + small vec magnitude for small angular error" — the absolute sign of vec depends on which side you're approaching from and is irrelevant to the controller's correctness. Reformulated to test the actual invariant rather than a specific arc direction. Honestly deferred to v0.5 - Drake-derived MultibodyPlant export for mixer matrix - Rocq formal proof of ATT-P01 (needs rules_rocq_rust) - Verus SMT contracts on mixer arithmetic - Gazebo Harmonic SITL hookup (lands with position controller) - rerun.io .rrd evidence recording - Differential test vs PX4 mc_att_control reference Co-Authored-By: Claude Opus 4.7 (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.01s 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 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.11s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 7 tests test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s --- scenario: attitude --- running 13 tests test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 13 tests test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 13 tests test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.66s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 7 tests test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s --- scenario: step --- running 9 tests test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s [falcon-hello-demo] building release binary... running 33 tests test result: ok. 33 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 33 tests test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 33 tests test result: ok. 33 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.39s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 9 tests test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 9 tests test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 9 tests test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 16 tests test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 16 tests test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 16 tests test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.84s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 5 tests test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s --- noise=0 (deterministic) --- running 10 tests test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s 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 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.10s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s falcon verification gate (filter: (has-tag "falcon"))7 artifact(s) matched: FV-FALCON-ATT-001, FV-FALCON-RATE-001, FV-FALCON-WORLD-001, FV-FALCON-MAVLINK-001, FV-FALCON-EKF-STUB-001, FV-FALCON-EKF-001, FV-FALCON-MIX-001[ PASS] ( 8.62s) FV-FALCON-ATT-001: cargo test -p relay-att ✅ Rivet verification gate — falcon7/7 passed
Source of truth: |
Summary
Full inner control cascade closes. ATT → RATE → MIX → plant; commanded 20° tilt reached in 0.352 s with 0.029° steady-state error.
What's in
crates/relay-att— quaternion-error proportional attitude controller, 250 Hz, shortest-arc selection, small-angle linearisation within ~1.5 % of exact for |θ| < 30°, NaN-safe. 10 unit + proptest cases.crates/relay-mix-quad— X-config 4-motor mixer (standard PX4 quad-x convention). Priority-preserving saturation. 10 unit + proptest cases.examples/falcon-sitl-hoverattitudescenario — full cascade closed-loop bench. 2 added integration tests.FV-FALCON-ATT-001+FV-FALCON-MIX-001verification artifacts with extractablefields.steps.FEAT-FALCON-v0.4bumpedpending→approvedwith achieved metrics.Achieved bench metrics
cargo test --workspacecargo test -p relay-attcargo test -p relay-mix-quadcargo test -p falcon-sitl-hovercargo run -p falcon-sitl-hoverrivet validateTest plan
cargo run -p falcon-sitl-hover --releasePASSes all 4 scenarios locallycargo run -p falcon-sitl-hover --release -- --scenario attitudeprints convergence + RMS metricsAfter merge
Honestly deferred to v0.5
rules_rocq_rust).rrdevidence recording🤖 Generated with Claude Code