From 925814a7b330b84e8e060088b43c47c060fe39c6 Mon Sep 17 00:00:00 2001 From: Trishna Saeharaseelan <trishna.saeharaseelan@noc.ac.uk> Date: Fri, 3 Mar 2023 11:47:30 +0000 Subject: [PATCH] fix: projects to project --- __init__.py | 2 +- project/__init__.py | 0 project/soar/SOAR_README.md | 51 +++ project/soar/swagger.json | 697 ++++++++++++++++++++++++++++++++++++ tests/test_schemas.py | 2 +- 5 files changed, 750 insertions(+), 2 deletions(-) create mode 100644 project/__init__.py create mode 100644 project/soar/SOAR_README.md create mode 100644 project/soar/swagger.json diff --git a/__init__.py b/__init__.py index 41054da..69f9fe8 100644 --- a/__init__.py +++ b/__init__.py @@ -5,7 +5,7 @@ from flask import Flask __all__ = [ "formats", "examples", - "projects", + "project", "tests", ] app = Flask(__name__) diff --git a/project/__init__.py b/project/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/project/soar/SOAR_README.md b/project/soar/SOAR_README.md new file mode 100644 index 0000000..74338d8 --- /dev/null +++ b/project/soar/SOAR_README.md @@ -0,0 +1,51 @@ +# SoAR Project +Squad of Adaptive Robots Project + +----------------------------------- +## Message Data Flow Summary +| Partner | Message Type | Source | Destination | Via Comms Backbone? | Contains Serialized Vehicle-Specific File? | Comment | +| --------------------- | ------------------------ | --------------------- | ------------------------------------------ | ------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------- | +| Hydrosurv (reav) | platform status-compiled | Reav-60 | Hydrosurv Adapter | No | Yes | N/A | +| Hydrosurv (reav) | platform status | Hydrosurv Adapter | Autonomy Engine | Yes | No | N/A | +| Hydrosurv (reav) | mission plan | Autonomy Engine | Hydrosurv Adapter | Yes | No | N/A | +| Hydrosurv (reav) | mission plan-compiled | Hydrosurv Adapter | Reav-60 | No | Yes | N/A | +| Hydrosurv (reav) | acknowledgement | Hydrosurv Adapter | Comms Backbone (Audit) | Yes | No | When hydrosurv adapter has (a) Received, (b) Sent Plan to Reav, and (c) Executed by Reav | +| RHU (autonomy engine) | platform status | C2’s Hydrosurv/Ecosub | Autonomy Engine | Yes | No | N/A | +| RHU (autonomy engine) | mission plan | Autonomy Engine | C2’s Hydrosurv/Ecosub | Yes | No | N/A | +| RHU (autonomy engine) | planning configuration | GUI | Autonomy Engine | Yes | No | N/A | +| RHU (autonomy engine) | observation | Ecosub C2 | Autonomy Engine | Yes | No | N/A | +| RHU (autonomy engine) | survey progress | Ecosub/AH1 C2 | Autonomy Engine | TBD | TBD | N/A | +| RHU (autonomy engine) | scanline | TBD | TBD | TBD | TBD | N/A | +| RHU (autonomy engine) | emergency | GUI | TBD – all | TBD | TBD | TBD – all platforms pre-compiled ABORT via Black box | +| Planet Ocean (ecosub) | platform status-compiled | Ecosub | Black Box TBC | No | Yes | Via Hermes + Router | +| Planet Ocean (ecosub) | platform status-compiled | Black Box TBC | Ecosub C2 | Yes | Yes | N/A | +| Planet Ocean (ecosub) | platform status | Ecosub C2 | Autonomy Engine | Yes | No | N/A | +| Planet Ocean (ecosub) | mission plan | Autonomy Engine | Ecosub C2 | Yes | No | N/A | +| Planet Ocean (ecosub) | mission plan | Ecosub C2 | Black Box TBC | Yes | Yes | N/A | +| Planet Ocean (ecosub) | mission plan-compiled | Black Box TBC | Ecosub | No | Yes | Via Hermes + Router | +| Planet Ocean (ecosub) | observation-compiled | Ecosub | Black Box TBC | No | Yes | Via Hermes + Router | +| Planet Ocean (ecosub) | observation-compiled | Black Box TBC | Ecosub C2 | Yes | Yes | N/A | +| Planet Ocean (ecosub) | observation | Ecosub C2 | Autonomy Engine | Yes | No | N/A | +| Planet Ocean (ecosub) | survey progress | TBD | TBD | TBD | TBD | N/A | +| Planet Ocean (ecosub) | survey progress | TBD | TBD | TBD | TBD | N/A | +| Planet Ocean (ecosub) | scanline | TBD | TBD | TBD | TBD | N/A | +| Planet Ocean (ecosub) | scanline | TBD | TBD | TBD | TBD | N/A | +| Planet Ocean (ecosub) | emergency | GUI | TBD – Ecosub (ABORT command via Black Box) | TBD | TBD | TBD – all platforms pre-compiled ABORT via Black box | +| NOC (AH1) | platform status-compiled | AH1 | Black Box TBC | No | Yes | Via Hermes + Router | +| NOC (AH1) | platform status-compiled | Black Box TBC | NOC C2 | Yes | Yes | N/A | +| NOC (AH1) | platform status | NOC C2 | Autonomy Engine | Yes | No | N/A | +| NOC (AH1) | scan point | Autonomy Engine | NOC C2 | Yes | No | N/A | +| NOC (AH1) | scan point-compiled | NOC C2 | Black Box TBC | Yes | Yes | Would this technically be a mission plan-compiled? | +| NOC (AH1) | scan point | Black Box TBC | Ecosub | No | Yes | Via Hermes + Router | +| NOC (AH1) | survey progress | TBD | TBD | TBD | TBD | TBD | +| NOC (AH1) | survey progress | TBD | TBD | TBD | TBD | TBD | +| NOC (AH1) | emergency | GUI | TBD – AH1 (ABORT command via Black Box) | TBD | TBD | TBD – all platforms pre-compiled ABORT via Black box | +| NOC (GUI) | planning configuration | GUI | Autonomy Engine | Yes | No | N/A | +| NOC (GUI) | emergency | GUI | TBD | TBD | TBD | TBD | + +## Run Docs +1. Run the command below +``` +python3 generate_swagger.py +``` +2. Go to `http://127.0.0.1:5000/soardocs/` diff --git a/project/soar/swagger.json b/project/soar/swagger.json new file mode 100644 index 0000000..9bdf22a --- /dev/null +++ b/project/soar/swagger.json @@ -0,0 +1,697 @@ +{ + "components":{ + "schemas":{ + "MESSAGE":{ + "description":"Full message definition with message-metadata in `header` and different message type schemas under `payload`", + "properties":{ + "header":{ + "$ref":"#/components/schemas/header" + }, + "payload":{ + "$ref":"#/components/schemas/payload" + } + }, + "required":[ + "header", + "payload" + ], + "type":"object" + }, + "acknowledgement":{ + "properties":{ + "approved":{ + "description":"Human-in-the-loop approval.1 - Plan approved; 0 - Plan Rejected", + "type":"boolean" + }, + "autonomy_engine_plan_ID":{ + "description":"Mission plan ID (according to Autonomy Engine's mission plan number sent) executed by platform", + "example":1, + "type":"integer" + }, + "message_type":{ + "description":"Type of message", + "example":"acknowledgement", + "type":"string" + }, + "platform_ID":{ + "description":"Unique identifier for this platform", + "example":"reav-x-1", + "type":"string" + } + }, + "required":[ + "message_type", + "autonomy_engine_plan_ID", + "platform_ID", + "approved" + ], + "type":"object" + }, + "header":{ + "discriminator":{ + "propertyName":"message_type" + }, + "properties":{ + "delivery_type":{ + "default":"publish", + "description":"To publish or broadcast this message.", + "enum":[ + "broadcast", + "publish" + ], + "example":"publish", + "type":"string" + }, + "destination":{ + "description":"Publisher topic; What is the destination of this message", + "example":"ah1", + "type":"string" + }, + "encoded":{ + "description":"Indicate that message raw (encoded) or decoded. Options: encoded=True, decoded=False", + "example":false, + "type":"boolean" + }, + "message_ID":{ + "description":"An identifier for the type of message received.", + "example":"b427003c-0000-11aa-a1eb-bvcdfghjgfdd", + "type":"string" + }, + "source":{ + "description":"The sender; Where is this message from", + "example":"autonomy_engine", + "type":"string" + }, + "timestamp":{ + "description":"Timestamp of message", + "example":"2022-11-16T00:00:00Z", + "format":"date-time", + "type":"string" + }, + "version":{ + "description":"Version of comms backbone message format protocol", + "example":2.0, + "format":"float", + "type":"number" + } + }, + "type":"object" + }, + "mission_plan":{ + "properties":{ + "autonomy_engine_plan_ID":{ + "description":"Unique identifier for this plangenerated by the Autonomy Engine", + "example":3, + "type":"integer" + }, + "message_type":{ + "description":"Type of message", + "example":"mission_plan", + "type":"string" + }, + "plan":{ + "items":{ + "properties":{ + "action":{ + "description":"Autonomy Engine's action from `move`, `payload`, `dive`, `send_hits`, `scanline`, `scanpoint`.", + "example":"move", + "type":"string" + }, + "activate_payload":{ + "description":"To activate/deactivate sensor for Autosub Hover-1 --> `MBES` sensor and for EcoSUB --> `Sidescan`", + "example":true, + "type":"boolean" + }, + "altitude":{ + "description":"Altitude of next action", + "example":15.0, + "format":"float", + "type":"number" + }, + "depth":{ + "description":"Depth of next action", + "example":15.0, + "format":"float", + "type":"number" + }, + "flight_style":{ + "description":"Platform-specific modes/flight styles to perform next action", + "example":"orbit", + "type":"string" + }, + "send_environmental_data":{ + "description":"To trigger the platform to send list of observations if any found", + "example":false, + "type":"boolean" + }, + "start_point_latitude":{ + "description":"Start point, x-coordinate", + "example":-4.187143188645706, + "format":"float", + "type":"number" + }, + "start_point_longitude":{ + "description":"Start point, y-coordinate", + "example":50.37072283932642, + "format":"float", + "type":"number" + }, + "target_waypoint_latitude":{ + "description":"Target waypoint, x-coordinate", + "example":-4.187143188645706, + "format":"float", + "type":"number" + }, + "target_waypoint_longitude":{ + "description":"Target waypoint, y-coordinate", + "example":50.37072283932642, + "format":"float", + "type":"number" + } + }, + "required":[ + "target_waypoint_latitude", + "target_waypoint_longitude" + ], + "type":"object" + }, + "type":"array" + }, + "platform_ID":{ + "description":"Unique identifier for this platform", + "example":"reav-x-1", + "type":"string" + } + }, + "required":[ + "message_type", + "autonomy_engine_plan_ID", + "platform_ID", + "plan" + ], + "type":"object" + }, + "observation":{ + "properties":{ + "additional_data":{ + "description":"Placeholder field for any additional data", + "example":{ + "sensor_payload":false + } + }, + "message_type":{ + "description":"Type of message", + "example":"observation", + "type":"string" + }, + "platform_ID":{ + "description":"Unique identifier for this platform", + "example":"reav-x-1", + "type":"string" + }, + "points_of_interest":{ + "description":"Points from features of interest identified by platform if any found.", + "items":{ + "properties":{ + "latitude":{ + "description":"Identified x-coordinate of point of interest", + "example":178.2, + "format":"float", + "type":"number" + }, + "longitude":{ + "description":"Identified y-coordinate of point of interest", + "example":-10.122, + "format":"float", + "type":"number" + }, + "quality_of_point":{ + "description":"Quality/strength of points from features of interest identified by platform.", + "example":0.98, + "format":"float", + "type":"number" + } + }, + "required":[ + "latitude", + "longitude" + ], + "type":"object" + }, + "type":"array" + }, + "region_surveyed":{ + "description":"Region surveyed by given platform. GEOJSON", + "example":"", + "nullable":true + } + }, + "required":[ + "message_type", + "platform_ID" + ], + "type":"object" + }, + "payload":{ + "discriminator":{ + "mapping":{ + "acknowledgement":"#/components/schemas/acknowledgement", + "mission_plan":"#/components/schemas/mission_plan", + "observation":"#/components/schemas/observation", + "planning_configuration":"#/components/schemas/planning_configuration", + "platform_status":"#/components/schemas/platform_status" + }, + "propertyName":"message_type" + }, + "oneOf":[ + { + "$ref":"#/components/schemas/acknowledgement" + }, + { + "$ref":"#/components/schemas/mission_plan" + }, + { + "$ref":"#/components/schemas/observation" + }, + { + "$ref":"#/components/schemas/planning_configuration" + }, + { + "$ref":"#/components/schemas/platform_status" + } + ] + }, + "planning_configuration":{ + "properties":{ + "exclusion_zones":{ + "description":"Exclusion zones for all platforms", + "items":{ + "description":"Using GEOJSON, exact 4-point region (rectangle shaped)", + "properties":{ + "geometry_coordinates":{ + "example":[ + [ + [ + -4.187143188645706, + 50.37072283932642 + ], + [ + -4.202697005964865, + 50.368816892405874 + ], + [ + -4.203156724702808, + 50.365640144076906 + ], + [ + -4.19449868846155, + 50.362267670845654 + ] + ] + ], + "type":"array" + } + }, + "type":"object" + }, + "type":"array" + }, + "message_type":{ + "description":"Type of message", + "example":"planning_configuration", + "type":"string" + }, + "planning_config_ID":{ + "description":"Unique identifier tagged to version of this configuration plan", + "example":3, + "type":"integer" + }, + "squads":{ + "items":{ + "properties":{ + "no_of_platforms":{ + "description":"Number of platforms", + "example":3, + "type":"integer" + }, + "platforms":{ + "description":"Squad consists of these platforms", + "items":{ + "properties":{ + "additional_specs":{ + "description":"Any addition fields/data to be added here", + "example":{ + "scan_type":"DVL", + "swath_width":10.0 + } + }, + "emergency":{ + "properties":{ + "additional_data":{ + "description":"Any addition fields/data to be added here", + "example":{ + + } + }, + "safe_command":{ + "description":"Command/Action that is native to respective partner's platform/C2", + "enum":[ + "go_home", + "abort_now", + "stop_mission" + ], + "example":"go_home", + "type":"string" + }, + "target_depth":{ + "description":"Z-coordinate safe place for respective platform . If platform to NOT stay at depth, key in `0.0`", + "example":10.0, + "format":"float", + "type":"number" + }, + "target_waypoint_latitude":{ + "description":"X-coordinate safe place for respective platform", + "example":-7.432, + "format":"float", + "type":"number" + }, + "target_waypoint_longitude":{ + "description":"Y-coordinate safe place for respective platform", + "example":50.365, + "format":"float", + "type":"number" + } + }, + "required":[ + "target_waypoint_latitude", + "target_waypoint_longitude", + "target_depth" + ], + "type":"object" + }, + "max_velocity":{ + "description":"Maximum altitude set for squad.", + "example":0.9, + "format":"float", + "type":"number" + }, + "min_altitude":{ + "description":"Minimum altitude set for squad.", + "example":15.2, + "format":"float", + "type":"number" + }, + "min_velocity":{ + "description":"Minimum velocity set for squad.", + "example":0.1, + "format":"float", + "type":"number" + }, + "model":{ + "example":"reav", + "type":"string" + }, + "platform_ID":{ + "description":"Unique identifier for this platform", + "example":"reav-x-1", + "type":"string" + }, + "serial":{ + "description":"platform serial number", + "example":"reav-60", + "type":"string" + } + }, + "required":[ + "platform_ID", + "serial", + "model", + "emergency", + "min_altitude", + "min_velocity", + "max_velocity" + ], + "type":"object" + }, + "type":"array" + }, + "region_of_interest":{ + "description":"Using GEOJSON, exact 4-point region (rectangle shaped)", + "properties":{ + "geometry_coordinates":{ + "example":[ + [ + [ + -4.187143188645706, + 50.37072283932642 + ], + [ + -4.202697005964865, + 50.368816892405874 + ], + [ + -4.203156724702808, + 50.365640144076906 + ], + [ + -4.19449868846155, + 50.362267670845654 + ] + ] + ], + "type":"array" + } + }, + "type":"object" + }, + "squad_ID":{ + "description":"Identifier of given squad", + "example":23, + "type":"integer" + }, + "squad_mission_type":{ + "description":"Mission of given squad: `tracking`, `survey`, `inspection`", + "enum":[ + "tracking", + "survey", + "inspection" + ], + "example":"survey", + "type":"string" + }, + "squad_state":{ + "description":"In execution, Waiting.. <define further>", + "example":false, + "type":"string" + } + }, + "required":[ + "squad_ID", + "no_of_platforms", + "platforms", + "squad_mission_type", + "squad_state" + ], + "type":"object" + }, + "type":"array" + } + }, + "required":[ + "message_type", + "planning_config_ID", + "squads", + "exclusion_zones" + ], + "type":"object" + }, + "platform_status":{ + "properties":{ + "altitude":{ + "description":"Target altitude in metres", + "example":20.0, + "format":"float", + "type":"number" + }, + "autonomy_engine_plan_ID":{ + "description":"Last mission plan ID (according to Autonomy Engine's mission plan number sent) executed by platform", + "example":1, + "type":"integer" + }, + "battery_remaining_capacity":{ + "description":"Battery remaining % provided by respective C2", + "example":80.2, + "format":"float", + "type":"number" + }, + "depth":{ + "default":0.0, + "description":"Target depth in metres", + "example":50.0, + "format":"float", + "type":"number" + }, + "heading":{ + "description":"Angular distance relative to north, usually 000\u00b0 at north, clockwise through 359\u00b0, in degrees", + "example":124.3, + "format":"float", + "type":"number" + }, + "health_status":{ + "description":"Health status where 0 is OK, 1 is platform has an ERROR", + "example":false, + "type":"boolean" + }, + "latitude":{ + "description":"Latitude in decimal degrees.", + "example":178.2, + "format":"float", + "type":"number" + }, + "localisation_east_error":{ + "description":"Difference in EAST between deadreckoningand USBL update.", + "example":0.000129, + "format":"float", + "type":"number" + }, + "localisation_north_error":{ + "description":"Difference in NORTH between deadreckoning and USBL update.", + "example":0.000129, + "format":"float", + "type":"number" + }, + "longitude":{ + "description":"Longitude in decimal degrees.", + "example":-10.122, + "format":"float", + "type":"number" + }, + "message_type":{ + "description":"Type of message", + "example":"platform_status", + "type":"string" + }, + "mission_plan_ID":{ + "description":"Mission plan ID according to platform-C2 system", + "example":1, + "type":"integer" + }, + "mission_track_ID":{ + "description":"Track number - stage in mission (e.g. 4 --> Waypoint 3 to Waypoint 4)", + "example":4, + "type":"integer" + }, + "platform_ID":{ + "description":"Unique identifier for this platform", + "example":"reav-x-1", + "type":"string" + }, + "platform_state":{ + "description":"Current state executed by platform. E.g. STOP, IDLE, ABORT.", + "example":"ABORT", + "type":"string" + }, + "platform_timestamp":{ + "description":"Timestamp for onboard platform status message", + "example":"2022-12-21T00:00:00Z", + "format":"date-time", + "type":"string" + }, + "range_to_go":{ + "description":"Estimated distance to reach next waypoint", + "example":124.3, + "format":"float", + "type":"number" + }, + "sensor_config":{ + "description":"Scanning sensor on platform available to be controlled by the Autonomy Engine", + "properties":{ + "additional_data":{ + "description":"Any addition fields/data to be added here", + "example":{ + "payload":[ + 1.2, + 434 + ] + }, + "type":"object" + }, + "sensor_on":{ + "description":"Sensor switched on (True) or off (False)", + "example":true, + "type":"boolean" + }, + "sensor_serial":{ + "description":"serial number of sensor", + "example":"mbes-002a", + "type":"string" + } + }, + "type":"object" + }, + "speed_over_ground":{ + "description":"Speed over ground", + "example":124.3, + "format":"float", + "type":"number" + }, + "status_source":{ + "description":"Indicate if this status message is from the platform or USBL", + "enum":[ + "usbl", + "onboard_platform" + ], + "example":"usbl", + "type":"string" + }, + "thrust_applied":{ + "description":"Thrust applied", + "example":124.3, + "format":"float", + "type":"number" + }, + "transmission_mode":{ + "description":"Mode in which status message was transmitted when on the surface (e.g. iridium/wifi) or underwater (e.g. acoustics)", + "enum":[ + "acoustics", + "iridium", + "wifi", + "starlink" + ], + "example":"wifi", + "type":"string" + }, + "usbl_fix_seconds_ago":{ + "description":"USBL Fix received x second ago.", + "example":10.0, + "format":"float", + "type":"number" + }, + "water_current_velocity":{ + "description":"Water current magnitude and direction", + "example":"124.3NE", + "type":"string" + } + }, + "required":[ + "message_type", + "platform_ID", + "status_source", + "platform_timestamp", + "latitude", + "longitude" + ], + "type":"object" + } + } + }, + "info":{ + "description":"SoAR message protocol in schemas", + "title":"SoAR Backbone Message Formats", + "version":"1.0" + }, + "openapi":"3.0.2", + "paths":{ + + } +} \ No newline at end of file diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 830525c..2f9d465 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -7,7 +7,7 @@ import json import os -SCHEMA_DIR = "projects/soar/swagger.json" +SCHEMA_DIR = "project/soar/swagger.json" MOCK_DATA_DIR = "examples/" -- GitLab