Orekit基于TLE的SGP4轨道预报

概述

本文展示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

参考:​https://www.orekit.org/site-orekit-12.2.1/apidocs/​

相关推荐
piaopiaolanghua1 个月前
Python中的SGP4轨道预报库
python·sgp4
写一封情书2 年前
tldk之tle简单记录
dpdk·tldk·tle