From e9883c2b7532a9c78d260ecea235ccacc065672a Mon Sep 17 00:00:00 2001 From: Julien Perrochet Date: Wed, 20 Nov 2024 10:06:05 +0100 Subject: [PATCH] [interfaces] update automated_testing submodule --- interfaces/interuss/automated_testing | 2 +- .../flight_planning/v1/api.py | 96 +++++-- .../automated_testing/geo_awareness/v1/api.py | 4 +- .../geospatial_map/v1/api.py | 18 +- .../automated_testing/rid/v1/injection.py | 271 ++++++++++-------- .../automated_testing/rid/v1/observation.py | 200 ++++++++++++- .../interuss/automated_testing/scd/v1/api.py | 4 +- .../automated_testing/versioning/api.py | 8 +- 8 files changed, 429 insertions(+), 174 deletions(-) diff --git a/interfaces/interuss/automated_testing b/interfaces/interuss/automated_testing index 8a5f1db..417797f 160000 --- a/interfaces/interuss/automated_testing +++ b/interfaces/interuss/automated_testing @@ -1 +1 @@ -Subproject commit 8a5f1db0f59b8fcce1c6095bcec17e994df0fb75 +Subproject commit 417797f42e8ebd7cc1b71e82ec0fee0fe1e972a1 diff --git a/src/uas_standards/interuss/automated_testing/flight_planning/v1/api.py b/src/uas_standards/interuss/automated_testing/flight_planning/v1/api.py index cd65c4e..a5958f1 100644 --- a/src/uas_standards/interuss/automated_testing/flight_planning/v1/api.py +++ b/src/uas_standards/interuss/automated_testing/flight_planning/v1/api.py @@ -1,4 +1,4 @@ -"""Data types and operations from Flight Planning Automated Testing Interface 0.4.0 OpenAPI""" +"""Data types and operations from Flight Planning Automated Testing Interface 0.5.0 OpenAPI""" # This file is autogenerated; do not modify manually! @@ -12,7 +12,7 @@ from implicitdict import ImplicitDict, StringBasedDateTime -API_VERSION = "0.4.0" +API_VERSION = "0.5.0" """Version of Flight Planning Automated Testing Interface OpenAPI specification from which the objects in this package were generated.""" FlightPlanID = str @@ -20,9 +20,9 @@ class StatusResponseStatus(str, Enum): - """The status of the USS automated testing interface. - - `Starting`: the USS is starting and the automated test driver should wait before sending requests. - - `Ready`: the USS is ready to receive test requests. + """The status of this automated testing interface. + - `Starting`: the interface is starting and the automated test driver should wait before sending requests. + - `Ready`: the interface is ready to receive test requests. """ Starting = "Starting" @@ -31,20 +31,20 @@ class StatusResponseStatus(str, Enum): class StatusResponse(ImplicitDict): status: StatusResponseStatus - """The status of the USS automated testing interface. - - `Starting`: the USS is starting and the automated test driver should wait before sending requests. - - `Ready`: the USS is ready to receive test requests. + """The status of this automated testing interface. + - `Starting`: the interface is starting and the automated test driver should wait before sending requests. + - `Ready`: the interface is ready to receive test requests. """ api_name: Optional[str] """Indication of the API implemented at this URL. Must be "Flight Planning Automated Testing Interface".""" api_version: Optional[str] - """Indication of the API version implemented at this URL. Must be "v0.4.0" when implementing this version of the API.""" + """Indication of the API version implemented at this URL. Must be "v0.5.0" when implementing this version of the API.""" class FlightPlanAdditionalInformation(ImplicitDict): - """Any information relevant to a particular jurisdiction or use case not described in the standard schema. The keys and values must be agreed upon between the test designers and USSs under test.""" + """Any information relevant to a particular jurisdiction or use case not described in the standard schema. The keys and values must be agreed upon between the test designers and test participants.""" @@ -68,11 +68,11 @@ class BasicFlightPlanInformationUasState(str, Enum): - `Nominal`: The user or UAS reports or implies that it is performing nominally, or has not indicated `OffNominal` or `Contingent`. - - `OffNominal`: The user or UAS reports or implies that it is temporarily not performing nominally, but - may expect to be able to recover to normal operation. + - `OffNominal`: The user or UAS reports or implies that it is temporarily not conforming to its intent, + but may expect to be able to recover to normal operation. - - `Contingent`: The user or UAS reports or implies that it is not performing nominally and may be unable - to recover to normal operation. + - `Contingent`: The user or UAS reports or implies that it is not conforming to its intent and may be + unable to recover to normal operation. - `NotSpecified`: The UAS status is not currently available or known (for instance, if the flight is planned in the future and the UAS that will be flying has not yet connected to the system). @@ -155,7 +155,7 @@ class AdvisoryInclusion(str, Enum): class UpsertFlightPlanResponse(ImplicitDict): planning_result: PlanningActivityResult - """The result of the flight plan creation or update attempt. If any option other than `Completed` is specified, the `notes` field should be populated with the reason for the unsuccessful outcome.""" + """The result of the flight plan creation or update attempt by the emulated user. If any option other than `Completed` is specified, the `notes` field should be populated with the reason for the unsuccessful outcome.""" notes: Optional[str] """Human-readable explanation of the observed result. This explanation may be made available to a human reviewing the test results, and ideally should explain why an undesirable result was obtained. For instance, if the injection attempt Failed, then these notes may indicate that the attempt failed because the DSS indicated 400 to a valid request (perhaps also including the valid request as proof).""" @@ -169,7 +169,7 @@ class UpsertFlightPlanResponse(ImplicitDict): class DeleteFlightPlanResponse(ImplicitDict): planning_result: PlanningActivityResult - """The result of attempted flight plan cancellation/closure. If any option other than `Completed` is specified, the `notes` field should be populated with the reason for the unsuccessful outcome.""" + """The result of attempted flight plan cancellation/closure by the USS admin. If any option other than `Completed` is specified, the `notes` field should be populated with the reason for the unsuccessful outcome.""" notes: Optional[str] """Human-readable explanation of the observed result.""" @@ -191,7 +191,7 @@ class ClearAreaOutcome(ImplicitDict): """True if, and only if, all flight plans in the specified area managed by the USS were canceled and removed.""" message: Optional[str] - """If the USS was unable to clear the entire area, this message can provide information on the problem encountered.""" + """If the USS admin was unable to clear the entire area, this message can provide information on the problem encountered.""" details: Optional[ClearAreaOutcomeDetails] """Optional free-form structured data to augment `message`.""" @@ -357,6 +357,43 @@ class Time(ImplicitDict): format: TimeFormat = TimeFormat.RFC3339 +UserNotificationConflicts = str +"""Conflict status as indicated in the notification. + - `Unknown`: Notification doesn't contain information regarding conflicts. + - `None`: Notification indicates no conflicts. + - `Single`: Notification indicates the presence of one conflict. + - `Multiple`: Notification indicates the presence of multiple conflicts. + +Acceptable values: +* Unknown +* None +* Single +* Multiple +""" + + +class UserNotification(ImplicitDict): + """Notification observed by virtual user.""" + + observed_at: Time + """Time at which the virtual user observed the notification.""" + + conflicts: Optional[UserNotificationConflicts] = "Unknown" + """Conflict status as indicated in the notification. + - `Unknown`: Notification doesn't contain information regarding conflicts. + - `None`: Notification indicates no conflicts. + - `Single`: Notification indicates the presence of one conflict. + - `Multiple`: Notification indicates the presence of multiple conflicts. + """ + + +class QueryUserNotificationsResponse(ImplicitDict): + """Response object for query request for notifications observed by the virtual user.""" + + user_notifications: List[UserNotification] + """List of applicable observed user notifications.""" + + class ASTMF354821OpIntentInformation(ImplicitDict): """Information provided about a flight plan that is necessary for ASTM F3548-21.""" @@ -477,11 +514,11 @@ class BasicFlightPlanInformation(ImplicitDict): - `Nominal`: The user or UAS reports or implies that it is performing nominally, or has not indicated `OffNominal` or `Contingent`. - - `OffNominal`: The user or UAS reports or implies that it is temporarily not performing nominally, but - may expect to be able to recover to normal operation. + - `OffNominal`: The user or UAS reports or implies that it is temporarily not conforming to its intent, + but may expect to be able to recover to normal operation. - - `Contingent`: The user or UAS reports or implies that it is not performing nominally and may be unable - to recover to normal operation. + - `Contingent`: The user or UAS reports or implies that it is not conforming to its intent and may be + unable to recover to normal operation. - `NotSpecified`: The UAS status is not currently available or known (for instance, if the flight is planned in the future and the UAS that will be flying has not yet connected to the system). @@ -498,7 +535,7 @@ class ClearAreaRequest(ImplicitDict): """Unique string identifying this request. If a second request with an identical ID is received, the USS may return the same response from the previous operation rather than attempting to clear the area again (the USS may also attempt to clear the area again).""" extent: Volume4D - """The USS should cancel and remove any flight plan it manages where any part of that flight plan intersects this area.""" + """The USS admin should cancel and remove any flight plan it manages where any part of that flight plan intersects this area.""" class FlightPlan(ImplicitDict): @@ -513,7 +550,7 @@ class FlightPlan(ImplicitDict): rpas_operating_rules_2_6: Optional[RPAS26FlightDetails] additional_information: Optional[FlightPlanAdditionalInformation] - """Any information relevant to a particular jurisdiction or use case not described in the standard schema. The keys and values must be agreed upon between the test designers and USSs under test.""" + """Any information relevant to a particular jurisdiction or use case not described in the standard schema. The keys and values must be agreed upon between the test designers and test participants.""" class UpsertFlightPlanRequest(ImplicitDict): @@ -534,6 +571,7 @@ class OperationID(str, Enum): ClearArea = "ClearArea" UpsertFlightPlan = "UpsertFlightPlan" DeleteFlightPlan = "DeleteFlightPlan" + QueryUserNotifications = "QueryUserNotifications" OPERATIONS: Dict[OperationID, Operation] = { @@ -584,4 +622,16 @@ class OperationID(str, Enum): 404: None, } ), + OperationID.QueryUserNotifications: Operation( + id="QueryUserNotifications", + path="/user_notifications", + verb="GET", + request_body_type=None, + response_body_type={ + 200: QueryUserNotificationsResponse, + 400: None, + 401: None, + 403: None, + } + ), } diff --git a/src/uas_standards/interuss/automated_testing/geo_awareness/v1/api.py b/src/uas_standards/interuss/automated_testing/geo_awareness/v1/api.py index 11f17bc..43910b9 100644 --- a/src/uas_standards/interuss/automated_testing/geo_awareness/v1/api.py +++ b/src/uas_standards/interuss/automated_testing/geo_awareness/v1/api.py @@ -1,4 +1,4 @@ -"""Data types and operations from Geo-Awareness Automated Test Interfaces 0.2.0 OpenAPI""" +"""Data types and operations from Geo-Awareness Automated Test Interfaces 0.2.2 OpenAPI""" # This file is autogenerated; do not modify manually! @@ -12,7 +12,7 @@ from implicitdict import ImplicitDict, StringBasedDateTime -API_VERSION = "0.2.0" +API_VERSION = "0.2.2" """Version of Geo-Awareness Automated Test Interfaces OpenAPI specification from which the objects in this package were generated.""" UUIDv4Format = str diff --git a/src/uas_standards/interuss/automated_testing/geospatial_map/v1/api.py b/src/uas_standards/interuss/automated_testing/geospatial_map/v1/api.py index dc01891..8f132a6 100644 --- a/src/uas_standards/interuss/automated_testing/geospatial_map/v1/api.py +++ b/src/uas_standards/interuss/automated_testing/geospatial_map/v1/api.py @@ -1,4 +1,4 @@ -"""Data types and operations from Geospatial Map Provider Automated Testing Interface 0.2.0 OpenAPI""" +"""Data types and operations from Geospatial Map Provider Automated Testing Interface 0.2.3 OpenAPI""" # This file is autogenerated; do not modify manually! @@ -12,7 +12,7 @@ from implicitdict import ImplicitDict, StringBasedDateTime -API_VERSION = "0.2.0" +API_VERSION = "0.2.3" """Version of Geospatial Map Provider Automated Testing Interface OpenAPI specification from which the objects in this package were generated.""" UUIDv4Format = str @@ -20,9 +20,9 @@ class StatusResponseStatus(str, Enum): - """The status of the USS automated testing interface. - - `Starting`: the USS is starting and the automated test driver should wait before sending requests. - - `Ready`: the USS is ready to receive test requests. + """The status of this automated testing interface. + - `Starting`: the interface is starting and the automated test driver should wait before sending requests. + - `Ready`: the interface is ready to receive test requests. """ Starting = "Starting" @@ -31,16 +31,16 @@ class StatusResponseStatus(str, Enum): class StatusResponse(ImplicitDict): status: StatusResponseStatus - """The status of the USS automated testing interface. - - `Starting`: the USS is starting and the automated test driver should wait before sending requests. - - `Ready`: the USS is ready to receive test requests. + """The status of this automated testing interface. + - `Starting`: the interface is starting and the automated test driver should wait before sending requests. + - `Ready`: the interface is ready to receive test requests. """ api_name: Optional[str] """Indication of the API implemented at this URL. Must be "Geospatial Map Provider Automated Testing Interface".""" api_version: Optional[str] - """Indication of the API version implemented at this URL. Must be "v0.2.0" when implementing this version of the API.""" + """Indication of the API version implemented at this URL. Must be "v0.2.2" when implementing this version of the API.""" class GeospatialHttpsSourceFormat(str, Enum): diff --git a/src/uas_standards/interuss/automated_testing/rid/v1/injection.py b/src/uas_standards/interuss/automated_testing/rid/v1/injection.py index a37fc04..2b1c817 100644 --- a/src/uas_standards/interuss/automated_testing/rid/v1/injection.py +++ b/src/uas_standards/interuss/automated_testing/rid/v1/injection.py @@ -1,4 +1,4 @@ -"""Data types and operations from Remote ID Test Data Injection 0.1.0 OpenAPI""" +"""Data types and operations from Remote ID Test Data Injection 0.3.0 OpenAPI""" # This file is autogenerated; do not modify manually! @@ -12,7 +12,7 @@ from implicitdict import ImplicitDict, StringBasedDateTime -API_VERSION = "0.1.0" +API_VERSION = "0.3.0" """Version of Remote ID Test Data Injection OpenAPI specification from which the objects in this package were generated.""" RIDFlightID = str @@ -42,8 +42,68 @@ class RIDAuthData(ImplicitDict): """Authentication data in form specified by `format`.""" +SpecificSessionID = str +"""A unique 20 byte ID intended to identify a specific flight (session) while providing a +greater level of privacy to the operator. The first byte is the registered unique Specific Session ID +Type maintained by a registrar (see Annex A5), and the remaining 19 bytes is the Session ID per the +Specific Session ID Type specification. + +Initial scheme registry entries include: + +0 – reserved +1 – Internet Engineering Task Force (IETF) Drone Remote Identification Protocol (DRIP) entity ID +2 – IEEE 1609.2 HashedID8 + +Expressed as a hexadecimal string of the underlying data bytes. A recipient should ignore any dashes in this value. If fewer than 20 bytes are specified, the remaining bytes at the end are assumed to have value 0. +""" + + +class UASID(ImplicitDict): + """Identification of the UAS performing this flight. At least one field of this object must be specified.""" + + serial_number: Optional[str] = "" + """This is expressed in the CTA-2063-A Serial Number format.""" + + registration_id: Optional[str] = "" + """If a CAA provides a method of registering UAS, this number is provided by the CAA or its authorized representative. Format is ., ASCII encoded, only uppercase letters (A-Z), dot (.), and digits (0-9) are allowed. Example is valid for the US.""" + + utm_id: Optional[str] = "" + """A UTM-provided universally unique ID traceable to a non-obfuscated ID that acts as a "session id" to protect exposure of operationally sensitive information.""" + + specific_session_id: Optional[SpecificSessionID] + + +Latitude = float +"""Degrees of latitude north of the equator, with reference to the WGS84 ellipsoid.""" + + +Longitude = float +"""Degrees of longitude east of the Prime Meridian, with reference to the WGS84 ellipsoid.""" + + +Altitude = float +"""An altitude, in meters, above the WGS84 ellipsoid.""" + + +class RIDHeightReference(str, Enum): + """The reference datum above which the height is reported.""" + + TakeoffLocation = "TakeoffLocation" + GroundLevel = "GroundLevel" + + +class RIDHeight(ImplicitDict): + """A relative altitude for the purposes of remote ID.""" + + distance: float + """Distance above reference datum. This value is provided in meters and must have a minimum resolution of 1 meter.""" + + reference: RIDHeightReference + """The reference datum above which the height is reported.""" + + class HorizontalAccuracy(str, Enum): - """This is the NACp enumeration from ADS-B, plus 1m for a more complete range for UAs. + """This is based on ADS-B NACp (plus the one extra increment). `HAUnknown`: Unknown horizontal accuracy @@ -91,7 +151,7 @@ class HorizontalAccuracy(str, Enum): class VerticalAccuracy(str, Enum): - """This is the GVA enumeration from ADS-B, plus some finer values for UAs. + """This is based on ADS-B Geodetic Vertical Accuracy (GVA) (plus the three extra increments) `VAUnknown`: Unknown vertical accuracy @@ -120,53 +180,33 @@ class VerticalAccuracy(str, Enum): VA1m = "VA1m" -class SpeedAccuracy(str, Enum): - """This is the same enumeration scale and values from ADS-B NACv. +OperatorId = str +"""CAA-issued registration/license ID for the remote pilot or operator. """ - `SAUnknown`: Unknown speed accuracy - `SA10mpsPlus`: > 10 m/s +class LatLngPoint(ImplicitDict): + """Point on the earth's surface.""" - `SA10mps`: < 10 m/s + lng: Longitude - `SA3mps`: < 3 m/s + lat: Latitude - `SA1mps`: < 1 m/s - `SA03mps`: < 0.3 m/s - """ +class OperatorAltitudeAltitudeType(str, Enum): + """Source of data for the altitude field.""" - SAUnknown = "SAUnknown" - SA10mpsPlus = "SA10mpsPlus" - SA10mps = "SA10mps" - SA3mps = "SA3mps" - SA1mps = "SA1mps" - SA03mps = "SA03mps" + Takeoff = "Takeoff" + Dynamic = "Dynamic" + Fixed = "Fixed" -class RIDAircraftType(str, Enum): - """Type of aircraft for the purposes of remote ID. +class OperatorAltitude(ImplicitDict): + """Altitude associated with the Remote Pilot""" - `VTOL` is a fixed wing aircraft that can take off vertically. `Helicopter` includes multirotor. - """ + altitude: Optional[Altitude] - NotDeclared = "NotDeclared" - Aeroplane = "Aeroplane" - Helicopter = "Helicopter" - Gyroplane = "Gyroplane" - VTOL = "VTOL" - Ornithopter = "Ornithopter" - Glider = "Glider" - Kite = "Kite" - FreeBalloon = "FreeBalloon" - CaptiveBalloon = "CaptiveBalloon" - Airship = "Airship" - FreeFallOrParachute = "FreeFallOrParachute" - Rocket = "Rocket" - TetheredPoweredAircraft = "TetheredPoweredAircraft" - GroundObstacle = "GroundObstacle" - Other = "Other" - HybridLift = "HybridLift" + altitude_type: Optional[OperatorAltitudeAltitudeType] + """Source of data for the altitude field.""" class UAClassificationEUCategory(str, Enum): @@ -195,111 +235,87 @@ class UAClassificationEUClass(str, Enum): -SpecificSessionID = str -"""A unique 20 byte ID intended to identify a specific flight (session) while providing a -greater level of privacy to the operator. The first byte is the registered unique Specific Session ID -Type maintained by a registrar (see Annex A5), and the remaining 19 bytes is the Session ID per the -Specific Session ID Type specification. - -Initial scheme registry entries include: - -0 – reserved -1 – Internet Engineering Task Force (IETF) Drone Remote Identification Protocol (DRIP) entity ID -2 – IEEE 1609.2 HashedID8 - -Expressed as a hexadecimal string of the underlying data bytes. A recipient should ignore any dashes in this value. If fewer than 20 bytes are specified, the remaining bytes at the end are assumed to have value 0. -""" - - -class UASID(ImplicitDict): - """Identification of the UAS performing this flight. At least one field of this object must be specified.""" - - serial_number: Optional[str] = "" - """This is expressed in the CTA-2063-A Serial Number format.""" - - registration_id: Optional[str] = "" - """If a CAA provides a method of registering UAS, this number is provided by the CAA or its authorized representative. Format is ., ASCII encoded, only uppercase letters (A-Z), dot (.), and digits (0-9) are allowed. Example is valid for the US.""" - - utm_id: Optional[str] = "" - """A UTM-provided universally unique ID traceable to a non-obfuscated ID that acts as a "session id" to protect exposure of operationally sensitive information.""" - - specific_session_id: Optional[SpecificSessionID] - +TimestampAccuracy = float +"""Declaration of timestamp accuracy, which is the largest difference between Timestamp and true time of applicability for any of the following fields: Latitude, Longitude, Geodetic Altitude, Pressure Altitude of Position, Height. to determine time of applicability of the location data provided. Expressed in seconds, precise to 1/10ths of seconds. The accuracy reflects the 95% uncertainty bound value for the timestamp.""" -Latitude = float -"""Degrees of latitude north of the equator, with reference to the WGS84 ellipsoid.""" +class RIDOperationalStatus(str, Enum): + """Indicates operational status of associated aircraft.""" -Longitude = float -"""Degrees of longitude east of the Prime Meridian, with reference to the WGS84 ellipsoid.""" - - -Altitude = float -"""An altitude, in meters, above the WGS84 ellipsoid.""" - - -class RIDHeightReference(str, Enum): - """The reference datum above which the height is reported.""" - - TakeoffLocation = "TakeoffLocation" - GroundLevel = "GroundLevel" - - -class RIDHeight(ImplicitDict): - """A relative altitude for the purposes of remote ID.""" - - distance: float - """Distance above reference datum. This value is provided in meters and must have a minimum resolution of 1 meter.""" - - reference: RIDHeightReference - """The reference datum above which the height is reported.""" + Undeclared = "Undeclared" + Ground = "Ground" + Airborne = "Airborne" + Emergency = "Emergency" + RemoteIDSystemFailure = "RemoteIDSystemFailure" -OperatorId = str -"""CAA-issued registration/license ID for the remote pilot or operator. """ +RIDTrack = float +"""Direction of flight expressed as a "True North-based" ground track angle. This value is provided in degrees East of North with a minimum resolution of 1 degree.""" -class LatLngPoint(ImplicitDict): - """Point on the earth's surface.""" +RIDSpeed = float +"""Ground speed of flight in meters per second.""" - lng: Longitude - lat: Latitude +class SpeedAccuracy(str, Enum): + """Provides quality/containment on horizontal ground speed. + `SAUnknown`: Unknown speed accuracy -class OperatorAltitudeAltitudeType(str, Enum): - """Source of data for the altitude field.""" + `SA10mpsPlus`: > 10 m/s - Takeoff = "Takeoff" - Dynamic = "Dynamic" - Fixed = "Fixed" + `SA10mps`: < 10 m/s + `SA3mps`: < 3 m/s -class OperatorAltitude(ImplicitDict): - """Altitude associated with the Remote Pilot""" + `SA1mps`: < 1 m/s - altitude: Optional[Altitude] + `SA03mps`: < 0.3 m/s + """ - altitude_type: Optional[OperatorAltitudeAltitudeType] - """Source of data for the altitude field.""" + SAUnknown = "SAUnknown" + SA10mpsPlus = "SA10mpsPlus" + SA10mps = "SA10mps" + SA3mps = "SA3mps" + SA1mps = "SA1mps" + SA03mps = "SA03mps" -class RIDOperationalStatus(str, Enum): - """Indicates operational status of associated aircraft.""" +VerticalSpeed = float +"""Speed up (vertically) WGS84-HAE, m/s""" - Undeclared = "Undeclared" - Ground = "Ground" - Airborne = "Airborne" - Emergency = "Emergency" - RemoteIDSystemFailure = "RemoteIDSystemFailure" +class UAType(str, Enum): + """The UA Type can help infer performance, speed, and duration of flights, for example, a + "fixed wing" can generally fly in a forward direction only (as compared to a multi-rotor). + This can also help differentiate aircraft types without sharing operationally sensitive + information like the make and model of a particular aircraft. Make and model are + anticipated to become available during the Registration ID lookup process. UAS Type is also + useful for correlating visual observation with data received. The types were formulated + based on unique flight characteristics. -RIDTrack = float -"""Direction of flight expressed as a "True North-based" ground track angle. This value is provided in degrees East of North with a minimum resolution of 1 degree.""" + `HybridLift` is a fixed wing aircraft that can take off vertically. `Helicopter` includes multirotor. + `VTOL` is equivalent to HybridLift, and kept for retro-compatibility with F3411-v19 + """ -RIDSpeed = float -"""Ground speed of flight in meters per second.""" + NotDeclared = "NotDeclared" + Aeroplane = "Aeroplane" + Helicopter = "Helicopter" + Gyroplane = "Gyroplane" + VTOL = "VTOL" + HybridLift = "HybridLift" + Ornithopter = "Ornithopter" + Glider = "Glider" + Kite = "Kite" + FreeBalloon = "FreeBalloon" + CaptiveBalloon = "CaptiveBalloon" + Airship = "Airship" + FreeFallOrParachute = "FreeFallOrParachute" + Rocket = "Rocket" + TetheredPoweredAircraft = "TetheredPoweredAircraft" + GroundObstacle = "GroundObstacle" + Other = "Other" class RIDAircraftPosition(ImplicitDict): @@ -369,8 +385,7 @@ class RIDAircraftState(ImplicitDict): timestamp: StringBasedDateTime """Time at which this state was valid. This may be the time coming from the source, such as a GPS, or the time when the system computes the values using an algorithm such as an Extended Kalman Filter (EKF). Timestamp must be expressed with a minimum resolution of 1/10th of a second. RFC 3339 format, per OpenAPI specification.""" - timestamp_accuracy: float - """Declaration of timestamp accuracy, which is the largest difference between Timestamp and true time of applicability for any of the following fields: Latitude, Longitude, Geodetic Altitude, Pressure Altitude of Position, Height. to determine time of applicability of the location data provided. Expressed in seconds, precise to 1/10ths of seconds. The accuracy reflects the 95% uncertainty bound value for the timestamp.""" + timestamp_accuracy: TimestampAccuracy operational_status: Optional[RIDOperationalStatus] @@ -383,8 +398,7 @@ class RIDAircraftState(ImplicitDict): speed_accuracy: SpeedAccuracy """Accuracy of horizontal ground speed.""" - vertical_speed: float - """Speed up (vertically) WGS84-HAE, m/s.""" + vertical_speed: VerticalSpeed height: Optional[RIDHeight] @@ -418,11 +432,14 @@ class TestFlightDetails(ImplicitDict): class TestFlight(ImplicitDict): - """The set of data to be injected into a Service Provider system under test for a single flight.""" + """The set of data to be provided to a Service Provider's test data injector for a single flight.""" injection_id: str """ID of the injected test flight. Remains the same regardless of the flight ID/UTM ID reported in the system.""" + aircraft_type: Optional[UAType] + """Aircraft type of the injected test flight.""" + telemetry: List[RIDAircraftState] """The set of telemetry data that should be injected into the system for this flight. Each element follows the RIDAircraftState schema from the ASTM remote ID standard.""" diff --git a/src/uas_standards/interuss/automated_testing/rid/v1/observation.py b/src/uas_standards/interuss/automated_testing/rid/v1/observation.py index 99fb2b8..ed35dad 100644 --- a/src/uas_standards/interuss/automated_testing/rid/v1/observation.py +++ b/src/uas_standards/interuss/automated_testing/rid/v1/observation.py @@ -1,4 +1,4 @@ -"""Data types and operations from Remote ID Display Data Observation 0.1.0 OpenAPI""" +"""Data types and operations from Remote ID Display Data Observation 0.3.0 OpenAPI""" # This file is autogenerated; do not modify manually! @@ -12,14 +12,44 @@ from implicitdict import ImplicitDict -API_VERSION = "0.1.0" +API_VERSION = "0.3.0" """Version of Remote ID Display Data Observation OpenAPI specification from which the objects in this package were generated.""" -class UAS(ImplicitDict): - """UAS information""" +class UAType(str, Enum): + """The UA Type can help infer performance, speed, and duration of flights, for example, a + "fixed wing" can generally fly in a forward direction only (as compared to a multi-rotor). + This can also help differentiate aircraft types without sharing operationally sensitive + information like the make and model of a particular aircraft. Make and model are + anticipated to become available during the Registration ID lookup process. UAS Type is also + useful for correlating visual observation with data received. The types were formulated + based on unique flight characteristics. + + `HybridLift` is a fixed wing aircraft that can take off vertically. `Helicopter` includes multirotor. + + `VTOL` is equivalent to HybridLift, and kept for retro-compatibility with F3411-v19 + """ + + NotDeclared = "NotDeclared" + Aeroplane = "Aeroplane" + Helicopter = "Helicopter" + Gyroplane = "Gyroplane" + VTOL = "VTOL" + HybridLift = "HybridLift" + Ornithopter = "Ornithopter" + Glider = "Glider" + Kite = "Kite" + FreeBalloon = "FreeBalloon" + CaptiveBalloon = "CaptiveBalloon" + Airship = "Airship" + FreeFallOrParachute = "FreeFallOrParachute" + Rocket = "Rocket" + TetheredPoweredAircraft = "TetheredPoweredAircraft" + GroundObstacle = "GroundObstacle" + Other = "Other" - id: Optional[str] - """Observed arbitrary and format agnostic (string) identification of a UAS.""" + +TimestampAccuracy = float +"""Declaration of timestamp accuracy, which is the largest difference between Timestamp and true time of applicability for any of the following fields: Latitude, Longitude, Geodetic Altitude, Pressure Altitude of Position, Height. to determine time of applicability of the location data provided. Expressed in seconds, precise to 1/10ths of seconds. The accuracy reflects the 95% uncertainty bound value for the timestamp.""" class RIDOperationalStatus(str, Enum): @@ -40,6 +70,34 @@ class RIDOperationalStatus(str, Enum): """Ground speed of flight in meters per second.""" +class SpeedAccuracy(str, Enum): + """Provides quality/containment on horizontal ground speed. + + `SAUnknown`: Unknown speed accuracy + + `SA10mpsPlus`: > 10 m/s + + `SA10mps`: < 10 m/s + + `SA3mps`: < 3 m/s + + `SA1mps`: < 1 m/s + + `SA03mps`: < 0.3 m/s + """ + + SAUnknown = "SAUnknown" + SA10mpsPlus = "SA10mpsPlus" + SA10mps = "SA10mps" + SA3mps = "SA3mps" + SA1mps = "SA1mps" + SA03mps = "SA03mps" + + +VerticalSpeed = float +"""Speed up (vertically) WGS84-HAE, m/s""" + + Longitude = float """Degrees of longitude east of the Prime Meridian, with reference to the WGS84 ellipsoid.""" @@ -60,6 +118,110 @@ class OperatorAltitudeAltitudeType(str, Enum): """An altitude, in meters, above the WGS84 ellipsoid.""" +class UAClassificationEUCategory(str, Enum): + EUCategoryUndefined = "EUCategoryUndefined" + Open = "Open" + Specific = "Specific" + Certified = "Certified" + + +class UAClassificationEUClass(str, Enum): + EUClassUndefined = "EUClassUndefined" + Class0 = "Class0" + Class1 = "Class1" + Class2 = "Class2" + Class3 = "Class3" + Class4 = "Class4" + Class5 = "Class5" + Class6 = "Class6" + + +UAClassificationEU = dict +"""Expected keys: +* category +* class +""" + + + +class HorizontalAccuracy(str, Enum): + """This is based on ADS-B NACp (plus the one extra increment). + + `HAUnknown`: Unknown horizontal accuracy + + `HA10NMPlus`: > 10NM (18.52km) + + `HA10NM`: < 10NM (18.52km) + + `HA4NM`: < 4NM (7.408km) + + `HA2NM`: < 2NM (3.704km) + + `HA1NM`: < 1NM (1852m) + + `HA05NM`: < 0.5NM (926m) + + `HA03NM`: < 0.3NM (555.6m) + + `HA01NM`: < 0.1NM (185.2m) + + `HA005NM`: < 0.05NM (92.6m) + + `HA30m`: < 30m + + `HA10m`: < 10m + + `HA3m`: < 3m + + `HA1m`: < 1m + """ + + HAUnknown = "HAUnknown" + HA10NMPlus = "HA10NMPlus" + HA10NM = "HA10NM" + HA4NM = "HA4NM" + HA2NM = "HA2NM" + HA1NM = "HA1NM" + HA05NM = "HA05NM" + HA03NM = "HA03NM" + HA01NM = "HA01NM" + HA005NM = "HA005NM" + HA30m = "HA30m" + HA10m = "HA10m" + HA3m = "HA3m" + HA1m = "HA1m" + + +class VerticalAccuracy(str, Enum): + """This is based on ADS-B Geodetic Vertical Accuracy (GVA) (plus the three extra increments) + + `VAUnknown`: Unknown vertical accuracy + + `VA150mPlus`: > 150m + + `VA150m`: < 150m + + `VA45m`: < 45m + + `VA25m`: < 25m + + `VA10m`: < 10m + + `VA3m`: < 3m + + `VA1m`: < 1m + """ + + VAUnknown = "VAUnknown" + VA150mPlus = "VA150mPlus" + VA150m = "VA150m" + VA45m = "VA45m" + VA25m = "VA25m" + VA10m = "VA10m" + VA3m = "VA3m" + VA1m = "VA1m" + + class AltitudeReference(str, Enum): W84 = "W84" EGM96 = "EGM96" @@ -90,12 +252,29 @@ class CurrentState(ImplicitDict): timestamp: Optional[str] """Time at which the message containing the current state information was generated by the display provider.""" + timestamp_accuracy: Optional[TimestampAccuracy] + operational_status: Optional[RIDOperationalStatus] track: Optional[RIDTrack] speed: Optional[RIDSpeed] + speed_accuracy: Optional[SpeedAccuracy] + """Accuracy of horizontal ground speed.""" + + vertical_speed: Optional[VerticalSpeed] + + +class UAS(ImplicitDict): + """UAS information""" + + id: Optional[str] + """Observed arbitrary and format agnostic (string) identification of a UAS.""" + + eu_classification: Optional[UAClassificationEU] + """When this field is specified, the Classification Type is "European Union". If no other classification field is specified, the Classification Type is "Undeclared".""" + class LatLngPoint(ImplicitDict): """Point on the earth's surface.""" @@ -141,6 +320,12 @@ class Position(ImplicitDict): alt: Optional[Altitude] + accuracy_h: Optional[HorizontalAccuracy] + """Horizontal error that is likely to be present in this reported position.""" + + accuracy_v: Optional[VerticalAccuracy] + """Vertical error that is likely to be present in this reported position.""" + msl_alt: Optional[MSLAltitude] height: Optional[RIDHeight] @@ -165,6 +350,9 @@ class Flight(ImplicitDict): id: str """Identifier of flight that may be used to obtain details about the flight. This is not necessarily the UTM/flight ID in the remote ID system.""" + aircraft_type: Optional[UAType] + """Aircraft type of the flight.""" + current_state: Optional[CurrentState] most_recent_position: Optional[Position] diff --git a/src/uas_standards/interuss/automated_testing/scd/v1/api.py b/src/uas_standards/interuss/automated_testing/scd/v1/api.py index d4d7984..d135160 100644 --- a/src/uas_standards/interuss/automated_testing/scd/v1/api.py +++ b/src/uas_standards/interuss/automated_testing/scd/v1/api.py @@ -1,4 +1,4 @@ -"""Data types and operations from Strategic Coordination Test Data Injection 0.2.0 OpenAPI""" +"""Data types and operations from Strategic Coordination Test Data Injection 0.2.2 OpenAPI""" # This file is autogenerated; do not modify manually! @@ -12,7 +12,7 @@ from implicitdict import ImplicitDict, StringBasedDateTime -API_VERSION = "0.2.0" +API_VERSION = "0.2.2" """Version of Strategic Coordination Test Data Injection OpenAPI specification from which the objects in this package were generated.""" class StatusResponseStatus(str, Enum): diff --git a/src/uas_standards/interuss/automated_testing/versioning/api.py b/src/uas_standards/interuss/automated_testing/versioning/api.py index 3f282f1..9bb60d5 100644 --- a/src/uas_standards/interuss/automated_testing/versioning/api.py +++ b/src/uas_standards/interuss/automated_testing/versioning/api.py @@ -1,4 +1,4 @@ -"""Data types and operations from Versioning Automated Testing Interface 0.1.0 OpenAPI""" +"""Data types and operations from Versioning Automated Testing Interface 0.1.2 OpenAPI""" # This file is autogenerated; do not modify manually! @@ -12,11 +12,11 @@ from implicitdict import ImplicitDict -API_VERSION = "0.1.0" +API_VERSION = "0.1.2" """Version of Versioning Automated Testing Interface OpenAPI specification from which the objects in this package were generated.""" SystemBoundaryIdentifier = str -"""Identifier of a system boundary, known to both the client and the USS separate from this API, for which a USS can provide a version. While the format is not prescribed by this API, any value must be URL-safe. It is recommended to use an approach similar to reverse-order Internet domain names and Java packages where the global scope is described with increasingly-precise identifiers joined by periods. For instance, the system boundary containing the mandatory Network Identification U-space service might be identified with `gov.eu.uspace.v1.netid` because the authority defining this system boundary is a governmental organization (specifically, the European Union) with requirements imposed on the system under test by the U-space regulation (first version) -- specifically, the Network Identification Service section.""" +"""Identifier of a system boundary, known to both the client and the USS separate from this API, for which this interface can provide a version. While the format is not prescribed by this API, any value must be URL-safe. It is recommended to use an approach similar to reverse-order Internet domain names and Java packages where the global scope is described with increasingly-precise identifiers joined by periods. For instance, the system boundary containing the mandatory Network Identification U-space service might be identified with `gov.eu.uspace.v1.netid` because the authority defining this system boundary is a governmental organization (specifically, the European Union) with requirements imposed on the system under test by the U-space regulation (first version) -- specifically, the Network Identification Service section.""" VersionIdentifier = str @@ -28,7 +28,7 @@ class GetVersionResponse(ImplicitDict): """The requested system identity/boundary.""" system_version: Optional[VersionIdentifier] - """The USS's version for the system with the specified system identity/boundary.""" + """The version of the system with the specified system identity/boundary.""" class OperationID(str, Enum):