mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-22 11:41:12 +00:00
[autodev] step-11 path-3: calibration fix + harness drift report
Attempted Path-3 (Full SITL with community images) for the SUT Reality
Gate. Discovered sitl_observer is offline-fixture replay, not a live
SITL client -- compose-file SITL services in environment.md are
aspirational. The real Path-3 needs the fixture builders + SUT CLI
end-to-end, which surfaced 5 additional integration drifts (H-10..H-14)
on top of the prior 9.
Fixes:
- tests/fixtures/calibration/adti26.json: body_to_camera_se3 was a
{rotation_xyzw, translation_xyz_m} dict; runtime_root/_replay_branch.py
loader strictly expects a 4x4 SE3. Identity quaternion + zero
translation = identity 4x4, semantically equivalent.
New files:
- tests/fixtures/replay_config_minimal.yaml: minimal replay-mode config
for harness reproduction (mode=replay, ardupilot_plane defaults).
- .gitignore: e2e/fixtures/sitl_replay/ (generated by build_p0X_fixtures).
Documentation:
- Step 11 report: appended Path-3 attempt section.
- Leftover doc: H-10..H-14 ticket payloads added.
- Autodev state: reflects Path-3 outcome.
Step 11 stays blocked; H-13 (auto-sync AC-8 hard-fails on stationary
fixtures) requires a SUT design decision and cannot be unilaterally
fixed mid-session.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -86,6 +86,83 @@ description: |
|
||||
story_points: 2
|
||||
```
|
||||
|
||||
### Story: H-10 — Fixture builder uses wrong CLI flag
|
||||
```yaml
|
||||
type: Story
|
||||
summary: "[Bug] sitl_replay_builder uses --fdr-out; CLI requires --output"
|
||||
description: |
|
||||
e2e/fixtures/sitl_replay_builder/builder.py:79 passes `--fdr-out` to
|
||||
`gps-denied-replay`. The CLI's actual flag (src/gps_denied_onboard/cli/replay.py:90)
|
||||
is `--output`. Also need to add the CLI's other required args
|
||||
(--camera-calibration, --config, --mavlink-signing-key) — see H-11.
|
||||
Bundle H-10 + H-11 in one PR. Unit tests in
|
||||
e2e/_unit_tests/fixtures/test_sitl_replay_builder_builder.py assert on
|
||||
`--fdr-out` and need to be updated.
|
||||
story_points: 2
|
||||
```
|
||||
|
||||
### Story: H-11 — Fixture builder missing required CLI args
|
||||
```yaml
|
||||
type: Story
|
||||
summary: "[Bug] sitl_replay_builder doesn't pass camera-calibration/config/signing-key"
|
||||
description: |
|
||||
gps-denied-replay requires --camera-calibration PATH, --config PATH,
|
||||
--mavlink-signing-key PATH. Fixture builder omits all three. Add
|
||||
fields to FixtureBuilderConfig with defaults pointing at
|
||||
tests/fixtures/calibration/adti26.json, a new
|
||||
tests/fixtures/replay_config_minimal.yaml, and
|
||||
tests/fixtures/mavlink_signing/dev_key. Also set
|
||||
BUILD_REPLAY_SINK_JSONL=ON in the subprocess env.
|
||||
story_points: 2
|
||||
```
|
||||
|
||||
### Bug: H-12 — Calibration JSON shape drift (FIXED)
|
||||
```yaml
|
||||
type: Bug
|
||||
summary: "[Bug] adti26.json body_to_camera_se3 used dict form; loader expects 4x4"
|
||||
description: |
|
||||
tests/fixtures/calibration/adti26.json declared body_to_camera_se3 as
|
||||
{rotation_xyzw, translation_xyz_m}. _replay_branch.py:308 does
|
||||
np.asarray(..., dtype=np.float64) which can't decode the dict. Fixed
|
||||
by converting to the equivalent 4x4 identity matrix. Both forms encode
|
||||
the same SE3 (identity) so no behavior change.
|
||||
story_points: 1
|
||||
status_after_create: "Done"
|
||||
```
|
||||
|
||||
### Story: H-13 — Auto-sync hard-fails on stationary fixtures
|
||||
```yaml
|
||||
type: Story
|
||||
summary: "[Bug] AC-8 auto-sync validation rejects stationary FT-P-01 fixture"
|
||||
description: |
|
||||
Auto-sync (src/gps_denied_onboard/replay_input/...) hard-fails when
|
||||
--time-offset-ms 0 is supplied for a fixture with stationary IMU + no
|
||||
video motion (FT-P-01 still-image scenario). Threshold:
|
||||
frame_window_match_pct_threshold=95% in ReplayAutoSyncConfig defaults.
|
||||
Three possible fixes (design decision needed):
|
||||
a) Add --skip-auto-sync CLI flag that bypasses AC-8 validation entirely
|
||||
when time_offset_ms is explicitly supplied
|
||||
b) Lower or expose match_threshold_pct via config (already configurable
|
||||
but not surfaced in fixture builder)
|
||||
c) Change fixture builder to inject a single motion event so auto-sync
|
||||
can find SOMETHING to align on
|
||||
Recommend (a): aligns with replay protocol intent ("manual offset
|
||||
bypasses auto-sync entirely" per ReplayConfig docstring).
|
||||
story_points: 3
|
||||
```
|
||||
|
||||
### Story: H-14 — Document BUILD_REPLAY_SINK_JSONL in .env.example
|
||||
```yaml
|
||||
type: Story
|
||||
summary: "[Doc] add BUILD_REPLAY_SINK_JSONL=ON to .env.example for replay mode"
|
||||
description: |
|
||||
src/gps_denied_onboard/components/c8_fc_adapter/noop_mavlink_transport.py
|
||||
requires BUILD_REPLAY_SINK_JSONL=ON env var to construct. Not in
|
||||
.env.example. Add with comment explaining it's a replay-mode requirement
|
||||
per replay protocol Invariant 9.
|
||||
story_points: 1
|
||||
```
|
||||
|
||||
### Story: H-1..H-3 — fixes already committed
|
||||
```yaml
|
||||
type: Story
|
||||
|
||||
Reference in New Issue
Block a user