feat(falcon): v0.19.5 — first controlled-hover PASS (10 s) + flight recording#50
Conversation
…ecording
First PASS verdict for a controlled hover under real gz physics, plus
the first flight recording (published to YouTube; repo keeps the
reproducible text evidence + render scripts). The quad lifts off and
holds the 2 m setpoint; a 10 s hover meets PASS criteria.
Bench (10 s alt-only PI+D altitude hold):
steps=1000 final_dist=0.359m rms_steady=0.390m min_dist=0.002m
counters: imu_recv=2372 (204 Hz) navsat_recv=581 (50 Hz) motor_send=1000
verdict: PASS (final < 0.5 m AND rms < 1.0 m)
v0.19.4 → v0.19.5 fixes (root-caused from mixer torque-saturation):
1. Body inertia 0.7 kg/0.0035 → 2.0 kg/0.0217 (x500-class). Low
inertia gave ~150 rad/s² angular accel from one motor's offset
thrust, beyond the 100 Hz rate-loop damping → positive feedback.
2. hover_thrust 0.5 → 0.72. At 2 kg the body weighs 19.6 N; motors
give 12.3 N at 0.5 PWM (can't lift), 19.6 N at ~0.72.
3. Altitude PI+D with anti-windup — P-only hovered 0.9 m short;
integral reaches the 2 m setpoint (min_dist=0.002 m).
Ships:
- --scenario=alt-only PI+D altitude hold (verified relay-mix-quad in
the thrust path); --scenario=alt-rate diagnostic.
- SDF: 2 kg x500-class body.
- scripts/animate_flight.py (trajectory animation renderer) +
record_gazebo_flight.sh + gui-video.config (gz VideoRecorder
live capture, needs a display).
- bench-evidence/gz-sim/recordings/ CSV + log (mp4 gitignored →
YouTube) + 2026-05-28-v0.19.5-controlled-hover-recording.md.
- FV-FALCON-SIM-011 + FEAT-FALCON-v0.19.5 rollout entry.
Recordings (mp4/mov/webm) are gitignored under recordings/ — they go
to YouTube; only the trajectory CSV + harness log are committed.
What this PASS is: verified relay-mix-quad + real bridge + real gz
physics controlled hover, altitude held within 0.36 m for 10 s.
Altitude controller is a hand-written PI+D (the alt-only diagnostic).
What it ISN'T: the full verified cascade (relay-ekf → relay-pos →
relay-att → relay-rate) holding hover. That path (--scenario=hover)
still has the v0.19.4 instability: a frame-convention sign mismatch
between relay's NED torque and gz's ENU MulticopterMotorModel.
Negating roll/pitch torque stabilised the first second; full hover
needs CW/CCW spin reconciled under the ENU↔NED Z-flip + attitude-angle
hold. Also: alt-only hover is stable ~10–12 s then drifts horizontally.
The 10 s PASS window is genuine controlled hover. Both → v0.19.6.
Verification:
- cargo test --workspace --all-targets → 406 passing.
- cargo test -p falcon-sitl-gz --features gazebo → 8/8.
- gz sim + alt-only bench (10 s) → PASS.
- rivet validate → PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
https://youtu.be/B6JlFE8pPZ4 — slotted into the bench-findings doc, FV-FALCON-SIM-011, and the rollout entry. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Automated review for PR #50pulseengine/relay: Verdict: 💬 Comment Summary: The provided patch introduces several new features and improvements to the Falcon SITL (Simulation in the Loop) environment. The changes include updating the inertial properties of the quadrotor, adding a GUI configuration file for capturing real Gazebo 3D footage of flight tests, and providing scripts for animating trajectory data and recording video. These enhancements will help improve the test Findings: 0 mechanical (rivet) · 2 from local AI model. Findings (2):
Generated by a local AI model and post-validated against a strict JSON contract. Each finding includes the verbatim line being criticised — verify by reading the file at the cited location. Reviewed at |
|
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.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.05s 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.03s 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.43s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s running 17 tests test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s --- scenario: step --- 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 17 tests test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s 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 | 31 |
| Failed | -6 |
| Skipped (bench-only — needs hardware / sim) | 7 |
| Skipped (no steps) | 6 |
Failed artifacts
Bench-only artifacts (not run by CI)
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-GEO-003— Geofence safety path — miri UB/overflow check (v0.12, AI substitute)FV-FALCON-SIM-005— gz-transport NavSat + Home projection — position-dependent loops (v0.18.1)FV-FALCON-ARCH-001— spar AADL architectural model — falcon cascade (v0.13)FV-FALCON-COV-001— witness MC/DC structural coverage — falcon pipeline wired (v0.13)FV-FALCON-COV-003— witness MC/DC on real Rust source — Geofence subject (v0.14.1)
Source of truth: artifacts/verification/FV-FALCON-*.yaml.
Summary
First PASS verdict for a controlled hover under real gz physics, plus the first flight recording. The quad lifts off and holds the 2 m setpoint; a 10 s hover meets PASS criteria.
Bench (10 s alt-only PI+D altitude hold)
```
steps=1000 final_dist=0.359m rms_steady=0.390m min_dist=0.002m
counters: imu_recv=2372 (204 Hz) navsat_recv=581 (50 Hz) motor_send=1000
verdict: PASS (final < 0.5 m AND rms < 1.0 m)
```
v0.19.4 → v0.19.5 fixes
Root-caused from the mixer torque-saturation that left the body grounded:
Recording
🎥 Video → YouTube (not committed). Recordings (
*.mp4/*.mov/*.webm) are gitignored underrecordings/; the repo keeps the trajectory CSV + harness log + render scripts.scripts/animate_flight.py— trajectory animation renderer (matplotlib + ffmpeg) → the clip uploaded to YouTube.scripts/record_gazebo_flight.sh+gui-video.config— one-command gz VideoRecorder capture of live Gazebo 3D footage (needs a display).What this PASS is — and isn't
Is: verified
relay-mix-quad+ real bridge + real gz physics controlled hover, altitude held within 0.36 m for 10 s. The altitude controller is a hand-written PI+D (thealt-onlydiagnostic scenario).Isn't: the full verified cascade (
relay-ekf → relay-pos → relay-att → relay-rate) holding hover.--scenario=hoverstill has the v0.19.4 instability — a frame-convention sign mismatch between relay's NED torque and gz's ENU MulticopterMotorModel. Negating roll/pitch torque stabilised the first second; full hover needs CW/CCW spin reconciled under the ENU↔NED Z-flip + attitude-angle hold. Also, alt-only hover is stable ~10–12 s then drifts horizontally. Both → v0.19.6.Verification
v0.19.6 candidates
--scenario=hoverholds level.🤖 Generated with Claude Code