diff --git a/docs/generate_swagger.py b/docs/generate_swagger.py index bbd8765e2d2f178e62169d47efbe4ed0f93bc00e..ba5f7e3c06b280aaa56ccc6637e9fb7fae853b2e 100644 --- a/docs/generate_swagger.py +++ b/docs/generate_swagger.py @@ -23,47 +23,11 @@ swagger_template = dict( }, host=LazyString(lambda: request.host), ) -message_header_schema = api.model( - "MessageHeader", - { - "timestamp": fields.DateTime( - required=True, - description="Timestamp of message", - example="2022-11-16T00:00:00Z", - ), - "source": fields.String( - required=True, - description="Where is this message from", - example="autonomy_engine", - ), - "destination": fields.String( - required=True, - description="What is the destination of this message", - example="ah-1", - ), - "encoded": fields.Boolean( - required=True, - description="Indicate that message raw (encoded) or decoded. " - + "Options: encoded=True, decoded=False", - example=False, - ), - "type": fields.String( - required=True, - description="Type of message", - example="platform_status", - ), - "payload": fields.Raw(required=True) # TODO: schema applicable changes according to "type" - }, -) + full_message_schema = api.model( "FullMessageSchema", { - "uuid": fields.DateTime( # add this - required=True, - description="Timestamp of message", - example="2022-11-16T00:00:00Z", - ), "timestamp": fields.DateTime( required=True, description="Timestamp of message", @@ -95,10 +59,9 @@ full_message_schema = api.model( description="Content of Message", # example="{}", ), - } + }, ) - constraints_schema = api.model( "ConstraintsSchema", { @@ -147,18 +110,172 @@ platform_schema = api.model( }, ) +action_schema = api.model( + "AutonomyEngineAction", + { + "action": fields.String( + required=True, + description="Autonomy Engine's action from `move`, `payload`," + + " `dive`, `send_hits`, `scanline`, `scanpoint`.", + example="move", + ), + "flight_style": fields.String( + required=False, + description="Platform-specific modes/flight styles to perform next action", + example="orbit", + ), + "latitude_waypoint": fields.Float( + required=True, + description="Next waypoint, x-coordinate", + example=-4.187143188645706, + ), + "longitude_waypoint": fields.Float( + required=True, + description="Next waypoint, y-coordinate", + example=50.37072283932642, + ), + "altitude": fields.Float( + required=False, + description="Altitude of next action", + example=15.0, + ), + "depth": fields.Float( + required=False, + description="Depth of next action", + example=15.0, + ), + "activate_payload": fields.Boolean( + required=False, + description="To activate/deactivate sensor for Autosub " + + "Hover-1 --> `MBES` sensor and for EcoSUB --> `Sidescan`", + example=True, + ), + "send_environmental_data": fields.Boolean( + required=False, + description="To trigger the platform to send list of observations if any found", + example=False, + ), + "scanline": fields.Boolean( + required=False, + description="To trigger the platform to scan-line", + example=False, + ), + "scanpoint": fields.Boolean( + required=False, + description="To trigger the platform to send list of observations if any found", + example=False, + ), + }, +) + +mission_plan_schema = api.model( + "MissionPlan", + { + "message": fields.Nested( + full_message_schema, + required=True, + description="Message header", + ), + "plan_ID": fields.Integer( + required=True, + description="Identifier of given mission sequence planned", + example=1, + ), + "platform_serial": fields.String( + required=True, + description="Serial of target platform to send mission to", + example="reav-60", + ), + "plan": fields.List( + fields.Nested(action_schema), + required=True, + description="Sequence of actions/instructions generated by the " + + " Autonomy Engine that should be compiled by the respective C2.", + ), + }, +) + +observation_schema = api.model( + "Observation", + { + "message": fields.Nested( + full_message_schema, + required=True, + description="Message header", + ), + "platform_serial": fields.String( + required=True, + description="Serial of platform to sendign observations", + example="ecosub-3", + ), + # "observation_type" ==> payloads tied to different types maybe? + # properties of each observation? + "points_of_interest": fields.Float( + required=False, + description="Points from features of interest identified by platform if any found. DEFINE FORMAT.", + example="", + ), + "region_surveyed": fields.Float( + required=False, + description="Region surveyed by given platform. DEFINE FORMAT. GEOJSON?", + example="", + ), + "quality_of_points": fields.Float( + required=False, + description="Quality/strength of points from features of interest identified by platform. DEFINE FORMAT.", + example=0.98, + ), + "additional_data": fields.Raw( + required=False, + description="Placeholder field for any additional data", + example={"sensor_payload": False}, + ), + }, +) + + +region_schema = api.model( + "RegionSchema", + { + "region": fields.Raw( + required=True, + description="Using GEOJSON, exact region of interest in rectangle format polygon", + example={ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "coordinates": [ + [ + [-4.187143188645706, 50.37072283932642], + [-4.202697005964865, 50.368816892405874], + [-4.203156724702808, 50.365640144076906], + [-4.19449868846155, 50.362267670845654], + ] + ], + "type": "Polygon", + }, + } + ], + }, + ), + }, +) + squad_metadata_schema = api.model( "SquadMetadataSchema", { "squad_ID": fields.Integer( required=True, description="Identifier of given squad", - example="ah-1", + example=23, ), "no_of_platforms": fields.Integer( required=True, - description="number of platforms", - example="ah-1", + description="Number of platforms", + example=3, ), "platforms": fields.List( fields.Nested(platform_schema), @@ -175,9 +292,43 @@ squad_metadata_schema = api.model( description="In execution, Waiting.. <define further>", example=False, ), + "region_of_interest": fields.List( + fields.Nested(region_schema), + required=False, + description="Region of interest and exclusion zones per squad.", + ), + "exclusion_zones": fields.List( + fields.Nested(region_schema), + required=True, + description="Exclusion zones exclusion zones per squad.", + ), }, ) + +planning_configuration_schema = api.model( + "PlanningConfigurationSchema", + { + "message": fields.Nested( + full_message_schema, + required=True, + description="Message header", + ), + "ID": fields.Integer( + required=True, + description="Unique identifier tagged to version of this" + + " configuration plan", + example=3, + ), + "squads": fields.Nested( + squad_metadata_schema, + required=False, + description="Details of each squad", + ), + }, +) + + gps_schema = api.model( "GPS", { @@ -216,52 +367,10 @@ gps_schema = api.model( description="Altitude in <DEFINE UNITS>", example="", ), - # "gps_fix_seconds_ago": fields.Float( - # required=False, - # description="", - # example="", - # ), + # "gps_fix_seconds_ago" }, ) -observation_schema = api.model( - "Observation", - { - "message": fields.Nested( - message_header_schema, - required=True, - description="Message header", - ), - "platform": fields.Nested(platform_schema), - "time": fields.String( - required=True, - description="Timestamp of message", - example="2022-11-16T00:00:00Z", - ), - # "observation_type" ==> payloads tied to different types maybe? - # properties of each observation? - "points_of_interest": fields.Float( - required=False, - description="Points from features of interest identified by platform if any found. DEFINE FORMAT.", - example="", - ), - "region_surveyed": fields.Float( - required=False, - description="Region surveyed by given platform. DEFINE FORMAT. GEOJSON?", - example="", - ), - "quality_of_points": fields.Float( - required=False, - description="Quality/strength of points from features of interest identified by platform. DEFINE FORMAT.", - example=0.98, - ), - "additional_data": fields.Raw( - required=False, - description="Placeholder field for any additional data", - example={"sensor_payload": False}, - ), - } -) sensor_schema = api.model( "Sensor", { @@ -280,13 +389,13 @@ sensor_schema = api.model( description="Add any additional sensor-related data here.", example={"sensor_loadtime_seconds": 30.0}, ), - } + }, ) platform_status_message_schema = api.model( "platformStatusMessage", { "message": fields.Nested( - message_header_schema, + full_message_schema, required=True, description="Message header", ), @@ -298,7 +407,7 @@ platform_status_message_schema = api.model( + "STOP, IDLE, ABORT.", example="IDLE", ), - "autonomy_mission_ID": fields.Integer( + "autonomy_plan_ID": fields.Integer( required=False, description="Last mission plan ID (according to Autonomy Engine's mission plan number) executed by platform", example=1, @@ -343,9 +452,11 @@ platform_status_message_schema = api.model( example="Warning", ), "gps_data": fields.List( - fields.Nested(gps_schema), # TODO: TBD Do we want a list of gps readings to allow > 1 reading i.e. platform + usbl + fields.Nested( + gps_schema + ), # TODO: TBD Do we want a list of gps readings to allow > 1 reading i.e. platform + usbl required=True, - description="GPS of each platform", + description="Metadata pf each platform", ), "localisation_error": fields.Float( required=False, @@ -362,40 +473,36 @@ platform_status_message_schema = api.model( description="Battery remaining capacity % provided by respective platform/C2.", example=80.0, ), - "sensor_config": fields.Nested(sensor_schema), # TODO: TBD Do we want a list of sensors to allow > 1 sensor + "sensor_config": fields.Nested( + sensor_schema + ), # TODO: TBD Do we want a list of sensors to allow > 1 sensor }, ) -mission_plan_schema = api.model( - "MissionPlan", +acknowledgement_schema = api.model( + "Acknowledgement", { "message": fields.Nested( - message_header_schema, + full_message_schema, required=True, description="Message header", ), - "ID": fields.Integer( + "message_ID": fields.Integer( required=True, - description="Unique identifier tagged to version of this" - + " configuration plan", - example=3, + description="Identifier of message received and executed with " + + "success for mission plans sent by the Autonomy Engine.", + example=202, ), - "time": fields.String( + "status": fields.String( required=True, - description="", - example="", + description="Highest level of acknowledgement. I.e. `c2_received`: Received by C2," + + " `c2_sent`: Sent from C2->Platform, `executed`: Executed by platform", ), - "platform_ID": fields.Integer( - required=False, - description="Details of each squad", - ), - "payload": fields.Raw( - required=True, - ) }, ) + swagger_config = { "headers": [], "specs": [ @@ -420,94 +527,6 @@ swagger_config = { "consumes": ["application/json"], } -autonomy_configuration_schema = api.model( - "SquadConfigurationSchema", - { - "message": fields.Nested( - message_header_schema, - required=True, - description="Message header", - ), - "ID": fields.Integer( - required=True, - description="Unique identifier tagged to version of this" - + " configuration plan", - example=3, - ), - "time": fields.String( - required=True, - description="", - example="", - ), - "squads": fields.Nested( - squad_metadata_schema, - required=False, - description="Details of each squad", - ), - "region_of_operation": fields.Raw( - required=True, - description="Using GEOJSON, exact region of interest EXCLUDING exclusion zone", - example={ - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "properties": {}, - "geometry": { - "coordinates": [ - [ - [ - -4.187143188645706, - 50.37072283932642 - ], - [ - -4.202697005964865, - 50.368816892405874 - ], - [ - -4.203156724702808, - 50.365640144076906 - ], - [ - -4.19449868846155, - 50.362267670845654 - ], - [ - -4.187373048015246, - 50.35933489062816 - ], - [ - -4.1859938917992565, - 50.36207215780212 - ], - [ - -4.188598964651192, - 50.36471151593676 - ], - [ - -4.192506573927574, - 50.367350727294706 - ], - [ - -4.188675584440716, - 50.36837704762925 - ], - [ - -4.187143188645706, - 50.37072283932642 - ] - ] - ], - "type": "Polygon" - # "projection": coordinate system used - } - } - ] - } - ), - }, -) - swagger = Swagger(app, template=swagger_template, config=swagger_config) @@ -528,12 +547,12 @@ class platformStatus(Resource): ns3 = api.namespace( - "autonomy_configuration", description="Autonomy Configuration Format. Do we want region of interest to be per squad, per platform or in the main schema?" + "planning_configuration", description="Planning Configuration Format. Do we want region of interest to be per squad, per platform or in the main schema?" ) @ns3.route("") -class AutonomyConfiguration(Resource): - @ns3.response(200, "Success", autonomy_configuration_schema) +class PlanningConfiguration(Resource): + @ns3.response(200, "Success", planning_configuration_schema) def get(self): pass @@ -548,28 +567,18 @@ class MissionPlan(Resource): def get(self): pass -@ns4.route("/ecosub") -class MissionPlanEcosub(Resource): - @ns4.response(200, "Success", mission_plan_schema) - def get(self): - pass -@ns4.route("/reav") -class MissionPlanReav(Resource): - @ns4.response(200, "Success", mission_plan_schema) - def get(self): - pass -@ns4.route("/autosubhover") -class MissionPlanAutosubHover(Resource): - @ns4.response(200, "Success", mission_plan_schema) - def get(self): - pass - ns5 = api.namespace("observation", description="Observation Format --> Per platform or generic?") @ns5.route("") class Observation(Resource): @ns5.response(200, "Success", observation_schema) def get(self): pass +ns6 = api.namespace("acknowledgement", description="Acknowledgment Format") +@ns6.route("") +class Acknowledgment(Resource): + @ns6.response(200, "Success", acknowledgement_schema) + def get(self): + pass if __name__ == "__main__": app.run() diff --git a/examples/all/acknowledgment.json b/examples/all/acknowledgment.json new file mode 100644 index 0000000000000000000000000000000000000000..3c7b91f199418f617aafff6705bb646f38d3eae4 --- /dev/null +++ b/examples/all/acknowledgment.json @@ -0,0 +1,11 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "message_ID": 202, + "status": "executed" + } +} \ No newline at end of file diff --git a/examples/all/mission_plan.json b/examples/all/mission_plan.json new file mode 100644 index 0000000000000000000000000000000000000000..e97e553affd9564d434a271a236a110a9c80781c --- /dev/null +++ b/examples/all/mission_plan.json @@ -0,0 +1,25 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "plan_ID": 1, + "platform_serial": "reav-60", + "plan": [ + { + "action": "move", + "flight_style": "orbit", + "latitude_waypoint": -4.187143188645706, + "longitude_waypoint": 50.37072283932642, + "altitude": 0, + "depth": 0, + "activate_payload": false, + "send_environmental_data": false, + "scanline": false, + "scanpoint": false + } + ] + } +} \ No newline at end of file diff --git a/examples/all/observation.json b/examples/all/observation.json new file mode 100644 index 0000000000000000000000000000000000000000..bbbde9986a268df63b6eb44bc564927a863ac0ec --- /dev/null +++ b/examples/all/observation.json @@ -0,0 +1,16 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "platform_serial":"ecosub-3", + "points_of_interest": "", + "region_surveyed": "", + "quality_of_points": 0.98, + "additional_data": { + "sensor_x": false + } + } +} \ No newline at end of file diff --git a/examples/all/planning_configuration.json b/examples/all/planning_configuration.json new file mode 100644 index 0000000000000000000000000000000000000000..df6042179988319c5ea8bce403705892a09ec2b7 --- /dev/null +++ b/examples/all/planning_configuration.json @@ -0,0 +1,101 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "gui", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "ID": 3, + "squads": { + "squad_ID": 23, + "no_of_platforms": 3, + "platforms": [ + { + "platform_ID": 1, + "serial": "ah-1", + "model": "ah-1", + "constraints": { + "min_altitude": 15.2, + "min_velocity": 0.1, + "max_velocity": 0.9 + }, + "active": true + } + ], + "squad_mission_type": "survey", + "squad_state": false, + "region_of_interest": [ + { + "region": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "coordinates": [ + [ + [ + -4.187143188645706, + 50.37072283932642 + ], + [ + -4.202697005964865, + 50.368816892405874 + ], + [ + -4.203156724702808, + 50.365640144076906 + ], + [ + -4.19449868846155, + 50.362267670845654 + ] + ] + ], + "type": "Polygon" + } + } + ] + } + } + ], + "exclusion_zones": [ + { + "region": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "coordinates": [ + [ + [ + -4.187143188645706, + 50.37072283932642 + ], + [ + -4.202697005964865, + 50.368816892405874 + ], + [ + -4.203156724702808, + 50.365640144076906 + ], + [ + -4.19449868846155, + 50.362267670845654 + ] + ] + ], + "type": "Polygon" + } + } + ] + } + } + ] + } + } +} \ No newline at end of file diff --git a/examples/all/platform_status.json b/examples/all/platform_status.json new file mode 100644 index 0000000000000000000000000000000000000000..78a156befca10f0dbbd9b9256e9d016e5f1bc459 --- /dev/null +++ b/examples/all/platform_status.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "platform": { + "platform_ID": 2, + "serial": "ah-1", + "model": "ah-1", + "constraints": { + "min_altitude": 15.2, + "min_velocity": 0.1, + "max_velocity": 0.9 + }, + "active": true + }, + "platform_state": "IDLE", + "autonomy_plan_ID": 1, + "mission_track_ID": 4, + "mission_action_ID": 1, + "range_to_go": 124.3, + "speed_over_ground": 124.3, + "water_current_velocity": 124.3, + "thrust_applied": 124.3, + "health_status": "Warning", + "gps_data": [ + { + "gps_source": "internal", + "latitude_type": "", + "longitude_type": "", + "latitude": -7.432, + "longitude": 50.365, + "depth": 0.0, + "altitude": 0.0 + } + ], + "localisation_error": 0.008, + "usbl_fix_seconds_ago": 20.3, + "battery_remaining_capacity": 80, + "sensor_config": { + "sensor_name": "MBES", + "sensor_status": false, + "additional_data": { + "sensor_loadtime_seconds": 30 + } + } + } + } +} \ No newline at end of file diff --git a/examples/autonomy_engine/mission_plan.json b/examples/autonomy_engine/mission_plan.json index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e97e553affd9564d434a271a236a110a9c80781c 100644 --- a/examples/autonomy_engine/mission_plan.json +++ b/examples/autonomy_engine/mission_plan.json @@ -0,0 +1,25 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "plan_ID": 1, + "platform_serial": "reav-60", + "plan": [ + { + "action": "move", + "flight_style": "orbit", + "latitude_waypoint": -4.187143188645706, + "longitude_waypoint": 50.37072283932642, + "altitude": 0, + "depth": 0, + "activate_payload": false, + "send_environmental_data": false, + "scanline": false, + "scanpoint": false + } + ] + } +} \ No newline at end of file diff --git a/examples/autonomy_engine/observation.json b/examples/autonomy_engine/observation.json new file mode 100644 index 0000000000000000000000000000000000000000..bbbde9986a268df63b6eb44bc564927a863ac0ec --- /dev/null +++ b/examples/autonomy_engine/observation.json @@ -0,0 +1,16 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "platform_serial":"ecosub-3", + "points_of_interest": "", + "region_surveyed": "", + "quality_of_points": 0.98, + "additional_data": { + "sensor_x": false + } + } +} \ No newline at end of file diff --git a/examples/autonomy_engine/planning_configuration.json b/examples/autonomy_engine/planning_configuration.json index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..df6042179988319c5ea8bce403705892a09ec2b7 100644 --- a/examples/autonomy_engine/planning_configuration.json +++ b/examples/autonomy_engine/planning_configuration.json @@ -0,0 +1,101 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "gui", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "ID": 3, + "squads": { + "squad_ID": 23, + "no_of_platforms": 3, + "platforms": [ + { + "platform_ID": 1, + "serial": "ah-1", + "model": "ah-1", + "constraints": { + "min_altitude": 15.2, + "min_velocity": 0.1, + "max_velocity": 0.9 + }, + "active": true + } + ], + "squad_mission_type": "survey", + "squad_state": false, + "region_of_interest": [ + { + "region": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "coordinates": [ + [ + [ + -4.187143188645706, + 50.37072283932642 + ], + [ + -4.202697005964865, + 50.368816892405874 + ], + [ + -4.203156724702808, + 50.365640144076906 + ], + [ + -4.19449868846155, + 50.362267670845654 + ] + ] + ], + "type": "Polygon" + } + } + ] + } + } + ], + "exclusion_zones": [ + { + "region": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "coordinates": [ + [ + [ + -4.187143188645706, + 50.37072283932642 + ], + [ + -4.202697005964865, + 50.368816892405874 + ], + [ + -4.203156724702808, + 50.365640144076906 + ], + [ + -4.19449868846155, + 50.362267670845654 + ] + ] + ], + "type": "Polygon" + } + } + ] + } + } + ] + } + } +} \ No newline at end of file diff --git a/examples/autonomy_engine/platform_status.json b/examples/autonomy_engine/platform_status.json new file mode 100644 index 0000000000000000000000000000000000000000..78a156befca10f0dbbd9b9256e9d016e5f1bc459 --- /dev/null +++ b/examples/autonomy_engine/platform_status.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "platform": { + "platform_ID": 2, + "serial": "ah-1", + "model": "ah-1", + "constraints": { + "min_altitude": 15.2, + "min_velocity": 0.1, + "max_velocity": 0.9 + }, + "active": true + }, + "platform_state": "IDLE", + "autonomy_plan_ID": 1, + "mission_track_ID": 4, + "mission_action_ID": 1, + "range_to_go": 124.3, + "speed_over_ground": 124.3, + "water_current_velocity": 124.3, + "thrust_applied": 124.3, + "health_status": "Warning", + "gps_data": [ + { + "gps_source": "internal", + "latitude_type": "", + "longitude_type": "", + "latitude": -7.432, + "longitude": 50.365, + "depth": 0.0, + "altitude": 0.0 + } + ], + "localisation_error": 0.008, + "usbl_fix_seconds_ago": 20.3, + "battery_remaining_capacity": 80, + "sensor_config": { + "sensor_name": "MBES", + "sensor_status": false, + "additional_data": { + "sensor_loadtime_seconds": 30 + } + } + } + } +} \ No newline at end of file diff --git a/examples/hydrosurv_adapter/acknowledgment.json b/examples/hydrosurv_adapter/acknowledgment.json new file mode 100644 index 0000000000000000000000000000000000000000..3c7b91f199418f617aafff6705bb646f38d3eae4 --- /dev/null +++ b/examples/hydrosurv_adapter/acknowledgment.json @@ -0,0 +1,11 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "message_ID": 202, + "status": "executed" + } +} \ No newline at end of file diff --git a/examples/hydrosurv_adapter/mission_plan.json b/examples/hydrosurv_adapter/mission_plan.json new file mode 100644 index 0000000000000000000000000000000000000000..e97e553affd9564d434a271a236a110a9c80781c --- /dev/null +++ b/examples/hydrosurv_adapter/mission_plan.json @@ -0,0 +1,25 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "plan_ID": 1, + "platform_serial": "reav-60", + "plan": [ + { + "action": "move", + "flight_style": "orbit", + "latitude_waypoint": -4.187143188645706, + "longitude_waypoint": 50.37072283932642, + "altitude": 0, + "depth": 0, + "activate_payload": false, + "send_environmental_data": false, + "scanline": false, + "scanpoint": false + } + ] + } +} \ No newline at end of file diff --git a/examples/hydrosurv_adapter/platform_status.json b/examples/hydrosurv_adapter/platform_status.json new file mode 100644 index 0000000000000000000000000000000000000000..ab1a23a2c2e9d95518fdf171c3a3cd7c04f368b5 --- /dev/null +++ b/examples/hydrosurv_adapter/platform_status.json @@ -0,0 +1,51 @@ +{ + "timestamp": "2022-11-16T00:00:00Z", + "source": "hydrosurv_adapter", + "destination": "autonomy_engine", + "encoded": false, + "type": "platform_status", + "payload": { + "platform": { + "platform_ID": 23, + "serial": "ah-1", + "model": "ah-1", + "constraints": { + "min_altitude": 15.2, + "min_velocity": 0.1, + "max_velocity": 0.9 + }, + "active": true + }, + "platform_state": "IDLE", + "autonomy_plan_ID": 1, + "mission_track_ID": 4, + "mission_action_ID": 1, + "range_to_go": 124.3, + "speed_over_ground": 124.3, + "water_current_velocity": 124.3, + "thrust_applied": 124.3, + "health_status": "Warning", + "gps_data": [ + { + "gps_source": "internal", + "latitude_type": "", + "longitude_type": "", + "latitude": -7.432, + "longitude": 50.365, + "depth": 0.0, + "altitude": 0.0 + } + ], + "localisation_error": 0.008, + "usbl_fix_seconds_ago": 20.3, + "battery_remaining_capacity": 80, + "sensor_config": { + "sensor_name": "MBES", + "sensor_status": false, + "additional_data": { + "sensor_loadtime_seconds": 30 + } + } + } + } +} \ No newline at end of file diff --git a/formats/mission_plan.py b/formats/mission_plan.py index 91bfa0347fb7eb2e939f74e97aeb8c3825c474c3..acd10e7fb4ee10fe47875f2475a3caf18ddce7d7 100644 --- a/formats/mission_plan.py +++ b/formats/mission_plan.py @@ -86,8 +86,8 @@ mission_plan_schema = api.model( "plan": fields.List( fields.Nested(action_schema), required=True, - description="Sequence of actions/instructions generated by the " + - " Autonomy Engine that should be compiled by the respective C2.", + description="Sequence of actions/instructions generated by the " + + " Autonomy Engine that should be compiled by the respective C2.", ), }, ) diff --git a/formats/observation.py b/formats/observation.py index a759406db84779fe5993732519251c929e4943b9..88306e4e3942ffe400c80364300581b46a2b200a 100644 --- a/formats/observation.py +++ b/formats/observation.py @@ -1,7 +1,7 @@ """ schema: platform-specific decoded status message (DRAFT) """ -from . import message_header_schema, platform_schema, api +from . import full_message_schema, platform_schema, api from flask_restx import fields @@ -9,15 +9,14 @@ observation_schema = api.model( "Observation", { "message": fields.Nested( - message_header_schema, + full_message_schema, required=True, description="Message header", ), - "platform": fields.Nested(platform_schema), - "time": fields.String( + "platform_serial": fields.String( required=True, - description="Timestamp of message", - example="2022-11-16T00:00:00Z", + description="Serial of platform to sendign observations", + example="ecosub-3", ), # "observation_type" ==> payloads tied to different types maybe? # properties of each observation?