mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-04-22 22:36:37 +00:00
component assesment and fixes done
This commit is contained in:
@@ -45,9 +45,13 @@
|
||||
**Interface**: `IFlightAPI`
|
||||
**Endpoints**: `POST /flights`, `GET /flights/{flightId}`, `DELETE /flights/{flightId}`, `PUT /flights/{flightId}/waypoints/{waypointId}`, `POST .../images/batch`, `POST .../user-fix`, `GET .../status`, `GET .../stream`
|
||||
|
||||
**F02_flight_processor**
|
||||
**Interface**: `IFlightProcessor`
|
||||
**API**: `create_flight()`, `get_flight()`, `get_flight_state()`, `delete_flight()`, `update_waypoint()`, `batch_update_waypoints()`, `validate_waypoint()`, `validate_geofence()`, `process_frame()`, `run_processing_loop()`, `handle_tracking_loss()`, `initialize_system()`
|
||||
**F02.1_flight_lifecycle_manager**
|
||||
**Interface**: `IFlightLifecycleManager`
|
||||
**API**: `create_flight()`, `get_flight()`, `get_flight_state()`, `delete_flight()`, `update_waypoint()`, `batch_update_waypoints()`, `validate_waypoint()`, `validate_geofence()`, `queue_images()`, `handle_user_fix()`, `create_client_stream()`, `convert_object_to_gps()`, `initialize_system()`
|
||||
|
||||
**F02.2_flight_processing_engine**
|
||||
**Interface**: `IFlightProcessingEngine`
|
||||
**API**: `start_processing()`, `stop_processing()`, `process_frame()`, `apply_user_fix()`, `handle_tracking_loss()`, `get_active_chunk()`, `create_new_chunk()`
|
||||
|
||||
**F03_flight_database**
|
||||
**Interface**: `IFlightDatabase`
|
||||
@@ -176,40 +180,40 @@
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| F02 | F16 | `load_config()` | Load system configuration |
|
||||
| F02 | F16 | `load_model()` × 4 | Load SuperPoint, LightGlue, DINOv2, LiteSAM |
|
||||
| F04 | F08 | Satellite tiles | F08 generates descriptors for Faiss |
|
||||
| F08 | H04 | `build_index()` | Build satellite descriptor index |
|
||||
| F08 | F15 | `get_inference_engine("DINOv2")` | Get model for descriptor generation |
|
||||
| F02.1 | F17 | `load_config()` | Load system configuration |
|
||||
| F02.1 | F16 | `load_model()` × 4 | Load SuperPoint, LightGlue, DINOv2, LiteSAM |
|
||||
| F04 | F08 | Satellite tiles + index | F08 loads pre-built Faiss index from provider |
|
||||
| F08 | H04 | `load_index()` | Load satellite descriptor index |
|
||||
| F08 | F16 | `get_inference_engine("DINOv2")` | Get model for descriptor computation |
|
||||
|
||||
### Flight Creation
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| Client | F01 | `POST /flights` | Create flight |
|
||||
| F01 | F02 | `create_flight()` | Initialize flight state |
|
||||
| F02 | F16 | `get_flight_config()` | Get camera params, altitude |
|
||||
| F02 | F13 | `set_enu_origin(flight_id, start_gps)` | Set ENU coordinate origin |
|
||||
| F02 | F04 | `prefetch_route_corridor()` | Prefetch tiles |
|
||||
| F04 | Satellite Provider | `GET /api/satellite/tiles/batch` | HTTP batch download |
|
||||
| F01 | F02.1 | `create_flight()` | Initialize flight state |
|
||||
| F02.1 | F17 | `get_flight_config()` | Get camera params, altitude |
|
||||
| F02.1 | F13 | `set_enu_origin(flight_id, start_gps)` | Set ENU coordinate origin |
|
||||
| F02.1 | F04 | `prefetch_route_corridor()` | Prefetch tiles |
|
||||
| F04 | Satellite Provider | `GET /api/satellite/tiles/batch` | HTTP batch download (includes tile metadata) |
|
||||
| F04 | H06 | `compute_tile_bounds()` | Tile coordinate calculations |
|
||||
| F02 | F03 | `insert_flight()` | Persist flight data |
|
||||
| F02.1 | F03 | `insert_flight()` | Persist flight data |
|
||||
|
||||
### SSE Stream Creation
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| Client | F01 | `GET .../stream` | Open SSE connection |
|
||||
| F01 | F02 | `create_client_stream()` | Route through coordinator |
|
||||
| F02 | F15 | `create_stream()` | Establish SSE channel |
|
||||
| F01 | F02.1 | `create_client_stream()` | Route through lifecycle manager |
|
||||
| F02.1 | F15 | `create_stream()` | Establish SSE channel |
|
||||
|
||||
### Image Upload
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| Client | F01 | `POST .../images/batch` | Upload 10-50 images |
|
||||
| F01 | F02 | `queue_images()` | Route through coordinator |
|
||||
| F02 | F05 | `queue_batch()` | Queue for processing |
|
||||
| F01 | F02.1 | `queue_images()` | Route through lifecycle manager |
|
||||
| F02.1 | F05 | `queue_batch()` | Queue for processing |
|
||||
| F05 | H08 | `validate_batch()` | Validate sequence, format |
|
||||
| F05 | F03 | `save_image_metadata()` | Persist image metadata |
|
||||
|
||||
@@ -217,48 +221,48 @@
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| F02 | F05 | `get_next_image()` | Get image for processing |
|
||||
| F02 | F06 | `requires_rotation_sweep()` | Check if sweep needed |
|
||||
| F02.2 | F05 | `get_next_image()` | Get image for processing |
|
||||
| F02.2 | F06 | `requires_rotation_sweep()` | Check if sweep needed |
|
||||
| F06 | H07 | `rotate_image()` × 12 | Rotate in 30° steps |
|
||||
| F06 | F09 | `align_to_satellite(img, tile, bounds)` × 12 | Try LiteSAM each rotation |
|
||||
| F06 | F04 | `get_cached_tile()` + `compute_tile_bounds()` | Get expected tile with bounds |
|
||||
| F09 | F15 | `get_inference_engine("LiteSAM")` | Get model |
|
||||
| F02.2 | F04 | `get_cached_tile()` + `compute_tile_bounds()` | Get expected tile with bounds |
|
||||
| F09 | F16 | `get_inference_engine("LiteSAM")` | Get model |
|
||||
| F06 | H07 | `calculate_rotation_from_points()` | Precise angle from homography |
|
||||
| F06 | F03 | `save_heading()` | Store UAV heading |
|
||||
| F02.2 | F03 | `save_heading()` | Store UAV heading |
|
||||
|
||||
### Per-Frame Processing (Sequential VO)
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| F02 | F12 | `get_active_chunk()` | Get active chunk for frame |
|
||||
| F02 | F07 | Process frame | Provide image and chunk context |
|
||||
| F02.2 | F12 | `get_active_chunk()` | Get active chunk for frame |
|
||||
| F02.2 | F07 | `compute_relative_pose()` | Provide image and chunk context |
|
||||
| F07 | F16 | `get_inference_engine("SuperPoint")` | Get feature extractor |
|
||||
| F07 | F16 | `get_inference_engine("LightGlue")` | Get matcher |
|
||||
| F07 | H05 | `start_timer()`, `end_timer()` | Monitor timing |
|
||||
| F07 | F10 | `add_relative_factor_to_chunk()` | Add pose measurement to chunk subgraph |
|
||||
| F02 | F12 | `add_frame_to_chunk()` | Add frame to chunk |
|
||||
| F02.2 | F10 | `add_relative_factor_to_chunk()` | Add pose measurement to chunk subgraph |
|
||||
| F02.2 | F12 | `add_frame_to_chunk()` | Add frame to chunk |
|
||||
|
||||
### Tracking Good (Drift Correction)
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| F02 | F11 | `check_confidence()` | Check tracking quality |
|
||||
| F02 | F04 | `fetch_tile()` + `compute_tile_bounds()` | Get single tile with bounds |
|
||||
| F02 | F09 | `align_to_satellite(img, tile, bounds)` | Align to 1 tile |
|
||||
| F02 | F10 | `add_absolute_factor()` | Add GPS measurement |
|
||||
| F02.2 | F11 | `check_confidence()` | Check tracking quality |
|
||||
| F02.2 | F04 | `fetch_tile()` + `compute_tile_bounds()` | Get single tile with bounds |
|
||||
| F02.2 | F09 | `align_to_satellite(img, tile, bounds)` | Align to 1 tile |
|
||||
| F02.2 | F10 | `add_absolute_factor()` | Add GPS measurement |
|
||||
|
||||
### Tracking Lost (Progressive Search + Chunk Building)
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| F02 | F11 | `check_confidence()` → FAIL | Low confidence |
|
||||
| F02.2 | F11 | `check_confidence()` → FAIL | Low confidence |
|
||||
| F11 | F12 | `create_chunk_on_tracking_loss()` | **Proactive chunk creation** |
|
||||
| F12 | F10 | `create_new_chunk()` | Create chunk in factor graph |
|
||||
| F12 | F10 | `create_chunk_subgraph()` | Create chunk in factor graph |
|
||||
| F12 | F03 | `save_chunk_state()` | Persist chunk state for recovery |
|
||||
| F02 | F12 | `get_active_chunk()` | Get new active chunk |
|
||||
| F02.2 | F12 | `get_active_chunk()` | Get new active chunk |
|
||||
| F11 | F06 | `requires_rotation_sweep()` | Trigger rotation sweep (single-image) |
|
||||
| F11 | F08 | `retrieve_candidate_tiles()` | Coarse localization (single-image) |
|
||||
| F08 | F15 | `get_inference_engine("DINOv2")` | Get model |
|
||||
| F08 | F16 | `get_inference_engine("DINOv2")` | Get model |
|
||||
| F08 | H04 | `search()` | Query Faiss index |
|
||||
| F08 | F04 | `get_tile_by_gps()` × 5 | Get candidate tiles |
|
||||
| F11 | F04 | `expand_search_grid(4)` | Get 2×2 grid |
|
||||
@@ -266,14 +270,14 @@
|
||||
| F11 (fail) | F04 | `expand_search_grid(9)` | Expand to 3×3 |
|
||||
| F11 (fail) | F04 | `expand_search_grid(16)` | Expand to 4×4 |
|
||||
| F11 (fail) | F04 | `expand_search_grid(25)` | Expand to 5×5 |
|
||||
| F11 (fail) | F03 | Continue building chunk | **Chunk building continues** |
|
||||
| F11 (background) | F03 | `get_chunks_for_matching()` | Get unanchored chunks |
|
||||
| F11 (fail) | F12 | Continue building chunk | **Chunk building continues** |
|
||||
| F11 (background) | F12 | `get_chunks_for_matching()` | Get unanchored chunks |
|
||||
| F11 (background) | F08 | `retrieve_candidate_tiles_for_chunk()` | **Chunk semantic matching** |
|
||||
| F11 (background) | F06 | `try_chunk_rotation_steps()` | **Chunk rotation sweeps** |
|
||||
| F11 (background) | F09 | `align_chunk_to_satellite()` | **Chunk LiteSAM matching** |
|
||||
| F11 (background) | F10 | `add_chunk_anchor()` + `merge_chunks()` | **Chunk merging** |
|
||||
| F11 (fail) | F14 | `send_user_input_request()` | Request human help (last resort) |
|
||||
| F11 | F02 | `update_flight_status("BLOCKED")` | Block processing |
|
||||
| F11 (background) | F10 | `add_chunk_anchor()` + `merge_chunk_subgraphs()` | **Chunk merging** |
|
||||
| F11 (fail) | F02.2 | Returns `UserInputRequest` | Request human help (last resort) |
|
||||
| F02.2 | F15 | `send_user_input_request()` | Send SSE event to client |
|
||||
|
||||
### Optimization & Results
|
||||
|
||||
@@ -281,13 +285,13 @@
|
||||
|--------|--------|--------|---------|
|
||||
| F10 | H03 | `huber_loss()`, `cauchy_loss()` | Apply robust kernels |
|
||||
| F10 | Internal | `optimize()` | Run iSAM2 optimization |
|
||||
| F02 | F10 | `get_trajectory()` | Get optimized poses |
|
||||
| F02 | F13 | `enu_to_gps()` | Convert ENU to GPS |
|
||||
| F02.2 | F10 | `get_trajectory()` | Get optimized poses |
|
||||
| F02.2 | F13 | `enu_to_gps()` | Convert ENU to GPS |
|
||||
| F13 | H01 | `project()`, `unproject()` | Camera operations |
|
||||
| F13 | H02 | `compute_gsd()` | GSD calculations |
|
||||
| F13 | H06 | `tile_to_latlon()` | Coordinate transforms |
|
||||
| F02 | F14 | Frame GPS + object coords | Provide results |
|
||||
| F14 | F02 | `update_waypoint()` | Per-frame waypoint update |
|
||||
| F02.2 | F14 | Frame GPS + object coords | Provide results |
|
||||
| F14 | F03 | `update_waypoint()` | Per-frame waypoint update |
|
||||
| F14 | F15 | `send_frame_result()` | Publish to client |
|
||||
| F15 | Client | SSE `frame_processed` | Real-time delivery |
|
||||
| F14 | F03 | `save_frame_result()` | Persist frame result |
|
||||
@@ -298,18 +302,20 @@
|
||||
|--------|--------|--------|---------|
|
||||
| F15 | Client | SSE `user_input_needed` | Notify client |
|
||||
| Client | F01 | `POST .../user-fix` | Provide anchor |
|
||||
| F01 | F11 | `apply_user_anchor()` | Apply fix |
|
||||
| F01 | F02.1 | `handle_user_fix()` | Route through lifecycle manager |
|
||||
| F02.1 | F02.2 | `apply_user_fix()` | Delegate to processing engine |
|
||||
| F02.2 | F11 | `apply_user_anchor()` | Apply fix |
|
||||
| F11 | F10 | `add_absolute_factor()` (high confidence) | Hard constraint |
|
||||
| F10 | Internal | `optimize()` | Re-optimize |
|
||||
| F11 | Event | Emit `UserFixApplied` | F02 subscribes and resumes |
|
||||
| F02.2 | F15 | `send_frame_result()` | Publish result via SSE |
|
||||
|
||||
### Asynchronous Refinement
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| F10 | Internal (background) | `optimize()` | Back-propagate anchors |
|
||||
| F10 | F14 | `get_trajectory()` | Get refined poses |
|
||||
| F14 | F02 | `batch_update_waypoints()` | Batch update waypoints |
|
||||
| F14 | F10 | `get_trajectory()` | Get refined poses |
|
||||
| F14 | F03 | `batch_update_waypoints()` | Batch update waypoints |
|
||||
| F14 | F15 | `send_refinement()` × N | Send updates |
|
||||
| F15 | Client | SSE `frame_refined` × N | Incremental updates |
|
||||
|
||||
@@ -334,31 +340,31 @@
|
||||
|
||||
| Source | Target | Method | Purpose |
|
||||
|--------|--------|--------|---------|
|
||||
| F16 | ALL | `get_*_config()` | Provide configuration |
|
||||
| F17 | ALL | `get_*_config()` | Provide configuration |
|
||||
| H05 | F07, F08, F09, F10, F11 | `start_timer()`, `end_timer()` | Performance monitoring |
|
||||
|
||||
---
|
||||
|
||||
## Interaction Coverage Verification
|
||||
|
||||
✅ **Initialization**: F02→F16, F17; F04→F08→H04
|
||||
✅ **Flight creation**: Client→F01→F02→F04,F12,F16,F17,F14
|
||||
✅ **Image upload**: Client→F01→F05→H08,F17
|
||||
✅ **Initialization**: F02.1→F16, F17; F04→F08→H04
|
||||
✅ **Flight creation**: Client→F01→F02.1→F04,F12,F16,F17,F14
|
||||
✅ **Image upload**: Client→F01→F02.1→F05→H08
|
||||
✅ **Rotation sweep**: F06→H07,F09 (12 iterations)
|
||||
✅ **Sequential VO**: F07→F16,F10(chunk),F12,H05
|
||||
✅ **Drift correction**: F02→F04,F09,F10
|
||||
✅ **Tracking loss**: F11→F12(proactive chunk),F06,F08,F04(progressive),F09,F15,F02
|
||||
✅ **Chunk building**: F02→F12→F10,F07
|
||||
✅ **Sequential VO**: F02.2→F07→F16,F10(chunk),F12,H05
|
||||
✅ **Drift correction**: F02.2→F04,F09,F10
|
||||
✅ **Tracking loss**: F02.2→F11→F12(proactive chunk),F06,F08,F04(progressive),F09
|
||||
✅ **Chunk building**: F02.2→F12→F10,F07
|
||||
✅ **Chunk image retrieval**: F12→F05(get_image_by_sequence for chunk images)
|
||||
✅ **Chunk semantic matching**: F11→F12→F08(chunk descriptor)
|
||||
✅ **Chunk LiteSAM matching**: F11→F06(chunk rotation)→F09(chunk alignment)
|
||||
✅ **Chunk merging**: F11→F10(Sim3 transform)
|
||||
✅ **Global PR**: F08→F16,H04,F04
|
||||
✅ **Optimization**: F10→H03(chunk optimization, global optimization)
|
||||
✅ **Coordinate transform**: F13→H01,H02,H06
|
||||
✅ **Results**: F02→F13→F14→F15,F03
|
||||
✅ **User input**: Client→F01→F11→F10,F02
|
||||
✅ **Refinement**: F10→F14→F02,F15
|
||||
✅ **Coordinate transform**: F13→F10,H01,H02,H06
|
||||
✅ **Results**: F02.2→F13→F14→F15,F03
|
||||
✅ **User input**: Client→F01→F02.1→F02.2→F11→F10
|
||||
✅ **Refinement**: F10→F14→F03,F15
|
||||
✅ **Configuration**: F17→ALL
|
||||
✅ **Performance**: H05→processing components
|
||||
|
||||
@@ -386,7 +392,9 @@
|
||||
### Component Specifications Status
|
||||
|
||||
- [x] F01 Flight API (merged from R01 Route REST API)
|
||||
- [x] F02 Flight Processor (merged from R02, R03, G02)
|
||||
- [x] F02.1 Flight Lifecycle Manager (split from F02 Flight Processor)
|
||||
- [x] F02.2 Flight Processing Engine (split from F02 Flight Processor)
|
||||
- [x] F03 Flight Database (merged from R04, G17)
|
||||
- [x] F04 Satellite Data Manager
|
||||
- [x] F05 Image Input Pipeline
|
||||
- [x] F06 Image Rotation Manager
|
||||
@@ -401,26 +409,31 @@
|
||||
- [x] F15 SSE Event Streamer
|
||||
- [x] F16 Model Manager
|
||||
- [x] F17 Configuration Manager
|
||||
- [x] F03 Flight Database (merged from R04, G17)
|
||||
- [x] Helper components (H01-H08)
|
||||
|
||||
---
|
||||
|
||||
## Architecture Notes
|
||||
|
||||
### F02 Flight Processor Complexity
|
||||
### F02 Split: Lifecycle Manager + Processing Engine
|
||||
|
||||
F02 Flight Processor handles multiple concerns:
|
||||
- Flight lifecycle management
|
||||
- Processing loop orchestration
|
||||
- Event subscription and state updates
|
||||
- Coordination of F07/F08/F09/F10
|
||||
F02 has been split into two components with clear Single Responsibility:
|
||||
|
||||
**Current Status**: Acceptable for MVP. The responsibilities are related (all flight processing) and the component acts as a coordinator rather than implementing logic directly.
|
||||
**F02.1 Flight Lifecycle Manager**:
|
||||
- Flight CRUD operations
|
||||
- System initialization
|
||||
- API request routing
|
||||
- SSE stream creation
|
||||
- User fix delegation
|
||||
|
||||
**Future Consideration**: If complexity grows, consider splitting into:
|
||||
- F02a Flight State Manager (lifecycle, status)
|
||||
- F02b Processing Loop Coordinator (frame processing orchestration)
|
||||
**F02.2 Flight Processing Engine**:
|
||||
- Main processing loop
|
||||
- Frame-by-frame processing orchestration
|
||||
- Recovery coordination with F11
|
||||
- Chunk management coordination with F12
|
||||
- Runs in background thread per active flight
|
||||
|
||||
**Rationale**: This split aligns with Single Responsibility Principle. F02.1 handles external-facing operations (API layer), while F02.2 handles internal processing (background engine).
|
||||
|
||||
**Decision**: Keep as single component. Clear internal organization with separate methods for state vs processing concerns. Event-based communication with F11 keeps recovery logic separate.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user