Main Content

Satellite Constellation Access to a Ground Station

This example demonstrates how to set up access analysis between a ground station and conical sensors onboard a constellation of satellites. A ground station and a conical sensor belonging to a satellite are said to have access to one another if the ground station is inside the conical sensor's field of view and the conical sensor's elevation angle with respect to the ground station is greater than or equal to the latter's minimum elevation angle. The scenario involves a constellation of 40 low-Earth orbit satellites and a geographical site. Each satellite has a camera with a field of view of 90 degrees. The entire constellation of satellites is tasked with photographing the geographical site, which is located at 42.3001 degrees North and 71.3504 degrees West. The photographs are required to be taken between 12 May 2020 1:00 PM UTC and 12 May 2020 7:00 PM UTC when the site is adequately illuminated by the sun. In order to capture good quality pictures with minimal atmospheric distortion, the satellite's elevation angle with respect to the site should be at least 30 degrees (please note that 30 degrees was arbitrarily chosen for illustrative purposes). During the 6 hour interval, it is required to determine the times during which each satellite can photograph the site. It is also required to determine the percentage of time during this interval when at least one satellite's camera can see the site. This percentage quantity is termed the system-wide access percentage.

Create a Satellite Scenario

Create a satellite scenario using satelliteScenario. Use datetime to set the start time to 12-May-2020 1:00:00 PM UTC, and the stop time to 12-May-2020 7:00:00 PM UTC. Set the simulation sample time to 30 seconds.

startTime = datetime(2020,5,12,13,0,0);
stopTime = startTime + hours(6);
sampleTime = 30; % seconds
sc = satelliteScenario(startTime,stopTime,sampleTime)
sc = 
  satelliteScenario with properties:

         StartTime: 12-May-2020 13:00:00
          StopTime: 12-May-2020 19:00:00
        SampleTime: 30
           Viewers: [0×0 matlabshared.satellitescenario.Viewer]
        Satellites: [1×0 matlabshared.satellitescenario.Satellite]
    GroundStations: [1×0 matlabshared.satellitescenario.GroundStation]
          AutoShow: 1

Add Satellites to the Satellite Scenario

Use satellite to add satellites to the scenario from the TLE file leoSatelliteConstellation.tle. The TLE file defines the mean orbital parameters of 40 generic satellites in nearly circular low-Earth orbits at an altitude and inclination of approximately 500 km and 55 degrees respectively.

tleFile = "leoSatelliteConstellation.tle";
sat = satellite(sc,tleFile)
sat = 
  1x40 Satellite array with properties:

    Name
    ID
    ConicalSensors
    Gimbals
    Transmitters
    Receivers
    Accesses
    GroundTrack
    Orbit
    OrbitPropagator
    MarkerColor
    MarkerSize
    ShowLabel
    LabelFontColor
    LabelFontSize

Add Cameras to the Satellites

Use conicalSensor to add a conical sensor to each satellite. These conical sensors represent the cameras. Specify their MaxViewAngle to be 90 degrees, which defines the field of view.

for idx = 1:numel(sat)
    name = sat(idx).Name + " Camera";
    conicalSensor(sat(idx),"Name",name,"MaxViewAngle",90);
end

% Retrieve the cameras
cam = [sat.ConicalSensors]
cam = 
  1x40 ConicalSensor array with properties:

    Name
    ID
    MountingLocation
    MountingAngles
    MaxViewAngle
    Accesses
    FieldOfView

Define the Geographical Site to be Photographed in the Satellite Scenario

Use groundStation to add a ground station, which represents the geographical site to be photographed. Specify its MinElevationAngle to be 30 degrees. If latitude and longitude are not specified, they default to 42.3001 degrees North and 71.3504 degrees West.

name = "Geographical Site";
minElevationAngle = 30; % degrees
geoSite = groundStation(sc, ...
    "Name",name, ...
    "MinElevationAngle",minElevationAngle)
geoSite = 
  GroundStation with properties:

                 Name:  Geographical Site
                   ID:  81
             Latitude:  42.3 degrees
            Longitude:  -71.35 degrees
             Altitude:  0 meters
    MinElevationAngle:  30 degrees
       ConicalSensors:  [1x0 matlabshared.satellitescenario.ConicalSensor]
              Gimbals:  [1x0 matlabshared.satellitescenario.Gimbal]
         Transmitters:  [1x0 satcom.satellitescenario.Transmitter]
            Receivers:  [1x0 satcom.satellitescenario.Receiver]
             Accesses:  [1x0 matlabshared.satellitescenario.Access]
          MarkerColor:  [0 1 1]
           MarkerSize:  10
            ShowLabel:  true
       LabelFontColor:  [0 1 1]
        LabelFontSize:  15

Add Access Analysis Between the Cameras and the Geographical Site

Use access to add access analysis between each camera and the geographical site. The access analyses will be used to determine when each camera can photograph the site.

for idx = 1:numel(cam)
    access(cam(idx),geoSite);
end

% Retrieve the access analysis objects
ac = [cam.Accesses];

% Properties of access analysis objects
ac(1)
ans = 
  Access with properties:

    Sequence:  [41 81]
    LineWidth:  1
    LineColor:  [0.5 0 1]

