Capture Satellite Data Using AWS Ground Station
This example shows how to use the Amazon® Web Services (AWS) Ground Station service from within MATLAB® to receive data from Earth observation satellite AQUA. AQUA (launched in 2002), is an Earth-orbiting, National Aeronautics and Space Administration (NASA), scientific research satellite that studies precipitation, evaporation, and cycling of water. You can capture data from other satellites for which you have access permission by changing the satellite information. Using this example, you can capture satellite data as radio frequency (RF) in-phase quadrature (I/Q) samples, and as demodulated and decoded data. You can further process and analyze this captured data using the Communications Toolbox™, Image Processing Toolbox™ and Satellite Communications Toolbox™.
Introduction
AWS Ground Station is a service that enables you to manage satellite communications and process data without the need to build or maintain your own ground station infrastructure. You can get more information about the AWS Ground Station service and its capabilities from the AWS Ground Station website.
AWS Ground Station currently supports low earth orbit (LEO) and medium earth orbit (MEO) satellites. These satellites are visible from the ground station for only a few minutes during each pass, due to their orbital cycles. Communication is possible when the satellites are within the line of sight of a ground station. AWS Ground Station establishes contact with the satellites, and then receives, demodulates, and decodes RF signals from them. The AWS ground station delivers your contact data asynchronously to an Amazon Simple Storage Service (S3) bucket associated with your account. The service delivers your contact data as packet capture (PCAP) files. You can replay the contact data into a software-defined radio (SDR) or extract the payload data from the PCAP files for processing.
AWS Services and Costs
This example uses these AWS services, some of which can incur costs on your AWS account. For cost estimates, see the linked pricing page for each AWS service.
AWS enables you to visualize, understand, and manage your AWS costs and usage over time. For more details, see the AWS Cost Explorer website.
Set Up Access to AWS
To capture data from satellites using the AWS Ground Station service, you must have an AWS account with permission to use the AWS services this example uses. For more information, see the Setting Up AWS Ground Station website. To set up access to the AWS services used in this example, follow these steps.
Create an Identity and Access Management (IAM) user with programmatic access, and permission to use all the AWS service policies listed in the AWS Services and Costs section. For more information on creating an IAM user, see Creating IAM users (console) in the AWS documentation.
Once you have created an IAM user, download the
.csv
credentials file for configuring the AWS command line interface (CLI) for use with MATLAB.
Request Access to Ground Station
To get access to ground station services on your account, email aws-groundstation@amazon.com with the satellite ID and your AWS account ID. This figure shows a sample email for obtaining access to AWS services.
Configure AWS CLI
In this example, you configure the AWS CLI for accessing the AWS services by following these steps.
Download and install the latest AWS CLI from the AWS Command Line Interface site.
Configure the installed AWS CLI using the previously downloaded
.csv
file. To instead configure the AWS CLI outside of MATLAB, use the AWS IAM Identity center.
If you do not have an IAM username or credentials saved in a .csv
file, see the Set Up Access to AWS section. Contact your administrator, see how to sign in to your AWS account and configuring AWS CLI to use IAM Identity Center.
Once you have a .csv
credentials file, uncomment and these commands and replace the fullfile
input arguments with the full path to the file on your computer.
% csvCredentialsFile = fullfile("C:","Work","credentials.csv"); % cfg = HelperAWSAccount(csvCredentialsFile);
If you use IAM Identity Center to configure the AWS CLI, replace the profileName
value with your profile name. A profile comprises the settings and credentials used to execute the AWS commands.
profileName =
"JohnDoe";
cfg = HelperAWSAccount(profileName)
cfg = HelperAWSAccount with properties: ProfileName: "JohnDoe" CSVFile: []
Get Satellite List
To obtain the list of satellites accessible in your AWS account, use the HelperSatellitelist
function.
satelliteList = HelperSatellitelist(cfg);
satelliteList(:,(1:3)) % Display satellite list
ans=6×3 table
SatelliteName SatelliteID GroundStation
_____________ ___________ _____________
"AQUA" 27424 "Ohio 1"
"AQUA" 27424 "Oregon 1"
"NOAA20" 43013 "Ohio 1"
"NOAA20" 43013 "Oregon 1"
"SUOMINPP" 37849 "Ohio 1"
"SUOMINPP" 37849 "Oregon 1"
Capture Satellite Data
In this example, you capture satellite data by inputting satellite ID and ground station location into the HelperSatelliteDataCapture
function. You can input this information manually, or you can input a row from the table in satelliteList
.
% (optional) If the S3 Bucket you are using for data storage is in the % same region as ground station, specify its name. s3Bucket =""; % (optional) Specify an email address at which to receive updates % regarding the status of a scheduled contact. notificationEmail =
""; obj = HelperSatelliteDataCapture(cfg,satelliteList(1,:), ... NotificationEmail=notificationEmail,S3Bucket=s3Bucket)
obj = HelperSatelliteDataCapture with properties: SatelliteID: 27424 SatelliteName: "AQUA" GroundStation: "Ohio 1" NotificationEmail: "" S3Bucket: "" Contact details ContactStatus: [] ContactStartTime: [] ContactDuration: [] Captured data files IQDataFile: [] ProcessedDataFile: [] Satellite properties ManagedParameters: [1×1 struct]
If you opt for notifications, AWS sends confirmation email to the address you specify. Open the email and select Confirm subscription to receive more alerts. This figure shows a sample email received from the AWS notification service.
List Time of Satellite Contacts
List the start time and duration of a contact between satellite and the specified ground station by using the listContacts
function.
contactList = listContacts(obj)
contactList=12×2 table
StartTime Duration
___________________ ________
2023-02-20 23:12:06 00:08:36
2023-02-21 00:50:11 00:09:12
2023-02-21 12:48:40 00:10:28
2023-02-21 14:26:51 00:06:10
2023-02-21 23:53:31 00:06:34
2023-02-22 01:34:57 00:05:33
2023-02-22 11:57:01 00:04:40
2023-02-22 13:30:48 00:09:09
2023-02-22 22:59:22 00:07:30
2023-02-23 00:35:11 00:10:55
2023-02-23 12:35:25 00:10:06
2023-02-23 14:13:06 00:07:31
Schedule Contact
Schedule a contact to configure the AWS notification service and capture satellite data into an S3 bucket. Schedule a contact with these input parameters by using the scheduleContact
function.
(optional)
StartTime
— Specify the start time of the contact(optional)
Duration
— Specify the duration (in minutes) for which to capture data
If you do not specify StartTime
or Duration
, AWS captures the data at the first available slot of the satellite.
startTime = contactList.StartTime(1);
duration =
1;
scheduleContact(obj,StartTime=startTime,Duration=duration)
1 | satelliteDataCapture-20-02-2023-03-08-40 | CREATE_IN_PROGRESS | 2023-02-20T09:39:58.528000+00:00 | 1 | TrackingConfig | CREATE_COMPLETE | 2023-02-20T09:40:06.744000+00:00 | 2 | AquaDownlinkDemodDecodeAntennaConfig | CREATE_COMPLETE | 2023-02-20T09:40:06.050000+00:00 | 3 | TrackingConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:05.987000+00:00 | 4 | AquaDownlinkDigIfAntennaConfig | CREATE_COMPLETE | 2023-02-20T09:40:05.931000+00:00 | 5 | AquaDownlinkDemodDecodeAntennaConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:05.598000+00:00 | 6 | AquaDownlinkDigIfAntennaConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:05.460000+00:00 | 7 | MWS3BucketRole | CREATE_IN_PROGRESS | 2023-02-20T09:40:04.838000+00:00 | 8 | MWS3BucketRole | CREATE_IN_PROGRESS | 2023-02-20T09:40:04.227000+00:00 | 9 | MWS3BucketName | CREATE_IN_PROGRESS | 2023-02-20T09:40:04.088000+00:00 | 10 | MWSatelliteDataCaptureRole | CREATE_IN_PROGRESS | 2023-02-20T09:40:03.274000+00:00 | 11 | AquaDownlinkDigIfAntennaConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:03.118000+00:00 | 12 | AquaDownlinkDemodDecodeAntennaConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:03.102000+00:00 | 13 | MWS3BucketName | CREATE_IN_PROGRESS | 2023-02-20T09:40:02.933000+00:00 | 14 | MWSatelliteDataCaptureRole | CREATE_IN_PROGRESS | 2023-02-20T09:40:02.788000+00:00 | 15 | TrackingConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:02.600000+00:00 | 1 | RenameCapturedFilesRule | CREATE_IN_PROGRESS | 2023-02-20T09:40:29.754000+00:00 | 2 | MWSatelliteDaCaptureRule | CREATE_IN_PROGRESS | 2023-02-20T09:40:29.683000+00:00 | 3 | RenameCapturedFilesRule | CREATE_IN_PROGRESS | 2023-02-20T09:40:29.451000+00:00 | 4 | MWSatelliteDaCaptureRule | CREATE_IN_PROGRESS | 2023-02-20T09:40:29.362000+00:00 | 5 | RenameFilesLambda | CREATE_COMPLETE | 2023-02-20T09:40:28.201000+00:00 | 6 | MWSatelliteDataCapture | CREATE_COMPLETE | 2023-02-20T09:40:27.888000+00:00 | 7 | MWS3BucketPolicy | CREATE_IN_PROGRESS | 2023-02-20T09:40:27.407000+00:00 | 8 | MWS3BucketPolicy | CREATE_IN_PROGRESS | 2023-02-20T09:40:26.525000+00:00 | 9 | MWS3BucketName | CREATE_COMPLETE | 2023-02-20T09:40:25.192000+00:00 | 10 | RenameFilesLambda | CREATE_IN_PROGRESS | 2023-02-20T09:40:22.420000+00:00 | 11 | MWSatelliteDataCapture | CREATE_IN_PROGRESS | 2023-02-20T09:40:22.097000+00:00 | 12 | RenameFilesLambda | CREATE_IN_PROGRESS | 2023-02-20T09:40:20.633000+00:00 | 13 | MWSatelliteDataCapture | CREATE_IN_PROGRESS | 2023-02-20T09:40:20.486000+00:00 | 14 | MWS3BucketRole | CREATE_COMPLETE | 2023-02-20T09:40:19.743000+00:00 | 15 | MWSatelliteDataCaptureRole | CREATE_COMPLETE | 2023-02-20T09:40:18.867000+00:00 | 1 | AquaMissionProfile | CREATE_COMPLETE | 2023-02-20T09:40:48.751000+00:00 | 2 | AquaMissionProfile | CREATE_IN_PROGRESS | 2023-02-20T09:40:48.402000+00:00 | 3 | AquaMissionProfile | CREATE_IN_PROGRESS | 2023-02-20T09:40:46.945000+00:00 | 4 | S3RecordingDownlinkConfig | CREATE_COMPLETE | 2023-02-20T09:40:45.390000+00:00 | 5 | S3RecordingDownlinkConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:45.040000+00:00 | 6 | S3RecordingDemodDecodeConfig | CREATE_COMPLETE | 2023-02-20T09:40:44.920000+00:00 | 7 | S3RecordingDemodDecodeConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:44.641000+00:00 | 8 | S3RecordingDownlinkConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:43.294000+00:00 | 9 | S3RecordingDemodDecodeConfig | CREATE_IN_PROGRESS | 2023-02-20T09:40:43.041000+00:00 | 10 | MWS3BucketPolicy | CREATE_COMPLETE | 2023-02-20T09:40:41.641000+00:00 | 1 | satelliteDataCapture-20-02-2023-03-08-40 | CREATE_COMPLETE | 2023-02-20T09:41:44.512000+00:00 | The ground station contact has been scheduled successfully at 2023-02-20 23:12:06.
You can list the scheduled contacts by specifying the "scheduled"
argument to the listContacts
function.
scheduledContactList = listContacts(obj,"scheduled");
If you have opted for email notifications, the AWS notification service notifies you regarding the contact status.
Save and Load
Save the HelperSatelliteDataCapture
object using the save
function.
save("scheduledObj","obj")
To load scheduledObj
, double-click the MAT file or use the load
function. AWS updates the contact status automatically.
load("scheduledObj")
Cancel Contact
You can cancel your scheduled contact before the scheduled time. Before doing so, review the terms and conditions for canceling a scheduled contact, as well as the associated charges and pricing. To cancel a scheduled contact, uncomment and use the cancelContact
function.
%cancelContact(obj)
You can list the cancelled contacts by specifying "cancelled" argument to the listContacts
function.
cancelledContactList = listContacts(obj,"cancelled");
Get Captured Data from S3 Bucket
After the successful completion of a contact, download the captured data files from the S3 bucket to a local workstation for further processing. Alternatively, you can provide a path which to save the data files by using the downloadDataFile
function. Additionally, the updateContactStatus
function updates the data filenames for the IQ data file and the processed data file.
contactStatus = obj.updateContactStatus; if strcmp(contactStatus,"completed") downloadDataFile(obj) end
Other Satellites
You can collect data from any of these satellites by changing the satellite NORAD ID in the HelperSatelliteDataCapture
function.
NOAA 20 JPSS 1 (NORAD ID 43013) — This satellite was launched in 2017, and orbits at an altitude of 825 km. It carries five sensors for studying land and water.
SUOMI NPP (NORAD ID 37849) — This satellite was launched in 2011, and orbits at an altitude of 883 km. It carries four sensors that provide climate measurements.
TERRA (NORAD ID 25994) — This satellite was launched in 1999, and orbits at an altitude of 705 km. It carries five sensors for studying the surface of the Earth.
Appendix
The example uses these helper functions:
HelperAWSAccount.m
— Sign into AWS CLI through MATLAB by providing IAM usernameHelperSatellitelist.m
— List available satellites in your AWS accountHelperSatelliteDataCapture.m
— Set up satellite ID, ground station, S3 bucket and notification email