Réservez des contacts avec des éphémérides personnalisées - AWS Ground Station

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Réservez des contacts avec des éphémérides personnalisées

Aperçu

Lorsque vous utilisez des éphémérides personnalisées (TLE, OEM ou élévation d'azimut), vous pouvez réserver des contacts à l'aide de l'API. ReserveContact Cette section décrit deux flux de travail courants pour la réservation de contacts et les points importants à prendre en compte pour garantir une planification des contacts réussie.

AWS Ground Station les antennes sont des ressources partagées entre plusieurs clients. Cela signifie que même si une fenêtre de contact apparaît disponible lorsque vous listez des contacts, un autre client peut la réserver avant vous. Il est donc essentiel de vérifier que votre contact arrive dans l'SCHEDULEDÉtat après la réservation et de mettre en place un suivi approprié des changements d'état du contact.

Important

Pour les éphémérides d'altitude azimutale, le satelliteArn paramètre peut être omis dans la ReserveContact demande, et vous devez fournir l'identifiant de l'éphéméride. trackingOverrides Pour les éphémérides TLE et OEM, vous devez toujours fournir le. satelliteArn

Flux de travail de réservation de contacts

Il existe deux flux de travail principaux pour réserver des contacts avec des éphémérides personnalisées :

  1. List-then-reserve flux de travail : Répertoriez d'abord les fenêtres de contact disponibles en utilisant ListContacts, puis sélectionnez et réservez une fenêtre spécifique. Cette approche est utile lorsque vous souhaitez voir toutes les opportunités disponibles avant de faire une sélection.

  2. Processus de réservation directe : réservez directement un contact pour un créneau horaire spécifique sans avoir d'abord répertorié les contacts disponibles. Cette approche est utile lorsque vous connaissez déjà l'heure de contact souhaitée ou que vous travaillez avec des horaires prédéterminés.

Les deux flux de travail sont valides et le choix dépend de vos exigences opérationnelles. Les sections suivantes fournissent des exemples de chaque approche.

Flux de travail 1 : Lister les contacts disponibles puis réserver

Ce flux de travail recherche d'abord les fenêtres de contact disponibles, puis réserve une fenêtre spécifique. Cela est utile lorsque vous souhaitez voir toutes les opportunités disponibles avant de faire une sélection.

Exemple : liste et réserve avec éphémérides d'altitude azimutale

import boto3 from datetime import datetime, timezone import time # Create AWS Ground Station client ground_station_client = boto3.client("groundstation") # Create azimuth elevation ephemeris print("Creating azimuth elevation ephemeris...") ephemeris_response = ground_station_client.create_ephemeris( name="AzEl Ephemeris for Contact", ephemeris={ "azEl": { "groundStation": "Ohio 1", "data": { "azElData": { "angleUnit": "DEGREE_ANGLE", "azElSegmentList": [ { "referenceEpoch": "2024-03-15T10:00:00Z", "validTimeRange": { "startTime": "2024-03-15T10:00:00Z", "endTime": "2024-03-15T10:15:00Z", }, "azElList": [ {"dt": 0.0, "az": 45.0, "el": 10.0}, {"dt": 180.0, "az": 50.0, "el": 15.0}, {"dt": 360.0, "az": 55.0, "el": 20.0}, {"dt": 540.0, "az": 60.0, "el": 25.0}, {"dt": 720.0, "az": 65.0, "el": 30.0}, {"dt": 900.0, "az": 70.0, "el": 35.0}, ], } ], } }, } }, ) ephemeris_id = ephemeris_response["ephemerisId"] print(f"Created ephemeris: {ephemeris_id}") # Wait for ephemeris to become ENABLED while True: status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[ "status" ] if status == "ENABLED": print("Ephemeris is ENABLED") break elif status in ["INVALID", "ERROR"]: raise RuntimeError(f"Ephemeris failed: {status}") time.sleep(5) # List available contacts print("Listing available contacts...") contacts = ground_station_client.list_contacts( # Note: satelliteArn is omitted for azimuth elevation ephemeris groundStation="Ohio 1", missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-profile", startTime=datetime(2024, 3, 15, 10, 0, 0, tzinfo=timezone.utc), endTime=datetime(2024, 3, 15, 10, 15, 0, tzinfo=timezone.utc), statusList=["AVAILABLE"], ephemeris={"azEl": {"id": ephemeris_id}}, ) if contacts["contactList"]: # Reserve the first available contact contact = contacts["contactList"][0] print(f"Reserving contact from {contact['startTime']} to {contact['endTime']}...") reservation = ground_station_client.reserve_contact( # Note: satelliteArn is omitted when using azimuth elevation ephemeris missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-profile", groundStation="Ohio 1", startTime=contact["startTime"], endTime=contact["endTime"], trackingOverrides={ "programTrackSettings": {"azEl": {"ephemerisId": ephemeris_id}} }, ) print(f"Reserved contact: {reservation['contactId']}") else: print("No available contacts found")

Exemple : Répertorier et réserver avec les éphémérides TLE

import boto3 from datetime import datetime, timedelta, timezone import time # Create AWS Ground Station client ground_station_client = boto3.client("groundstation") satellite_id = "12345678-1234-1234-1234-123456789012" satellite_arn = f"arn:aws:groundstation::111122223333:satellite/{satellite_id}" # Create TLE ephemeris print("Creating TLE ephemeris...") ephemeris_response = ground_station_client.create_ephemeris( name="TLE Ephemeris for Contact", satelliteId=satellite_id, enabled=True, expirationTime=datetime.now(timezone.utc) + timedelta(days=7), priority=1, # Higher priority than default ephemeris ephemeris={ "tle": { "tleData": [ { "tleLine1": "1 25994U 99068A 24075.54719794 .00000075 00000-0 26688-4 0 9997", "tleLine2": "2 25994 98.2007 30.6589 0001234 89.2782 18.9934 14.57114995111906", "validTimeRange": { "startTime": datetime.now(timezone.utc), "endTime": datetime.now(timezone.utc) + timedelta(days=7), }, } ] } }, ) ephemeris_id = ephemeris_response["ephemerisId"] print(f"Created ephemeris: {ephemeris_id}") # Wait for ephemeris to become ENABLED while True: status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[ "status" ] if status == "ENABLED": print("Ephemeris is ENABLED") break elif status in ["INVALID", "ERROR"]: raise RuntimeError(f"Ephemeris failed: {status}") time.sleep(5) # List available contacts print("Listing available contacts...") start_time = datetime.now(timezone.utc) + timedelta(hours=1) end_time = start_time + timedelta(days=1) contacts = ground_station_client.list_contacts( satelliteArn=satellite_arn, # Required for TLE/OEM ephemeris groundStation="Hawaii 1", missionProfileArn="arn:aws:groundstation:us-west-2:111122223333:mission-profile/example-profile", startTime=start_time, endTime=end_time, statusList=["AVAILABLE"], ) if contacts["contactList"]: # Reserve the first available contact contact = contacts["contactList"][0] print(f"Reserving contact from {contact['startTime']} to {contact['endTime']}...") reservation = ground_station_client.reserve_contact( satelliteArn=satellite_arn, # Required for TLE/OEM ephemeris missionProfileArn="arn:aws:groundstation:us-west-2:111122223333:mission-profile/example-profile", groundStation="Hawaii 1", startTime=contact["startTime"], endTime=contact["endTime"], # Note: trackingOverrides is optional for TLE/OEM # The system will use the highest priority ephemeris automatically ) print(f"Reserved contact: {reservation['contactId']}") else: print("No available contacts found")

Flux de travail 2 : réservation par contact direct

Ce flux de travail réserve directement un contact sans répertorier au préalable les fenêtres disponibles. Cette approche est utile lorsque vous connaissez déjà l'heure de contact souhaitée ou que vous implémentez une planification automatisée.

Exemple : réservation directe avec éphémérides d'élévation d'azimut

import boto3 from datetime import datetime, timezone import time # Create AWS Ground Station client ground_station_client = boto3.client("groundstation") # Define contact window contact_start = datetime(2024, 3, 20, 14, 0, 0, tzinfo=timezone.utc) contact_end = datetime(2024, 3, 20, 14, 15, 0, tzinfo=timezone.utc) # Create azimuth elevation ephemeris for the specific contact time print("Creating azimuth elevation ephemeris...") ephemeris_response = ground_station_client.create_ephemeris( name="Direct Contact AzEl Ephemeris", ephemeris={ "azEl": { "groundStation": "Ohio 1", "data": { "azElData": { "angleUnit": "DEGREE_ANGLE", "azElSegmentList": [ { "referenceEpoch": contact_start.isoformat(), "validTimeRange": { "startTime": contact_start.isoformat(), "endTime": contact_end.isoformat(), }, "azElList": [ {"dt": 0.0, "az": 45.0, "el": 10.0}, {"dt": 180.0, "az": 50.0, "el": 15.0}, {"dt": 360.0, "az": 55.0, "el": 20.0}, {"dt": 540.0, "az": 60.0, "el": 25.0}, {"dt": 720.0, "az": 65.0, "el": 30.0}, {"dt": 900.0, "az": 70.0, "el": 35.0}, ], } ], } }, } }, ) ephemeris_id = ephemeris_response["ephemerisId"] print(f"Created ephemeris: {ephemeris_id}") # Wait for ephemeris to become ENABLED while True: status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[ "status" ] if status == "ENABLED": print("Ephemeris is ENABLED") break elif status in ["INVALID", "ERROR"]: raise RuntimeError(f"Ephemeris failed: {status}") time.sleep(5) # Directly reserve the contact print(f"Reserving contact from {contact_start} to {contact_end}...") reservation = ground_station_client.reserve_contact( # Note: satelliteArn is omitted for azimuth elevation missionProfileArn="arn:aws:groundstation:us-east-2:111122223333:mission-profile/example-profile", groundStation="Ohio 1", startTime=contact_start, endTime=contact_end, trackingOverrides={"programTrackSettings": {"azEl": {"ephemerisId": ephemeris_id}}}, ) print(f"Reserved contact: {reservation['contactId']}")

Exemple : réservation directe avec TLE ephemeris

import boto3 from datetime import datetime, timedelta, timezone import time # Create AWS Ground Station client ground_station_client = boto3.client("groundstation") satellite_id = "12345678-1234-1234-1234-123456789012" satellite_arn = f"arn:aws:groundstation::111122223333:satellite/{satellite_id}" # Define contact window (based on predicted pass) contact_start = datetime(2024, 3, 21, 10, 30, 0, tzinfo=timezone.utc) contact_end = datetime(2024, 3, 21, 10, 42, 0, tzinfo=timezone.utc) # Create TLE ephemeris print("Creating TLE ephemeris...") ephemeris_response = ground_station_client.create_ephemeris( name="Direct Contact TLE Ephemeris", satelliteId=satellite_id, enabled=True, expirationTime=contact_end + timedelta(days=1), priority=1, ephemeris={ "tle": { "tleData": [ { "tleLine1": "1 25994U 99068A 24080.50000000 .00000075 00000-0 26688-4 0 9999", "tleLine2": "2 25994 98.2007 35.6589 0001234 89.2782 18.9934 14.57114995112000", "validTimeRange": { "startTime": (contact_start - timedelta(hours=1)).isoformat(), "endTime": (contact_end + timedelta(hours=1)).isoformat(), }, } ] } }, ) ephemeris_id = ephemeris_response["ephemerisId"] print(f"Created ephemeris: {ephemeris_id}") # Wait for ephemeris to become ENABLED while True: status = ground_station_client.describe_ephemeris(ephemerisId=ephemeris_id)[ "status" ] if status == "ENABLED": print("Ephemeris is ENABLED") break elif status in ["INVALID", "ERROR"]: raise RuntimeError(f"Ephemeris failed: {status}") time.sleep(5) # Directly reserve the contact print(f"Reserving contact from {contact_start} to {contact_end}...") reservation = ground_station_client.reserve_contact( satelliteArn=satellite_arn, # Required for TLE ephemeris missionProfileArn="arn:aws:groundstation:us-west-2:111122223333:mission-profile/example-profile", groundStation="Hawaii 1", startTime=contact_start, endTime=contact_end, # Note: trackingOverrides is optional for TLE # The system will use the highest priority ephemeris automatically ) print(f"Reserved contact: {reservation['contactId']}")

Surveillance des changements d'état des contacts

Après avoir réservé un contact, il est important de surveiller son état afin de s'assurer qu'il effectue une transition réussie SCHEDULED et d'être informé de tout problème. AWS Ground Station envoie des événements à Amazon EventBridge pour tous les changements d'état des contacts.

Les états de contact suivent ce cycle de vie :

  • SCHEDULING- Le contact est en cours de traitement pour la planification

  • SCHEDULED- Le contact a été planifié avec succès et sera exécuté

  • FAILED_TO_SCHEDULE- Le contact n'a pas pu être planifié (état du terminal)

Pour plus d'informations sur les états et le cycle de vie des contacts, consultezComprendre le cycle de vie des contacts.

Mettre en œuvre le suivi de l'état des contacts avec EventBridge

Pour surveiller l'évolution de l'état des contacts en temps réel, vous pouvez configurer une EventBridge règle Amazon qui déclenche une fonction Lambda chaque fois qu'un contact de la Ground Station change d'état. Cette approche est plus efficace et plus évolutive que l'interrogation de l'état du contact.

Étapes d’implémentation

  1. Création d'une fonction Lambda pour traiter les événements de changement d'état des contacts

  2. Créez une EventBridge règle qui correspond aux événements de changement d'état des contacts de la Ground Station

  3. Ajouter la fonction Lambda comme cible pour la règle

Exemple de gestionnaire de fonctions Lambda

Pour un exemple complet de fonction Lambda qui traite les événements de changement d'état des contacts, consultez la GroundStationCloudWatchEventHandlerLambda ressource du modèle. AquaSnppJpssTerraDigIF.yml CloudFormation Ce modèle est disponible dans le compartiment Amazon S3 d'accueil du AWS Ground Station client. Pour obtenir des instructions sur l'accès à ce modèle, consultez la Assemblage section de l'exemple de point de terminaison du flux de données.

EventBridge configuration des règles

La EventBridge règle doit utiliser le modèle d'événement suivant pour correspondre à tous les changements d'état des contacts de la Ground Station :

{ "source": ["aws.groundstation"], "detail-type": ["Ground Station Contact State Change"] }

Pour filtrer uniquement des états spécifiques (par exemple, les défaillances), vous pouvez ajouter un filtre détaillé :

{ "source": ["aws.groundstation"], "detail-type": ["Ground Station Contact State Change"], "detail": { "contactStatus": [ "FAILED_TO_SCHEDULE", "FAILED", "AWS_FAILED", "AWS_CANCELLED" ] } }

Pour obtenir des instructions détaillées sur la création de EventBridge règles avec des cibles Lambda, consultez la section Création de règles qui réagissent aux événements dans le guide de EventBridge l'utilisateur Amazon.

Configuration de EventBridge règles pour l'automatisation

Vous pouvez créer des EventBridge règles pour répondre automatiquement aux changements d'état des contacts. Par exemple :

  • Envoyer des notifications lorsqu'un contact ne parvient pas à planifier

  • Déclenchez des fonctions Lambda pour préparer les ressources lorsqu'un contact entre PREPASS

  • Enregistrez les contacts complétés à des fins d'audit

Pour obtenir des informations détaillées sur la configuration EventBridge des règles relatives aux AWS Ground Station événements, consultezAutomatisez AWS Ground Station avec des événements.

Bonnes pratiques et considérations

Gestion des conflits de planification

Les AWS Ground Station antennes étant des ressources partagées, une fenêtre de contact qui apparaît disponible ListContacts peut être réservée par un autre client avant que vous ne puissiez la réserver. Pour gérer cela :

  1. Vérifiez toujours l'état du contact après la réservation

  2. Implémenter une logique de nouvelle tentative avec des fenêtres temporelles alternatives

  3. Envisagez de réserver des contacts bien à l'avance lorsque cela est possible

  4. Utiliser EventBridge les événements pour surveiller les FAILED_TO_SCHEDULE états

Calendrier de validation des éphémérides

N'oubliez pas que les éphémérides doivent être en ENABLED état avant de pouvoir les utiliser pour réserver des contacts. Le processus de validation prend généralement de quelques secondes à quelques minutes selon le type et la taille des éphémérides. Vérifiez toujours le statut des éphémérides avant de tenter de réserver des contacts.

Considérations relatives au calendrier des contacts

Lorsque vous utilisez des éphémérides personnalisées :

Différences entre les API par type d'éphéméride

L'ReserveContactAPI se comporte différemment selon le type d'éphéméride :

Type d'éphéméride Learn par satellite requis Suivi des annulations requis
TLE Oui Non (facultatif)
OEM Oui Non (facultatif)
Élévation de l'azimut Non (facultatif) Oui