주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

위성 시나리오를 활용한 우주선 자세 프로파일 분석

이 예제는 Simulink®에서 위성의 궤도 및 자세 상태를 전파하는 방법과, 위성 시나리오에서 계산된 궤적 및 자세 프로파일을 시각화하는 방법을 보여줍니다. 다음을 사용합니다.

  • Aerospace Blockset™ Spacecraft Dynamics 블록

  • Aerospace Blockset Attitude Profile 블록

  • Aerospace Toolbox satelliteScenario 객체

Spacecraft Dynamics 블록은 수치 적분을 사용하여 우주선의 평행 이동 및 회전 동역학을 모델링합니다. 이 시스템은 하나 이상의 우주선의 위치, 속도, 자세 및 각속도를 시간 경과에 따라 계산합니다. 가장 정확한 결과를 얻으려면 허용오차 설정(1e-8 미만)이 낮은 가변 단계 솔버를 사용하십시오. 임무 요건에 따라 허용오차를 더 크게 설정하여 속도를 높일 수 있습니다. 그렇게 하면 계산 결과의 정확도에 영향을 미칠 수 있습니다.

Attitude Profile 블록은 위성이 제공한 정렬 축을 지정된 목표물과 일치시키는 가장 짧은 쿼터니언 회전 값을 반환합니다. 이 예시에서, 위성은 임무 시작 시점에 천저(nadir) 방향을 향하고, 그 후 표적 1을 향하도록 방향을 전환한 뒤 다시 천저 방향을 향하고, 마지막으로 표적 2를 향하도록 방향을 전환합니다. 두 표적 모두 지리적 위치로 제공됩니다.

Aerospace Toolbox satelliteScenario 객체를 사용하면 이전에 생성된, 타임스탬프가 포함된 ephemeris 및 자세 데이터를 시계열 객체나 타임테이블 객체로 시나리오에 불러올 수 있습니다. 데이터는 시나리오 객체 내에서 시나리오 시간 스텝에 맞춰 보간되므로, Simulink 모델에서 생성된 데이터를 새로운 satelliteScenario 객체나 기존 객체에 통합할 수 있습니다. 이 예제에서는 Spacecraft Dynamics 블록을 사용하여 위성의 궤도 및 자세 상태를 계산한 다음, 이 데이터를 활용하여 액세스 분석을 위해 새로운 satelliteScenario 객체에 위성을 추가합니다.

예제 모델 열기

이 예제 모델은 지구 관측 임무를 수행하도록 구성되어 있으며, 이 임무 동안 위성은 아마존 열대우림의 특정 지역의 상공을 통과하면서 해당 지역의 이미지를 촬영하고 산림 벌채 추이를 추적합니다. 이 위성은 노르웨이 스발바르에 위치한 지상국으로 영상을 전송하거나 데이터를 수신하지 않을 때는 천저(nadir) 방향을 향하고 있습니다.

mission.mdl = "SpacecraftDynamicsCustomAttitudeExampleModel";
open_system(mission.mdl);

Space Dynamics custom attitude example model

임무 파라미터 및 위성 초기 조건 정의

임무의 시작 날짜와 기간을 지정합니다. 이 예제는 MATLAB® 구조체를 사용하여 임무 데이터를 구성합니다. 이러한 구조체를 사용하면 나중에 예제의 데이터에 더 직관적으로 접근할 수 있습니다. 또한 전역적 기반 작업 공간을 정리하는 데에도 도움이 됩니다.

mission.StartDate = datetime(2021,1,1,12,0,0);
mission.Duration = hours(1.5);

Spacecraft Dynamics 블록에서 위성 속성 설정

위성의 초기 궤도 요소를 지정합니다.

mission.Satellite.blk = mission.mdl + "/Spacecraft Dynamics";
mission.Satellite.SemiMajorAxis  = 7.2e6; % meters
mission.Satellite.Eccentricity   = .05;
mission.Satellite.Inclination    = 70;    % deg
mission.Satellite.ArgOfPeriapsis = 0;     % deg
mission.Satellite.RAAN           = 215;   % deg
mission.Satellite.TrueAnomaly    = 200;   % deg

위성의 초기 자세 상태를 지정합니다.

mission.Satellite.q0 = [0.1509 0.4868 0.3031 -0.8052];
mission.Satellite.pqr = [0, 0, 0]; % deg/s

