spec cleanup

This commit is contained in:
Oleksandr Bezdieniezhnykh
2025-11-30 19:08:40 +02:00
parent b12f37ab01
commit 3d034e27ee
10 changed files with 270 additions and 152 deletions
+37 -32
View File
@@ -297,8 +297,8 @@ ASTRAL-Next is a GPS-denied UAV visual localization system using tri-layer match
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ F03 save_heading() via F06 │ │ │
│ │ │ update_heading() │ │ │
│ │ │ F06 update_heading() → returns │ │ │
│ │ │ F02.2 calls F03 save_heading() │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ │ │
│ └────────────────────────────────────────────────────┘ │
@@ -323,15 +323,15 @@ ASTRAL-Next is a GPS-denied UAV visual localization system using tri-layer match
**Sequence**:
```
┌──────────────────────────────────────────────────────────────────────────┐
F11 Failure Recovery Coordinator
F02.2 calls F11 methods (direct returns, NO EVENTS)
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. EMIT RecoveryStarted event │ │
│ │ └─ F02.2 updates status to "recovering" │ │
│ │ 1. F02.2 calls F11.start_search() → returns SearchSession │ │
│ │ F02.2 updates status to "recovering" │ │
│ └──────────────────────────────┬──────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 2. create_chunk_on_tracking_loss() via F12 │ │
│ │ 2. F02.2 calls F11.create_chunk_on_tracking_loss() via F12 │ │
│ │ └─ Proactive chunk creation (processing continues) │ │
│ └──────────────────────────────┬──────────────────────────────┘ │
│ ▼ │
@@ -343,10 +343,9 @@ ASTRAL-Next is a GPS-denied UAV visual localization system using tri-layer match
│ │ │ │
│ │ ┌───────────────────────────────────────────────────┐ │ │
│ │ │ For grid_size in [1, 4, 9, 16, 25]: │ │ │
│ │ │ ├─ F04 expand_search_grid() │ │ │
│ │ │ ├─ For each tile: │ │ │
│ │ │ │ ├─ F04 compute_tile_bounds() │ │ │
│ │ │ │ └─ F09 align_to_satellite(img, tile, bounds)│ │ │
│ │ │ ├─ F11.expand_search_radius() → tiles │ │ │
│ │ │ ├─ F02.2 fetches tiles via F04 │ │ │
│ │ │ ├─ F11.try_current_grid() → AlignmentResult │ │ │
│ │ │ │ │ │ │
│ │ │ └─ If match found: BREAK │ │ │
│ │ └───────────────────────────────────────────────────┘ │ │
@@ -357,8 +356,8 @@ ASTRAL-Next is a GPS-denied UAV visual localization system using tri-layer match
│ │ Single-image match found? │ │
│ ▼ ▼ │
│ ┌─────────────────────┐ ┌────────────────────────────┐ │
│ │ EMIT RecoverySucceeded│ │ Continue chunk building │ │
│ │ Resume normal flow │ │ → Flow 7 (Chunk Building) │ │
│ │ F11.mark_found() │ │ Continue chunk building │ │
│ │ Resume normal flow │ │ → Flow 7 (Chunk Building) │ │
│ └─────────────────────┘ │ → Flow 8 (Chunk Matching) │ │
│ │ (Background) │ │
│ └────────────────────────────┘ │
@@ -480,28 +479,28 @@ ASTRAL-Next is a GPS-denied UAV visual localization system using tri-layer match
**Sequence**:
```
┌───────────────────────────────────────────────────────────────────────-──┐
F11 merge_chunk_to_trajectory()
F02.2 orchestrates via F11.merge_chunk_to_trajectory() │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. Get chunk frames: F12 get_chunk_frames(chunk_id) │ │
│ │ 1. Get chunk frames: F12 get_chunk_frames(new_chunk_id) │ │
│ └──────────────────────────────┬──────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 2. Anchor chunk: F12 mark_chunk_anchored(chunk_id, gps) │ │
│ │ └─ F10 add_chunk_anchor(flight_id, chunk_id, frame_id, │ │
│ │ 2. Anchor chunk: F12 mark_chunk_anchored(new_chunk_id, gps) │ │
│ │ └─ F10 add_chunk_anchor(flight_id, new_chunk_id, frame_id│ │
│ │ gps, covariance) │ │
│ └──────────────────────────────┬──────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 3. Determine target chunk (predecessor or "main") │ │
│ │ └─ Returns target_chunk_id (predecessor or "main") │ │
│ │ 3. Determine main chunk (predecessor or "main") │ │
│ │ └─ Returns main_chunk_id (predecessor or "main") │ │
│ └──────────────────────────────┬──────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 4. Merge: F12 merge_chunks(target_chunk_id, chunk_id, Sim3) │ │
│ │ ├─ F10 merge_chunk_subgraphs(flight_id, chunk_id, │ │
│ │ │ target_chunk_id, transform) ← Apply Sim(3) │ │
│ │ ├─ F12 deactivate_chunk(chunk_id) │ │
│ │ 4. Merge: F12 merge_chunks(main_chunk_id,new_chunk_id,Sim3) │ │
│ │ ├─ F10 merge_chunk_subgraphs(flight_id, new_chunk_id, │ │
│ │ │ main_chunk_id, transform) ← Apply Sim(3) │ │
│ │ ├─ F12 deactivate_chunk(new_chunk_id) │ │
│ │ └─ F03 save_chunk_state() │ │
│ └──────────────────────────────┬──────────────────────────────┘ │
│ ▼ │
@@ -511,10 +510,11 @@ ASTRAL-Next is a GPS-denied UAV visual localization system using tri-layer match
│ └──────────────────────────────┬──────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 6. EMIT ChunkMerged event (flight_id,chunk_id,merged_frames)│ │
│ │ ─ F14 subscribes → update_results_after_chunk_merge() │ │
│ │ ├─ F10 get_trajectory(flight_id) → ENU poses │ │
│ │ ├─ F13 enu_to_gps() for each frame │ │
│ │ 6. F11 returns True → F02.2 coordinates result updates: │ │
│ │ ─ F02.2 calls F10 get_trajectory(flight_id) → ENU poses │ │
│ │ ├─ F02.2 calls F13 enu_to_gps() for each frame │ │
│ │ ├─ F02.2 constructs List[RefinedFrameResult] │ │
│ │ └─ F02.2 calls F14.update_results_after_chunk_merge() │ │
│ │ ├─ F03 save_frame_result() + update_waypoint() │ │
│ │ └─ F15 send_refinement() → SSE "frame_refined" × N │ │
│ └─────────────────────────────────────────────────────────────┘ │
@@ -522,6 +522,7 @@ ASTRAL-Next is a GPS-denied UAV visual localization system using tri-layer match
```
**Sim(3) Transform**: Translation + Rotation + Scale alignment between chunks
**Note**: F14 does NOT call F10/F13. F02.2 performs coordinate conversion and passes GPS results.
---
@@ -534,14 +535,18 @@ ASTRAL-Next is a GPS-denied UAV visual localization system using tri-layer match
**Sequence**:
```
┌──────────────────────────────────────────────────────────────────────────┐
F11 create_user_input_request()
F02.2 orchestrates via F11.create_user_input_request() │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. Get UAV image for frame_id │
│ │ 2. Get top-5 candidates from F08 │ │
│ │ 3. Create UserInputRequest │ │
│ 4. F15 send_user_input_request() → SSE "user_input_needed" │
│ 5. EMIT UserInputNeeded event
│ │ 1. F11.create_user_input_request() → returns UserInputRequest│
│ │ └─ Gets UAV image, top-5 candidates from F08 │ │
│ │ └─ Returns request object (does NOT call F15) │ │
└──────────────────────────────┬──────────────────────────────┘
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 2. F02.2 receives UserInputRequest │ │
│ │ ├─ F02.2 calls F15.send_user_input_request() │ │
│ │ │ → SSE "user_input_needed" │ │
│ │ └─ F02.2 updates status to "BLOCKED" │ │
│ └─────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────┘