利用卫星场景分析航天器姿态剖面
这个例子展示了如何在Simulink®中传播卫星的轨道和姿态状态,并在卫星场景中可视化计算出的轨道和姿态剖面。它使用:
航空航天Blockset™航天器动力学块
航空航天Blockset态度概要块
航空航天工具箱
satelliteScenario
对象
的航天器动力学用数值积分法模拟航天器的平移和旋转动力学。它计算一个或多个航天器随时间的位置、速度、姿态和角速度。为了获得最准确的结果,请使用低公差设置(小于1e-8)的变步长求解器。根据您的任务要求,您可以通过使用更大的公差来提高速度。这样做可能会影响解决方案的准确性。
的态度概要Block返回将卫星提供的对准轴与指定目标对齐的最短四元数旋转。在这个例子中,卫星在任务开始时指向最低点,然后转向与目标1对齐,指向最低点,然后转向目标2。两个目标都作为地理位置提供。
航天工具箱satelliteScenario
对象使您可以将先前生成的、带有时间戳的蜉蝣和态度数据作为时间序列或时间表对象加载到场景中。在场景对象中插入数据以与场景时间步骤保持一致,允许您将在Simulink模型中生成的数据合并到新的或现有的模型中satelliteScenario
对象。在本例中,卫星轨道和姿态状态是用航天器动力学块计算的,然后使用该数据将卫星添加到一个新的satelliteScenario
对象进行访问分析。
打开示例模型
该示例模型被配置为执行地球观测任务,在该任务中,一颗卫星对亚马逊雨林的一个区域执行凌空飞行,以捕获该区域的森林砍伐趋势的图像和跟踪。卫星在没有主动成像或与位于挪威斯瓦尔巴群岛的地面站下行时指向最低点。
的使命。mdl =“SpacecraftDynamicsCustomAttitudeExampleModel”;open_system (mission.mdl);
定义任务参数和卫星初始条件
指定任务的开始日期和持续时间。本例使用MATLAB®结构来组织任务数据。这些结构使得稍后在示例中访问数据更加直观。它们还帮助整理全局基本工作区。
的使命。StartDate = datetime(2021,1,1,12,0,0);的使命。持续时间=小时(1.5);
在航天器动力学块上设置卫星属性
指定卫星的初始轨道元素。
task . satellite .blk =任务。mdl +“/航天器动力学”;mission. satellite . semmajoraxis = 7.2e6;%米mission. satellite .偏心= .05;卫星倾角= 70;%度task . satellite . argofperiapsis = 0;%度mission.Satellite.RAAN = 215;%度task . satellite . trueanomaly = 200;%度
指定卫星的初始姿态状态。
mission.Satellite。Q0 = [0.1509 0.4868 0.3031 -0.8052];task . satellite .pqr = [0,0,0];%度/秒
使用提供的初始条件和所需的传播设置配置航天器动力学块。这些值也可以在Simulink中的属性检查器中设置。
set_param (mission.Satellite.blk...“startDate可以”字符串(juliandate (mission.StartDate)),...“stateFormatNum”,“轨道要素”,...“orbitType”,“开普勒”,...“semiMajorAxis”字符串(mission.Satellite.SemiMajorAxis),...“偏心”字符串(mission.Satellite.Eccentricity),...“倾向”字符串(mission.Satellite.Inclination),...“raan”字符串(mission.Satellite.RAAN),...“argPeriapsis”字符串(mission.Satellite.ArgOfPeriapsis),...“trueAnomaly”字符串(mission.Satellite.TrueAnomaly));set_param (mission.Satellite.blk...“attitudeFormat”,“四元数”,...“attitudeFrame”,“ICRF”,...“态度”mat2str (mission.Satellite.q0),...“attitudeRate”mat2str (mission.Satellite.pqr));
使用EGM2008球形谐波重力模型进行轨道传播。
set_param (mission.Satellite.blk...“gravityModel”,“球函数”,...“earthSH”,“EGM2008”,...地球球谐势模型“shDegree”,“120”,...球谐模型的阶和度“useEOPs”,“上”,...在ECI到ECEF转换中使用EOP“eopFile”,“aeroiersdata.mat”);% EOP数据文件
重力梯度扭矩的贡献可以包括在姿态动力学计算中。
set_param (mission.Satellite.blk“useGravGrad”,“上”);
配置目标指向姿态配置文件块
姿态剖面区块的目标是两个地面位置,第一个是巴西亚马逊雨林的一个位置,用于观察森林砍伐情况,第二个是向下链接图像数据到美国斯瓦尔巴群岛的一个地面站。该块在模型中预配置,如下所示。
的“指向LatLonAlt”选项被选中指向模式参数。的z-axis用作卫星的主要对准矢量。这意味着卫星体z-axis指向在整个模拟过程中传递到块中的地理坐标。的y- LVLH框架沿轨道行进方向的轴定义为次要约束向量。卫星体x-axis被指定为次要对齐向量。这使我们的卫星在整个任务中尽可能地指向前方,而不会中断主要对准。
建立Simulink模型以产生所需的输出
应用模型级求解器设置使用set_param
.为了获得最佳性能和精度,请使用可变步长求解器。将最大步长设置为导致输出数据没有大时间间隔的值。
set_param (mission.mdl...“SolverType”,“变步”,...“SolverName”,“VariableStepAuto”,...“RelTol”,“0.5 e-5”,...“AbsTol”,“1 e-5”,...“MaxStep”,“5”,...“MinStep”,“汽车”,...“StopTime”字符串(秒(mission.Duration)));
保存模型输出端口数据为数据集
的时间表
对象。
set_param (mission.mdl...“SaveOutput”,“上”,...“OutputSaveName”,“你”,...“SaveFormat”,“数据集”,...“DatasetSignalFormat”,“时间表”);
运行模型并收集卫星星历表和姿态剖面
模拟模型。在本例中,航天器动力学块在惯性坐标系(ICRF/GCRF)中输出位置和速度状态。
的使命。SimOutput = sim(task .mdl);
创建并可视化卫星场景
为了进行分析,创建一个卫星场景对象。指定时间步长为1分钟。
场景=卫星。StartDate可以,...的使命。开始日期+任务。持续时间、60);
将两个目标添加为巴西和斯瓦尔巴群岛的地面站。
gsNO =地面站(场景,78,21,名称=“斯瓦尔巴特群岛,没有”)
gsNO =地面站,具有属性:名称:Svalbard, NO ID: 1纬度:78度经度:21度海拔高度:0米MinElevationAngle: 0度锥形传感器:[1x0 matlab共享.satellite场景。ConicalSensor] Gimbals: [1x0 matlabshared.satellitescenario.]发射机:[1x0 satcom.satellitescenario.]发射器]接收器:[1x0 satcom.satellitescenario.]接收端:[1x0 matlabshared.satellitescenario.]Access] MarkerColor: [1 0.4118 0.1608] MarkerSize: 6 ShowLabel: true LabelFontColor: [1 11 1] LabelFontSize: 15
gsAmazon =地面站(场景,-4.9,-66,Name=“亚马逊雨林”)
gsAmazon =地面站与属性:名称:亚马逊雨林ID: 2纬度:-4.9度经度:-66度海拔高度:0米MinElevationAngle: 0度圆锥传感器:[1x0 matlabshare .satellite场景。ConicalSensor] Gimbals: [1x0 matlabshared.satellitescenario.]发射机:[1x0 satcom.satellitescenario.]发射器]接收器:[1x0 satcom.satellitescenario.]接收端:[1x0 matlabshared.satellitescenario.]Access] MarkerColor: [1 0.4118 0.1608] MarkerSize: 6 ShowLabel: true LabelFontColor: [1 11 1] LabelFontSize: 15
将观测卫星添加到场景中。更新职位时间表
资料载于SimOutput
对象删除多余的数据点。
task . satellite . ephemeris = retime(task . simoutput .yout{1}.Values,...秒(uniquetol (mission.SimOutput。吹捧。)));卫星(场景,任务。卫星。星历,...“CoordinateFrame”,“惯性”,“名称”,“ObservationSat”);
在卫星上添加一个锥形传感器,以35度半角表示机载摄像头。在场景查看器中启用视野可视化。为了帮助可视化,传感器安装在距离卫星10米的位置+ 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
方法关联已记录的姿态时间表
用卫星。参数ExtrapolationMethod
控件外部的指向行为时间表
的范围内。
task . satellite . attitudeprofile = retime(task . simoutput .yout{3}.Values,...秒(uniquetol (mission.SimOutput。吹捧。)));pointAt (mission.Satellite.AttitudeProfile坐在那儿,...“CoordinateFrame”,“惯性”,“格式”,“四元数”,“ExtrapolationMethod”,“最低点”);
打开卫星场景查看器查看场景并与之交互。
viewer1 = satellite escenarioviewer(场景);
卫星指向最低点开始了这个场景。当它接近亚马逊雨林中的目标1时,它会旋转指向并跟踪这个目标。
成像段完成后,卫星返回指向最低点。
当卫星进入北极地面站的范围时,它旋转指向这个目标。
自定义框架转向
这个例子展示了如何在MATLAB和Simulink中为一个简单的地球观测卫星任务导入自定义姿态数据,其中机载摄像机固定在卫星主体上。另一种常见的方法是将传感器固定在万向节上,并通过操纵万向节而不是航天器本体来定位传感器。修改上述场景,将传感器安装在万向节上,并引导万向节对卫星正下方的区域进行均匀扫描。
重置卫星始终指向最低点,覆盖以前提供的自定义姿态配置文件。
删除(viewer1);pointAt(坐“最低点”);
删除现有传感器对象以将其从卫星上移除,并将具有相同属性的新传感器附加到万向节上。
删除(snsr);gimm =万向节(sat);snsr = conicalSensor(gim, MaxViewAngle=70, MountingLocation=[0 0 10]);fieldOfView (snsr);
定义方位角和仰角的万向节转向建模一个扫模式随时间低于卫星。
gimbalSweep。时间=秒(1:50:5000)';gimbalSweep。Az = [...45 * (7),...45: 5: -45,...-45 *(1、13),...45:5:45,...45 *(1、13),...45: 5: -45,...-45 * 1 (13)];gimbalSweep.Az(end-2:end) = [];gimbalSweep。Az = gimbalSweep。Az + 90;gimbalSweep。El = [...0: 5: -30,...-30 * 1 (19),...30:5:30,...30 *的(19),...30: 5: -30,...-30 * 1 (19),...30:5:30];gimbalSweep.El(end-2:end) = [];
绘制随时间变化的命令方位角和仰角值。
图(1)在;情节(gimbalSweep。时间,gimbalSweep.Az);情节(gimbalSweep。时间,gimbalSweep.El);持有从;传奇([“阿兹(度)”,“埃尔(度)”]);
存储方位角和仰角在a时间表
.
gimbalSweep。TT =时间表(gimbalSweep。时间,[gimbalSweep。阿兹,gimbalSweep.El]);
转动万向节时间表
.对于所提供的数据之外的时间步骤,框架返回其默认方向。
pointAt (gim gimbalSweep.TT);
查看更新后的场景卫星场景查看器.
viewer2 = satellite escenarioviewer(场景);