제공된 초기 조건과 원하는 전파 설정을 사용하여 Spacecraft Dynamics 블록을 구성합니다. 이러한 값은 Simulink의 속성 인스펙터에서도 설정할 수 있습니다.

set_param(mission.Satellite.blk, ...
    "startDate",      string(juliandate(mission.StartDate)), ...
    "stateFormatNum", "Orbital elements", ...
    "orbitType",      "Keplerian", ...
    "semiMajorAxis",  string(mission.Satellite.SemiMajorAxis), ...
    "eccentricity",   string(mission.Satellite.Eccentricity), ...
    "inclination",    string(mission.Satellite.Inclination), ...
    "raan",           string(mission.Satellite.RAAN), ...
    "argPeriapsis",   string(mission.Satellite.ArgOfPeriapsis), ...
    "trueAnomaly",    string(mission.Satellite.TrueAnomaly));
set_param(mission.Satellite.blk, ...
    "attitudeFormat", "Quaternion", ...
    "attitudeFrame",  "ICRF", ...
    "attitude",       mat2str(mission.Satellite.q0), ...
    "attitudeRate",   mat2str(mission.Satellite.pqr));

궤도 계산에는 EGM2008 구면 조화 중력 모델을 사용합니다.

set_param(mission.Satellite.blk, ...
    "gravityModel", "Spherical Harmonics", ...
    "earthSH",      "EGM2008", ... % Earth spherical harmonic potential model
    "shDegree",     "120", ... % Spherical harmonic model degree and order
    "useEOPs",      "on", ... % Use EOP's in ECI to ECEF transformations
    "eopFile",      "aeroiersdata.mat"); % EOP data file

중력 기울기 토크의 기여도는 자세 동역학 계산에 포함될 수 있습니다.

set_param(mission.Satellite.blk, "useGravGrad", "on");

목표물 조준을 위한 Attitude Profile 블록 구성

Attitude Profile 블록은 두 곳의 지상 지점을 대상으로 합니다. 첫 번째는 브라질 아마존 열대우림 내의 한 지점으로, 산림 벌채 현상을 관측하기 위함이며, 두 번째는 노르웨이 스발바르에 위치한 지상 기지로 이미지 데이터를 전송하기 위함입니다. 아래와 같이 모델에 블록이 미리 구성되어 있습니다.

Pointing mode 파라미터에서 "Point at LatLonAlt" 옵션이 선택되어 있습니다. z축은 위성의 주 정렬 벡터로 사용됩니다. 이는 시뮬레이션이 진행되는 동안 위성 바디 z축의 방향이 블록에 전달된 지리적 좌표를 향한다는 것을 의미합니다. LVLH 프레임의 y축은 주행 방향의 선로를 따라 향하며, 2차 제약 벡터로 정의됩니다. 위성 바디 x축이 보조 정렬 벡터로 지정됩니다. 이를 통해 주 정렬을 방해하지 않으면서도 임무 기간 내내 위성이 가능한 한 전방을 향하도록 유지됩니다.

원하는 출력을 생성하도록 Simulink 모델 설정하기

set_param을 사용하여 모델 수준 솔버 설정을 적용합니다. 최상의 성능과 정확도를 얻으려면 가변 단계 솔버를 사용하십시오. 최대 스텝 크기를, 출력 데이터에 큰 시간 간격이 생기지 않는 값으로 설정하십시오.

set_param(mission.mdl, ...
    "SolverType", "Variable-step", ...
    "SolverName", "VariableStepAuto", ...
    "RelTol",     "0.5e-5", ...
    "AbsTol",     "1e-5", ...
    "MaxStep",    "5", ...
    "MinStep",    "auto", ...
    "StopTime",   string(seconds(mission.Duration)));

모델 출력 포트 데이터를 dataset 또는 timetable 객체 형식으로 저장합니다.

set_param(mission.mdl, ...
    "SaveOutput", "on", ...
    "OutputSaveName", "yout", ...
    "SaveFormat", "Dataset", ...
    "DatasetSignalFormat", "timetable");

모델을 실행하고 위성 ephemeris 및 자세 프로파일 수집

모델을 시뮬레이션합니다. 이 예제에서 Spacecraft Dynamics 블록은 관성(ICRF/GCRF) 좌표계에서 위치 및 속도 상태를 출력합니다.

