diff --git a/docs/re/captures/pitch-rate-curve-clean.csv b/docs/re/captures/pitch-rate-curve-clean.csv new file mode 100644 index 0000000..812a002 --- /dev/null +++ b/docs/re/captures/pitch-rate-curve-clean.csv @@ -0,0 +1,40 @@ +t,speed_units_per_wall_s,rate_deg_per_wall_s +0.52,1498.8,37.47 +1.03,1276.1,91.64 +1.53,1045.5,90.49 +2.05,1133.7,118.83 +2.55,885.4,129.88 +3.06,777.7,127.51 +3.57,788.1,174.38 +4.07,546.7,157.56 +4.57,536.2,124.41 +5.09,946.8,161.62 +5.59,821.9,138.76 +6.09,636.7,131.35 +6.61,529.3,133.56 +7.13,674.7,162.01 +7.63,669.2,125.78 +8.17,746.4,127.35 +8.67,821.1,154.31 +9.17,569.7,135.57 +9.67,645.2,167.18 +10.19,720.0,150.99 +10.69,698.6,123.63 +11.21,717.0,125.53 +11.72,826.9,165.47 +12.23,471.3,114.2 +12.77,594.0,146.56 +13.29,858.3,174.73 +13.79,734.8,130.83 +14.31,502.8,91.53 +14.81,822.9,168.67 +15.31,696.2,166.37 +15.83,462.2,109.81 +16.33,791.0,162.87 +16.85,854.4,155.88 +17.37,536.8,98.26 +17.89,873.1,182.24 +18.41,630.0,155.61 +18.93,584.1,129.64 +19.43,699.6,132.45 +19.97,805.1,142.68 diff --git a/docs/re/flight-speed-law.md b/docs/re/flight-speed-law.md index cec9ce0..1fb2a53 100644 --- a/docs/re/flight-speed-law.md +++ b/docs/re/flight-speed-law.md @@ -585,3 +585,38 @@ measurement taken through a doubtful instrument cannot settle it. Data: [aliased, for reference](captures/rate-curve-aliased-BAD.csv) ยท [windowed](captures/rate-curve-windowed.csv). + + +## The clean sweep: magnitudes agree, the LAW does not follow ๐ŸŸก + +Fresh flight, row pinning **CONFIDENT** (margin 0.413), one sweep and nothing before +it โ€” the conditions the previous attempt lacked. Clock 01:16.08 โ†’ 01:41.46 (ร—1.26). +Binned by speed, both converted to game units: + +| speed (game) | measured ยฐ/game-s | linear interpolation of the caps | +|---|---|---| +| ~435 | 100.8 | 125.6 | +| ~572 | 113.8 | 115.7 | +| ~709 | 126.3 | 105.7 | +| ~846 | 83.1 | 95.7 | +| ~983 | 72.7 | 85.8 | + +(prediction = `AV_PitchPlus_Min` 150 at `MinimumVelocity` 100 โ†’ `_Max` 70 at +`MaximumVelocity` 1200, interpolated linearly.) + +**What this supports:** the magnitudes are right โ€” measured 73โ€“126 ยฐ/game-s across +speeds 400โ€“1 050 against a predicted 86โ€“126 โ€” and the high-speed end falls, as a +speed-dependent cap should. + +**What it does not support:** the interpolation *law*. The scatter is ยฑ25 %, the two +fastest bins hold only 1 and 2 windows each (they are the first moments before the +speed bled), and the slowest bin disagrees in the wrong direction (100.8 measured vs +125.6 predicted). A sweep that is *driven* by the speed bleeding cannot spend long at +either extreme, which is exactly where the law is most testable. + +**The design that would settle it**, and why this one cannot: hold a *settled* +throttle, pitch for only **~1 second**, and read the rate โ€” the speed barely moves +inside a 1 s burst, so each burst yields one honest `(speed, rate)` point. Repeat at +`LT` / neutral / `RT` for three clean points at known speeds, instead of one smeared +sweep. Data: +[`captures/pitch-rate-curve-clean.csv`](captures/pitch-rate-curve-clean.csv). diff --git a/tools/re-capture/axis_probe.py b/tools/re-capture/axis_probe.py index 083e053..b06f73a 100755 --- a/tools/re-capture/axis_probe.py +++ b/tools/re-capture/axis_probe.py @@ -122,8 +122,14 @@ def pin_rows(w, off, cfg): up_i = max(cand, key=lambda r: abs(ys[r])) right_i = [r for r in cand if r != up_i][0] print(f"# row world-Y means: {[round(y,3) for y in ys]} (forward = row {f_i})") - print(f"# -> up = row {up_i}, right = row {right_i}" - f" {'CONFIDENT' if abs(ys[up_i]) - abs(ys[right_i]) > 0.3 else 'WEAK โ€” craft may not be level'}") + margin = abs(ys[up_i]) - abs(ys[right_i]) + ok = margin > 0.3 + print(f"# -> up = row {up_i}, right = row {right_i} margin {margin:.3f} " + f"{'CONFIDENT' if ok else 'WEAK โ€” craft is not level'}") + if not ok and os.environ.get("ALLOW_WEAK_PIN") != "1": + sys.exit("refusing to measure with a WEAK row pin โ€” fly level first, or set " + "ALLOW_WEAK_PIN=1 if the caller genuinely does not care " + "(roll is immune to the labelling; pitch and yaw are not)") return up_i, right_i