概述
本文展示Orekit中SGP4轨道预报功能,使用两行轨道根数(TLE)作为输入,输出J2000地心惯性坐标系位置速度。本文代码编译通过,运行通过,输出结果测试通过!
代码
java
import org.orekit.frames.FramesFactory;
import org.orekit.frames.Frame;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.analytical.tle.TLE;
import org.orekit.propagation.analytical.tle.TLEPropagator;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.PVCoordinates;
import org.orekit.data.DataProvidersManager;
import org.orekit.data.DirectoryCrawler;
import org.orekit.data.DataContext;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 基于 SGP4 模型的轨道预报器
* 使用 TLE(两行轨道根数)进行轨道传播
*/
public class SGP4PropagatorFunction {
// 静态初始化块,在类加载时初始化Orekit
static {
initOrekit();
}
/**
* 初始化Orekit环境
*/
private static void initOrekit() {
try {
// 设置Orekit数据路径
String userHome = System.getProperty("user.home");
String orekitDataPath = userHome + File.separator + "orekit-data";
System.out.println("orekit-data: " + orekitDataPath);
File orekitData = new File(orekitDataPath);
if (!orekitData.exists()) {
System.err.println("警告: orekit-data目录不存在");
System.err.println("请从 https://gitlab.orekit.org/orekit/orekit-data 下载数据");
if (orekitData.mkdirs()) {
System.out.println("已创建目录,请放入数据文件。");
}
return;
}
// 初始化数据提供者
DataProvidersManager manager = DataContext.getDefault().getDataProvidersManager();
manager.addProvider(new DirectoryCrawler(orekitData));
System.out.println("Orekit 初始化完成");
} catch (Exception e) {
System.err.println("Orekit 初始化失败: " + e.getMessage());
e.printStackTrace();
}
}
private static final TimeScale UTC = TimeScalesFactory.getUTC();
private static final Frame INERTIAL_FRAME = FramesFactory.getEME2000();
/**
* 执行 SGP4 轨道预报
*
* @param tleLine1 TLE 第一行
* @param tleLine2 TLE 第二行
* @param startDate 起始时间(若为 null,则使用 TLE 中的历元)
* @param stepSizeSeconds 时间步长 (秒)
* @param numPoints 预报点数
* @return 预报的状态向量列表(PVCoordinates)
*/
public static List<PVCoordinates> propagate(
String tleLine1, String tleLine2,
AbsoluteDate startDate,
int stepSizeSeconds,
int numPoints) {
// 创建 TLE 对象
TLE tle = new TLE(tleLine1, tleLine2);
// 如果未指定起始时间,使用 TLE 历元
if (startDate == null) {
startDate = tle.getDate();
}
// 创建 SGP4 传播器
// 使用默认设置,可以添加地球定向参数等配置
Propagator propagator = TLEPropagator.selectExtrapolator(tle);
List<PVCoordinates> pvList = new ArrayList<>(numPoints);
// 循环计算每个时间点
for (int i = 0; i < numPoints; i++) {
AbsoluteDate currentDate = startDate.shiftedBy(i * stepSizeSeconds);
SpacecraftState state = propagator.propagate(currentDate);
PVCoordinates pv = state.getPVCoordinates(INERTIAL_FRAME);
pvList.add(pv);
}
return pvList;
}
//传播器
public static Propagator createTLEPropagator(String line1, String line2) {
TLE tle = new TLE(line1, line2);
// 创建带配置的传播器
TLEPropagator propagator = TLEPropagator.selectExtrapolator(tle);
// 可以设置各种参数,如:
// propagator.setMass(1000.0); // 设置卫星质量
// propagator.setAttitudeProvider(...); // 设置姿态提供者
return propagator;
}
/**
* 主函数示例:使用一个典型的卫星 TLE 进行 SGP4 预报
*/
public static void main(String[] args) {
try {
// 示例 TLE:ISS (ZARYA)
String tleLine1 = "1 25544U 98067A 24001.50000000 .00019378 00000+0 33590-3 0 9990";
String tleLine2 = "2 25544 51.6439 26.6697 0007045 65.9786 13.4740 15.50209478451577";
// 解析 TLE 获取其内部历元作为起始时间
TLE tle = new TLE(tleLine1, tleLine2);
AbsoluteDate startDate = tle.getDate(); // TLE 历元
System.out.println("TLE 历元: " + startDate.toString(UTC));
// 执行 SGP4 预报(10个点,每60秒一个)
List<PVCoordinates> states = propagate(tleLine1, tleLine2, startDate, 60, 10);
// 输出结果表头
System.out.printf("%-4s %-25s %-12s %-12s %-12s %-12s %-12s %-12s%n",
"序号", "时间 (UTC)", "X (km)", "Y (km)", "Z (km)", "VX (m/s)", "VY (m/s)", "VZ (m/s)");
// 输出每个时间点的状态
for (int k = 0; k < states.size(); k++) {
PVCoordinates pv = states.get(k);
Vector3D p = pv.getPosition();
Vector3D v = pv.getVelocity();
AbsoluteDate t = startDate.shiftedBy(k * 60);
System.out.printf("%-4d %-25s %-12.3f %-12.3f %-12.3f %-12.3f %-12.3f %-12.3f%n",
k + 1,
t.toString(UTC).replace('T', ' '),
p.getX() / 1000.0,
p.getY() / 1000.0,
p.getZ() / 1000.0,
v.getX(),
v.getY(),
v.getZ()
);
}
} catch (Exception ex) {
System.err.println("程序执行异常: " + ex.getMessage());
ex.printStackTrace();
}
}
}
运行结果
bash
Orekit 初始化完成
TLE 历元: 2024-01-01T12:00:00.000
序号 时间 (UTC) X (km) Y (km) Z (km) VX (m/s) VY (m/s) VZ (m/s)
1 2024-01-01 12:00:00.000 -713.858 4260.546 5229.009 -7139.961 -2568.506 1117.067
2 2024-01-01 12:01:00.000 -1140.292 4096.788 5283.962 -7069.084 -2887.990 714.025
3 2024-01-01 12:02:00.000 -1561.499 3914.253 5314.626 -6965.811 -3194.212 307.732
4 2024-01-01 12:03:00.000 -1975.549 3713.777 5320.862 -6830.619 -3485.775 -99.949
5 2024-01-01 12:04:00.000 -2380.546 3496.280 5302.642 -6664.130 -3761.346 -507.147
6 2024-01-01 12:05:00.000 -2774.633 3262.761 5260.051 -6467.108 -4019.668 -911.997
7 2024-01-01 12:06:00.000 -3156.005 3014.290 5193.287 -6240.457 -4259.561 -1312.643
8 2024-01-01 12:07:00.000 -3522.915 2752.005 5102.656 -5985.213 -4479.930 -1707.247
9 2024-01-01 12:08:00.000 -3873.681 2477.109 4988.575 -5702.546 -4679.767 -2094.000
10 2024-01-01 12:09:00.000 -4206.697 2190.863 4851.570 -5393.748 -4858.158 -2471.129
环境
- Apache Maven 3.9.12
- jdk1.8.0_202
- orekit 12.2
- hipparchus-core 4.0
<dependencies>
<!-- Orekit核心库 -->
<dependency>
<groupId>org.orekit</groupId>
<artifactId>orekit</artifactId>
<version>12.2</version>
</dependency>
<!-- 数学库 -->
<dependency>
<groupId>org.hipparchus</groupId>
<artifactId>hipparchus-core</artifactId>
<version>4.0</version>
</dependency>
</dependencies>
注意:需要将Orekit的数据解压并放到用户目录下,譬如C:\Users\<user>\orekit-data