mission.SimOutput = sim(mission.mdl);

위성 시나리오 생성 및 시각화

분석을 위해 satellite scenario 객체를 생성하십시오. 시간 스텝을 1분으로 지정하십시오.

scenario = satelliteScenario(mission.StartDate, ...
    mission.StartDate + mission.Duration, 60);

두 곳을 브라질과 스발바르의 지상국으로 추가하십시오.

gsNO = groundStation(scenario, 78, 21, Name="Svalbard, NO")
gsNO = 
  GroundStation with properties:
                 Name:  Svalbard, NO
                   ID:  1
             Latitude:  78 degrees
            Longitude:  21 degrees
             Altitude:  0 meters
    MinElevationAngle:  0 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]
              Eclipse:  [1x0 Aero.satellitescenario.Eclipse]
       CoordinateAxes:  [1x1 matlabshared.satellitescenario.CoordinateAxes]
          MarkerColor:  [1 0.4118 0.1608]
           MarkerSize:  6
            ShowLabel:  true
       LabelFontColor:  [1 1 1]
        LabelFontSize:  15
gsAmazon = groundStation(scenario, -4.9, -66, Name="Amazon Rainforest")
gsAmazon = 
  GroundStation with properties:
                 Name:  Amazon Rainforest
                   ID:  2
             Latitude:  -4.9 degrees
            Longitude:  -66 degrees
             Altitude:  0 meters
    MinElevationAngle:  0 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]
              Eclipse:  [1x0 Aero.satellitescenario.Eclipse]
       CoordinateAxes:  [1x1 matlabshared.satellitescenario.CoordinateAxes]
          MarkerColor:  [1 0.4118 0.1608]
           MarkerSize:  6
            ShowLabel:  true
       LabelFontColor:  [1 1 1]
        LabelFontSize:  15

관측 위성을 시나리오에 추가하십시오. SimOutput 객체 내의 timetable 위치 데이터를 업데이트하여 불필요한 데이터 포인트를 제거하십시오.

mission.Satellite.Ephemeris = retime(mission.SimOutput.yout{1}.Values, ...
    seconds(uniquetol(mission.SimOutput.tout, .0001)));
sat = satellite(scenario, mission.Satellite.Ephemeris, ...
    "CoordinateFrame", "inertial", "Name", "ObservationSat");

위성에 원뿔형 센서를 추가하고, 반각이 35도인 이 센서를 탑재 카메라로 설정하십시오. 시나리오 뷰어에서 시야각 시각화 기능을 활성화합니다. 시각화를 돕기 위해, 센서는 위성으로부터 10m 떨어진 +z 방향에 설치되어 있습니다.

snsr = conicalSensor(sat, MaxViewAngle=70, MountingLocation=[0 0 10]);
fieldOfView(snsr);

원뿔형 센서와 두 지상국 간에 액세스를 추가하십시오.

acNO = access(snsr, gsNO)
acNO = 
  Access with properties:
    Sequence:  [4 1]
    LineWidth:  3
    LineColor:  [0.3922 0.8314 0.0745]
acAmazon = access(snsr, gsAmazon)
acAmazon = 
  Access with properties:
    Sequence:  [4 2]
    LineWidth:  3
    LineColor:  [0.3922 0.8314 0.0745]

pointAt 메서드를 사용하여 기록된 자세 timetable을 위성과 연관시킵니다. ExtrapolationMethod 파라미터는 timetable 범위 밖에서의 포인팅 동작을 제어합니다.

mission.Satellite.AttitudeProfile = retime(mission.SimOutput.yout{3}.Values, ...
    seconds(uniquetol(mission.SimOutput.tout, .0001)));
pointAt(sat, mission.Satellite.AttitudeProfile, ...
    "CoordinateFrame", "inertial", "Format", "quaternion", "ExtrapolationMethod", "nadir");

위성 시나리오 뷰어를 열어 시나리오를 확인하고 상호작용할 수 있습니다.

viewer1 = satelliteScenarioViewer(scenario);

Satellite scenario viewer of ObservationSat

위성에 3차원 모델을 할당하고 좌표축을 시각화하십시오. 빨간색, 녹색, 파란색 화살표는 위성의 바디 프레임의 x, y, z 축 방향을 가리키고 있습니다.

