How to use pointAt() to point ground stations gimbals at different satellites at different time in satellite constellation to study link margin?

조회 수: 31 (최근 30일)
I'm trying to study link budget of ground stations and satellite constellation.
I've gone through the exapmle "https://in.mathworks.com/help/satcom/ug/multihop-satellite-communication.html". This example shows one ground station (GS1) pointing at one satellite (sat1) and another ground station (GS2) at another satellite (sat2), and then calculating link margin from GS1 to GS2.
Im trying to extend this example by using satellite constellation where a ground station can use the presently visible satellite and switch to next one after the crossing of the satellite.
I've tried it using the below code
sc = satelliteScenario(startTime, stopTime, sampleTime, 'AutoSimulate',true);
plotRaditationPattern = true;
% Add ground stations
gsMumbai = groundStation(sc, 'Name', 'BOM GS', 'Latitude', 19.0760, 'Longitude', 72.8777); % Mumbai Ground Station
ueBengaluru = groundStation(sc, 'Name', 'BLR UE', 'Latitude', 12.9716, 'Longitude', 77.5946); % User Equipment in Bengaluru
% Add LEO satellite constellation (Keplerian elements)
numSatellites = 40;
semiMajorAxis = 7000e3 * ones(1, numSatellites); % Approximate altitude for LEO
eccentricity = zeros(1, numSatellites);
argumentOfPeriapsis = 13*ones(1, numSatellites);
trueAnomaly = linspace(0, 360, numSatellites); % Distribute satellites around the orbit
inclination = 40 * ones(1, numSatellites); % Common inclination for constellations
rightAscensionOfAscendingNode = linspace(0, 360, numSatellites);
[accessIntervalsGS2GS, acessGS2GS] = getSource2TargetPaths(gsMumbai, ueBengaluru, satArray, 1,false);
disp('Ground station to Ground Station Access Intervals with max 1 hop:');
disp(accessIntervalsGS2GS);
sc.AutoSimulate = false;
restart(sc);
disp(sc.SimulationStatus)
% Iterate over the simulation time and dynamically point the gimbal at the correct satellite
while sc.SimulationTime <= sc.StopTime
currentSimTime = sc.SimulationTime; % Get the current simulation time
% Check the access intervals to find the satellite that is visible at this time
for i = 1:height(accessIntervalsGS2GS)
% Get the access interval start and end times
intervalStart = accessIntervalsGS2GS(i, 4);
intervalEnd = accessIntervalsGS2GS(i, 5);
% If the current simulation time is within the access interval
if currentSimTime >= intervalStart.Variables && currentSimTime <= intervalEnd.Variables
% Get the satellite associated with this access interval using acessGS2GS
satID = acessGS2GS(i).Sequence(2); % Source asset ID (Satellite ID)
% Find the corresponding satellite object in satArray using the ID
for j = 1:numel(satArray)
if satArray(j).ID == satID
% Point the gimbal at the satellite
pointAt(gimbalGSMumbaitx, satArray(j));
pointAt(gimbalUErx, satArray(j));
break; % Stop after pointing at the correct satellite
end
end
end
end
% Update the simulation time step
if (sc.SimulationStatus ~= "Completed") && (seconds(sc.StopTime - sc.SimulationTime) > sc.SampleTime)
disp(sc.SimulationTime)
advance(sc);
else
break;
end
end
% restart(sc);
sc.AutoSimulate = true;
[linksIntervalsGS2GS, linksGS2GS] = getSource2TargetPathLinks(gsMumbai, ueBengaluru, satArray, 1, false);
disp('Ground station to Ground Station Access Intervals with max 1 hops:');
disp(linksIntervalsGS2GS);
However the pointAt() function causes the ground stations to point only at the last satellite, so for whole simulation they are pointing at only 1 satellite.
How to dynamically point ground stations to the passing satellites at different times of the simulations.?
This should give us link margin between the two ground stations all the time whenver a satellite connects to both the ground stations.
  댓글 수: 2
Aravind
Aravind 2024년 10월 4일
The code you have provided fails to run as some of the variables and functions are not well defined. Could you please provide implementation details of the functions "getSource2TargetPaths" and "getSource2TargetPathLinks". Also, please provide the values for the missing variables like "startTime", "satArray", "stopTime", "sampleTime", etc. This will help in reproducing the issue so that I can try debugging it.
Ravi Raj Saxena
Ravi Raj Saxena 2024년 10월 4일
편집: Ravi Raj Saxena 2024년 10월 10일
Hello Thanks a lot @Aravind for replying. In the question I only shared a part of the code I wanted to work on. I've shared all the related files here.
Please note that I've also tried by looping over the satellites to point the Ground station towards the satellite but that cause the Ground station to pointAT only at the last satellite in the loop.

댓글을 달려면 로그인하십시오.

채택된 답변

Aravind
Aravind 2024년 10월 30일 7:01
It seems you are encountering difficulties with the "pointAt" function in a loop, where you are adjusting the target at each simulation time step to point at the nearest satellite. I have managed to replicate the issue you are experiencing.
Upon reviewing your code, it appears the problem may stem from the repeated calls to the "pointAt" function within a loop. Since your goal is to dynamically change the satellites that the ground stations point to, you might consider using a "steeringtable" as a workaround. This will allow you to create a pointing schedule for the gimbals instead of repeatedly calling the "pointAt" function. More information can be found in the documentation here: https://www.mathworks.com/help/releases/R2022a/satcom/ref/matlabshared.satellitescenario.satellite.pointat.html#mw_a7e2d1e3-b588-465f-b127-28023bf685f4.
A "steeringtable" is a MATLAB "timetable" object containing the azimuth and elevation angles of the target that the gimbal is pointing to. You can use the table “accessIntervalsGS2GS” which is pre-calculated and contains the time interval and the target satellite, to populate the “steeringtable”. The azimuth and elevation angles of the satellite during that time interval can be calculated using the "aer" function. More details about the "aer" function can be found here: https://www.mathworks.com/help/releases/R2022a/satcom/ref/matlabshared.satellitescenario.satellite.aer.html.
By populating a "steeringtable," you can ensure that the ground station gimbals consistently point to the nearest satellite to establish a communication link. Once the "steeringtable" is created, you can pass it as an argument to the "pointAt" function, making the call only once rather than in a loop, thereby avoiding the previous issue.
Here are some documentation links and resources to help you get started with creating the "steeringtable":
  1. 1. MATLAB timetable: https://www.mathworks.com/help/releases/R2022a/matlab/ref/timetable.html
  2. 2. Overview of timetable in MATLAB: https://www.mathworks.com/help/releases/R2022a//matlab/timetables.html
  3. 3. A related MATLAB Answer where the "pointAt" function is used with a "timetable" object: https://www.mathworks.com/matlabcentral/answers/1943574-need-attitude-of-a-satellite-that-is-pointing-at-a-target
I hope this helps to resolve your issue.
  댓글 수: 1
Ravi Raj Saxena
Ravi Raj Saxena 2024년 11월 18일 7:23
편집: Ravi Raj Saxena 2024년 11월 18일 7:29
Hello,
Thanks a lot for your answer. The ground station is able to steer at different location at different times using the steering table created as mentinoed by you.
However, it is not pointing correctly to any satellite and keep moving somewhere else may be because of wrong azimuth and eleavation angles.
I've tried different way to calculate azimuth and elevation using aer function by interchaning asset, target and different coordinate frame however couldn't get succes. Below is the code I've tried
groundStation = gsMumbai; % Replace with the variable for BOM GS ground station
accessTable = accessIntervalsGS2GS2; % Replace with your modified access interval table
% Initialize the steering table
steeringTable = [];%table('Size', [0, 4], 'VariableTypes', {'datetime', 'double', 'double', 'string'},'VariableNames', {'Time', 'Azimuth', 'Elevation', 'SatelliteName'});
% Loop over each visibility interval to populate the steering table
for i = 1:height(accessTable)
startTime = accessTable.StartTime(i);
endTime = accessTable.EndTime(i);
satelliteName = accessTable.SatelliteHops{i};
% Find the satellite object based on the name (assumes unique satellite names)
satellite = getSatfromName(satelliteName, satArray); % satArray is your array of satellite objects
satRx = getCommDevice(satellite(1), 'GS', 'rx');
% Generate time samples within the interval
timeSamples = startTime:sampleTime:endTime;
% Calculate azimuth and elevation for each time sample
azimuth = zeros(length(timeSamples), 1);
elevation = zeros(length(timeSamples), 1);
for t = 1:length(timeSamples)
% Calculate AER (azimuth, elevation, range) from GS to satellite at each time sample
[azimuth(t), elevation(t), ~] = aer(satellite, groundStation, timeSamples(t), coordinateFrame='body');
end
% Add data to the steering table
tempTable = table(timeSamples', azimuth, elevation, {string(satelliteName(1))}, 'VariableNames', {'Time', 'Azimuth', 'Elevation', 'SatelliteName'});
steeringTable = [steeringTable; tempTable];
end
% Sort the table by Time
steeringTableSorted = sortrows(steeringTable, 'Time');
% Combine Azimuth and Elevation into a single [Azimuth, Elevation] vector
steeringTableSorted.AzimuthElevation = [steeringTableSorted.Azimuth, steeringTableSorted.Elevation];
steeringTable = removevars(steeringTableSorted, {'Azimuth', 'Elevation', 'SatelliteName'}); % Remove old columns
% Step 3: Convert to a timetable
steeringTimetable = table2timetable(steeringTable, 'RowTimes', 'Time');
pointAt(gimbalGSMumbaitx, steeringTimetable)

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Scenario Generation and Visualization에 대해 자세히 알아보기

제품


릴리스

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by