From a0ae5a208cccc1a3b4127da25f5c948bb2f8ec56 Mon Sep 17 00:00:00 2001 From: Dan Jones <danjon@noc.ac.uk> Date: Thu, 12 Sep 2024 09:06:14 +0100 Subject: [PATCH] feat: add waypoint status message for dry-run Rather than sending a goto to the platform the sfmc-adapter will publish a waypoint_status message which the c2-adapter can read and add to the positions service as a simulated waypoint --- examples/geojson/platform_status.json | 4 +- examples/mas-dt/waypoint_status.json | 24 ++ formats/payload.py | 8 +- formats/platform_status.py | 150 ++++++- generate_schema_config.py | 3 +- project/soar/swagger.json | 596 +++++++++++++++++++------- 6 files changed, 613 insertions(+), 172 deletions(-) create mode 100644 examples/mas-dt/waypoint_status.json diff --git a/examples/geojson/platform_status.json b/examples/geojson/platform_status.json index 4cfc131..4a7b1fc 100644 --- a/examples/geojson/platform_status.json +++ b/examples/geojson/platform_status.json @@ -22,7 +22,7 @@ "type": "Point", "coordinates": [ -10.122, - 178.2, + 78.2, 50.0, 20 ] @@ -31,7 +31,7 @@ "type": "Point", "coordinates": [ -10.5, - 178.5 + 78.5 ] } } diff --git a/examples/mas-dt/waypoint_status.json b/examples/mas-dt/waypoint_status.json new file mode 100644 index 0000000..3652914 --- /dev/null +++ b/examples/mas-dt/waypoint_status.json @@ -0,0 +1,24 @@ +{ + "header":{ + "message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd", + "timestamp": "2024-09-05T00:00:00Z", + "version": "v2.0.0-beta.1", + "source": "noc-sfmc", + "destination": "mas-dt.noc.slocum.unit_xxx.from_platform.platform_status", + "delivery_type": "publish", + "encoded": false + }, + "payload":{ + "message_type": "waypoint_status", + "platform_ID": "unit_xxx", + "platform_timestamp": "2024-09-05T00:00:00Z", + "status_source": "simulated", + "autonomy_engine_plan_ID": 1, + "mission_plan_ID": 1, + "mission_track_ID": 4, + "waypoint": { + "type": "Point", + "coordinates": [-10.122, 78.2, 50.0, 20.0] + } + } +} diff --git a/formats/payload.py b/formats/payload.py index 0868657..c1f85dc 100644 --- a/formats/payload.py +++ b/formats/payload.py @@ -5,9 +5,9 @@ payload_schema = { "alert": "#/components/schemas/alert", "instruction_set": "#/components/schemas/instruction_set", "mission_plan": "#/components/schemas/mission_plan", - "mission_plan_encoded": "#/components/schemas/" + "mission_plan_encoded", + "mission_plan_encoded": "#/components/schemas/mission_plan_encoded", "observation": "#/components/schemas/observation", - "observation_encoded": "#/components/schemas/" + "observation_encoded", + "observation_encoded": "#/components/schemas/observation_encoded", "planning_configuration": "#/components/schemas/" + "planning_configuration", "platform_status": "#/components/schemas/platform_status", @@ -15,7 +15,8 @@ payload_schema = { + "platform_status_encoded", "acknowledgement": "#/components/schemas/acknowledgement", "survey": "#/components/schemas/survey", - "survey_encoded": "#/components/schemas/" + "survey_encoded", + "survey_encoded": "#/components/schemas/survey_encoded", + "waypoint_status": "#/components/schemas/waypoint_status", }, }, "oneOf": [ @@ -31,5 +32,6 @@ payload_schema = { {"$ref": "#/components/schemas/platform_status_encoded"}, {"$ref": "#/components/schemas/survey"}, {"$ref": "#/components/schemas/survey_encoded"}, + {"$ref": "#/components/schemas/waypoint_status"}, ], } diff --git a/formats/platform_status.py b/formats/platform_status.py index 4780780..0a12615 100644 --- a/formats/platform_status.py +++ b/formats/platform_status.py @@ -25,27 +25,14 @@ sensor_schema = { }, } -platform_status_schema = { +platform_status_core_fields_schema = { "type": "object", "properties": { - "message_type": { - "type": "string", - "description": "Type of message", - "example": "platform_status", - "enum": ["platform_status"], - }, "platform_ID": { "type": "string", "description": "Unique identifier for this platform", "example": "reav-x-1", }, - "status_source": { - "type": "string", - "enum": ["usbl", "onboard_platform"], - "description": "Indicate if this status message is from the" - + " platform or USBL", - "example": "usbl", - }, "transmission_mode": { "type": "string", "enum": ["acoustics", "iridium", "wifi", "starlink"], @@ -172,7 +159,41 @@ platform_status_schema = { }, "sensor_config": sensor_schema, }, +} + +platform_status_schema = { + "type": "object", + "properties": { + "message_type": { + "type": "string", + "description": "Type of message", + "example": "platform_status", + "enum": ["platform_status"], + }, + "status_source": { + "type": "string", + "enum": ["usbl", "onboard_platform", "simulated"], + "description": "Indicate if this status message is from the" + + " platform or USBL", + "example": "usbl", + }, + }, + "allOf": [platform_status_core_fields_schema], "oneOf": [ + { + "type": "object", + "properties": { + "no_position_reason": { + "type": "string", + "enum": ["missing", "invalid", "old", "poor_fix"], + "description": "Why position data is unavailable", + "example": "invalid", + }, + }, + "required": [ + "no_position_reason", + ], + }, { "type": "object", "properties": { @@ -254,3 +275,104 @@ platform_status_schema = { "platform_timestamp", ], } + +waypoint_status_schema = { + "type": "object", + "properties": { + "message_type": { + "type": "string", + "description": "Type of message", + "example": "waypoint_status", + "enum": ["waypoint_status"], + }, + "status_source": { + "type": "string", + "enum": ["onboard_platform", "simulated", "autonomy"], + "description": "Indicate if this status message is from the" + + " platform or USBL", + "example": "usbl", + }, + }, + "allOf": [platform_status_core_fields_schema], + "oneOf": [ + { + "type": "object", + "properties": { + "position": { + "$ref": "https://geojson.org/schema/Point.json", + }, + "waypoint": { + "$ref": "https://geojson.org/schema/Point.json", + }, + }, + "required": [ + "waypoint", + ], + }, + { + "type": "object", + "properties": { + "latitude": { + "type": "number", + "format": "float", + "description": "Latitude (Y-coordinate) in decimal degrees.", + "example": 178.2, + }, + "longitude": { + "type": "number", + "format": "float", + "description": "Longitude (X-coordinate) in decimal degrees.", + "example": -10.122, + }, + "depth": { + "type": "number", + "format": "float", + "description": "Target depth in metres", + "example": 50.0, + "default": 0.0, + }, + "altitude": { + "type": "number", + "format": "float", + "description": "Target altitude in metres", + "example": 20.0, + }, + "waypoint_latitude": { + "type": "number", + "format": "float", + "description": "Latitude (Y-coordinate) in decimal degrees.", + "example": 178.2, + }, + "waypoint_longitude": { + "type": "number", + "format": "float", + "description": "Longitude (X-coordinate) in decimal degrees.", + "example": -10.122, + }, + "waypoint_depth": { + "type": "number", + "format": "float", + "description": "Target depth in metres", + "example": 50.0, + "default": 0.0, + }, + "waypoint_altitude": { + "type": "number", + "format": "float", + "description": "Target altitude in metres", + "example": 20.0, + }, + }, + "required": [ + "waypoint_latitude", + "waypoint_longitude", + ], + }, + ], + "required": [ + "message_type", + "platform_ID", + "status_source", + "platform_timestamp", + ], +} diff --git a/generate_schema_config.py b/generate_schema_config.py index 3c0f530..aa784fb 100644 --- a/generate_schema_config.py +++ b/generate_schema_config.py @@ -6,7 +6,7 @@ from formats.observation import observation_schema from formats.observation_encoded import observation_encoded_schema from formats.payload import payload_schema from formats.planning_configuration import planning_configuration_schema -from formats.platform_status import platform_status_schema +from formats.platform_status import platform_status_schema, waypoint_status_schema from formats.platform_status_encoded import platform_status_encoded_schema from formats.survey import survey_schema from formats.survey_encoded import survey_encoded_schema @@ -74,6 +74,7 @@ def get_swagger_config(reload=False): "alert": alert_schema, "instruction_set": instruction_set_schema, "config_file": config_file_schema, + "waypoint_status": waypoint_status_schema, } }, } diff --git a/project/soar/swagger.json b/project/soar/swagger.json index b2a1073..c9def12 100644 --- a/project/soar/swagger.json +++ b/project/soar/swagger.json @@ -1820,7 +1820,8 @@ "platform_status": "#/components/schemas/platform_status", "platform_status_encoded": "#/components/schemas/platform_status_encoded", "survey": "#/components/schemas/survey", - "survey_encoded": "#/components/schemas/survey_encoded" + "survey_encoded": "#/components/schemas/survey_encoded", + "waypoint_status": "#/components/schemas/waypoint_status" }, "propertyName": "message_type" }, @@ -1860,6 +1861,9 @@ }, { "$ref": "#/components/schemas/survey_encoded" + }, + { + "$ref": "#/components/schemas/waypoint_status" } ] }, @@ -2207,7 +2211,183 @@ "type": "object" }, "platform_status": { + "allOf": [ + { + "properties": { + "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_output": { + "description": "Battery output in kW", + "example": 80.2, + "format": "float", + "type": "number" + }, + "battery_remaining_capacity": { + "description": "Battery remaining % provided by respective C2", + "example": 80.2, + "format": "float", + "type": "number" + }, + "endurance": { + "description": "Estimate of hours of operation remaining based on present output or performance", + "example": 7.4, + "format": "float", + "type": "number" + }, + "fuel_remaining_capacity": { + "description": "Percentage remaining capacity", + "example": 80.2, + "format": "float", + "type": "number" + }, + "fuel_volume": { + "description": "Litres of liquid fuel", + "example": 12.5, + "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" + }, + "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" + }, + "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" + }, + "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" + } + }, + "type": "object" + } + ], "oneOf": [ + { + "properties": { + "no_position_reason": { + "description": "Why position data is unavailable", + "enum": [ + "missing", + "invalid", + "old", + "poor_fix" + ], + "example": "invalid", + "type": "string" + } + }, + "required": [ + "no_position_reason" + ], + "type": "object" + }, { "properties": { "position": { @@ -2283,64 +2463,6 @@ } ], "properties": { - "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_output": { - "description": "Battery output in kW", - "example": 80.2, - "format": "float", - "type": "number" - }, - "battery_remaining_capacity": { - "description": "Battery remaining % provided by respective C2", - "example": 80.2, - "format": "float", - "type": "number" - }, - "endurance": { - "description": "Estimate of hours of operation remaining based on present output or performance", - "example": 7.4, - "format": "float", - "type": "number" - }, - "fuel_remaining_capacity": { - "description": "Percentage remaining capacity", - "example": 80.2, - "format": "float", - "type": "number" - }, - "fuel_volume": { - "description": "Litres of liquid fuel", - "example": 12.5, - "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" - }, - "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" - }, "message_type": { "description": "Type of message", "enum": [ @@ -2349,106 +2471,15 @@ "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" + "onboard_platform", + "simulated" ], "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": [ @@ -2628,6 +2659,267 @@ "is_binary" ], "type": "object" + }, + "waypoint_status": { + "allOf": [ + { + "properties": { + "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_output": { + "description": "Battery output in kW", + "example": 80.2, + "format": "float", + "type": "number" + }, + "battery_remaining_capacity": { + "description": "Battery remaining % provided by respective C2", + "example": 80.2, + "format": "float", + "type": "number" + }, + "endurance": { + "description": "Estimate of hours of operation remaining based on present output or performance", + "example": 7.4, + "format": "float", + "type": "number" + }, + "fuel_remaining_capacity": { + "description": "Percentage remaining capacity", + "example": 80.2, + "format": "float", + "type": "number" + }, + "fuel_volume": { + "description": "Litres of liquid fuel", + "example": 12.5, + "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" + }, + "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" + }, + "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" + }, + "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" + } + }, + "type": "object" + } + ], + "oneOf": [ + { + "properties": { + "position": { + "$ref": "#/components/schemas/geojson.org.schema.Point.json" + }, + "waypoint": { + "$ref": "#/components/schemas/geojson.org.schema.Point.json" + } + }, + "required": [ + "waypoint" + ], + "type": "object" + }, + { + "properties": { + "altitude": { + "description": "Target altitude in metres", + "example": 20.0, + "format": "float", + "type": "number" + }, + "depth": { + "default": 0.0, + "description": "Target depth in metres", + "example": 50.0, + "format": "float", + "type": "number" + }, + "latitude": { + "description": "Latitude (Y-coordinate) in decimal degrees.", + "example": 178.2, + "format": "float", + "type": "number" + }, + "longitude": { + "description": "Longitude (X-coordinate) in decimal degrees.", + "example": -10.122, + "format": "float", + "type": "number" + }, + "waypoint_altitude": { + "description": "Target altitude in metres", + "example": 20.0, + "format": "float", + "type": "number" + }, + "waypoint_depth": { + "default": 0.0, + "description": "Target depth in metres", + "example": 50.0, + "format": "float", + "type": "number" + }, + "waypoint_latitude": { + "description": "Latitude (Y-coordinate) in decimal degrees.", + "example": 178.2, + "format": "float", + "type": "number" + }, + "waypoint_longitude": { + "description": "Longitude (X-coordinate) in decimal degrees.", + "example": -10.122, + "format": "float", + "type": "number" + } + }, + "required": [ + "waypoint_latitude", + "waypoint_longitude" + ], + "type": "object" + } + ], + "properties": { + "message_type": { + "description": "Type of message", + "enum": [ + "waypoint_status" + ], + "example": "waypoint_status", + "type": "string" + }, + "status_source": { + "description": "Indicate if this status message is from the platform or USBL", + "enum": [ + "onboard_platform", + "simulated", + "autonomy" + ], + "example": "usbl", + "type": "string" + } + }, + "required": [ + "message_type", + "platform_ID", + "status_source", + "platform_timestamp" + ], + "type": "object" } } }, -- GitLab