Visualize the Scenario

Use satelliteScenarioViewer to launch a satellite scenario viewer and visualize the scenario.

v = satelliteScenarioViewer(sc);

The viewer may be used as a visual confirmation that the scenario has been set up correctly. The violet line indicates that the camera on Satellite 4 and the geographical site have access to one another. This means that the geographical site is inside the camera's field of view and the camera's elevation angle with respect to the site is greater than or equal to 30 degrees. For the purposes of this scenario, this means that the camera can successfully photograph the site.

Visualize the Field Of View of the Camera

Use fieldOfView to visualize the field of view of each camera on Satellite 4.

fov = fieldOfView(cam([cam.Name] == "Satellite 4 Camera"))
fov = 
  FieldOfView with properties:

         LineWidth: 1
         LineColor: [0 1 0]
    VisibilityMode: 'inherit'

The presence of the geographical site inside the contour is a visual confirmation that it is inside the field of view of the camera onboard Satellite 4.

Customize the Visualizations

Use hide to hide the satellite orbits and declutter the visualization.

hide([sat.Orbit]);

Change the color of access visualizations to green.

for idx = 1:numel(ac)
    ac(idx).LineColor = 'green';
end

Determine the Times when the Cameras can Photograph the Geographical Site

Use accessIntervals to determine the times when there is access between each camera and the geographical site. These are the times when the camera can photograph the site.

accessIntervals(ac)
ans=30×8 table
           Source                  Target           IntervalNumber         StartTime                EndTime           Duration    StartOrbit    EndOrbit
    _____________________    ___________________    ______________    ____________________    ____________________    ________    __________    ________

    "Satellite 1 Camera"     "Geographical Site"          1           12-May-2020 13:36:00    12-May-2020 13:39:30      210           1            1    
    "Satellite 1 Camera"     "Geographical Site"          2           12-May-2020 15:23:00    12-May-2020 15:25:00      120           2            2    
    "Satellite 2 Camera"     "Geographical Site"          1           12-May-2020 14:30:30    12-May-2020 14:34:30      240           1            1    
    "Satellite 3 Camera"     "Geographical Site"          1           12-May-2020 13:28:30    12-May-2020 13:32:30      240           1            1    
    "Satellite 4 Camera"     "Geographical Site"          1           12-May-2020 13:00:00    12-May-2020 13:02:30      150           1            1    
    "Satellite 4 Camera"     "Geographical Site"          2           12-May-2020 14:46:00    12-May-2020 14:48:30      150           2            2    
    "Satellite 5 Camera"     "Geographical Site"          1           12-May-2020 16:28:30    12-May-2020 16:33:00      270           3            3    
    "Satellite 6 Camera"     "Geographical Site"          1           12-May-2020 17:05:30    12-May-2020 17:09:30      240           3            3    
    "Satellite 7 Camera"     "Geographical Site"          1           12-May-2020 16:20:00    12-May-2020 16:24:30      270           2            3    
    "Satellite 8 Camera"     "Geographical Site"          1           12-May-2020 15:18:00    12-May-2020 15:20:00      120           2            2    
    "Satellite 8 Camera"     "Geographical Site"          2           12-May-2020 17:03:30    12-May-2020 17:07:00      210           3            3    
    "Satellite 9 Camera"     "Geographical Site"          1           12-May-2020 17:55:30    12-May-2020 17:57:00       90           3            3    
    "Satellite 10 Camera"    "Geographical Site"          1           12-May-2020 18:44:30    12-May-2020 18:49:00      270           4            4    
    "Satellite 11 Camera"    "Geographical Site"          1           12-May-2020 18:39:30    12-May-2020 18:44:00      270           4            4    
    "Satellite 12 Camera"    "Geographical Site"          1           12-May-2020 17:58:00    12-May-2020 18:01:00      180           3            3    
    "Satellite 29 Camera"    "Geographical Site"          1           12-May-2020 13:09:30    12-May-2020 13:13:30      240           1            1    
      ⋮

The above table consists of the start and end times of each interval during which a given camera can photograph the site. The duration of each interval is reported in seconds. StartOrbit and EndOrbit are the orbit counts of the satellite that the camera is attached to when the access begins and ends. The count starts from the scenario start time.

Use play to visualize the simulation of the scenario from its start time to stop time. It can be seen that the green lines appear whenever the camera can photograph the geographical site.

play(sc);

Calculate System-Wide Access Percentage

In addition to determining the times when each camera can photograph the geographical site, it is also required to determine the system-wide access percentage, which is the percentage of time from the scenario start time to stop time when at least one satellite can photograph the site. This is computed as follows:

  • For each camera, calculate the access status history to the site using accessStatus. For a given camera, this is a row vector of logicals, where each element in the vector represents the access status corresponding to a given time sample. A value of True indicates that the camera can photograph the site at that specific time sample.

  • Perform a logical OR on all these row vectors corresponding to access of each camera to the site. This will result in a single row vector of logicals, in which a given element is true if at least one camera can photograph the site at the corresponding time sample for a duration of one scenario sample time of 30 seconds.

  • Count the number of elements in the vector whose value is True. Multiply this quantity by the sample time of 30 seconds to determine the total time in seconds when at least one camera can photograph the site.

  • Divide this quantity by the scenario duration of 6 hours and multiply by 100 to get the system-wide access percentage.

