Aircraft-to-Satellite Communication for ADS-B Out
This example examines the Automatic Dependent Surveillance–Broadcast (ADS-B) Out connectivity of a flight from JFK International Airport in New York to L.F. Wade International Airport in Bermuda. The ADS-B Out system can connect to a variety of targets including airports and the Iridium NEXT satellite constellation. As a result, even while the aircraft does not have a direct line of sight with any ground station due to the Earth curvature over open water, the satellite ADS-B connection allows the aircraft to still provide continuous attitude, GPS position, and status to all other aircraft and airports interested in the aircraft state. The ADS-B system responds to the strongest ADS-B update initiator. The omnidirectional antennas on the top and bottom of the aircraft broadcast out to initiate the ADS-B update.
This example consists of three main parts:
Create the scenario containing the aircraft, airports, and Iridium satellite network.
Perform access analysis to determine when the aircraft has line-of-sight access with the airports or satellites within the Iridium network.
Perform link closure analysis of the ADS-B Out system with the airports and the satellites.
This example uses:
Sensor Fusion and Tracking Toolbox™
geoTrajectory(Sensor Fusion and Tracking Toolbox) function to generate the aircraft trajectory.
(Optionally) You can also use the
geoTrajectory(Radar Toolbox) function in Radar Toolbox.
Satellite Communications Toolbox
satelliteScenarioobject to analyze and visualize the results for both the satellite, aircraft, and ground station.
(Optionally) You can also create
satelliteScenario(Aerospace Toolbox) object using the Aerospace Toolbox.
Satellite Communications Toolbox
linkIntervalsfunctions to determine communications links.
(Optionally) Phased Array System Toolbox
phased.CosineAntennaElement(Phased Array System Toolbox) functions to approximate the 48-beam antenna pattern of the Iridium satellite.
For more information on the Iridium NEXT satellite constellation and network, see https://www.iridium.com/network/.
Construct the Scenario
Create a satellite scenario. Specify a start date and duration for the scenario. Choose the duration to equal to the flight time from New York to Bermuda, approximately six hours.
startTime = datetime(2020,5,5,0,0,0); stopTime = startTime + hours(6); sampleTime = 60; %seconds sc = satelliteScenario(startTime,stopTime,sampleTime); viewer = satelliteScenarioViewer(sc);
Create the airports properties in the scenario.
airportName = ["JFK International (New York)";... "L.F. Wade International Airport (Bermuda)"]; airportLat = [40.6413;32.3634]; airportLon = [-73.7781;-64.7053];
Add the airports to the scenario using the
airports = groundStation(sc,airportLat,airportLon,Name=airportName);
geoTrajectory (Sensor Fusion and Tracking Toolbox) starting and ending latitude/longitude/altitude (LLA) objects based on the airport locations and flying altitude of 10.6 km, which is typical of large commercial aircraft. The
geoTrajectory function generates trajectories based on waypoints in geodetic coordinates. Set the flight time based on the scenario duration. Sample the trajectory every 30 seconds.
startLLA = [airportLat(1) airportLon(1) 10600]; endLLA = [airportLat(2) airportLon(2) 10600]; timeOfTravel = [0 seconds(sc.StopTime-sc.StartTime)]; sampleRate = 1/30; trajectory = geoTrajectory([startLLA;endLLA],timeOfTravel,... SampleRate=sampleRate,... AutoPitch=true,AutoBank=true);
Output the LLA waypoints of the trajectory and orientation of the aircraft at the sample rate of the scenario.
[positionLLA,orientation] = trajectory(); [aircraftPosition,aircraftOrientation] = lookupPose(trajectory,... trajectory.TimeOfArrival(1):(1/trajectory.SampleRate):trajectory.TimeOfArrival(end));
timetable for the aircraft position and orientation. Use the
retime function to interpolate the position and orientation into the same time step as the scenario, every 60 seconds.
aircraftPositionTT = timetable(aircraftPosition,... StartTime=sc.StartTime,... TimeStep=seconds(1/trajectory.SampleRate),... VariableNames="Lat-Lon-Alt"); aircraftOrientationTT = timetable(compact(aircraftOrientation),... StartTime=sc.StartTime,... TimeStep=seconds(1/trajectory.SampleRate),... VariableNames="Orientation"); aircraftPositionTT = retime(aircraftPositionTT,'regular','linear',TimeStep=seconds(sc.SampleTime)); aircraftOrientationTT = retime(aircraftOrientationTT,'regular','nearest',TimeStep=seconds(sc.SampleTime));
Note: You sample the aircraftOrientationTT to the nearest neighbor to avoid interpolation errors of the quaternion values.
Visualize the aircraft trajectory using
lat = aircraftPositionTT.("Lat-Lon-Alt")(:,1); lon = aircraftPositionTT.("Lat-Lon-Alt")(:,2); geoplot(lat, lon, "b-") geolimits([31,42],[-76,-63]); geobasemap topographic;
Add the aircraft to the scenario using the
satellite function. The satellite function approximates the aircraft as a satellite with the ephemeris specified by
aircraft = satellite(sc,aircraftPositionTT, CoordinateFrame="geographic", Name="Aircraft"); pointAt(aircraft,aircraftOrientationTT,CoordinateFrame="ned"); hide(aircraft.Orbit); show(aircraft.GroundTrack);
The Iridium NEXT satellite network, launched between 2018 and 2019 , contains 66 active LEO satellites with:
Six orbital planes with an approximate inclination of 86.6 degrees and difference of RAAN of approximately 30 degrees between planes .
11 satellites per orbital plane with an approximate difference in true anomaly of 32.7 degrees between satellites .
Add the active Iridium NEXT satellites to the scenario. Create the orbital elements for the satellites in the Iridium network and create the satellites using the
numSatellitesPerOrbitalPlane = 11; numOrbits = 6; RAAN = ; trueanomaly = ; for i = 1:numOrbits for j = 1:numSatellitesPerOrbitalPlane RAAN(end+1) = 180*(i-1)/numOrbits; %#ok<SAGROW> if mod(i,2) trueanomaly(end+1) = 360*(j-1)/numSatellitesPerOrbitalPlane; %#ok<SAGROW> else % Satellites offset in alternating orbits trueanomaly(end+1) = 360*(j-1 + 0.5)/numSatellitesPerOrbitalPlane; %#ok<SAGROW> end end end semimajoraxis = repmat((6371 + 780)*1e3,size(RAAN)); % kms inclination = repmat(86.4,size(RAAN)); % degrees eccentricity = zeros(size(RAAN)); % degrees argofperiapsis = zeros(size(RAAN)); % degrees iridiumSatellites = satellite(sc,semimajoraxis,eccentricity,inclination,RAAN,argofperiapsis,trueanomaly,Name="Iridium " + string(1:66)');
If you have a license for Aerospace Toolbox, you can also create the Iridium constellation using the
walkerStar (Aerospace Toolbox) function.
Since many satellites share common orbital planes, display the orbital path of only the first satellite in each plane.
Add conical sensors to the Iridium satellites to act as a camera to establish visual access between the satellites and the aircraft.
iridiumConicalSensors = conicalSensor(iridiumSatellites,"MaxViewAngle",125);
Aircraft Access Analysis
Determine access analysis between the aircraft, airports, and satellites using the scenario. Calculate the access interval between the aircraft and airports using the
accessIntervals functions based on when the aircraft has line-of-sight access to the airport. JFK and L.F. Wade airports can see the aircraft during the first and last two hours of the flight, respectively. Otherwise the aircraft is blocked by the curvature of the Earth.
acAirport = access(aircraft,sc.GroundStations); airportAccessIntvls = accessIntervals(acAirport)
airportAccessIntvls=2×8 table Source Target IntervalNumber StartTime EndTime Duration StartOrbit EndOrbit __________ ___________________________________________ ______________ ____________________ ____________________ ________ __________ ________ "Aircraft" "JFK International (New York)" 1 05-May-2020 00:00:00 05-May-2020 01:49:00 6540 NaN NaN "Aircraft" "L.F. Wade International Airport (Bermuda)" 1 05-May-2020 04:14:00 05-May-2020 06:00:00 6360 NaN NaN
Calculate a similar access analysis between the aircraft and the satellites based on the visibility of the aircraft within the conical sensors' field of view. This serves as a first-round approximation of the Iridium multibeam antenna shown in the next section.
acSatellite = access(aircraft,iridiumConicalSensors); satelliteAccessIntvls = accessIntervals(acSatellite); [sSatellite,time] = accessStatus(acSatellite); satVisPlotData = double(sSatellite); satVisPlotData(satVisPlotData == false) = NaN; % Hide invisible satellites. satVisPlotData = satVisPlotData + (0:numel(iridiumSatellites)-1)'; % Add space to satellites to be stacked. plot(time,satVisPlotData," .",Color="blue") yticks(1:5:66) yticklabels(iridiumSatellites.Name(1:5:66)) title("Satellite Visibility") grid on xlabel("Time") axis tight
The access intervals computation shows that the aircraft has continuous satellite communication access with the Iridium network when the aircraft is over the open ocean. Combined with the airport access, the aircraft has continuous line-of-sight access throughout the flight.
Aircraft Link Analysis
After establishing that the aircraft maintains a direct connection with either airports and the Iridium network throughout the entire flight, generate a link budget for the respective ground and satellite-based ADS-B Out systems. The ADS-B Out system uses the existing Mode A/C and S transponder antennas located on the top and bottom of the aircraft, respectively. ADS-B uses the Mode S of the transponder and operates the ADS-B Out on a frequency of 1090 MHz with a minimum effective isotropic radiated power (EIRP) of 125 Watts.
fADSB = 1090e6; % 1090 MHz
For this example, model the pair of Mode-S transponders as a single isotropic transmitter at the center of the aircraft.
aircraftADSBAntenna = arrayConfig("Size",[1 1]); % Create an isotropic antenna element aircraftADSBTransmitter = transmitter(aircraft, ... Antenna = aircraftADSBAntenna, ... Frequency = fADSB,... Power=10*log10(125),... % ADS-B Out minimum as EIRP of 125 Watts MountingAngles = [0;0;0],... % In degrees Name="ADS-B Aircraft Transmitter"); pattern(aircraftADSBTransmitter,Size=50000);
Aircraft to Airport ADS-B Out Link
Add isotropic antennas and receivers to the airports.
% Airport Antenna airportADSBAntenna = arrayConfig("Size",[1 1]); % Create an isotropic antenna element airportADSBReceiver = receiver(... airports, ... Antenna=airportADSBAntenna, ... Name=airports.Name + " Receiver"); pattern(airportADSBReceiver,fADSB,Size=50000);
Aircraft to Satellite ADS-B Out Link
Using only Satellite Communication Toolbox, you can model the antenna on the Iridium satellite as an isotropic antenna. If you have a license for Phased Array Toolbox, you can model an approximation of the custom 48-beam antenna used by the Iridium NEXT satellites . Use this dropdown to select the antenna to model.
antennaType = "Isotropic";
Simulate Iridium Satellites Link with Isotropic Antennas
Create and add an isotropic antenna receiver to the Iridium satellites.
if antennaType == "Isotropic" % Create and add an isotropic antenna receiver to the Iridium satellites. satelliteADSBAntenna = arrayConfig("Size",[1 1]); % Add code comment satelliteADSBReceiver = receiver(iridiumSatellites, ... Antenna=satelliteADSBAntenna, ... MountingAngles=[0,0,0], ... Name=iridiumSatellites.Name + " Receiver"); pattern(satelliteADSBReceiver,fADSB,Size=50000); % Play the scenario. play(sc); end
Simulate Iridium Satellites Link with Custom 48-Beam Antenna
Create and add a custom antenna element receiver to the Iridium satellites using the HelperCustom48BeamAntenna convenience function.
Note: The mounting angle matches the default frames of Phased Array System Toolbox and the Satellite Communications Toolbox.
if antennaType == "Custom 48-Beam" % Use Custom Antenna Element on 48-spot beam satelliteADSBAntenna = HelperCustom48BeamAntenna(fADSB); satelliteADSBReceiver = receiver(iridiumSatellites, ... Antenna=satelliteADSBAntenna, ... MountingAngles=[0,-90,0], ... Name=iridiumSatellites.Name + " Receiver"); pattern(satelliteADSBReceiver,fADSB,Size=300000); % Play the scenario. play(sc); end
ADS-B Out Link Closure Times
Add ADS-B Out link analysis from the aircraft to airports and satellites.
lnkADSB = link(aircraftADSBTransmitter, [airportADSBReceiver, satelliteADSBReceiver]);
Plot the maximum margin for the link to any of the available receivers. The margin is the received Eb/No minus the required Eb/No for that receiver.
[eL,time] = ebno(lnkADSB); marginADSB = eL - repmat([airportADSBReceiver.RequiredEbNo,satelliteADSBReceiver.RequiredEbNo]',[1,size(eL,2)]); figure; plot(time,max(marginADSB),"b") xlabel("Time"); ylabel("Margin (dB)"); title("ADS-B Out Link Margin vs. Time");
 Attachment EngineeringStatement SAT-MOD-20131227-00148. https://fcc.report/IBFS/SAT-MOD-20131227-00148/1031348. Accessed 17 Jan. 2023.
 Attachment Exhibit A SAT-MOD-20131227-00148. https://fcc.report/IBFS/SAT-MOD-20131227-00148/1031240. Accessed 17 Jan. 2023.