Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@
direction_filter,
get_mock_uss_interactions,
)
from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario
from monitoring.uss_qualifier.scenarios.scenario import (
DISTANCE_ERROR_TOLERANCE_FRACTION,
GenericTestScenario,
)
from monitoring.uss_qualifier.suites.suite import ExecutionContext


Expand Down Expand Up @@ -81,28 +84,21 @@ def __init__(
Angle.from_degrees(1 * degree_per_km)
)

limit_side_km = self._rid_version.max_diagonal_km / math.sqrt(2)
limit_diagonal_length_ok = self._rid_version.max_diagonal_km * (
1 - DISTANCE_ERROR_TOLERANCE_FRACTION
)

limit_side_km = limit_diagonal_length_ok / math.sqrt(2)
self._limit_rect = LatLngRect.from_point(isa_center).convolve_with_cap(
Angle.from_degrees(limit_side_km * degree_per_km / 2)
)
# Make sure the limit_rect is close to the allowed diagonal limit
assert (
self._rid_version.max_diagonal_km * 0.99
< geo.get_latlngrect_diagonal_km(self._limit_rect)
<= self._rid_version.max_diagonal_km
), (
f"{geo.get_latlngrect_diagonal_km(self._limit_rect)} > {self._rid_version.max_diagonal_km}"

limit_diagonal_length_fail = self._rid_version.max_diagonal_km * (
1 + DISTANCE_ERROR_TOLERANCE_FRACTION
)

# Make the too big rect 1% larger than the allowed diagonal limit
self._too_big_rect = LatLngRect.from_point(isa_center).convolve_with_cap(
Angle.from_degrees(limit_side_km * 1.01 * degree_per_km / 2)
)
assert (
geo.get_latlngrect_diagonal_km(self._too_big_rect)
> self._rid_version.max_diagonal_km
), (
f"{geo.get_latlngrect_diagonal_km(self._too_big_rect)} <= {self._rid_version.max_diagonal_km}"
Angle.from_degrees(limit_diagonal_length_fail * degree_per_km / 2)
)

@property
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@
from monitoring.uss_qualifier.scenarios.astm.netrid.virtual_observer import (
VirtualObserver,
)
from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario
from monitoring.uss_qualifier.scenarios.scenario import (
DISTANCE_ERROR_TOLERANCE_FRACTION,
GenericTestScenario,
)
from monitoring.uss_qualifier.suites.suite import ExecutionContext


Expand Down Expand Up @@ -100,12 +103,28 @@ def poll_fct(rect: LatLngRect) -> bool:
evaluator.evaluate_system_instantaneously(self._observers.observers, rect)
return False

max_allowed_diagonal_m = self._rid_version.max_diagonal_km * 1000
max_details_diagonal_m = self._rid_version.max_details_diagonal_km * 1000

virtual_observer.start_polling(
config.min_polling_interval.timedelta,
[
self._rid_version.max_diagonal_km * 1000 + 500, # too large
self._rid_version.max_diagonal_km * 1000 - 100, # clustered
self._rid_version.max_details_diagonal_km * 1000 - 100, # details
# max_allowed_diagonal_m
# * (1 + DISTANCE_ERROR_TOLERANCE_FRACTION), # too large
# max_allowed_diagonal_m
# * (
# 1 - DISTANCE_ERROR_TOLERANCE_FRACTION
# ), # clustered, just below max limit
# max_details_diagonal_m
# * (
# 1 + DISTANCE_ERROR_TOLERANCE_FRACTION
# ), # clustered, just above clustering limit
# TODO figure out why if we remove one tolerance fraction mock_uss will
# only return clustered data, when it should still show details, but only on v19
max_details_diagonal_m
* (
1 - 2*DISTANCE_ERROR_TOLERANCE_FRACTION
), # details, just below clustering limit
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@BenjaminPelletier or @mickmis, above, if the diagonal is set to max_details_diagonal_m * (1 - DISTANCE_ERROR_TOLERANCE_FRACTION), mock_uss will return a cluster rather than the details (at least if I can trust the uss_qualifier logs), at least for NetRID v19 (out of time to check for v22a)

Is this expected? (I think not, but before digging I'd rather check)

I'll bring this up at the next weekly meeting (this comment is mostly to provide context during the discussion)

],
poll_fct,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@

SPEED_PRECISION = 0.05
HEIGHT_PRECISION_M = 1
DISTANCE_PRECISION_M = 0.1
TIMESTAMP_DISCONNECT_TOLERANCE_SEC = 1

# SP responses to /flights endpoint's p99 should be below this:
Expand Down Expand Up @@ -675,7 +676,10 @@ def _evaluate_clusters_obfuscation_distance(
cluster_width, cluster_height = geo.flatten(
cluster_rect.lo(), cluster_rect.hi()
)
min_dim = 2 * self._rid_version.min_obfuscation_distance_m
min_dim = (
2 * self._rid_version.min_obfuscation_distance_m
- DISTANCE_PRECISION_M
)
Comment on lines +679 to +682
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: without the epsilon, when running the NetRID v19 scenario, for a requested diagonal of max_details_diagonal_m * (1 - DISTANCE_ERROR_TOLERANCE_FRACTION), the check below will fail.

(might or might not be related to the fact that we get a cluster when we expect details, depending on how clusters are built by mock_uss)

if cluster_height < min_dim or cluster_width < min_dim:
# Cluster has a too small distance to the edge
check.record_failed(
Expand Down
6 changes: 6 additions & 0 deletions monitoring/uss_qualifier/scenarios/scenario.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@
QueryType.F3411v22aUSSGetFlightDetails,
]

# Different spherical models have different precisions: implementations may use a different model
# than uss_qualifier. We thus accept an error margin of 0.7% around distance limits and thresholds
# to avoid failing USSes for minor differences in precision whenever the relevant standard is not
# prescriptive in that regard.
DISTANCE_ERROR_TOLERANCE_FRACTION = 0.007


class ScenarioCannotContinueError(Exception):
def __init__(self, msg):
Expand Down
180 changes: 90 additions & 90 deletions monitoring/uss_qualifier/suites/astm/netrid/f3411_19.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,76 +16,76 @@ resources:
test_exclusions: resources.dev.TestExclusionsResource?
uss_identification: resources.interuss.uss_identification.USSIdentificationResource?
actions:
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.ServiceProviderNotifiesSlowUpdates
resources:
flights_data: flights_data
service_providers: service_providers
evaluation_configuration: evaluation_configuration
on_failure: Continue
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.DisplayProviderBehavior
resources:
observers: observers
mock_uss: mock_uss_sp
id_generator: id_generator
dss_pool: dss_instances
isa: service_area
uss_identification: uss_identification?
on_failure: Continue
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.NetworkedUASDisconnect
resources:
flights_data: flights_data
service_providers: service_providers
evaluation_configuration: evaluation_configuration
dss_pool: dss_instances
on_failure: Continue
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.SpOperatorNotifyMissingFields
resources:
flights_data: flights_data
service_providers: service_providers
evaluation_configuration: evaluation_configuration
on_failure: Continue
- action_generator:
generator_type: action_generators.astm.f3411.ForEachDSS
resources:
dss_instances: dss_instances
dss_datastore_cluster: dss_datastore_cluster?
utm_client_identity: utm_client_identity
id_generator: id_generator
service_area: service_area
problematically_big_area: problematically_big_area
planning_area: planning_area
test_exclusions: test_exclusions?
specification:
action_to_repeat:
test_suite:
suite_type: suites.astm.netrid.f3411_19.dss_probing
resources:
dss: dss
all_dss_instances: dss_instances
dss_datastore_cluster: dss_datastore_cluster?
utm_client_identity: utm_client_identity
id_generator: id_generator
isa: service_area
problematically_big_area: problematically_big_area
planning_area: planning_area
test_exclusions: test_exclusions?
on_failure: Continue
dss_instances_source: dss_instances
dss_instance_id: dss
on_failure: Continue
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.ServiceProviderNotificationBehavior
resources:
flights_data: flights_data
service_providers: service_providers
mock_uss: mock_uss_dp
id_generator: id_generator
dss_pool: dss_instances
on_failure: Continue
# - test_scenario:
# scenario_type: scenarios.astm.netrid.v19.ServiceProviderNotifiesSlowUpdates
# resources:
# flights_data: flights_data
# service_providers: service_providers
# evaluation_configuration: evaluation_configuration
# on_failure: Continue
# - test_scenario:
# scenario_type: scenarios.astm.netrid.v19.DisplayProviderBehavior
# resources:
# observers: observers
# mock_uss: mock_uss_sp
# id_generator: id_generator
# dss_pool: dss_instances
# isa: service_area
# uss_identification: uss_identification?
# on_failure: Continue
# - test_scenario:
# scenario_type: scenarios.astm.netrid.v19.NetworkedUASDisconnect
# resources:
# flights_data: flights_data
# service_providers: service_providers
# evaluation_configuration: evaluation_configuration
# dss_pool: dss_instances
# on_failure: Continue
# - test_scenario:
# scenario_type: scenarios.astm.netrid.v19.SpOperatorNotifyMissingFields
# resources:
# flights_data: flights_data
# service_providers: service_providers
# evaluation_configuration: evaluation_configuration
# on_failure: Continue
# - action_generator:
# generator_type: action_generators.astm.f3411.ForEachDSS
# resources:
# dss_instances: dss_instances
# dss_datastore_cluster: dss_datastore_cluster?
# utm_client_identity: utm_client_identity
# id_generator: id_generator
# service_area: service_area
# problematically_big_area: problematically_big_area
# planning_area: planning_area
# test_exclusions: test_exclusions?
# specification:
# action_to_repeat:
# test_suite:
# suite_type: suites.astm.netrid.f3411_19.dss_probing
# resources:
# dss: dss
# all_dss_instances: dss_instances
# dss_datastore_cluster: dss_datastore_cluster?
# utm_client_identity: utm_client_identity
# id_generator: id_generator
# isa: service_area
# problematically_big_area: problematically_big_area
# planning_area: planning_area
# test_exclusions: test_exclusions?
# on_failure: Continue
# dss_instances_source: dss_instances
# dss_instance_id: dss
# on_failure: Continue
# - test_scenario:
# scenario_type: scenarios.astm.netrid.v19.ServiceProviderNotificationBehavior
# resources:
# flights_data: flights_data
# service_providers: service_providers
# mock_uss: mock_uss_dp
# id_generator: id_generator
# dss_pool: dss_instances
# on_failure: Continue
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.NominalBehavior
resources:
Expand All @@ -95,26 +95,26 @@ actions:
evaluation_configuration: evaluation_configuration
dss_pool: dss_instances
on_failure: Continue
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.Misbehavior
resources:
flights_data: flights_data
service_providers: service_providers
observers: observers
evaluation_configuration: evaluation_configuration
dss_pool: dss_instances
on_failure: Continue
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.OperatorInteractions
resources: {}
on_failure: Continue
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.AggregateChecks
resources:
service_providers: service_providers
observers: observers
dss_instances: dss_instances
test_exclusions: test_exclusions?
# - test_scenario:
# scenario_type: scenarios.astm.netrid.v19.Misbehavior
# resources:
# flights_data: flights_data
# service_providers: service_providers
# observers: observers
# evaluation_configuration: evaluation_configuration
# dss_pool: dss_instances
# on_failure: Continue
# - test_scenario:
# scenario_type: scenarios.astm.netrid.v19.OperatorInteractions
# resources: {}
# on_failure: Continue
# - test_scenario:
# scenario_type: scenarios.astm.netrid.v19.AggregateChecks
# resources:
# service_providers: service_providers
# observers: observers
# dss_instances: dss_instances
# test_exclusions: test_exclusions?
participant_verifiable_capabilities:
- id: service_provider
name: NetRID Service Provider
Expand Down
Loading