Commit fd3f162a authored by Trishna Saeharaseelan's avatar Trishna Saeharaseelan
Browse files

Merge branch '7-message-formats-initial' into 'master'

Create initial message schemas

See merge request !2
parents defa0678 28857644
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "hermes",
"destination": "autonomy_engine",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "platform_status",
"platform_ID": "ecosub-5",
"platform_timestamp": "2022-12-21T00:00:00Z",
"status_source": "usbl",
"latitude": 178.2,
"longitude": -10.122,
"depth": 50,
"altitude": 20
}
}
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "ecosub_c2",
"destination": "autonomy_engine",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "platform_status",
"platform_ID": "ecosub-2",
"platform_timestamp": "2022-12-21T00:00:00Z",
"status_source": "onboard_platform",
"autonomy_engine_plan_ID": 1,
"battery_remaining_capacity": 80.2,
"active": true,
"platform_state": "ABORT",
"mission_action_ID": 1,
"mission_track_ID": 4,
"latitude": 178.2,
"longitude": -10.122,
"depth": 50,
"altitude": 20,
"heading": 90.0,
"health_status": "Warning",
"localisation_error": 0,
"usbl_fix_seconds_ago": 0,
"range_to_go": 124.3,
"sensor_config": {
"sensor_ID": 22,
"serial": "sidescan-2x",
"sensor_on": true,
"additional_data": {
"whiskers_on": true
}
},
"current_pitch": -4,
"speed_over_ground": 4.3,
"thrust_applied": 124.3,
"water_current_velocity": 124.3
}
}
{
"header": {
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "autonomy_engine",
"destination": "ecosub_c2",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "mission_plan",
"platform_ID": "ecosub-2",
"autonomy_engine_plan_ID": 1,
"plan": [
{
"action": "move",
"flight_style": "go to waypoint",
"latitude_waypoint": -3.237143188645706,
"longitude_waypoint": 52.37072283932642,
"depth": 0.0,
"activate_payload": false,
"send_environmental_data": false
},
{
"action": "dive",
"flight_style": "dive to depth",
"latitude_waypoint": -3.237143188645706,
"longitude_waypoint": 52.37072283932642,
"altitude": 10,
"activate_payload": false,
"send_environmental_data": false
},
{
"action": "scanline",
"flight_style": "go to waypoint",
"latitude_waypoint": -0.237143188645706,
"longitude_waypoint": 60.00000000000000,
"altitude": 10,
"activate_payload": true,
"send_environmental_data": false
},
{
"action": "climb",
"flight_style": "go to surface",
"latitude_waypoint": -0.237143188645706,
"longitude_waypoint": 52.37072283932642,
"depth": 0,
"activate_payload": false,
"send_environmental_data": true
}
]
}
}
\ No newline at end of file
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "ecosub_c2",
"destination": "autonomy_engine",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "observation",
"platform_ID": "ecosub-2",
"points_of_interest": [
{
"latitude": 178.2,
"longitude": -10.122,
"quality_of_point": 0.98
},
{
"latitude": 50.1382,
"longitude": -11.122,
"quality_of_point": 0.50
}
],
"region_surveyed": ""
}
}
\ No newline at end of file
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "hermes",
"destination": "autonomy_engine",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "platform_status",
"platform_ID": "ecosub-5",
"platform_timestamp": "2022-12-21T00:00:00Z",
"status_source": "usbl",
"latitude": 178.2,
"longitude": -10.122,
"depth": 50,
"altitude": 20
}
}
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "ecosub_c2",
"destination": "autonomy_engine",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "platform_status",
"platform_ID": "ecosub-2",
"platform_timestamp": "2022-12-21T00:00:00Z",
"status_source": "onboard_platform",
"autonomy_engine_plan_ID": 1,
"battery_remaining_capacity": 80.2,
"active": true,
"platform_state": "ABORT",
"mission_action_ID": 1,
"mission_track_ID": 4,
"latitude": 178.2,
"longitude": -10.122,
"depth": 50,
"altitude": 20,
"heading": 90.0,
"health_status": "Warning",
"localisation_error": 0,
"usbl_fix_seconds_ago": 0,
"range_to_go": 124.3,
"sensor_config": {
"sensor_ID": 22,
"serial": "sidescan-2x",
"sensor_on": true,
"additional_data": {
"whiskers_on": true
}
},
"current_pitch": -4,
"speed_over_ground": 4.3,
"thrust_applied": 124.3,
"water_current_velocity": 124.3
}
}
#C2#
4338
(4338,)
11111111111111111000000000000000
Health : 722
Content_Mask : 4
Battery Voltage : 82045
Battery Amps : 0
Battery Acc charge : 767
Battery Max Amps : 548
Battery Max Voltage : 18
Inner pressure : 43
Inner Temp : 4
Inner Humidity : 0
Max depth : 0
Current Pitch : -80
Max pitch : 0
Current RPM : 0
Surface Time : 1636015764
last GPS Time : 0
(b'A', 0, 60, 1636016049, 57.33663558959961, -4.444321632385254, 0, 4294934528, 722, 4, 82045, 0, 767, 548, 18, 43, 4, 0, 0, -80, 0, 0, 1636015764, 0)
['Type', 'Version', 'Sub_Num', 'Time', 'Latitude', 'Longitude', 'Health', 'Content_Mask', 'Battery Voltage', 'Battery Amps', 'Battery Acc charge', 'Battery Max Amps', 'Battery Max Voltage', 'Inner pressure', 'Inner Temp', 'Inner Humidity', 'Max depth', 'Current Pitch', 'Max pitch', 'Current RPM', 'Surface Time', 'last GPS Time']
(b'A', 0, 60, 1636016049, 57.33663558959961, -4.444321632385254, 0, 4294934528, 722, 4, 82045, 0, 767, 548, 18, 43, 4, 0, 0, -80, 0, 0, 1636015764, 0)
\ No newline at end of file
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "ecosub_c2",
"destination": "autonomy_engine",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "platform_status",
"planning_config_ID": 3,
"exclusion_zones": [
{
"geometry_coordinates": [
[
[
-4.187143188645706,
50.37072283932642
],
[
-4.202697005964865,
50.368816892405874
],
[
-4.203156724702808,
50.365640144076906
],
[
-4.19449868846155,
50.362267670845654
]
]
]
}
],
"squads": [
{
"squad_ID": 1,
"no_of_platforms": 1,
"squad_mission_type": "tracking",
"squad_state": "active",
"platforms": [
{
"model": "reav",
"platform_ID": "reav-60-1",
"serial": "reav-60",
"emergency": {
"additional_data": {},
"latitude_waypoint": -7.432,
"longitude_waypoint": 50.365,
"safe_command": "go_home",
"target_depth": 10
},
"max_velocity": 0.9,
"min_altitude": 15.2,
"min_velocity": 0.1,
"additional_data": {}
}
],
"region_of_interest": {
"geometry_coordinates": [
[
[
-4.187143188645706,
50.37072283932642
],
[
-4.202697005964865,
50.368816892405874
],
[
-4.203156724702808,
50.365640144076906
],
[
-4.19449868846155,
50.362267670845654
]
]
]
}
},
{
"squad_ID": 2,
"no_of_platforms": 3,
"squad_mission_type": "survey",
"squad_state": "active",
"platforms": [
{
"platform_ID": "ecosub-2",
"serial": "ecosub-2",
"model": "ecosub",
"emergency": {
"additional_data": {},
"latitude_waypoint": -7.432,
"longitude_waypoint": 50.365,
"safe_command": "go_home",
"target_depth": 10.0
},
"max_velocity": 0.9,
"min_altitude": 15.2,
"min_velocity": 0.1,
"additional_data": {
"scan_type": "DVL",
"swath_width": 10
}
},
{
"platform_ID": "ecosub-5",
"serial": "ecosub-5",
"model": "ecosub",
"emergency": {
"additional_data": {},
"latitude_waypoint": -0.432,
"longitude_waypoint": 20.365,
"safe_command": "go_home",
"target_depth": 0.0
},
"max_velocity": 0.9,
"min_altitude": 15.2,
"min_velocity": 0.1,
"additional_data": {
"scan_type": "DVL",
"swath_width": 10
}
}
]
},
{
"squad_ID": 3,
"no_of_platforms": 1,
"squad_mission_type": "inspection",
"squad_state": "active",
"platforms": [
{
"platform_ID": "139-ah-1",
"serial": "ah-1",
"model": "autosub",
"emergency": {
"additional_data": {},
"latitude_waypoint": 20.432,
"longitude_waypoint": 50.365,
"safe_command": "abort_now",
"target_depth": 0.0
},
"max_velocity": 0.9,
"min_altitude": 15.2,
"min_velocity": 0.1,
"additional_data": {
"scan_type": "MBES"
}
}
],
"region_of_interest": {}
}
]
}
}
\ No newline at end of file
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 1,
"source": "hydrosurv_adapter",
"destination": "autonomy_engine",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "acknowledgement",
"acknowledged_message_ID": "11111111-7bc8-11ed-a1eb-0242ac999999",
"status": "c2_received"
}
}
\ No newline at end of file
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "autonomy_engine",
"destination": "hydrosurv_adapter",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "mission_plan",
"platform_ID": "reav-60-1",
"autonomy_engine_plan_ID": 1,
"plan": [
{
"latitude_waypoint": -4.187143188645706,
"longitude_waypoint": 50.37072283932642
},
{
"latitude_waypoint": -3.187143188645706,
"longitude_waypoint": 51.37072283932642
},
{
"latitude_waypoint": -3.237143188645706,
"longitude_waypoint": 52.37072283932642
}
]
}
}
\ No newline at end of file
{
"header":{
"message_ID": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
"timestamp": "2022-11-16T00:00:00Z",
"version": 2,
"source": "hydrosurv_adapter",
"destination": "autonomy_engine",
"delivery_type": "publish",
"encoded": false
},
"payload":{
"message_type": "platform_status",
"autonomy_engine_plan_ID": 1,
"active": true,
"status_source": "onboard_platform",
"battery_remaining_capacity": 80.2,
"heading": 310.0,
"health_status": "Lost Connection",
"latitude": 178.2,
"longitude": -10.122,
"mission_action_ID": 1,
"mission_track_ID": 4,
"platform_ID": "reav-60-1",
"platform_state": "ABORT",
"platform_timestamp": "2022-12-21T00:00:00Z",
"speed_over_ground": 4.5,
"range_to_go": 0.0,
"thrust_applied": 2.3
}
}
\ No newline at end of file
from openapi_spec_validator import openapi_v30_spec_validator
from openapi_spec_validator.readers import read_from_filename
from openapi_schema_validator import validate
from jsonschema import FormatChecker
from tests.fixtures.schemas import (
acknowledgement_schema,
message_header,
observation_schema,
planning_configuration_schema,
platform_status_schema,
mission_plan_schema,
)
import unittest
import json
class TestSpecs(unittest.TestCase):
def test_swagger_specs(self):
"""
Test specs (swagger.json generated from generate_schema_config.py)
"""
schema, spec_url = read_from_filename("tests/fixtures/swagger.json")
self.assertIsNone(openapi_v30_spec_validator.validate(schema))
class TestSchema(unittest.TestCase):
def test_sample_hydrosurv_messages(self):
"""
Test schema - Hydrosurv Messages
"""
message_types = ["acknowledgement", "mission_plan", "platform_status"]
for item in message_types:
f = open("examples/hydrosurv_adapter/%s.json" % item)
mock_data = json.load(f)
header_data = mock_data["header"]
payload_data = mock_data["payload"]
self.assertIsNone(
validate(
header_data,
message_header,
format_checker=FormatChecker(),
)
)
if item == "acknowledgement":
self.assertIsNone(
validate(
payload_data,
acknowledgement_schema,
format_checker=FormatChecker(),
)
)
elif item == "mission_plan":
self.assertIsNone(
validate(
payload_data,
mission_plan_schema,
format_checker=FormatChecker(),
)
)
elif item == "platform_status":
self.assertIsNone(
validate(
payload_data,
platform_status_schema,
format_checker=FormatChecker(),
)
)
def test_sample_gui_messages(self):
"""
Test schema - GUI Messages
"""
message_types = ["planning_configuration"]
for item in message_types:
f = open("examples/gui_adapter/%s.json" % item)
mock_data = json.load(f)
header_data = mock_data["header"]
payload_data = mock_data["payload"]
self.assertIsNone(
validate(
header_data,
message_header,
format_checker=FormatChecker(),
)
)
if item == "planning_configuration":
self.assertIsNone(
validate(
payload_data,
planning_configuration_schema,
format_checker=FormatChecker(),
)
)
def test_sample_ecosub_messages(self):
"""
Test schema - Ecosub Messages
"""
message_types = [
"observation",
"mission_plan",
"platform_status",
"platform_status-from_usbl_example",
]
for item in message_types:
f = open("examples/ecosub_adapter/%s.json" % item)
mock_data = json.load(f)
header_data = mock_data["header"]
payload_data = mock_data["payload"]
self.assertIsNone(
validate(
header_data,
message_header,
format_checker=FormatChecker(),
)
)
if item == "platform_status-from_usbl_example.json":
self.assertIsNone(
validate(
payload_data,
platform_status_schema,
format_checker=FormatChecker(),
)
)
elif item == "mission_plan":
self.assertIsNone(
validate(
payload_data,
mission_plan_schema,
format_checker=FormatChecker(),
)
)
elif item == "platform_status":
self.assertIsNone(
validate(
payload_data,
platform_status_schema,
format_checker=FormatChecker(),
)
)
elif item == "observation":
self.assertIsNone(
validate(
payload_data,
observation_schema,
format_checker=FormatChecker(),
)
)
def test_sample_autonomy_engine_messages(self):
"""
Test schema - Autonomy Engine Messages
"""
message_types = [
"planning_configuration",
"mission_plan_AH1",
"mission_plan_ECOSUB",
"mission_plan_HYDROSURV",
"platform_status",
"platform_status-from_usbl_example",
"acknowledgement",
]
for item in message_types:
f = open("examples/autonomy_engine_adapter/%s.json" % item)
mock_data = json.load(f)
header_data = mock_data["header"]
payload_data = mock_data["payload"]
self.assertIsNone(
validate(
header_data,
message_header,
format_checker=FormatChecker(),
)
)
if item == "platform_status-from_usbl_example.json":
self.assertIsNone(
validate(
payload_data,
platform_status_schema,
format_checker=FormatChecker(),
)
)
elif item == "mission_plan_AH1":
self.assertIsNone(
validate(
payload_data,
mission_plan_schema,
format_checker=FormatChecker(),
)
)
elif item == "mission_plan_ECOSUB":
self.assertIsNone(
validate(
payload_data,
mission_plan_schema,
format_checker=FormatChecker(),
)
)
elif item == "mission_plan_HYDROSURV":
self.assertIsNone(
validate(
payload_data,
mission_plan_schema,
format_checker=FormatChecker(),
)
)
elif item == "platform_status":
self.assertIsNone(
validate(
payload_data,
platform_status_schema,
format_checker=FormatChecker(),
)
)
elif item == "observation":
self.assertIsNone(
validate(
payload_data,
observation_schema,
format_checker=FormatChecker(),
)
)
elif item == "planning_configuration":
self.assertIsNone(
validate(
payload_data,
planning_configuration_schema,
format_checker=FormatChecker(),
)
)
elif item == "acknowledgement":
self.assertIsNone(
validate(
payload_data,
acknowledgement_schema,
format_checker=FormatChecker(),
)
)
if __name__ == "__main__":
unittest.main()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment