├── MathLabScripts ├── FullSatelliteSimulation.m ├── ModulationofPackets.m ├── Non_Step_Satellite_Network.m └── Satellite_Connection_Simulation_Chart.m ├── README.md ├── SimulacionCisco.pkt └── UniverseSandboxSimulationVideos ├── RedSatelitalSistemaSolar.webm └── RedSatelitalTierra.webm /MathLabScripts/FullSatelliteSimulation.m: -------------------------------------------------------------------------------- 1 | % Create satellite communication scenario 2 | sc = satelliteScenario; 3 | 4 | % General parameters 5 | simulationDuration = hours(24); % Simulation duration 6 | sc.StopTime = datetime("now") + simulationDuration; 7 | 8 | % --- GEO ORBIT --- 9 | % GEO orbital parameters 10 | semiMajorAxisGEO = 42164e3; % GEO semi-major axis (Earth radius + altitude) 11 | eccentricityGEO = 0; % Circular orbit 12 | inclinationGEO = 0; % Equatorial orbit 13 | raanGEO = 0; % Right Ascension of the Ascending Node 14 | argumentOfPeriapsisGEO = 0; % Argument of periapsis 15 | trueAnomalyGEO = 0; % Initial true anomaly 16 | 17 | % Create satellite in GEO 18 | geoSat = satellite(sc, semiMajorAxisGEO, eccentricityGEO, ... 19 | inclinationGEO, raanGEO, argumentOfPeriapsisGEO, trueAnomalyGEO, ... 20 | "Name", "GEO Sat"); 21 | 22 | % --- LEO ORBIT --- 23 | % LEO orbital parameters 24 | semiMajorAxisLEO = 7000e3; % LEO semi-major axis (Earth radius + altitude) 25 | eccentricityLEO = 0; % Circular orbit 26 | inclinationLEO = 98; % Polar inclination 27 | argumentOfPeriapsisLEO = 0; % Argument of periapsis 28 | 29 | % Constellation parameters 30 | numPlanesLEO = 20; % Number of orbital planes 31 | satellitesPerPlane = 10; % Satellites per orbital plane 32 | totalLEOSatellites = numPlanesLEO * satellitesPerPlane; % Total satellites 33 | planeSeparation = 360 / numPlanesLEO; % Plane separation in degrees 34 | satelliteSeparation = 360 / satellitesPerPlane; % Satellite separation within the plane 35 | 36 | % Create satellites in stepped constellation 37 | for plane = 0:numPlanesLEO-1 38 | raanLEO = plane * planeSeparation; % RAAN for each plane 39 | for sat = 0:satellitesPerPlane-1 40 | trueAnomalyLEO = sat * satelliteSeparation; % Offset within the plane 41 | leoSat = satellite(sc, semiMajorAxisLEO, eccentricityLEO, ... 42 | inclinationLEO, raanLEO, argumentOfPeriapsisLEO, trueAnomalyLEO, ... 43 | "Name", sprintf("LEO Sat %d-%d", plane+1, sat+1)); 44 | end 45 | end 46 | 47 | % --- GROUND STATIONS --- 48 | % Station in Bogotá (main uplink) 49 | latitudeBogota = 4.7110; 50 | longitudeBogota = -74.0721; 51 | altitudeBogota = 0; 52 | gsBogota = groundStation(sc, "Name", "Bogota Station", ... 53 | "Latitude", latitudeBogota, "Longitude", longitudeBogota, "Altitude", altitudeBogota); 54 | 55 | % Station in Riohacha (uplink for La Guajira) 56 | latitudeRiohacha = 11.535458; 57 | longitudeRiohacha = -72.922254; 58 | altitudeRiohacha = 0; 59 | gsRiohacha = groundStation(sc, "Name", "Riohacha Station", ... 60 | "Latitude", latitudeRiohacha, "Longitude", longitudeRiohacha, "Altitude", altitudeRiohacha); 61 | 62 | % Station in Leticia (uplink for Amazonas) 63 | latitudeLeticia = -4.2150; 64 | longitudeLeticia = -69.9406; 65 | altitudeLeticia = 0; 66 | gsLeticia = groundStation(sc, "Name", "Leticia Station", ... 67 | "Latitude", latitudeLeticia, "Longitude", longitudeLeticia, "Altitude", altitudeLeticia); 68 | 69 | % Station in Mitú (uplink for Vaupés and jungle areas) 70 | latitudeMitu = 1.1983; 71 | longitudeMitu = -70.1730; 72 | altitudeMitu = 0; 73 | gsMitu = groundStation(sc, "Name", "Mitu Station", ... 74 | "Latitude", latitudeMitu, "Longitude", longitudeMitu, "Altitude", altitudeMitu); 75 | 76 | % Station in San Andrés (uplink for the archipelago) 77 | latitudeSanAndres = 12.5847; 78 | longitudeSanAndres = -81.7006; 79 | altitudeSanAndres = 0; 80 | gsSanAndres = groundStation(sc, "Name", "San Andres Station", ... 81 | "Latitude", latitudeSanAndres, "Longitude", longitudeSanAndres, "Altitude", altitudeSanAndres); 82 | 83 | % Station in Pasto (uplink for Nariño and southern regions) 84 | latitudePasto = 1.2136; 85 | longitudePasto = -77.2811; 86 | altitudePasto = 0; 87 | gsPasto = groundStation(sc, "Name", "Pasto Station", ... 88 | "Latitude", latitudePasto, "Longitude", longitudePasto, "Altitude", altitudePasto); 89 | 90 | % Station in Villavicencio (uplink for Llanos Orientales) 91 | latitudeVillavicencio = 4.1420; 92 | longitudeVillavicencio = -73.6266; 93 | altitudeVillavicencio = 0; 94 | gsVillavicencio = groundStation(sc, "Name", "Villavicencio Station", ... 95 | "Latitude", latitudeVillavicencio, "Longitude", longitudeVillavicencio, "Altitude", altitudeVillavicencio); 96 | 97 | % Station in Quibdó (uplink for Chocó and Pacific region) 98 | latitudeQuibdo = 5.6919; 99 | longitudeQuibdo = -76.6584; 100 | altitudeQuibdo = 0; 101 | gsQuibdo = groundStation(sc, "Name", "Quibdo Station", ... 102 | "Latitude", latitudeQuibdo, "Longitude", longitudeQuibdo, "Altitude", altitudeQuibdo); 103 | 104 | % --- Download Link Points (rural areas) --- 105 | % Region: La Guajira 106 | latitudeGuajiraDL = 11.709312; 107 | longitudeGuajiraDL = -72.261161; 108 | altitudeGuajiraDL = 0; 109 | gsGuajiraDL = groundStation(sc, "Name", "Guajira Download Link", ... 110 | "Latitude", latitudeGuajiraDL, "Longitude", longitudeGuajiraDL, "Altitude", altitudeGuajiraDL); 111 | 112 | % Region: Amazonas 113 | latitudeAmazonasDL = -3.7534; 114 | longitudeAmazonasDL = -70.2563; 115 | altitudeAmazonasDL = 0; 116 | gsAmazonasDL = groundStation(sc, "Name", "Amazonas Download Link", ... 117 | "Latitude", latitudeAmazonasDL, "Longitude", longitudeAmazonasDL, "Altitude", altitudeAmazonasDL); 118 | 119 | % Region: Chocó 120 | latitudeChocoDL = 5.3000; 121 | longitudeChocoDL = -76.8000; 122 | altitudeChocoDL = 0; 123 | gsChocoDL = groundStation(sc, "Name", "Choco Download Link", ... 124 | "Latitude", latitudeChocoDL, "Longitude", longitudeChocoDL, "Altitude", altitudeChocoDL); 125 | 126 | % Region: Vaupés 127 | latitudeVaupesDL = -0.8607; 128 | longitudeVaupesDL = -70.9300; 129 | altitudeVaupesDL = 0; 130 | gsVaupesDL = groundStation(sc, "Name", "Vaupes Download Link", ... 131 | "Latitude", latitudeVaupesDL, "Longitude", longitudeVaupesDL, "Altitude", altitudeVaupesDL); 132 | 133 | % Region: Putumayo 134 | latitudePutumayoDL = -1.1520; 135 | longitudePutumayoDL = -76.6500; 136 | altitudePutumayoDL = 0; 137 | gsPutumayoDL = groundStation(sc, "Name", "Putumayo Download Link", ... 138 | "Latitude", latitudePutumayoDL, "Longitude", longitudePutumayoDL, "Altitude", altitudePutumayoDL); 139 | 140 | % Region: Vichada 141 | latitudeVichadaDL = 4.7087; 142 | longitudeVichadaDL = -69.7591; 143 | altitudeVichadaDL = 0; 144 | gsVichadaDL = groundStation(sc, "Name", "Vichada Download Link", ... 145 | "Latitude", latitudeVichadaDL, "Longitude", longitudeVichadaDL, "Altitude", altitudeVichadaDL); 146 | 147 | % Region: Guainía 148 | latitudeGuainiaDL = 2.5701; 149 | longitudeGuainiaDL = -68.3000; 150 | altitudeGuainiaDL = 0; 151 | gsGuainiaDL = groundStation(sc, "Name", "Guainia Download Link", ... 152 | "Latitude", latitudeGuainiaDL, "Longitude", longitudeGuainiaDL, "Altitude", altitudeGuainiaDL); 153 | 154 | % --- VISUALIZATION --- 155 | % Visualize the scenario with satellites and stations 156 | satelliteScenarioViewer(sc); 157 | 158 | % Display satellite information 159 | disp("Satellites created:"); 160 | disp(sc.Satellites); 161 | 162 | % Display ground station information 163 | disp("Ground stations:"); 164 | disp(sc.GroundStations); 165 | 166 | -------------------------------------------------------------------------------- /MathLabScripts/ModulationofPackets.m: -------------------------------------------------------------------------------- 1 | % Simulation Parameters 2 | fs = 10000; % Sampling frequency (in Hz) 3 | f_carrier_upload = 2000; % Carrier frequency for the upload link (in Hz) 4 | f_carrier_download = 1000; % Carrier frequency for the download link (in Hz) 5 | f_message = 50; % Message signal frequency (in Hz) 6 | t = 0:1/fs:0.2; % Simulation time for a packet (0.2 seconds) 7 | 8 | % Message signal (representing a data packet) 9 | message_signal = sin(2*pi*f_message*t); 10 | 11 | % Amplitude Modulation (AM) for each link 12 | am_signal_upload = (1 + 0.5 * message_signal) .* cos(2*pi*f_carrier_upload*t); 13 | am_signal_download = (1 + 0.5 * message_signal) .* cos(2*pi*f_carrier_download*t); 14 | 15 | % Plot the modulated signal for both links 16 | figure; 17 | 18 | % Upload link 19 | subplot(3, 1, 1); 20 | plot(t, am_signal_upload, 'b'); 21 | title('Upload Link: AM Modulated Signal'); 22 | xlabel('Time (s)'); 23 | ylabel('Amplitude'); 24 | grid on; 25 | 26 | % Download link 27 | subplot(3, 1, 2); 28 | plot(t, am_signal_download, 'g'); 29 | title('Download Link: AM Modulated Signal'); 30 | xlabel('Time (s)'); 31 | ylabel('Amplitude'); 32 | grid on; 33 | 34 | % Simulate the transmission of 10 packets with latency 35 | subplot(3, 1, 3); 36 | hold on; 37 | title('Packet Transmission'); 38 | xlabel('Time (s)'); 39 | ylabel('Amplitude'); 40 | grid on; 41 | 42 | n_packets = 10; % Number of packets 43 | avg_latency = 0.1; % Average latency between packets (in seconds) 44 | 45 | for i = 1:n_packets 46 | % Send packet from Upload Link to satellite 47 | plot(t + (i-1)*avg_latency, am_signal_upload, 'r'); 48 | pause(0.2); % Simulate upload transmission latency 49 | 50 | % Send packet from satellite to Download Link 51 | plot(t + (i-1)*avg_latency + 0.1, am_signal_download, 'k'); 52 | pause(0.2); % Simulate download reception latency 53 | end 54 | 55 | hold off; 56 | -------------------------------------------------------------------------------- /MathLabScripts/Non_Step_Satellite_Network.m: -------------------------------------------------------------------------------- 1 | % Create the satellite communication scenario 2 | sc = satelliteScenario; 3 | 4 | % General parameters 5 | simulationDuration = hours(24); % Simulation duration (24 hours) 6 | sc.StopTime = datetime("now") + simulationDuration; 7 | 8 | % --- GEO ORBIT --- 9 | % GEO orbital parameters 10 | semiMajorAxisGEO = 42164e3; % Semi-major axis for GEO (Earth radius + altitude) 11 | eccentricityGEO = 0; % Circular orbit 12 | inclinationGEO = 0; % Equatorial orbit 13 | raanGEO = 0; % Right ascension of the ascending node 14 | argumentOfPeriapsisGEO = 0; % Argument of perigee 15 | trueAnomalyGEO = 0; % Initial true anomaly 16 | 17 | % Create GEO satellite 18 | geoSat = satellite(sc, semiMajorAxisGEO, eccentricityGEO, ... 19 | inclinationGEO, raanGEO, argumentOfPeriapsisGEO, trueAnomalyGEO, ... 20 | "Name", "GEO Sat"); 21 | 22 | % --- LEO ORBIT --- 23 | % LEO orbital parameters 24 | semiMajorAxisLEO = 7000e3; % Semi-major axis for LEO (Earth radius + altitude) 25 | eccentricityLEO = 0; % Circular orbit 26 | inclinationLEO = 98; % Polar inclination 27 | raanLEO = 0; % Right ascension of the ascending node 28 | argumentOfPeriapsisLEO = 0; % Argument of perigee 29 | trueAnomalyLEO = 0; % Initial true anomaly 30 | 31 | % Create LEO satellites (example constellation) 32 | numLEOSatellites = 10; % Number of satellites in the constellation 33 | for i = 0:numLEOSatellites-1 34 | raanLEO = i * (360 / numLEOSatellites); % Distribute satellites evenly in orbit 35 | leoSat = satellite(sc, semiMajorAxisLEO, eccentricityLEO, ... 36 | inclinationLEO, raanLEO, argumentOfPeriapsisLEO, trueAnomalyLEO, ... 37 | "Name", sprintf("LEO Sat %d", i+1)); 38 | end 39 | 40 | % --- GROUND STATIONS --- 41 | % Ground station in Bogotá (main uplink) 42 | latitudeBogota = 4.7110; 43 | longitudeBogota = -74.0721; 44 | altitudeBogota = 0; 45 | gsBogota = groundStation(sc, "Name", "Bogota Station", ... 46 | "Latitude", latitudeBogota, "Longitude", longitudeBogota, "Altitude", altitudeBogota); 47 | 48 | % Ground station in Riohacha (uplink for La Guajira) 49 | latitudeRiohacha = 11.5447; 50 | longitudeRiohacha = -72.9075; 51 | altitudeRiohacha = 0; 52 | gsRiohacha = groundStation(sc, "Name", "Riohacha Station", ... 53 | "Latitude", latitudeRiohacha, "Longitude", longitudeRiohacha, "Altitude", altitudeRiohacha); 54 | 55 | % Ground station in Leticia (uplink for the Amazon) 56 | latitudeLeticia = -4.2150; 57 | longitudeLeticia = -69.9406; 58 | altitudeLeticia = 0; 59 | gsLeticia = groundStation(sc, "Name", "Leticia Station", ... 60 | "Latitude", latitudeLeticia, "Longitude", longitudeLeticia, "Altitude", altitudeLeticia); 61 | 62 | % --- VISUALIZATION --- 63 | % Visualize the scenario with satellites and ground stations 64 | satelliteScenarioViewer(sc); 65 | 66 | % Display satellite information 67 | disp("Satellites created:"); 68 | disp(sc.Satellites); 69 | 70 | % Display ground station information 71 | disp("Ground stations:"); 72 | disp(sc.GroundStations); 73 | -------------------------------------------------------------------------------- /MathLabScripts/Satellite_Connection_Simulation_Chart.m: -------------------------------------------------------------------------------- 1 | % Definition of geographic coordinates for Bogotá (latitude and longitude) 2 | lat_bogota = 4.7110; % Latitude of Bogotá (in degrees) 3 | lon_bogota = -74.0721; % Longitude of Bogotá (in degrees) 4 | 5 | % Geographic coordinates for Uribia (download) 6 | lat_uribia = 11.6833; % Latitude of Uribia (in degrees) 7 | lon_uribia = -72.2042; % Longitude of Uribia (in degrees) 8 | 9 | % Parameters of the LEO satellite 10 | altitude_satellite = 600; % Altitude in km 11 | lat_satellite = 5.0; % Latitude of the satellite over Colombia (approximate) 12 | lon_satellite = -74.0; % Longitude of the satellite over Colombia (approximate) 13 | 14 | % Earth's radius (in km) 15 | radius_earth = 6371; 16 | 17 | % Convert geographic coordinates to radians 18 | lat_bogota_rad = deg2rad(lat_bogota); 19 | lon_bogota_rad = deg2rad(lon_bogota); 20 | lat_uribia_rad = deg2rad(lat_uribia); 21 | lon_uribia_rad = deg2rad(lon_uribia); 22 | lat_satellite_rad = deg2rad(lat_satellite); 23 | lon_satellite_rad = deg2rad(lon_satellite); 24 | 25 | % Cartesian coordinates 26 | % Bogotá 27 | x_bogota = radius_earth * cos(lat_bogota_rad) * cos(lon_bogota_rad); 28 | y_bogota = radius_earth * cos(lat_bogota_rad) * sin(lon_bogota_rad); 29 | z_bogota = radius_earth * sin(lat_bogota_rad); 30 | 31 | % Uribia 32 | x_uribia = radius_earth * cos(lat_uribia_rad) * cos(lon_uribia_rad); 33 | y_uribia = radius_earth * cos(lat_uribia_rad) * sin(lon_uribia_rad); 34 | z_uribia = radius_earth * sin(lat_uribia_rad); 35 | 36 | % Satellite 37 | x_satellite = (radius_earth + altitude_satellite) * cos(lat_satellite_rad) * cos(lon_satellite_rad); 38 | y_satellite = (radius_earth + altitude_satellite) * cos(lat_satellite_rad) * sin(lon_satellite_rad); 39 | z_satellite = (radius_earth + altitude_satellite) * sin(lat_satellite_rad); 40 | 41 | % Plot Earth with satellite's orbit 42 | figure; 43 | hold on; 44 | 45 | % Create Earth sphere with no color, just the border 46 | [earth_x, earth_y, earth_z] = sphere(100); 47 | surf(earth_x * radius_earth, earth_y * radius_earth, earth_z * radius_earth, 'FaceColor', 'none', 'EdgeColor', [0.5 0.5 0.5]); 48 | 49 | % Plot satellite's orbit as a dashed line 50 | theta = linspace(0, 2*pi, 200); % Angle for the orbit 51 | x_orbit = (radius_earth + altitude_satellite) * cos(theta); 52 | y_orbit = (radius_earth + altitude_satellite) * sin(theta); 53 | z_orbit = zeros(size(theta)); % Assuming orbit in the equatorial plane 54 | plot3(x_orbit, y_orbit, z_orbit, 'k--', 'LineWidth', 1.5); 55 | 56 | % Plot communication links (upload and download) 57 | plot3([x_bogota, x_satellite], [y_bogota, y_satellite], [z_bogota, z_satellite], 'r-', 'LineWidth', 2); % Upload 58 | plot3([x_satellite, x_uribia], [y_satellite, y_uribia], [z_satellite, z_uribia], 'b-', 'LineWidth', 2); % Download 59 | 60 | % Plot positions 61 | plot3(x_bogota, y_bogota, z_bogota, 'go', 'MarkerFaceColor', 'g'); % Bogotá (upload link) 62 | plot3(x_uribia, y_uribia, z_uribia, 'mo', 'MarkerFaceColor', 'm'); % Uribia (download link) 63 | plot3(x_satellite, y_satellite, z_satellite, 'ko', 'MarkerFaceColor', 'k'); % Satellite 64 | 65 | % Labels and configuration 66 | title('Satellite in Orbit over Colombia with Communication Links'); 67 | xlabel('X (km)'); 68 | ylabel('Y (km)'); 69 | zlabel('Z (km)'); 70 | legend('Earth (Silhouette)', 'Satellite Orbit', 'Upload Link', 'Download Link', ... 71 | 'Bogotá (Base Station)', 'Uribia (Download Station)', 'Satellite'); 72 | grid on; 73 | axis equal; 74 | hold off; 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SatelliteNetworkSim 2 | 3 | A simulation tool designed to model, analyze, and optimize satellite networks. This repository provides algorithms and tools for simulating satellite constellations, inter-satellite communications, and ground station interactions. Ideal for researchers, engineers, and enthusiasts in the fields of aerospace, telecommunications, and network design. 4 | 5 | ## Context 6 | This project addresses the challenge of designing a satellite network to provide connectivity to the most disconnected regions of Colombia, such as La Guajira, Amazonas, and others. The goal is to explore how satellite networks can bridge the digital divide in these underserved areas. 7 | 8 | ## Approach 9 | We consider terrestrial satellite networks focusing on GEO (Geostationary Earth Orbit) and LEO (Low Earth Orbit) constellations. For simplicity, this simulation does not account for Earth's rotation but provides a baseline model for network design and performance analysis. 10 | 11 | ## Simulation 12 | The initial simulation was conducted using Universe Sandbox, establishing the first parameters for building the satellite network model. These include: 13 | - Defining orbital parameters for GEO and LEO satellites. 14 | - Positioning satellites to maximize coverage over target regions. 15 | - Simulating basic communication links and analyzing potential coverage gaps. 16 | 17 | 18 | 19 | Here is the simulation of the satellite network without Earth's rotation: 20 | 21 |
22 |
23 |
32 |
33 |
61 |
62 |
75 |
76 |
86 |
87 |
99 |
100 |
108 |
109 |
125 |
126 |