tools+docs: the pitch stick sign was inverted - the pilot fires now
Measured, not argued: command a 45-degree-off-the-nose error and watch whether it
shrinks, both axes, both sides, two pulse widths, with the opposite sign as a
control. Yaw's sign is correct (45 -> 11.3/32.7 at 0.6 s, 41.6/33.8 at 1.2 s).
Pitch's is inverted - the pilot's own sign GREW the error every time
(48.3/55.6/70.7/91.7) and the opposite shrank it every time (30.7/41.5/15.7/9.6).
A method artefact is recorded because it gave the opposite answer first: a 3 s
full-deflection pulse overshoots a 45-degree error so far that BOTH signs look
wrong (45 -> 164 and 45 -> 178). A long pulse cannot answer a sign question.
Verified against the game rather than by inspection. Before: fire=1 in 0 of 13521
samples, |aim yaw| pinned at 90.0, target 36-43 km away. After: 43 of 1732, aim
down to 2.3 degrees, range median 6.3 km, and the HUD's own ammunition counters
moving - NOSE BM 06000 -> 05723, MAIN MPM 00300 -> 00298.
Also fixed a leftover of the same FIFO era: pilot.py called pad.f.write("tap A
90") for the target-select double tap, which raised AttributeError once Pad
stopped having an `f`. Pad gained tap()/dpad(); ctrl_probe.py and target_probe.py
still use pad.f and now say so in place.
Still open: YOU KILLED is 0000 after 250 s of firing and REMAINING OB is still
012. The craft shoots, closes and selects; whether it destroys anything is next.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
BIN
docs/re/captures/stage02-pilot-firing-after-sign-fix.png
Normal file
BIN
docs/re/captures/stage02-pilot-firing-after-sign-fix.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 MiB |
@@ -122,7 +122,58 @@ Same probe, on runs confirmed animating at both ends of every phase
|
||||
suspicion that the binding was wrong: `pos-0x70` is live and tracks the ship. It
|
||||
only looked dead because nothing was turning the ship.
|
||||
|
||||
## 🟡 Still open — the pilot does not converge
|
||||
## ✅ AND THE SECOND HALF: the PITCH stick sign was inverted
|
||||
|
||||
(The section below is what was open before this was measured; it is kept because
|
||||
the sequence matters.)
|
||||
|
||||
With the pad reaching the game, the sign question became testable and was
|
||||
settled by commanding a **45°-off-the-nose error** and watching whether it
|
||||
shrank — both axes, both sides, two pulse widths, plus the opposite sign as a
|
||||
control:
|
||||
|
||||
| pulse | axis | pilot's own sign | opposite sign |
|
||||
|---|---|---|---|
|
||||
| 0.6 s | yaw | 45° → **11.3** / **32.7** ✅ reduces | — |
|
||||
| 1.2 s | yaw | 45° → **41.6** / **33.8** ✅ reduces | — |
|
||||
| 0.6 s | pitch | 45° → 48.3 / 55.6 🔴 grows | 45° → **30.7** / **41.5** reduces |
|
||||
| 1.2 s | pitch | 45° → 70.7 / 91.7 🔴 grows | 45° → **15.7** / **9.6** reduces |
|
||||
|
||||
So `sticks()`'s `sy = -(KP*pitch - KD*…)` had the **wrong sign**; yaw's is right.
|
||||
|
||||
🔴 **A method artefact worth recording, because it gave the opposite answer
|
||||
first.** The first attempt used a **3 s** full-deflection pulse and reported
|
||||
pitch growing under *both* signs (45° → 164° and 45° → 178°). That is
|
||||
overshoot: three seconds of full pitch swings the ship far past a 45° error, so
|
||||
the frozen world-direction ends up behind it whichever way it turns. Pulse
|
||||
short, or measure the initial rotation direction — a long pulse cannot answer a
|
||||
sign question.
|
||||
|
||||
### Verified: the pilot fires
|
||||
|
||||
Same mission, same binding, sign flipped:
|
||||
|
||||
| | before | after |
|
||||
|---|---|---|
|
||||
| `fire=1` samples | **0** of 13 521 | **43** of 1 732 |
|
||||
| `\|aim yaw\|` | median 90.0°, min 90.0° | min **2.3°**, 7 of 14 inside 25° in the first pass |
|
||||
| range to target | median 43 km, min 36 km | median **6.3 km**, min 5.3 km |
|
||||
| ammunition | untouched | `NOSE BM 06000 → 05723`, `MAIN MPM 00300 → 00298` |
|
||||
|
||||

|
||||
|
||||
One more leftover of the same FIFO era was fixed on the way: `pilot.py` called
|
||||
`self.pad.f.write("tap A 90")` for the target-select double tap, which raised
|
||||
`AttributeError` the moment the class stopped having an `f`. `Pad` gained
|
||||
`tap()`/`dpad()`; `ctrl_probe.py` and `target_probe.py` still use `pad.f` and now
|
||||
say so in place.
|
||||
|
||||
🟡 **Still open even so:** `YOU KILLED WARSHIPS/WARPLANES` is still `0000` after
|
||||
250 s of firing, and `REMAINING OB` is still `012`. The craft shoots, closes and
|
||||
selects; whether it actually *destroys* anything is the next thing to measure,
|
||||
and it is what the objective-counter work is waiting on.
|
||||
|
||||
## 🟡 The state before that measurement — the pilot does not converge
|
||||
|
||||
With the pad fixed, a 150 s `pilot.py` run still fired **0** times: over its 86
|
||||
targeted samples `|aim yaw|` is *still* exactly 90.0° and the range is
|
||||
|
||||
Reference in New Issue
Block a user