mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-04-22 22:46:36 +00:00
5.0 KiB
5.0 KiB
Acceptance Test: Chunk Rotation Recovery
Summary
Validate chunk LiteSAM matching with rotation sweeps for chunks with unknown orientation (sharp turns).
Linked Acceptance Criteria
AC-4: Robust to sharp turns (<5% overlap) AC-5: Connect route chunks
Preconditions
- F02.2 Flight Processing Engine running
- F11 Failure Recovery Coordinator (chunk orchestration, returns status objects)
- F12 Route Chunk Manager functional (chunk lifecycle via
create_chunk(),mark_chunk_anchored()) - F06 Image Rotation Manager with chunk rotation support (
try_chunk_rotation_steps()) - F08 Global Place Recognition (chunk semantic matching via
retrieve_candidate_tiles_for_chunk()) - F09 Metric Refinement with chunk LiteSAM matching (
align_chunk_to_satellite()) - F10 Factor Graph Optimizer with chunk operations (
add_chunk_anchor(),merge_chunk_subgraphs()) - Test dataset: Chunk with unknown orientation (simulated sharp turn)
Test Description
Test system's ability to match chunks with unknown orientation using rotation sweeps. When a chunk is created after a sharp turn, its orientation relative to the satellite map is unknown. The system must rotate the entire chunk to all possible angles and attempt LiteSAM matching.
Test Steps
Step 1: Create Chunk with Unknown Orientation
- Action: Simulate sharp turn scenario
- Process frames 1-10 (normal flight, heading 0°)
- Sharp turn at frame 11 (heading changes to 120°)
- Tracking lost, chunk_2 created proactively
- Process frames 11-20 in chunk_2
- Expected Result:
- Chunk_2 created with frames 11-20
- Chunk orientation unknown (previous heading not relevant)
- Chunk ready for matching (10 frames)
Step 2: Chunk Semantic Matching
- Action: Attempt chunk semantic matching
- Expected Result:
- F08.compute_chunk_descriptor() → aggregate DINOv2 descriptor
- F08.retrieve_candidate_tiles_for_chunk() → returns top-5 candidate tiles
- Correct tile in top-5 candidates
Step 3: Chunk Rotation Sweeps
- Action: Attempt chunk LiteSAM matching with rotation sweeps
- Expected Result:
- F06.try_chunk_rotation_steps() called
- For each rotation angle (0°, 30°, 60°, ..., 330°):
- F06.rotate_chunk_360() rotates all 10 images
- F09.align_chunk_to_satellite() attempts matching
- Match found at 120° rotation (correct orientation)
- Returns ChunkAlignmentResult with:
- rotation_angle: 120°
- chunk_center_gps: correct GPS
- confidence > 0.7
- Sim(3) transform computed
Step 4: Chunk Merging
- Action: Merge chunk_2 to main trajectory
- Expected Result:
- F12.mark_chunk_anchored() updates chunk state (calls F10.add_chunk_anchor())
- F12.merge_chunks() merges chunk_2 into chunk_1 (calls F10.merge_chunk_subgraphs())
- Sim(3) transform applied correctly
- Global trajectory consistent
Step 5: Verify Final Trajectory
- Action: Verify all frames have GPS coordinates
- Expected Result:
- All 20 frames have GPS coordinates
- Frames 1-10: Original trajectory
- Frames 11-20: Merged chunk trajectory
- Global consistency maintained
- Accuracy: 18/20 < 50m (90%)
Success Criteria
Primary Criterion:
- Chunk rotation sweeps find correct orientation (120°)
- Chunk LiteSAM matching succeeds with rotation
- Chunk merged correctly to main trajectory
Supporting Criteria:
- All 12 rotation angles tried
- Match found at correct angle
- Sim(3) transform computed correctly
- Final trajectory globally consistent
Expected Results
Chunk Rotation Recovery:
- Chunk_2 created: frames 11-20
- Unknown orientation: previous heading (0°) not relevant
- Chunk semantic matching: correct tile in top-5
- Rotation sweeps: 12 rotations tried (0°, 30°, ..., 330°)
- Match found: 120° rotation
- Chunk center GPS: Accurate (within 20m)
- Chunk merged: Sim(3) transform applied
- Final trajectory: Globally consistent
- Accuracy: 18/20 < 50m (90%)
Pass/Fail Criteria
TEST PASSES IF:
- Chunk rotation sweeps find match at correct angle (120°)
- Chunk LiteSAM matching succeeds
- Chunk merged correctly
- Final trajectory globally consistent
- Accuracy acceptable (≥ 80% < 50m)
TEST FAILS IF:
- Rotation sweeps don't find correct angle
- Chunk LiteSAM matching fails
- Chunk merging produces inconsistent trajectory
- Final accuracy below threshold
Architecture Elements
Chunk Rotation:
- F06 rotates all images in chunk by same angle
- 12 rotation steps: 0°, 30°, 60°, ..., 330°
- F09 attempts LiteSAM matching for each rotation
Chunk LiteSAM Matching:
- Aggregate correspondences from multiple images
- More robust than single-image matching
- Handles featureless terrain better
Chunk Merging:
- Sim(3) transform (translation, rotation, scale)
- Critical for monocular VO scale ambiguity
- Preserves internal consistency
Notes
- Rotation sweeps are critical for chunks from sharp turns
- Previous heading may not be relevant after sharp turn
- Chunk matching more robust than single-image matching
- Sim(3) transform accounts for scale differences