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™.
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
.csvcredentials 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 firstname.lastname@example.org 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
.csvfile. 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
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
% (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
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 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
StartTime— Specify the start time of the contact
Duration— Specify the duration (in minutes) for which to capture data
If you do not specify
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
scheduledContactList = listContacts(obj,"scheduled");
If you have opted for email notifications, the AWS notification service notifies you regarding the contact status.
Save and Load
HelperSatelliteDataCapture object using the
scheduledObj, double-click the MAT file or use the
load function. AWS updates the contact status automatically.
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
You can list the cancelled contacts by specifying "cancelled" argument to the
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
You can collect data from any of these satellites by changing the satellite NORAD ID in the
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.
The example uses these helper functions:
HelperAWSAccount.m— Sign into AWS CLI through MATLAB by providing IAM username
HelperSatellitelist.m— List available satellites in your AWS account
HelperSatelliteDataCapture.m— Set up satellite ID, ground station, S3 bucket and notification email