sat.Visual3DModel = "SmallSat.glb";
coordinateAxes(sat, Scale=2);
camtarget(viewer1, sat);

Satellite scenario viewer of 3D model assigned to satellite with coordinate axes visualized

시나리오가 시작될 때 위성은 천저(nadir) 방향을 향하고 있습니다. 자홍색 마커는 원뿔형 센서를 나타냅니다.

Satellite scenario viewer with satellite points at the nadir

위성이 아마존 열대우림에 위치한 표적 1에 접근함에 따라, 이 표적을 조준하고 추적하기 위해 방향을 전환합니다.

Satellite scenario viewer of satellite nearing Amazon Rainforest

Satellite scenario viewer of satellite nearing Amazon Rainforest

이미징 작업이 완료되면, 위성은 다시 천저 방향을 향하게 됩니다.

Satellite scenario viewer shows that after the imaging segment is complete, the satellite returns to pointing at the nadir.

위성이 북극 지상국 수신 범위에 들어오면, 이 표적을 향하도록 방향을 전환합니다.

Satellite scenario viewer of satellite slewing to point at target

Satellite scenario viewer of satellite slewing to point at target

사용자 지정 짐벌 조향

이 예제는 간단한 지구 관측 위성 임무를 위해 MATLAB 및 Simulink 좌표계에서 사용자 지정 자세 데이터를 가져오는 방법을 보여 주며, 탑재된 카메라는 위성 바디에 고정되어 있습니다. 또 다른 일반적인 방법은 센서를 짐벌에 고정하고, 우주선 바디 자체를 움직이는 대신 짐벌을 조작하여 센서의 방향을 조정하는 것입니다. 위의 시나리오를 수정하여 센서를 짐벌에 장착하고, 짐벌을 조종하여 위성 바로 아래 영역을 균일하게 스캔하도록 하십시오.

위성이 항상 천저(nadir) 방향을 향하도록 재설정하고, 이전에 제공된 사용자 지정 자세 프로파일을 덮어씁니다.

delete(viewer1);
pointAt(sat, "nadir");

기존 센서 객체를 삭제하여 위성에서 제거한 다음, 동일한 속성을 가진 새 센서를 짐벌에 장착하십시오.

delete(snsr);
gim = gimbal(sat);
snsr = conicalSensor(gim, MaxViewAngle=70, MountingLocation=[0 0 10]);
fieldOfView(snsr);

위성 아래에서 시간에 따라 훑는 패턴을 모델링하기 위해 짐벌 조향에 필요한 방위각과 고도각을 정의하십시오.

gimbalSweep.Time = seconds(1:50:5000)';

gimbalSweep.Az = [...
    45*ones(1,7),...
    45:-5:-45,...
    -45*ones(1,13),...
    -45:5:45,...
    45*ones(1,13),...
    45:-5:-45,...
    -45*ones(1,13)];
gimbalSweep.Az(end-2:end) = [];
gimbalSweep.Az = gimbalSweep.Az + 90;

gimbalSweep.El = [...
    0:-5:-30,...
    -30*ones(1,19),...
    -30:5:30,...
    30*ones(1,19),...
    30:-5:-30,...
    -30*ones(1,19),...
    -30:5:30];
gimbalSweep.El(end-2:end) = [];

지시된 방위각 및 고도 값을 시간에 따라 플로팅하십시오.

figure(1)
hold on;
plot(gimbalSweep.Time', gimbalSweep.Az);
plot(gimbalSweep.Time', gimbalSweep.El);
hold off;
legend(["Az (deg)", "El (deg)"]);

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Az (deg), El (deg).

방위각과 고도각을 timetable에 저장하십시오.

gimbalSweep.TT = timetable(gimbalSweep.Time, [gimbalSweep.Az', gimbalSweep.El']);

timetable을 사용하여 짐벌을 조종하십시오. 제공된 데이터 범위를 벗어난 시간 스텝에서는 짐벌이 기본 방향으로 되돌아갑니다.

pointAt(gim, gimbalSweep.TT);

위성 시나리오 뷰어에서 업데이트된 시나리오를 확인하십시오.

viewer2 = satelliteScenarioViewer(scenario);

customSatelliteGimbalAnimation.gif of updated scenario

참고 항목

블록

객체