1. 引言
低轨互联网星座由于具有卫星容量大、覆盖面广、传输时延低、弹性抗毁能力强等优势成为各国争相发展的对象,典型的例如美国的“星链”、英国的“一网”。这其中以“星链”发展最为迅速,其发射数量年均增长约40%,在轨已超5800颗、20重覆盖,在70余个国家投入商业应用,已有超230万用户,展现了巨大的发展潜力。尤其是鉴于“星链”星座在俄乌冲突中的军事化应用和出色表现,各国都在积极发展自己的低轨星座系统,进一步加剧了低轨星座发展热潮。受国际太空领域发展影响,近几年我国低轨星座也呈火热发展态势,并涌现了国家卫星互联网、银河航天、上海垣信等众多低轨卫星星座,并且都已经发射多颗在轨试验星,未来随着行业生态的健全和发展,我国低轨卫星星座前景广阔。
由于低轨卫星高速运动,星座拓扑动态变化,需要借助有效的可视化软件辅助观察和研究卫星相对于地面站的运动过程,对于分析低轨卫星星座的运动特性、覆盖特性进而支撑轨道布局和跟踪建链等应用均具有重要的意义。为满足航天领域研究人员的可视化仿真需求,美国AGI公司专门推出了一款卫星仿真工具包STK (Satellite Tool Kit),可用于卫星星座轨道建模及可视化仿真,并已在领域内得到了广泛应用[1]。文献[2]基于STK以及Matlab工具对地面站、中继星、用户星、干扰星的星间、星地可见性进行了仿真研究。文献[3]基于STK对北斗三号系统的空域覆盖性能和定位精度分别进行仿真分析。文献[4]基于STK对双星火箭发射任务进行了可视化研究,并对星箭分离、卫星状态进行了可视化呈现。
STK虽然功能强大,但是在许多问题研究中也存在一定局限性,例如可扩展性差、价格昂贵、版权受限等[5],为此文献[5]基于Opengl和WPF开发了一款新的低轨卫星建模仿真软件,能够对卫星轨道、波束、星下点轨迹进行可视化仿真,运行于Windows操作系统。Opengl是一种跨平台开放式三维图形应用和程序接口,在Unix、Windows、Mac等多个平台上均能够提供较为优秀的渲染能力[5]。D3D12 (DirectD 12)是由微软公司推出的适用于Windows平台的最新版本的3D渲染引擎[6],相比Opengl,由于D3D12可绕过图形显示接口直接进行各种硬件的底层操作,其渲染性能要更加优异,并常用于大型3D游戏的实时渲染。为此,本文尝试采用D3D12渲染引擎针对低轨卫星星座进行可视化建模仿真开发,采用UWP (Windows通用应用平台)界面框架进行系统设计,基于面向对象编程语言C++进行实现,以期为低轨卫星星座的可视化建模仿真研究提供借鉴。
2. 系统组成
低轨卫星星座建模仿真系统架构由人机交互界面、轨道运动模型、渲染引擎和图形资源组成,其相互关系如下图1所示。
Figure 1. The architecture of the LEO satellite constellation simulation system based on UWP and D3D12
图1. 基于UWP和D3D12的低轨卫星星座建模仿真系统架构
2.1. 人机交互界面
人机交互界面由仿真控制接口、项目编辑接口、项目管理接口、图形显示窗口几部分组成。其中,仿真控制接口主要负责控制仿真的开始、暂停和停止,根据需要改变仿真的步长。项目编辑接口主要负责对卫星轨道的参数进行设置,包括轨道六根数以及轨道颜色、波束颜色等,同时支持按照Walker构型进行星座的编辑,批量添加卫星。项目管理接口主要负责项目的新建、加载以及存储管理等。图形显示接口主要负责对3D场景进行实时呈现。
2.2. 渲染引擎
渲染引擎主要根据系统需要对3D模型进行绘制和呈现。针对D3D12渲染引擎,相关模块主要包括D3D12设备、命令队列、命令列表、渲染目标视图、各类缓冲区资源等。D3D12渲染流程主要包括D3D初始化、创建命令队列和命令列表、创建围栏、创建交换链、创建描述符堆、更新缓冲区资源、渲染、页面翻转、同步等几个流程,如图2所示。其中,D3D初始化主要是创建D3D设备,获取提供显卡控制接口的对象ID3D12Device。命令队列ID3D12CommandQueue和命令列表ID3D12GraphicsCommandList是CPU与GPU之间交互的媒介,通过ID3D12CommandQueue,CPU可以将绘制命令交给GPU进行绘制。围栏ID3D12Fence主要是用于保持CPU和GPU之间的同步,避免资源读写冲突。交换链IDXGISwapChain用于前后台缓冲区的交换呈现,当后台缓冲区完成渲染后,通过IDXGISwapChain将后台缓冲区翻转为前台缓冲区进行呈现(Present),而前台缓冲区变为后台缓冲区进行渲染,通过交换链提高渲染效率。描述符堆ID3D12DescriptorHeap是存储顶点、索引、纹理等一系列资源描述符descriptor的内存区域,GPU通过descriptor调取资源进行绘制。在每一帧绘制前,都需要对缓冲区资源进行更新,例如物体的世界矩阵、观察矩阵等。当完成所有初始化和资源绑定工作后,将ID3D12GraphicsCommandList提交给GPU执行渲染命令,实际上是对当前的后台缓冲区进行写入,主要通过顶点着色器、像素着色器等各类着色器程序进行渲染。当完成绘制后,通过页面翻转进行Present。而后等待GPU处理完成后再进行下一帧的绘制工作。
Figure 2. The rendering process of the D3D12
图2. D3D12渲染流程
2.3. 图形资源
图形资源主要是指用于D3D渲染所需的贴图、几何模型、材质等,是生成一个3D模型所需的外部资源。本文所需的贴图资源主要包括地球的贴图材质、卫星的贴图材质、星空的贴图材质以及地球、卫星、波束等各类几何图形结构等。
2.4. 轨道运行模型
为了对卫星运行轨道进行建模仿真,需要轨道运行方程作为支撑。首先要建立卫星运行的全局坐标系和本体坐标系,然后对卫星的轨道动力学方程进行计算,进而得到卫星的实时位置,继而通过3D引擎进行呈现。常用二体运动方程对卫星的运行轨道进行推算,它主要根据万有引力定律,将卫星和地球视为两个质点进行求解。为了提高轨道的精度,还可以考虑各种摄动力的影响,例如J2摄动力。
3. 系统实现过程
3.1. 轨道运动模型建立及求解
采用地心赤道惯性坐标系来描述卫星的运动方程,地心赤道惯性坐标系的坐标原点O位于地球中心,X轴沿地球赤道平面指向春分点,Z轴沿着地球自转轴指向协议地极,Y轴与X轴和Z轴垂直并构成右手坐标系。
3.1.1. 二体运动方程及其求解
二体问题是天体物理学中的一个经典模型,主要研究的对象是空间中通过万有引力相互作用的两个物体。通过万有引力定律可以解得卫星在地心惯性坐标系(如图3所示)下的运动方程为:
(1)
其中
为地心引力常数,
为卫星的位置向量,
为卫星距离地心的距离,
为卫星沿X轴的坐标分量,Y、Z轴类似。上式属于三元二阶联立微分方程,在已知卫星初始位置
以及初始速度
的条件下,可以使用数值法进行求解[7]。本文采用四阶龙格–库塔法进行求解,首先将上式改写为状态方程形式:
(2)
其中
为速度矢量,其求解公式为:
(3)
卫星的初始位置和速度可以根据给定的轨道根数进行求解,共有六个参数,其中,a为轨道半长轴,代表椭圆轨道长轴的二分之一,e为偏心率,代表轨道两个焦点之间的距离与长轴的比值,i为轨道倾角,代表轨道所在平面与地球赤道平面的夹角,
为升交点赤经,代表X轴与卫星轨道升交点之间的夹角,
为近地点幅角,代表升交点与近地点在同一轨道平面中所形成的夹角,
为近地点时刻,代表卫星通过近地点的时刻。
Figure 3. The location of the satellite in the geocentric inertial coordinate system
图3. 卫星在地心惯性坐标系中的位置
通过以上六个参数就可以确定卫星轨道的形状,以及任意时刻卫星在轨道平面中的位置。在给出卫星轨道六参数的条件下,假定初始时刻为
,则可以通过轨道根数求出卫星在
时刻的位置
以及速度
,进而利用四阶龙格–库塔公式进行迭代计算出其它时刻的位置
以及速度
。轨道根数与卫星位置和速度的转换公式如下[7]:
(4)
(5)
(6)
式中
为真近点角,
时,
。
3.1.2. 经纬度计算
还可以通过计算卫星的经纬度,实现对卫星二维运动轨迹绘制的目的。在计算出卫星的三维坐标后,可以通过以下公式计算卫星的纬度[8]:
(7)
通过下式计算卫星的经度:
(8)
式中
为赤经,实际的卫星经度
还需要考虑地球自转的影响,设
为地球自转角速度,
为初始时刻的格林尼治赤经,假定初始时刻为
,即卫星过近地点的时刻,则
时刻的卫星经度
:
(9)
3.1.3. 终端可见性计算
在已知卫星海拔高度
、卫星经纬度、终端经纬度、最低可见仰角E的条件下,可以计算终端对卫星的可见性,首先计算终端与卫星的地心角:
(10)
其中
为终端经度,
为终端纬度,
为卫星经度,
为卫星纬度,然后计算卫星终端与卫星之间的仰角:
(11)
则当
的情况下,卫星可见。
3.2. 3D模型渲染
3.2.1. 地球模型渲染
地球模型可以采用球形作为地球的几何模型,主要使用顶点着色器以及像素着色器进行渲染,其着色器资源包括顶点、索引、贴图和材质。需要在每一帧更新的资源主要是地球的世界矩阵,根据地球的自转速率在每一帧进行更新。用于地球渲染的顶点着色器伪代码如下:
代码名称:地球模型顶点着色器 |
输入:顶点vertex_input,缓冲区ID:Instance |
输出:顶点vertex_output |
1. 获取常用缓冲区数据:ConstantData = GConstantbuffer[Instance] |
2. 将顶点变换到世界空间:position = vertex_input.position × ConstantData.world |
3. 将顶点变换到齐次裁剪空间:vertex_output.world = position × ViewProjectionMatrix |
4. 将法线坐标变换到世界空间:vertex_output.normal = vertex_input.Normal × ConstantData.world |
5. 对贴图坐标进行变换:vertex_output.texC = vertex_input.texC × ConstantData.texTransform |
6. 获取材质的索引:vertex_output.matindex = ConstantData.matindex |
7. 输出:return vertex_output |
用于地球渲染的像素着色器伪代码如下:
代码名称:地球模型像素着色器 |
输入:顶点vertex_output |
输出:颜色color |
1. 获取材质数据:MaterialData = gMaterialData [vertex_output. matindex] |
2. 进行贴图采样:color = gDiffuseMap.Sample(vertex_output. texC) |
3. 进行漫反射光照计算:color = gAmbientLightComput(gAmbientLight, MaterialData ,color) |
4. 进行方向光照计算:color = directLightComput(directLight, MaterialData ,color) |
5. 输出:return color |
3.2.2. 卫星模型渲染
卫星模型可以通过建模软件进行模型的建模,然后导入D3D渲染引擎进行渲染。主要使用顶点着色器以及像素着色器进行渲染,其着色器资源包括顶点、索引、贴图和材质。需要在每一帧更新的资源主要是卫星的世界矩阵,根据卫星的运行轨道在每一帧进行更新。其着色器伪代码同地球模型。
3.2.3. 轨道模型渲染
在进行轨道渲染前,需要首先生成指定时间段的卫星坐标数据,然后通过绘制直线列表的方式进行逐段直线的绘制,最终连起来就形成了轨道。本文分别基于二体运动方程以及J2摄动方程进行了卫星轨道计算,满足不同建模精度需求。用于轨道模型渲染的着色器类型包括顶点着色器和像素着色器,着色器资源主要包括顶点缓冲区和索引缓冲区,不需要材质和贴图。其顶点着色器外代码如下:
代码名称:轨道模型顶点着色器 |
输入:顶点vertex_input,缓冲区ID:Instance |
输出:顶点vertex_output |
1. 获取常用缓冲区数据:ConstantData = GConstantbuffer [Instance] |
2. 将顶点变换到世界空间:position = vertex_input.position × ConstantData.world |
3. 将顶点变换到齐次裁剪空间:vertex_output.world = position × ViewProjectionMatrix |
4. 复制颜色数据:vertex_output.Color = vertex_input.Color |
5. 输出:return vertex_output |
用于轨道渲染的像素着色器伪代码如下:
代码名称:轨道模型像素着色器 |
输入:顶点vertex_output |
输出:颜色color |
1. 获取颜色数据:color = vertex_output.Color |
2. 输出:return color |
其渲染结果如图4所示:
Figure 4. The rendering result of the satellite orbit
图4. 卫星轨道渲染结果
3.2.4. 波束模型渲染
卫星波束可以用圆锥体进行表示,同样使用顶点着色器和像素着色器进行渲染,着色器资源包括顶点、索引,不需要材质和贴图。其着色器伪代码同轨道模型伪代码。需要说明的是,在绘制波束时,需要在每一帧都更新波束的位置以及姿态,使得卫星波束一直指向地面。其中位置可以通过直接获取卫星的位置坐标即可,主要是姿态的变换较复杂,本文通过3个步骤进行转换,如图5所示:第一步将波束绕X轴旋转
,
;第二步将波束绕
轴旋转
;第三步将波束绕Z轴旋转
,
。其渲染结果如图6所示。其中
按下式求解:
(12)
(13)
式中
为
的X轴分量,
为将波束绕Z轴旋转
的旋转矩阵,则
,
为波束的当前姿态向量,
为波束的X轴Y轴Z轴分量,它实际上就是卫星的位置坐标。
Figure 5. The conversion process of the satellite beam
图5. 波束变换示意图
Figure 6. The rendering result of the satellite beam
图6. 卫星波束渲染结果
3.2.5. 星间链路模型渲染
星间链路可以用一段线段进行表示,同样使用顶点着色器和像素着色器进行渲染,着色器资源包括顶点、索引,不需要材质和贴图。其着色器伪代码同轨道模型伪代码。需要说明的是,由于卫星的位置一直在变化,因此每个顶点的位置都要实时变化,可使用动态顶点缓冲区进行顶点数据的更新,如图7所示。
Figure 7. The rendering result of the inter-satellite link
图7. 星间链路渲染结果
3.3. 二维运动轨迹渲染
本文采用direct2D技术进行2D渲染,为了支持与3D的交互,本文先通过在D3D12的设备上创建D3D11设备,然后使用D3D11设备获取2D渲染接口,进而实现在3D画面上进行2D图形的渲染。主要包括以下步骤:
代码名称:2D渲染 |
D3D11On12CreateDevice(*D3D12device,&D3D11device) //利用D3D12设备创建D3D11设备 D3D11device.As(&d3d11On12Device) //使用D3D11设备检索D3D11on12设备接口 d3d11On12Device.As(&dxgiDevice) //使用D3D11on12获取生成图像数据的DXGI接口 d2dFactory->CreateDevice(dxgiDevice.Get(),&d2dDevice)) //使用D2D工厂将DXGI接口转换为D2D设备 d2dDevice->CreateDeviceContext(deviceOptions,&d2dDeviceContext)) //使用D2D设备获取D2D设备上下文接口 …..//在完成3D绘制后,通过一系列命令获取二维图面 d2dDeviceContext->DrawText(string,format,position…) //在二维图面上绘制文字 d2dDeviceContext->DrawBitmap(bitmap,format,position…) //在二维图面上绘制图片 d2dDeviceContext->DrawGeometry(Gemetry,format,position…) //在二维图面上绘制线段 |
在进行卫星二维运动界面的渲染过程中,使用DrawBitmap函数绘制二维地图,使用DrawGeometry函数绘制卫星的运动轨迹,DrawText绘制卫星的名字以及其他必要的文字。
3.4. 人机交互界面设计
UWP采用XAML (可扩展标记语言)进行系统界面设计,通过XAML,可以使得Windows界面设计更加高效灵活并兼具美观性。本文采用XAML设计的人机交互界面如下图所示,包括3D模型呈现窗口、菜单栏、工具栏、项目编辑界面。其中,3D模型呈现窗口采用SwapChainPanel控件进行设计,SwapChainPanel专门用于D3D渲染图形的实时显示,通过利用SwapChainPanel,可以将D3D渲染结果嵌入到UWP界面中,实现Windows通用软件界面与D3D引擎技术的相结合,如图8所示。基于XAML的界面伪代码如下所示:
代码名称:系统界面设计 |
<Page> <Grid Row=3 Column=1> //整个界面分为3行1列 <Panel Grid.row=0> //第一行放置菜单栏 <Panel Grid.row=1> //第二行放置工具栏 <SplitPane Grid.row=2> //第三行放置3D界面 <SplitPane.Pane> <TreeView> //浮出界面放置项目列表,以树形结构展现 </ SplitPane.Pane> <SplitPane.Content> <SwapChainPanel> //主界面放置3D渲染视图 </SplitPane.Content> </Grid> </Page> |
通过XAML设计的系统界面如下图所示。
Figure 8. The UI of the system
图8. 系统界面
4. 试验验证
本文通过对模拟星链卫星、模拟一网卫星星座进行建模仿真验证本文方法的可行性和有效性。
4.1. 卫星参数
模拟星链卫星、模拟一网卫星星座的星座参数如表1所示,假设各个星座的构型均为Walker构型。
Table 1. Parameter of the simulation Constellation
表1. 仿真星座参数
星座名称 |
每轨卫星数量 |
轨道高度(Km) |
轨道倾角(度) |
模拟星链星座 |
22 |
550 |
53 |
模拟一网星座 |
49 |
1200 |
87.9 |
采用了普通家用计算机进行了仿真运行,操作系统为win10,CPU主频3.6 GHz,内存8 GB,显卡核心频率1.2 GHz,显卡内存2 GB。
4.2. 仿真结果
为了验证本文算法的准确性,将本文计算结果与STK仿真结果进行了对比,轨道高度为1200 km,轨道倾角为87.9˚,升交点赤经、近地点幅角、近地点时刻均为0,STK计算模型选择二体模型,如表2所示为仿真结果,结果表明本文计算的轨道数据与STK仿真结果基本一致,表明了方法的准确性。
Table 2. Orbit simulation result comparison of the STK and this paper
表2. 本文与STK的轨道计算结果对比
时间(s) |
本文计算结果(/km) |
STK计算结果(/km) |
X坐标 |
Y坐标 |
Z坐标 |
X坐标 |
Y坐标 |
Z坐标 |
0 |
7571 |
0 |
0 |
7571 |
0 |
0 |
60 |
7558.49 |
15.944 |
434.823 |
7558.486 |
15.944 |
434.8229 |
120 |
7520.993 |
31.836 |
868.208 |
7520.987 |
31.835 |
868.208 |
180 |
7458.632 |
47.622 |
1298.723 |
7458.625 |
47.622 |
1298.724 |
240 |
7371.613 |
63.251 |
1724.945 |
7371.608 |
63.25 |
1724.946 |
300 |
7260.224 |
78.671 |
2145.465 |
7260.222 |
78.67 |
2145.466 |
360 |
7124.833 |
93.83 |
2558.894 |
7124.837 |
93.83 |
2558.894 |
420 |
6965.885 |
108.68 |
2963.865 |
6965.899 |
108.6799 |
2963.863 |
480 |
6783.925 |
123.17 |
3359.035 |
6783.934 |
123.17 |
3359.035 |
540 |
6579.545 |
137.253 |
3743.1 |
6579.543 |
137.2533 |
3743.102 |
600 |
6353.406 |
150.883 |
4114.795 |
6353.403 |
150.8827 |
4114.796 |
图9为卫星星座的三维仿真结果,图10为卫星星座的二维仿真结果。通过仿真分析了不同星座构型在每天内的覆盖性,其中,卫星终端经度为−120度,纬度为40度,最低仰角设置为20度,可以看出在只有一轨时,一网卫星的覆盖性要优于星链星座,如表3所示。
Figure 9. The simulation result of the simulated Starlink of the first stage
图9. 模拟星链星座一阶段仿真结果
Figure 10. The trajectory of motion of the two-dimension simulation result of the simulated Starlink
图10. 模拟星链卫星星座二维运动轨迹仿真结果
Table 3. Coverage performance of the Constellation with different configuration in one day
表3. 一天内不同星座构型覆盖性能
星座名称 |
轨道数量 |
累计可见时长(分钟) |
最大可见时长(分钟) |
可见次数 |
模拟星链星座 |
1 |
223 |
96 |
24 |
模拟一网星座 |
1 |
342 |
224 |
2 |
5. 结束语
随着人类航天事业的蓬勃发展,针对航天领域的研究成为当前热点,而卫星轨道构型的可视化建模仿真是其中的重点方向,对于研究和分析卫星星座的布局合理性具有重要的意义。本文采用D3D12渲染技术对卫星星座模型进行了可视化渲染,同时基于UWP系统框架以及C++语言进行系统开发,仿真结果表明了本文方法的有效性,为后续进一步开展高中低混合轨道布局研究、星座路由规划研究、卫星可见性研究等奠定了基础。