Main Content

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.

  1. 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.

  2. 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 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.

  1. Download and install the latest AWS CLI from the AWS Command Line Interface site.

  2. 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,:), ...
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;
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.


To load scheduledObj, double-click the MAT file or use the load function. AWS updates the contact status automatically.


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.


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

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.


The example uses these helper functions:

Related Topics