mirror of
https://github.com/azaion/gps-denied-desktop.git
synced 2026-04-23 01:36:35 +00:00
add solution drafts, add component decomposition , add spec for other docs
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
# Service Interface Component
|
||||
|
||||
## Detailed Description
|
||||
The **Service Interface** serves as the external communication boundary of the ASTRAL-Next system. It implements the ZeroMQ patterns required for the background service architecture. It isolates the core logic from the communication protocol, allowing for easy testing and integration with different ground control stations or UI clients.
|
||||
|
||||
It manages two primary sockets:
|
||||
1. **Command Socket (REP):** Synchronous request-reply pattern for control commands (Start, Stop, User Input).
|
||||
2. **Data Socket (PUB):** Asynchronous publish-subscribe pattern for broadcasting telemetry and localization results.
|
||||
|
||||
## API Methods
|
||||
|
||||
### `start_service`
|
||||
- **Input:** `port_cmd: int`, `port_data: int`
|
||||
- **Output:** `void`
|
||||
- **Description:** Initializes the ZeroMQ contexts and binds the sockets to the specified ports. Starts the listener loop in a non-blocking manner (or separate thread).
|
||||
- **Test Cases:**
|
||||
- Bind to valid ports -> Success.
|
||||
- Bind to used ports -> Raise Error.
|
||||
|
||||
### `listen_for_commands`
|
||||
- **Input:** `timeout_ms: int`
|
||||
- **Output:** `CommandObject | None`
|
||||
- **Description:** Checks the REP socket for incoming messages. If a message is received, it parses the JSON and validates the schema. Returns a structured Command object (e.g., `StartCmd`, `UserFixCmd`) or `None` if timeout.
|
||||
- **Test Cases:**
|
||||
- Receive valid JSON `{"cmd": "START", ...}` -> Return `StartCmd` object.
|
||||
- Receive invalid JSON -> Send error reply, Return `None`.
|
||||
- Timeout -> Return `None`.
|
||||
|
||||
### `send_reply`
|
||||
- **Input:** `response: Dict`
|
||||
- **Output:** `void`
|
||||
- **Description:** Sends a JSON response back on the REP socket. Must be called after a request is received to complete the REQ-REP cycle.
|
||||
- **Test Cases:**
|
||||
- Send valid dict -> Success.
|
||||
- Send without receiving request -> ZeroMQ Error state.
|
||||
|
||||
### `publish_telemetry`
|
||||
- **Input:** `telemetry: Dict`
|
||||
- **Output:** `void`
|
||||
- **Description:** Serializes the telemetry dictionary to JSON and publishes it on the PUB socket with the topic "telemetry".
|
||||
- **Test Cases:**
|
||||
- Publish dict -> Client receives JSON string.
|
||||
|
||||
### `publish_request_input`
|
||||
- **Input:** `request_data: Dict` (contains image base64, satellite tiles base64)
|
||||
- **Output:** `void`
|
||||
- **Description:** Publishes a high-priority message on a specific topic (e.g., "system_alert") indicating user input is needed.
|
||||
- **Test Cases:**
|
||||
- Publish huge payload (images) -> Verify serialization performance.
|
||||
|
||||
## Integration Tests
|
||||
- **Mock Client Test:** Spin up a separate process acting as a client. Send "START" command, verify "ACK". Subscribe to telemetry, verify stream of messages.
|
||||
|
||||
## Non-functional Tests
|
||||
- **Latency:** Measure round-trip time for REQ-REP (< 10ms).
|
||||
- **Throughput:** Verify it can handle high-frequency status updates (e.g., 100Hz) without lagging the main loop.
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# Image Preprocessing Component
|
||||
|
||||
## Detailed Description
|
||||
The **Image Preprocessing** component is a core system module responsible for transforming raw image data into the canonical formats required by the AI models (SuperPoint, AnyLoc, LiteSAM). It ensures that all images entering the pipeline are consistently resized, normalized, and converted to tensors, decoupling the model requirements from the input source format.
|
||||
|
||||
## API Methods
|
||||
|
||||
### `preprocess_image`
|
||||
- **Input:** `image: np.array`, `target_size: tuple`, `normalize: bool`
|
||||
- **Output:** `np.array` (or Tensor)
|
||||
- **Description:** Resizes the input image to the target dimensions while handling aspect ratio (padding or cropping as configured). Optionally normalizes pixel intensity values (e.g., to 0-1 range or standard deviation).
|
||||
- **Test Cases:**
|
||||
- Input 4000x3000, Target 640x480 -> Output 640x480, valid pixel range.
|
||||
- Input grayscale vs RGB -> Handles channel expansion/contraction.
|
||||
|
||||
## Integration Tests
|
||||
- **Pipeline Compatibility:** Verify output matches the exact tensor shape expected by the Model Registry's SuperPoint and AnyLoc wrappers.
|
||||
|
||||
## Non-functional Tests
|
||||
- **Latency:** Operation must be extremely fast (< 5ms) to not add overhead to the pipeline. Use optimized libraries (OpenCV/TorchVision).
|
||||
@@ -0,0 +1,57 @@
|
||||
# Map Data Provider Component
|
||||
|
||||
## Detailed Description
|
||||
The **Map Data Provider** acts as the interface to the external "Custom Satellite Provider." It abstracts the complexity of fetching, caching, and georeferencing satellite imagery.
|
||||
|
||||
It maintains two layers of data:
|
||||
1. **Global Index:** A pre-computed vector database (Faiss) of satellite tiles covering the operation area, used by Layer 2 for coarse localization.
|
||||
2. **Tile Cache:** A local storage of high-resolution satellite raster tiles used by Layer 3 for fine matching.
|
||||
|
||||
It also handles the projection mathematics (Web Mercator <-> WGS84 Lat/Lon).
|
||||
|
||||
## API Methods
|
||||
|
||||
### `initialize_region`
|
||||
- **Input:** `bounding_box: {lat_min, lat_max, lon_min, lon_max}`, `zoom_level: int`
|
||||
- **Output:** `void`
|
||||
- **Description:** Prepares the system for the target area. Checks if tiles are cached; if not, requests them from the provider. Loads the Faiss index into memory.
|
||||
- **Test Cases:**
|
||||
- Region fully cached -> fast load.
|
||||
- Region missing -> initiates fetch (simulated).
|
||||
|
||||
### `get_tile_by_coords`
|
||||
- **Input:** `lat: float`, `lon: float`, `radius_m: float`
|
||||
- **Output:** `List[SatelliteTile]`
|
||||
- **Description:** Returns satellite tiles that cover the specified coordinate and radius. Used when we have a prior position (e.g., from L1 or History).
|
||||
- **SatelliteTile:** `image: np.array`, `bounds: BoundingBox`, `gsd: float`.
|
||||
- **Test Cases:**
|
||||
- Coordinate edge case (tile boundary) -> Returns overlapping tiles.
|
||||
|
||||
### `get_global_index`
|
||||
- **Input:** `void`
|
||||
- **Output:** `FaissIndex`, `List[TileMetadata]`
|
||||
- **Description:** Returns the handle to the searchable vector index and the corresponding metadata map (mapping index ID to tile geolocation).
|
||||
- **Test Cases:**
|
||||
- Verify index size matches number of tiles.
|
||||
|
||||
### `latlon_to_pixel`
|
||||
- **Input:** `lat: float`, `lon: float`, `tile_bounds: BoundingBox`, `image_shape: tuple`
|
||||
- **Output:** `x: int`, `y: int`
|
||||
- **Description:** Converts a GPS coordinate to pixel coordinates within a specific tile.
|
||||
- **Test Cases:**
|
||||
- Lat/Lon matches tile center -> Output (w/2, h/2).
|
||||
- Lat/Lon matches NW corner -> Output (0, 0).
|
||||
|
||||
### `pixel_to_latlon`
|
||||
- **Input:** `x: int`, `y: int`, `tile_bounds: BoundingBox`, `image_shape: tuple`
|
||||
- **Output:** `lat: float`, `lon: float`
|
||||
- **Description:** Inverse of `latlon_to_pixel`.
|
||||
- **Test Cases:**
|
||||
- Round trip test (LatLon -> Pixel -> LatLon) < 1e-6 error.
|
||||
|
||||
## Integration Tests
|
||||
- **Mock Provider:** Simulate the "Custom Satellite Provider" returning dummy tiles. Verify caching logic writes files to disk.
|
||||
|
||||
## Non-functional Tests
|
||||
- **Memory Usage:** Ensure loading the Faiss index for a large region (e.g., 100km x 100km) does not exceed available RAM.
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
# Model Registry Component
|
||||
|
||||
## Detailed Description
|
||||
The **Model Registry** is a centralized manager for all deep learning models (SuperPoint, LightGlue, AnyLoc, LiteSAM). It abstracts the loading mechanism, supporting both **TensorRT** (for production/GPU) and **PyTorch/ONNX** (for fallback/CPU/Sandbox).
|
||||
|
||||
It implements the "Factory" pattern, delivering initialized and ready-to-infer model wrappers to the Layer components. It also manages GPU resource allocation (e.g., memory growth).
|
||||
|
||||
## API Methods
|
||||
|
||||
### `load_model`
|
||||
- **Input:** `model_name: str` (e.g., "superpoint"), `backend: str` ("tensorrt" | "pytorch" | "auto")
|
||||
- **Output:** `ModelWrapper`
|
||||
- **Description:** Loads the specified model weights.
|
||||
- If `backend="auto"`, attempts TensorRT first; if fails (or no GPU), falls back to PyTorch.
|
||||
- Returns a wrapper object that exposes a uniform `infer()` method regardless of backend.
|
||||
- **Test Cases:**
|
||||
- Load "superpoint", backend="pytorch" -> Success.
|
||||
- Load invalid name -> Error.
|
||||
- Load "tensorrt" on CPU machine -> Fallback or Error (depending on strictness).
|
||||
|
||||
### `unload_model`
|
||||
- **Input:** `model_name: str`
|
||||
- **Output:** `void`
|
||||
- **Description:** Frees GPU/RAM resources associated with the model.
|
||||
- **Test Cases:**
|
||||
- Unload loaded model -> Memory released.
|
||||
|
||||
### `list_available_models`
|
||||
- **Input:** `void`
|
||||
- **Output:** `List[str]`
|
||||
- **Description:** Returns list of models registered and available on disk.
|
||||
|
||||
## Integration Tests
|
||||
- **Load All:** Iterate through all required models and verify they load successfully in the sandbox environment (likely PyTorch mode).
|
||||
|
||||
## Non-functional Tests
|
||||
- **Warmup Time:** Measure time from `load_model` to first successful inference.
|
||||
- **Switching Overhead:** Measure latency if models need to be swapped in/out of VRAM (though ideally all stay loaded).
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# L1 Visual Odometry Component
|
||||
|
||||
## Detailed Description
|
||||
**L1 Visual Odometry** handles the high-frequency, sequential tracking of the UAV. It receives the current frame and the previous frame, using **SuperPoint** for feature extraction and **LightGlue** for matching.
|
||||
|
||||
It estimates the **Relative Pose** (Translation and Rotation) between frames. Since monocular VO lacks scale, it outputs a "scale-ambiguous" translation vector or utilizes the altitude prior (if passed) to normalize. It is designed to be robust to low overlap but will flag "Tracking Lost" if matches fall below a threshold.
|
||||
|
||||
## API Methods
|
||||
|
||||
### `process_frame`
|
||||
- **Input:** `current_frame: FrameObject`, `prev_frame: FrameObject | None`
|
||||
- **Output:** `L1Result`
|
||||
- **Description:**
|
||||
1. Extracts features (Keypoints, Descriptors) from `current_frame` (using Model Registry).
|
||||
2. If `prev_frame` exists, matches features with `prev_frame` using LightGlue.
|
||||
3. Computes Essential/Fundamental Matrix and recovers relative pose $(R, t)$.
|
||||
4. Returns `L1Result`: `{ relative_pose: Matrix4x4, num_matches: int, confidence: float, keypoints: list }`.
|
||||
- **Test Cases:**
|
||||
- Frame 1 & Frame 2 (Good overlap) -> High match count, valid pose.
|
||||
- Frame 1 & Frame 10 (Zero overlap) -> Low match count, "Tracking Lost" status.
|
||||
|
||||
### `reset`
|
||||
- **Input:** `void`
|
||||
- **Output:** `void`
|
||||
- **Description:** Clears internal history/state. Used after a "Kidnapped Robot" reset.
|
||||
|
||||
## Integration Tests
|
||||
- **Trajectory Generation:** Feed a sequence of 10 frames. Integrate relative poses. Compare shape of trajectory to ground truth (ignoring scale).
|
||||
|
||||
## Non-functional Tests
|
||||
- **Inference Speed:** Must run < 100ms (TensorRT) or reasonable time on CPU.
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
# L2 Global ReLocalization Component
|
||||
|
||||
## Detailed Description
|
||||
**L2 Global ReLocalization** addresses the "Kidnapped Robot" problem. It is triggered when L1 fails (tracking lost) or periodically to drift-correct. It uses **AnyLoc (DINOv2 + VLAD)** to describe the current UAV image and queries the **Map Data Provider's** Faiss index to find the most similar satellite tiles.
|
||||
|
||||
It does NOT give a precise coordinate, but rather a "Top-K" list of candidate tiles (coarse location).
|
||||
|
||||
## API Methods
|
||||
|
||||
### `localize_coarse`
|
||||
- **Input:** `frame: FrameObject`, `top_k: int`
|
||||
- **Output:** `List[CandidateLocation]`
|
||||
- **Description:**
|
||||
1. Runs DINOv2 inference on the frame to get feature map.
|
||||
2. Aggregates features via VLAD to get a global descriptor vector.
|
||||
3. Queries Map Data Provider's Global Index.
|
||||
4. Returns list of candidates.
|
||||
- **CandidateLocation:** `{ tile_id: str, similarity_score: float, center_gps: LatLon }`
|
||||
- **Test Cases:**
|
||||
- Input Frame A -> Returns Satellite Tile covering Frame A's location in Top-3.
|
||||
- Input Black/Occluded Image -> Returns Low confidence or random.
|
||||
|
||||
## Integration Tests
|
||||
- **Recall Test:** Run on dataset where ground truth is known. Verify that the correct tile is within the returned Top-5 for > 80% of queries.
|
||||
|
||||
## Non-functional Tests
|
||||
- **Query Time:** Vector search must be extremely fast (< 50ms) even with large indices. DINOv2 inference is the bottleneck.
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# L3 Metric Refinement Component
|
||||
|
||||
## Detailed Description
|
||||
**L3 Metric Refinement** provides the "Pinpoint" accuracy. It takes a pair of images: the current UAV frame and a candidate Satellite Tile (provided by L2 or determined by the State Estimator's prediction).
|
||||
|
||||
It uses **LiteSAM** to find dense correspondences between the aerial and satellite views. It computes a Homography and solves for the absolute world coordinate of the UAV center, achieving pixel-level accuracy.
|
||||
|
||||
## API Methods
|
||||
|
||||
### `refine_pose`
|
||||
- **Input:** `uav_frame: FrameObject`, `satellite_tile: SatelliteTile`, `prior_yaw: float` (optional)
|
||||
- **Output:** `L3Result`
|
||||
- **Description:**
|
||||
1. Preprocesses images for LiteSAM.
|
||||
2. Infers dense matches.
|
||||
3. Filters outliers (RANSAC).
|
||||
4. Computes Homography $H$.
|
||||
5. Decomposes $H$ into rotation and translation (using camera intrinsics and tile GSD).
|
||||
6. Returns `{ abs_lat: float, abs_lon: float, yaw: float, confidence: float, match_inliers: int }`.
|
||||
- **Test Cases:**
|
||||
- Perfect match pair -> Accurate Lat/Lon.
|
||||
- Mismatched pair (wrong tile) -> Low inlier count, Low confidence.
|
||||
|
||||
## Integration Tests
|
||||
- **Accuracy Verification:** Use a ground-truth pair (UAV image + known correct Satellite tile). Verify calculated Lat/Lon error is < 20 meters.
|
||||
|
||||
## Non-functional Tests
|
||||
- **Robustness:** Test with satellite images from different seasons (if available) or synthetically altered (color shift) to verify LiteSAM's semantic robustness.
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
# State Estimator Component
|
||||
|
||||
## Detailed Description
|
||||
The **State Estimator** is the "Brain" of the system. It utilizes a **Factor Graph (GTSAM)** to fuse information from all sources:
|
||||
- **Relative factors** from L1 (Frame $t-1 \to t$).
|
||||
- **Absolute pose factors** from L3 (Frame $t \to$ World).
|
||||
- **Prior factors** (Altitude, Smoothness).
|
||||
- **User Inputs** (Manual geometric constraints).
|
||||
|
||||
It handles the optimization window (Smoothing and Mapping) and outputs the final trajectory. It also manages the logic for "350m outlier" rejection using robust error kernels (Huber/Cauchy).
|
||||
|
||||
## API Methods
|
||||
|
||||
### `add_frame_update`
|
||||
- **Input:** `timestamp: float`, `l1_data: L1Result`, `l3_data: L3Result | None`, `altitude_prior: float`
|
||||
- **Output:** `EstimatedState`
|
||||
- **Description:**
|
||||
1. Adds a new node to the graph for time $t$.
|
||||
2. Adds factor for L1 (if tracking valid).
|
||||
3. Adds factor for L3 (if global match found).
|
||||
4. Adds altitude prior.
|
||||
5. Performs incremental optimization (iSAM2).
|
||||
6. Returns optimized state `{ lat, lon, alt, roll, pitch, yaw, uncertainty_covariance }`.
|
||||
- **Test Cases:**
|
||||
- Sequence with drift -> L3 update snaps trajectory back to truth.
|
||||
- Outlier L3 input (350m off) -> Robust kernel ignores it, trajectory stays smooth.
|
||||
|
||||
### `add_user_correction`
|
||||
- **Input:** `timestamp: float`, `uav_pixel: tuple`, `sat_coord: LatLon`
|
||||
- **Output:** `void`
|
||||
- **Description:** Adds a strong "Pin" constraint to the graph at the specified past timestamp and re-optimizes.
|
||||
- **Test Cases:**
|
||||
- Retroactive fix -> Updates current position estimate based on past correction.
|
||||
|
||||
### `get_current_state`
|
||||
- **Input:** `void`
|
||||
- **Output:** `EstimatedState`
|
||||
- **Description:** Returns the latest optimized pose.
|
||||
|
||||
## Integration Tests
|
||||
- **Full Graph Test:** Feed synthetic noisy data. Verify that the output error is lower than the input noise (fusion gain).
|
||||
|
||||
## Non-functional Tests
|
||||
- **Stability:** Ensure graph doesn't explode (numerical instability) over long sequences (2000+ frames).
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
# System Orchestrator Component
|
||||
|
||||
## Detailed Description
|
||||
The **System Orchestrator** ties all components together. It implements the main control loop (or async pipeline) and the state machine for the system's operational modes:
|
||||
1. **Initializing:** Loading models, maps.
|
||||
2. **Tracking:** Normal operation (L1 active, L3 periodic).
|
||||
3. **Lost/Searching:** L1 failed, L2 aggressive search active.
|
||||
4. **Critical Failure:** L2 failed repeatedly, requesting User Input.
|
||||
|
||||
It subscribes to the Input Manager, pushes data to L1/L2/L3, updates the State Estimator, and publishes results via the Service Interface. It also monitors **PDM@K** proxy metrics to trigger the "Human-in-the-Loop".
|
||||
|
||||
## API Methods
|
||||
|
||||
### `run_pipeline_step`
|
||||
- **Input:** `void` (Driven by event loop)
|
||||
- **Output:** `void`
|
||||
- **Description:**
|
||||
1. Get frame from Input Manager.
|
||||
2. Run L1.
|
||||
3. Check if L3 (Global) update is needed (e.g., every 10th frame or if L1 confidence low).
|
||||
4. If needed, run L2 -> L3.
|
||||
5. Update State Estimator.
|
||||
6. Check health (Covariance size).
|
||||
7. If Critical -> Publish Request Input.
|
||||
8. Publish Telemetry.
|
||||
- **Test Cases:**
|
||||
- Normal flow -> Telemetry published.
|
||||
- Loss of tracking -> State transitions to "Searching".
|
||||
|
||||
### `handle_user_input`
|
||||
- **Input:** `UserCommand`
|
||||
- **Output:** `void`
|
||||
- **Description:** Passes manual fix data to State Estimator and resets failure counters.
|
||||
|
||||
## Integration Tests
|
||||
- **End-to-End Simulation:** Connect all components. Run the full sequence. Verify final output CSV matches requirements.
|
||||
|
||||
## Non-functional Tests
|
||||
- **Timing Budget:** Measure total wall-clock time per `run_pipeline_step`. Must be < 5.0s (average).
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
# Test Data Driver Component
|
||||
|
||||
## Detailed Description
|
||||
The **Test Data Driver** acts as a mock input source for the ASTRAL-Next system in the sandbox/validation environment. It replaces the real hardware camera drivers. It is responsible for iterating through the provided dataset (`AD*.jpg`), managing the simulation clock, and providing the "Ground Truth" camera intrinsics.
|
||||
|
||||
It serves as the primary feeder for Integration Tests, ensuring the system can be validated against a known sequence of events.
|
||||
|
||||
## API Methods
|
||||
|
||||
### `initialize_source`
|
||||
- **Input:** `source_path: str`, `camera_config_path: str`
|
||||
- **Output:** `bool`
|
||||
- **Description:** Opens the image directory. Loads the camera intrinsic parameters (K matrix, distortion model) from the config file. Prepares the iterator.
|
||||
- **Test Cases:**
|
||||
- Valid path -> Returns True, internal state ready.
|
||||
- Invalid path -> Returns False, logs error.
|
||||
|
||||
### `get_next_frame`
|
||||
- **Input:** `void`
|
||||
- **Output:** `FrameObject | None`
|
||||
- **Description:** Retrieves the next available image from the sequence.
|
||||
- **Structure of FrameObject:**
|
||||
- `image_raw`: np.array (Original resolution)
|
||||
- `timestamp`: float
|
||||
- `frame_id`: int
|
||||
- `intrinsics`: CameraIntrinsics object
|
||||
- **Test Cases:**
|
||||
- End of sequence -> Returns None.
|
||||
- Corrupt image file -> Skips or raises error.
|
||||
|
||||
### `get_intrinsics`
|
||||
- **Input:** `void`
|
||||
- **Output:** `CameraIntrinsics`
|
||||
- **Description:** Returns the loaded camera parameters (fx, fy, cx, cy, distortion).
|
||||
- **Test Cases:**
|
||||
- Check against known values in `data_parameters.md`.
|
||||
|
||||
## Integration Tests
|
||||
- **Sequence Replay:** Point to `docs/00_problem/input_data`, iterate through all `AD*.jpg` files. verify correct ordering and total count (60 frames).
|
||||
|
||||
## Non-functional Tests
|
||||
- **File I/O:** Efficiently read large files from disk without blocking the test runner for extended periods.
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36" version="28.2.8">
|
||||
<diagram id="ASTRAL_NEXT_Components" name="ASTRAL-Next Architecture">
|
||||
<mxGraphModel dx="1554" dy="815" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1100" pageHeight="850" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="2" value="External World" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;verticalAlign=top;align=left;spacingLeft=10;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="40" width="180" height="700" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="3" value="ASTRAL-Next Service" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;fontColor=#333333;strokeColor=#6c8ebf;verticalAlign=top;align=left;spacingLeft=10;" parent="1" vertex="1">
|
||||
<mxGeometry x="240" y="40" width="840" height="700" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="4" value="UAV Camera" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
|
||||
<mxGeometry x="70" y="100" width="120" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="5" value="Satellite Provider" style="cloud;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
|
||||
<mxGeometry x="60" y="240" width="140" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="6" value="Client / UI / GCS" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="115" y="550" width="30" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="30" value="10 Test Data Driver (Files)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;dashed=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="60" y="50" width="140" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="7" value="02 Image Preprocessing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="300" y="100" width="140" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="8" value="03 Map Data Provider" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
||||
<mxGeometry x="300" y="240" width="140" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="9" value="09 System Orchestrator" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="500" y="150" width="160" height="350" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="10" value="04 Model Registry" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="750" y="100" width="140" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="11" value="05 L1 Visual Odometry" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="750" y="200" width="140" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="12" value="06 L2 Global ReLoc" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="750" y="300" width="140" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="13" value="07 L3 Metric Refinement" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="750" y="400" width="140" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="14" value="08 State Estimator" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="500" y="580" width="160" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="15" value="01 Service Interface" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
|
||||
<mxGeometry x="300" y="580" width="140" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="16" value="Raw Images" style="endArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="4" target="7" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="31" value="Mock Data" style="endArrow=classic;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;dashed=1;" parent="1" source="30" target="7" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="17" value="Tiles/Data" style="endArrow=classic;html=1;exitX=0.875;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="5" target="8" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="18" value="User Cmd" style="endArrow=classic;html=1;exitX=1;exitY=0.3333333333333333;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="6" target="15" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="19" value="Telemetry" style="endArrow=classic;html=1;entryX=1;entryY=0.6666666666666666;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;dashed=1;" parent="1" source="15" target="6" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="20" value="Frame Data" style="endArrow=classic;startArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.15;entryDx=0;entryDy=0;" parent="1" source="7" target="9" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="21" value="Sat Data" style="endArrow=classic;startArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.4;entryDx=0;entryDy=0;" parent="1" source="8" target="9" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="22" value="Commands/Data" style="endArrow=classic;startArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" parent="1" source="15" target="9" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="23" value="Visual Odometry" style="endArrow=classic;startArrow=classic;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="9" target="11" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="24" value="Global Loc" style="endArrow=classic;startArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="9" target="12" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="25" value="Metric Refine" style="endArrow=classic;startArrow=classic;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="9" target="13" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="26" value="Update/State" style="endArrow=classic;startArrow=classic;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9" target="14" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="27" value="Use Models" style="endArrow=classic;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;" parent="1" source="10" target="11" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
Reference in New Issue
Block a user