カスタムエフェメリスでコンタクトを予約する - AWS Ground Station

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

カスタムエフェメリスでコンタクトを予約する

概要:

カスタムエフェメリス (TLE、OEM、または方位標高) を使用する場合は、ReserveContact API を使用してコンタクトを予約できます。このセクションでは、コンタクトを予約するための 2 つの一般的なワークフローと、コンタクトスケジューリングを成功させるための重要な考慮事項について説明します。

AWS Ground Station アンテナは、複数のお客様間で共有されるリソースです。つまり、問い合わせを一覧表示するときに問い合わせウィンドウが使用可能になっても、別の顧客が事前に予約する場合があります。したがって、コンタクトが予約後に SCHEDULED状態になったことを確認し、コンタクト状態の変化を適切にモニタリングすることが重要です。

重要

方位高度エフェメリスの場合、 satelliteArnパラメータをReserveContactリクエストから省略できます。エフェメリス ID trackingOverridesを指定する必要があります。TLE および OEM エフェメリスの場合は、引き続き を指定する必要がありますsatelliteArn

問い合わせ予約ワークフロー

カスタムエフェメリスでコンタクトを予約するには、主に 2 つのワークフローがあります。

  1. List-then-reserve ワークフロー: ListContacts を使用して利用可能な問い合わせウィンドウを最初に一覧表示してから、特定のウィンドウを選択して予約します。このアプローチは、選択する前に利用可能なすべての機会を確認する場合に役立ちます。

  2. 直接予約ワークフロー: 利用可能な連絡先を最初に一覧表示することなく、特定の時間枠の連絡先を直接予約します。このアプローチは、希望するコンタクト時間が既にわかっている場合や、事前に決められたスケジュールで作業している場合に便利です。

どちらのワークフローも有効であり、選択は運用要件によって異なります。以下のセクションでは、各アプローチの例を示します。

ワークフロー 1: 利用可能な連絡先を一覧表示し、予約する

このワークフローは、最初に利用可能な問い合わせウィンドウをクエリし、次に特定のウィンドウを予約します。これは、選択する前に利用可能なすべての機会を表示する場合に便利です。

例: 方位高度エフェメリスを使用した一覧表示と予約

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

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

ワークフロー 2: 直接連絡の予約

このワークフローは、利用可能なウィンドウを最初に一覧表示することなく、問い合わせを直接予約します。このアプローチは、希望する問い合わせ時間がすでにわかっている場合や、自動スケジューリングを実装している場合に便利です。

例: 方位高度エフェメリスを使用した直接予約

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

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

問い合わせ状態の変更のモニタリング

コンタクトを予約したら、その状態をモニタリングして、問題が正常に に移行SCHEDULEDし、通知されるようにすることが重要です。 は、すべてのコンタクト状態の変更について Amazon EventBridge にイベント AWS Ground Station を送信します。

問い合わせの状態は次のライフサイクルに従います。

  • SCHEDULING - 問い合わせはスケジューリングのために処理中です

  • SCHEDULED - 問い合わせは正常にスケジュールされ、実行されます

  • FAILED_TO_SCHEDULE - コンタクトをスケジュールできませんでした (終了状態)

問い合わせの状態とライフサイクルの詳細については、「」を参照してください問い合わせのライフサイクルを理解する

EventBridge を使用した問い合わせ状態モニタリングの実装

問い合わせの状態の変化をリアルタイムでモニタリングするには、Ground Station の問い合わせの状態が変わるたびに Lambda 関数をトリガーする Amazon EventBridge ルールを設定できます。このアプローチは、問い合わせステータスをポーリングするよりも効率的でスケーラブルです。

実装手順

  1. 問い合わせ状態変更イベントを処理する Lambda 関数を作成する

  2. Ground Station の問い合わせ状態変更イベントに一致する EventBridge ルールを作成する

  3. ルールのターゲットとして Lambda 関数を追加する

Lambda 関数ハンドラーの例

問い合わせ状態の変更イベントを処理する Lambda 関数の完全な例については、 AquaSnppJpssTerraDigIF.yml CloudFormation テンプレートの GroundStationCloudWatchEventHandlerLambdaリソースを参照してください。このテンプレートは、 AWS Ground Station カスタマーオンボーディング Amazon S3 バケットで使用できます。このテンプレートにアクセスする手順については、データフローエンドポイントの例のまとめる「」セクションを参照してください。

EventBridge ルール設定

EventBridge ルールは、次のイベントパターンを使用して、Ground Station のすべての問い合わせ状態の変化と一致する必要があります。

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

特定の状態 (障害など) のみをフィルタリングするには、詳細フィルターを追加できます。

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

Lambda ターゲットで EventBridge ルールを作成する詳細な手順については、「Amazon EventBridge ユーザーガイド」の「イベントに対応するルールの作成」を参照してください。

自動化のための EventBridge ルールの設定

EventBridge ルールを作成して、問い合わせ状態の変更に自動的に対応できます。例えば、次のようになります。

  • 問い合わせがスケジュールに失敗したときに通知を送信する

  • 問い合わせが入ったときに Lambda 関数をトリガーしてリソースを準備する PREPASS

  • 監査目的での問い合わせ完了のログ記録

AWS Ground Station イベントの EventBridge ルールの設定の詳細については、「」を参照してくださいイベント AWS Ground Station による自動化

ベストプラクティスと考慮事項

スケジュールの競合の処理

AWS Ground Station アンテナは共有リソースであるため、 に表示される問い合わせウィンドウListContactsは、予約する前に別のお客様が予約する場合があります。これを処理するには:

  1. 予約後に常に問い合わせステータスを確認する

  2. 代替時間枠を使用して再試行ロジックを実装する

  3. 可能であれば、問い合わせを事前に予約することを検討してください。

  4. EventBridge イベントを使用してFAILED_TO_SCHEDULE状態をモニタリングする

エフェメリス検証のタイミング

エフェメリスを使用してコンタクトを予約する前に、エフェメリスが ENABLED状態になっている必要があることに注意してください。検証プロセスは通常、エフェメリスのタイプとサイズに応じて数秒から数分かかります。コンタクトを予約する前に、必ずエフェメリスのステータスを確認してください。

問い合わせタイミングに関する考慮事項

カスタムエフェメリスを使用する場合:

  • エフェメリスが問い合わせ期間全体をカバーしていることを確認します。

  • 方位高度エフェメリスの場合、コンタクト全体を通して角度がアンテナをサイトマスクの上に維持していることを確認します。

  • 将来のコンタクトをスケジュールするときにエフェメリスの有効期限を考慮する

エフェメリスタイプ別の API の違い

ReserveContact API の動作はエフェメリスタイプによって異なります。

エフェメリスタイプ satelliteArn 必須 trackingOverrides 必須
TLE あり いいえ (オプション)
OEM あり いいえ (オプション)
方位高度 いいえ (オプション) あり