Reserva contactos con efemérides personalizadas - AWS Ground Station

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Reserva contactos con efemérides personalizadas

Descripción general de

Al usar efemérides personalizadas (TLE, OEM o elevación de acimut), puedes reservar contactos mediante la API. ReserveContact En esta sección, se describen dos flujos de trabajo comunes para reservar contactos y algunas consideraciones importantes para garantizar una programación de contactos correcta.

AWS Ground Station las antenas son recursos compartidos entre varios clientes. Esto significa que, aunque aparezca una ventana de contactos disponible al enumerar los contactos, es posible que otro cliente la reserve antes que tú. Por lo tanto, es fundamental comprobar que tu contacto llegue al SCHEDULED estado tras realizar la reserva e implementar un seguimiento adecuado de los cambios de estado del contacto.

importante

En el caso de las efemérides de elevación de acimut, es posible que se omita el satelliteArn parámetro en la ReserveContact solicitud y debes proporcionarnos el identificador de la efeméride. trackingOverrides En el caso de las efemérides TLE y OEM, aún debe proporcionar el. satelliteArn

Flujos de trabajo para reservar contactos

Existen dos flujos de trabajo principales para reservar contactos con efemérides personalizadas:

  1. List-then-reserve flujo de trabajo: primero enumere las ventanas de contactos disponibles y ListContacts, a continuación, seleccione y reserve una ventana específica. Este enfoque resulta útil si desea ver todas las oportunidades disponibles antes de realizar una selección.

  2. Flujo de trabajo de reserva directa: reserve directamente un contacto para un período de tiempo específico sin enumerar primero los contactos disponibles. Este enfoque resulta útil cuando ya sabes la hora de contacto deseada o si trabajas con horarios predeterminados.

Ambos flujos de trabajo son válidos y la elección depende de sus requisitos operativos. En las siguientes secciones se proporcionan ejemplos de cada enfoque.

Flujo de trabajo 1: Enumere los contactos disponibles y luego reserve

Este flujo de trabajo consulta primero las ventanas de contacto disponibles y, a continuación, reserva una ventana específica. Esto resulta útil si desea ver todas las oportunidades disponibles antes de realizar una selección.

Ejemplo: Listar y reservar con efemérides de elevación acimutal

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

Ejemplo: Anuncie y reserve con efemé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")

Flujo de trabajo 2: reserva por contacto directo

Este flujo de trabajo reserva directamente un contacto sin enumerar primero las ventanas disponibles. Este enfoque es útil cuando ya sabe la hora de contacto deseada o si está implementando una programación automatizada.

Ejemplo: reserva directa con efemérides de elevación acimutal

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

Ejemplo: reserva directa con efemé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}" # 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']}")

Supervisión de los cambios de estado de los contactos

Después de reservar un contacto, es importante monitorear su estado para garantizar que la transición se realice correctamente SCHEDULED y recibir notificaciones sobre cualquier problema. AWS Ground Station emite eventos a Amazon EventBridge para todos los cambios de estado de contacto.

Los estados de contacto siguen este ciclo de vida:

  • SCHEDULING- El contacto se está procesando para su programación

  • SCHEDULED- El contacto se programó correctamente y se ejecutará

  • FAILED_TO_SCHEDULE- No se ha podido programar el contacto (estado terminal)

Para obtener más información sobre los estados y el ciclo de vida de los contactos, consulteComprenda el ciclo de vida de.

Implementar la supervisión del estado de los contactos con EventBridge

Para monitorizar los cambios de estado de los contactos en tiempo real, puedes configurar una EventBridge regla de Amazon que active una función Lambda cada vez que un contacto de Ground Station cambie de estado. Este enfoque es más eficiente y escalable que sondear el estado del contacto.

Pasos para la implementación

  1. Cree una función Lambda para procesar eventos de cambio de estado de contacto

  2. Cree una EventBridge regla que coincida con los eventos de cambio de estado de contacto de Ground Station

  3. Agregue la función Lambda como objetivo de la regla

Ejemplo de controlador de funciones Lambda

Para ver un ejemplo completo de una función Lambda que procesa eventos de cambio de estado de contacto, consulte el GroundStationCloudWatchEventHandlerLambda recurso de la AquaSnppJpssTerraDigIF.yml CloudFormation plantilla. Esta plantilla está disponible en el bucket de Amazon S3 que se está incorporando AWS Ground Station al cliente. Para obtener instrucciones sobre cómo acceder a esta plantilla, consulte la Poniéndolo todo junto sección del ejemplo del punto final del flujo de datos.

EventBridge configuración de reglas

La EventBridge regla debe usar el siguiente patrón de eventos para que coincida con todos los cambios de estado de contacto de Ground Station:

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

Para filtrar únicamente por estados específicos (por ejemplo, errores), puedes añadir un filtro detallado:

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

Para obtener instrucciones detalladas sobre la creación de EventBridge reglas con objetivos Lambda, consulte Creación de reglas que reaccionen a los eventos en la Guía EventBridge del usuario de Amazon.

Configuración de EventBridge reglas para la automatización

Puede crear EventBridge reglas para responder automáticamente a los cambios de estado de los contactos. Por ejemplo:

  • Envía notificaciones cuando un contacto no pueda programar una cita

  • Activa funciones Lambda para preparar los recursos cuando entra un contacto PREPASS

  • Registre las terminaciones de los contactos con fines de auditoría

Para obtener información detallada sobre cómo configurar EventBridge las reglas para AWS Ground Station los eventos, consulteAutomatice AWS Ground Station con eventos.

Prácticas recomendadas y consideraciones

Gestión de conflictos de programación

Como AWS Ground Station las antenas son recursos compartidos, es ListContacts posible que otro cliente reserve una ventana de contacto que aparece disponible en antes de que tú puedas reservarla. Para gestionar esto:

  1. Compruebe siempre el estado de contacto después de la reserva

  2. Implemente la lógica de reintento con ventanas de tiempo alternativas

  3. Considere la posibilidad de reservar los contactos con bastante antelación siempre que sea posible

  4. Utilice EventBridge los eventos para monitorear los estados FAILED_TO_SCHEDULE

Tiempo de validación de efemérides

Recuerda que las efemérides deben estar en ENABLED estado para poder usarlas para reservar contactos. El proceso de validación suele tardar entre unos segundos y unos minutos, según el tipo y el tamaño de las efemérides. Compruebe siempre el estado de las efemérides antes de intentar reservar los contactos.

Consideraciones sobre el tiempo de contacto

Cuando se utilizan efemérides personalizadas:

Diferencias de API por tipo de efemérides

La ReserveContact API se comporta de forma diferente según el tipo de efemérides:

Tipo de efemérides Se requiere un ARN satelital Es obligatorio rastrear las anulaciones
TLE No (opcional)
OEM No (opcional)
Elevación del acimut No (opcional)