Reservieren Sie Kontakte mit benutzerdefinierten Ephemeriden - AWS Ground Station

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Reservieren Sie Kontakte mit benutzerdefinierten Ephemeriden

Übersicht

Wenn Sie benutzerdefinierte Ephemeriden (TLE, OEM oder Azimut-Elevation) verwenden, können Sie Kontakte über die API reservieren. ReserveContact In diesem Abschnitt werden zwei gängige Workflows für die Reservierung von Kontakten sowie wichtige Überlegungen zur Sicherstellung einer erfolgreichen Kontaktplanung beschrieben.

AWS Ground Station Antennen sind Ressourcen, die von mehreren Kunden gemeinsam genutzt werden. Das bedeutet, dass selbst wenn ein Kontaktfenster verfügbar erscheint, wenn Sie Kontakte auflisten, ein anderer Kunde es möglicherweise vor Ihnen reserviert. Daher ist es wichtig, sicherzustellen, dass Ihr Kontakt den SCHEDULED Status nach der Reservierung erreicht hat, und für eine angemessene Überwachung bei Änderungen des Kontaktstatus zu sorgen.

Wichtig

Bei azimutalen Elevations-Ephemeriden kann der satelliteArn Parameter in der ReserveContact Anfrage weggelassen werden und Sie müssen die Ephemeriden-ID angebentrackingOverrides. Für TLE- und OEM-Ephemeriden müssen Sie dennoch die angeben. satelliteArn

Workflows zur Kontaktreservierung

Es gibt zwei Hauptworkflows für die Reservierung von Kontakten mit benutzerdefinierten Ephemeriden:

  1. List-then-reserve Arbeitsablauf: Führen Sie zunächst die verfügbaren Kontaktfenster auf ListContacts, wählen Sie dann ein bestimmtes Fenster aus und reservieren Sie es. Dieser Ansatz ist nützlich, wenn Sie alle verfügbaren Möglichkeiten sehen möchten, bevor Sie eine Auswahl treffen.

  2. Direkter Reservierungsablauf: Reservieren Sie einen Kontakt direkt für ein bestimmtes Zeitfenster, ohne zuerst die verfügbaren Kontakte aufzulisten. Dieser Ansatz ist nützlich, wenn Sie Ihre gewünschte Kontaktzeit bereits kennen oder mit festgelegten Zeitplänen arbeiten.

Beide Workflows sind gültig und die Wahl hängt von Ihren betrieblichen Anforderungen ab. Die folgenden Abschnitte enthalten Beispiele für jeden Ansatz.

Arbeitsablauf 1: Verfügbare Kontakte auflisten und dann reservieren

Dieser Workflow fragt zuerst nach verfügbaren Kontaktfenstern und reserviert dann ein bestimmtes Fenster. Dies ist nützlich, wenn Sie alle verfügbaren Opportunities sehen möchten, bevor Sie eine Auswahl treffen.

Beispiel: Ephemeriden mit Azimut-Elevation auflisten und reservieren

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")

Beispiel: Mit TLE-Ephemeriden auflisten und reservieren

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")

Workflow 2: Direkte Kontaktreservierung

Dieser Workflow reserviert direkt einen Kontakt, ohne zuerst die verfügbaren Fenster aufzulisten. Dieser Ansatz ist nützlich, wenn Sie Ihre gewünschte Kontaktzeit bereits kennen oder eine automatisierte Terminplanung implementieren.

Beispiel: Direkte Reservierung mit azimutaler Elevations-Ephemeride

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']}")

Beispiel: Direktreservierung mit TLE-Ephemeriden

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']}")

Überwachung von Änderungen des Kontaktstatus

Nach der Reservierung eines Kontakts ist es wichtig, seinen Status zu überwachen, um sicherzustellen, dass der Übergang erfolgreich ist, SCHEDULED und um bei Problemen benachrichtigt zu werden. AWS Ground Station sendet Ereignisse an Amazon EventBridge für alle Änderungen des Kontaktstatus.

Kontaktstatus folgen diesem Lebenszyklus:

  • SCHEDULING- Der Kontakt wird gerade für die Terminplanung bearbeitet

  • SCHEDULED- Der Kontakt wurde erfolgreich geplant und wird ausgeführt

  • FAILED_TO_SCHEDULE- Der Kontakt konnte nicht geplant werden (Terminalstatus)

Weitere Informationen zu Kontaktstatus und Lebenszyklus finden Sie unterVerstehen Sie den Lebenszyklus von Kontakten.