for idx = 1:numel(ac)
    [s,time] = accessStatus(ac(idx));
    
    if idx == 1
        % Initialize system-wide access status vector in the first iteration
        systemWideAccessStatus = s;
    else
        % Update system-wide access status vector by performing a logical OR
        % with access status for the current camera-site access
        % analysis
        systemWideAccessStatus = or(systemWideAccessStatus,s);
    end
end

Use plot to plot the system-wide access status with respect to time.

plot(time,systemWideAccessStatus,"LineWidth",2);
grid on;
xlabel("Time");
ylabel("System-Wide Access Status");

Whenever system-wide access status is 1 (True), at least one camera can photograph the site.

Use nnz to determine the number of elements in systemWideAccessStatus whose value is True.

n = nnz(systemWideAccessStatus)
n = 203

Determine the total time when at least one camera can photograph the site. This is accomplished by multiplying the number of True elements by the scenario's sample time.

systemWideAccessDuration = n*sc.SampleTime % seconds
systemWideAccessDuration = 6090

Use seconds to calculate the total scenario duration.

scenarioDuration = seconds(sc.StopTime - sc.StartTime)
scenarioDuration = 21600

Calculate the system-wide access percentage.

systemWideAccessPercentage = (systemWideAccessDuration/scenarioDuration)*100
systemWideAccessPercentage = 28.1944

Improve the System-Wide Access Percentage by Making the Cameras Track the Geographical Site

The default attitude configuration of the satellites is such that their yaw axes point straight down towards nadir (the point on Earth directly below the satellite). Since the cameras are aligned with the yaw axis by default, they point straight down as well. As a result, the geographical site goes outside the field of view of the cameras before their elevation angle dips below 30 degrees. Therefore, the cumulative access percentage is limited by the cameras' field of view.

If instead the cameras always point at the geographical site, the latter is always inside the cameras' field of view as long as the Earth is not blocking the line of sight. Consequently, the system-wide access percentage will now be limited by the MinElevationAngle of the geographical site, as opposed to the cameras' field of view. In the former case, the access intervals began and ended when the site entered and left the camera's field of view. It entered the field of view some time after the camera's elevation angle went above 30 degrees, and left the field of view before its elevation angle dipped below 30 degrees. However, if the cameras constantly point at the site, the access intervals will begin when the elevation angle rises above 30 degrees and end when it dips below 30 degrees, thereby increasing the duration of the intervals. Therefore, the system-wide access percentage will increase as well.

Since the cameras are rigidly attached to the satellites, each satellite is required to be continuously reoriented along its orbit so that its yaw axis tracks the geographical site. As the cameras are aligned with the yaw axis, they too will point at the site. Use pointAt to make each satellite's yaw axis track the geographical site.

for idx = 1:numel(sat)
    pointAt(sat(idx),geoSite);
end

Re-calculate the system-wide access percentage.

% Calculate system-wide access status
for idx = 1:numel(ac)
    [s,time] = accessStatus(ac(idx));
    
    if idx == 1
        % Initialize system-wide access status vector in the first iteration
        systemWideAccessStatus = s;
    else
        % Update system-wide access status vector by performing a logical OR
        % with access status for the current camera-site combination
        systemWideAccessStatus = or(systemWideAccessStatus,s);
    end
end

% Calculate system-wide access percentage
n = nnz(systemWideAccessStatus);
systemWideAccessDuration = n*sc.SampleTime;
systemWideAccessPercentageWithTracking = (systemWideAccessDuration/scenarioDuration)*100
systemWideAccessPercentageWithTracking = 38.3333

The system-wide access percentage has improved by about 36%. This is the result of the cameras continuously pointing at the geographical site. This can be visualized by using play again.

play(sc)

The field of view contour is no longer circular because the camera is not pointing straight down anymore as it is tracking the geographical site.

Exploring the Example

This example demonstrated how to determine the times at which cameras onboard satellites in a constellation can photograph a geographical site. The cameras were modeled using conical sensors and access analysis was used to calculate the times when the cameras can photograph the site. Additionally, system-wide access percentage was computed to determine the percentage of time during a 6 hour period when at least one satellite can photograph the site. It was seen that these results depended on the direction at which the cameras were pointing.

These results are also a function of:

  • Orbit of the satellites

  • MinElevationAngle of the geographical site

  • Mounting position and location of the cameras with respect to the satellites

  • Field of view (MaxViewAngle) of the cameras if they are not continuously pointing at the geographical site

Modify the above parameters to your requirements and observe their influence on the access intervals and system-wide access percentage. The orbit of the satellites can be changed by explicitly specifying their Keplerian orbital elements using satellite. Additionally, the cameras can be mounted on gimbals, which can be rotated independent of the satellite. This way, the satellites can point straight down (the default behavior), while the gimbals can be configured so that the cameras independently track the geographical site.