写在前面
这是 Orekit 学习的第三篇,本篇准备介绍计算卫星的信号覆盖区,卫星信号覆盖区的计算,对现实生活中星地卫星通信具有重要的左右。之前的两篇分别介绍了卫星的姿态和卫星星下点计算,链接如下:
概念介绍
什么是 Satellite Footprint? 简单来说就是卫星可见的地球区域。通常判断一个终端能否与卫星通信,就要看卫星的信号覆盖区是否会覆盖这个终端以及在什么时间覆盖该终端;对于低轨卫星而言,由于卫星绕地球高速运动,实时计算卫星过境终端的时间区间,预测与终端建立通信的时间十分重要。
计算卫星覆盖区
Step 1: 创建 TLE Propagator(轨道动力模型)
//采用 STARLINK-1016 卫星定义轨道
final String line1 = "1 44722U 19074K 22306.13064920 .00001350 00000+0 10954-3 0 9998";
final String line2 = "2 44722 53.0549 279.3841 0001884 44.5577 315.5564 15.06391807164509";
TLE tle = new TLE(line1, line2);
TLEPropagator tlePropagator = TLEPropagator.selectExtrapolator(tle);
Step 2: 计算目标日期,卫星在轨道坐标系下的位置以及其星地点
//计算 UTC 时间2022-11-16T14:00:00 卫星位置
final AbsoluteDate target = new AbsoluteDate(2022, 11, 16, 14, 0, 00.000,TimeScalesFactory.getUTC());
SpacecraftState spacecraftState = tlePropagator.propagate(target);
//计算卫星在轨道坐标系下的位置
Vector3D position = spacecraftState.getPVCoordinates().getPosition();
//定义地球,J2000坐标系下
final OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,Constants.WGS84_EARTH_FLATTENING, FramesFactory.getITRF(IERSConventions.IERS_2010, true));
//卫星位置转换到地球坐标系下得到星下点
GeodeticPoint satGroundPoint = earth.transform(position, frame, target);
Step 1,Step 2 正是 Orekit 学习笔记(二)——星下点轨迹 计算星下点的步骤,有了星下点就可以进一步计算卫星信号覆盖区了。
Step 3: 计算卫星信号覆盖区
//将卫星轨道坐标系转换到地球坐标系
Transform inertToBody = spacecraftState.getFrame().getTransformTo(earth.getFrame(),spacecraftState.getDate());
Transform fovToBody = new Transform(spacecraftState.getDate(),spacecraftState.toTransform().getInverse(), inertToBody);
//计算卫星在目标时间的 FOV
CircularFieldOfView cfov = new CircularFieldOfView(Vector3D.PLUS_K, FastMath.toRadians(50.), 0.);
List<List<GeodeticPoint>> footprint = cfov.getFootprint(fovToBody, earth, 0.1);
//打印卫星的 Footprint 点集合
List<GeodeticPoint> list = footprint.get(0);
for (GeodeticPoint point : list) {
System.out.println("[" + FastMath.toDegrees(point.getLongitude()) + "," + FastMath.toDegrees(point.getLatitude()) + "],");
}
Step 4: 效果展示
将计算的结果的星下点以及 footprint 点集合,组成 geojson.io | powered by Mapbox 所需要的 Json 结构,形成的效果如下:
完整 Json 数据如下:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "satellite"
},
"geometry": {
"coordinates": [
-95.3148576074,
-42.9736678357
],
"type": "Point"
}
},
{
"type": "Feature",
"properties": {
"prop0": "value0",
"prop1": 0
},
"geometry": {
"type": "LineString",
"coordinates": [
[
-116.14112021406883,
-27.021247736721985
],
[
-114.24623547018452,
-30.37039752488045
],
[
-108.8037509037952,
-35.59966822623313
],
[
-106.51059116163403,
-37.6928916685081
],
[
-104.92950249322773,
-39.02808355641764
],
[
-103.6917634944783,
-39.9832649104088
],
[
-102.65822969703682,
-40.70581610897524
],
[
-101.76003209199155,
-41.27033909828671
],
[
-100.95761430818294,
-41.720181539463
],
[
-100.22591921030796,
-42.082781732504614
],
[
-99.54789878718476,
-42.376530018937366
],
[
-98.9112845905285,
-42.61424456611028
],
[
-98.30682437883175,
-42.805094121027786
],
[
-97.72724676351774,
-42.95573217414485
],
[
-97.16661509642842,
-43.07099771198373
],
[
-96.61990129950574,
-43.15436152296268
],
[
-96.08268877845866,
-43.20821387170379
],
[
-95.55095234258717,
-43.23404697651009
],
[
-95.02088308614663,
-43.23256248904756
],
[
-94.48873662515926,
-43.203720324918805
],
[
-93.95068809286987,
-43.14673590330811
],
[
-93.40267868989197,
-43.060025402999855
],
[
-92.84023684059409,
-42.941091091027104
],
[
-92.25825152358189,
-42.78632914785609
],
[
-91.65066411972707,
-42.590727829399235
],
[
-91.0100236179559,
-42.347399087271796
],
[
-90.32680824742737,
-42.046841313980586
],
[
-89.58833158788401,
-41.67574098219395
],
[
-88.7768659894373,
-41.21492868564952
],
[
-87.86617471280006,
-40.63565348730533
],
[
-86.81445974619385,
-39.89214319557736
],
[
-85.54798956380755,
-38.904683966586965
],
[
-83.91456990423964,
-37.51256742775906
],
[
-81.49219465363802,
-35.284964333445465
],
[
-73.63096104104751,
-27.716229489460897
],
[
-74.59690550381049,
-26.936594613011632
],
[
-75.6251644412441,
-26.165866364044174
],
[
-76.72030562009283,
-25.406968800439866
],
[
-77.88655412510748,
-24.66396665593958
],
[
-79.12756678214068,
-23.942120493844797
],
[
-80.44614833771251,
-23.24791361679101
],
[
-81.8439154654542,
-22.58902440118162
],
[
-83.3209245353782,
-21.97421576068261
],
[
-84.87529200944738,
-21.41311501347777
],
[
-86.50285063116036,
-20.915864977675444
],
[
-88.19689691529138,
-20.49264249096792
],
[
-89.94809098696382,
-20.153063778915975
],
[
-91.74456338422179,
-19.905524171803535
],
[
-93.57226165803536,
-19.75654607808271
],
[
-95.41553347404165,
-19.71022504006
],
[
-97.25789929639072,
-19.767861113355657
],
[
-99.08292825232623,
-19.927838538373788
],
[
-100.87510783139807,
-20.185775050238078
],
[
-102.6205994711563,
-20.534914396291597
],
[
-104.307797335164,
-20.966695455141434
],
[
-105.92764815718681,
-21.47140937781496
],
[
-107.47373333604374,
-22.038855880160792
],
[
-108.94214925515338,
-22.65892731612313
],
[
-110.33124185699342,
-23.322076159179527
],
[
-111.64125641199615,
-24.01964932247616
],
[
-112.87395687606038,
-24.74409520229196
],
[
-114.03225646424143,
-25.489063801890712
],
[
-115.11988678283646,
-26.249427080560917
]
]
}
}
]
}