Implementierung der Kontaktstatusüberwachung mit EventBridge

Um Änderungen des Kontaktstatus in Echtzeit zu überwachen, können Sie eine EventBridge Amazon-Regel einrichten, die eine Lambda-Funktion auslöst, wenn sich der Status eines Bodenstationskontakts ändert. Dieser Ansatz ist effizienter und skalierbarer als die Abfrage des Kontaktstatus.

Implementierungsschritte

  1. Erstellen Sie eine Lambda-Funktion zur Verarbeitung von Ereignissen zur Änderung des Kontaktstatus

  2. Erstellen Sie eine EventBridge Regel, die den Ereignissen zur Änderung des Kontaktstatus der Ground Station entspricht

  3. Fügen Sie die Lambda-Funktion als Ziel für die Regel hinzu

Beispiel für einen Lambda-Funktionshandler

Ein vollständiges Beispiel für eine Lambda-Funktion, die Ereignisse zur Änderung des Kontaktstatus verarbeitet, finden Sie in der GroundStationCloudWatchEventHandlerLambda Ressource in der AquaSnppJpssTerraDigIF.yml CloudFormation Vorlage. Diese Vorlage ist im Amazon S3 S3-Bucket für AWS Ground Station Kunden verfügbar. Anweisungen zum Zugriff auf diese Vorlage finden Sie im Es zusammensetzen Abschnitt des Beispiels für einen Datenfluss-Endpunkt.

EventBridge Regelkonfiguration

Die EventBridge Regel sollte das folgende Ereignismuster verwenden, um allen Änderungen des Kontaktstatus der Ground Station Rechnung zu tragen:

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

Um nur nach bestimmten Zuständen zu filtern (z. B. nach Ausfällen), können Sie einen Detailfilter hinzufügen:

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

Ausführliche Anweisungen zum Erstellen von EventBridge Regeln mit Lambda-Zielen finden Sie unter Erstellen von Regeln, die auf Ereignisse reagieren im EventBridge Amazon-Benutzerhandbuch.

EventBridge Regeln für die Automatisierung einrichten

Sie können EventBridge Regeln erstellen, um automatisch auf Änderungen des Kontaktstatus zu reagieren. Beispiel:

  • Senden Sie Benachrichtigungen, wenn ein Kontakt den Terminplan nicht einhält

  • Lambda-Funktionen auslösen, um Ressourcen vorzubereiten, wenn ein Kontakt eintritt PREPASS

  • Protokollieren Sie den Abschluss von Kontakten zu Prüfungszwecken

Ausführliche Informationen zum Einrichten von EventBridge Regeln für AWS Ground Station Ereignisse finden Sie unterAutomatisieren Sie AWS Ground Station mit Ereignissen.

Bewährte Methoden und Überlegungen

Umgang mit Terminkonflikten

Da es sich bei AWS Ground Station Antennen um gemeinsam genutzte Ressourcen handelt, wurde ein Kontaktfenster, das unter verfügbar angezeigt wird, ListContacts möglicherweise von einem anderen Kunden reserviert, bevor Sie es reservieren können. Um das zu handhaben:

  1. Überprüfen Sie nach der Reservierung immer den Kontaktstatus

  2. Implementieren Sie die Wiederholungslogik mit alternativen Zeitfenstern

  3. Erwägen Sie, Kontakte möglichst weit im Voraus zu reservieren

  4. Verwenden Sie EventBridge Ereignisse, um nach Staaten Ausschau zu halten FAILED_TO_SCHEDULE

Zeitplan für die Validierung von Ephemeriden

Denken Sie daran, dass die Ephemeride aktiviert sein muss, bevor ENABLED Sie sie zum Reservieren von Kontakten verwenden können. Der Validierungsprozess dauert je nach Art und Größe der Ephemeriden in der Regel einige Sekunden bis einige Minuten. Überprüfen Sie immer den Status der Ephemeriden, bevor Sie versuchen, Kontakte zu reservieren.

Überlegungen zum Zeitpunkt der Kontaktaufnahme

Wenn Sie benutzerdefinierte Ephemeriden verwenden:

API-Unterschiede je nach Ephemeridentyp

Die ReserveContact API verhält sich je nach Ephemeridentyp unterschiedlich:

Ephemeriden-Typ SatellitERN erforderlich TrackingOverrides erforderlich
TEL Ja Nein (fakultativ)
OEM Ja Nein (fakultativ)
Azimut-Elevation Nein (fakultativ) Ja