在其他语言中的集成

Orekit库可以从其他语言中访问,用于集成到现有软件中或在脚本语言(如MatlabPythonJython)中进行快速原型设计。这样可以直接与不同的对象进行交互,无论是从脚本还是直接在命令提示符下,都可以快速访问绘图工具。

Matlab

Matlab是一款用于技术计算的商业工具,具有易于访问的图形绘制功能。它可以访问Java库并将结果转换为Matlab对象。重要的是将orekit jar文件添加到Matlab的Java类路径中,可以通过使用javaaddpath命令或修改matlabroot/toolbox/local目录下的classpath.txt文件来实现。您可以使用javaclasspath函数显示当前的Java类路径。下面的示例使用javaaddpath来设置路径。请注意,从脚本复制粘贴到Matlab提示符中需要在Matlab版本7.5.0及以上版本中进行。

%
% /* 版权所有 2002-2023 CS GROUP
%  * 根据一个或多个贡献者许可协议,CS将此文件许可给您。
%  * 有关版权所有权的其他信息,请参阅随附的NOTICE文件。
%  * CS根据Apache许可证2.0版(“许可证”)将此文件许可给您。
%  * 除非适用法律要求或书面同意,否则在符合许可证的情况下使用此文件。
%  * 您可以在以下网址获取许可证副本:
%  *
%  *   http://www.apache.org/licenses/LICENSE-2.0
%  *
%  * 除非适用法律要求或书面同意,否则在符合许可证的情况下使用此文件。
%  * 此文件是基于“AS IS”原则分发的,没有任何明示或暗示的保证或条件。
%  * 有关特定语言的权限,请参阅许可证。
%  */
%
% 由Petrus Hyvönen于2011年将KeplerianPropagation.java翻译为Matlab,作为从Matlab访问orekit的示例
% jars orekit-8.0.jar、hipparchus-core-1.0.jar、hipparchus-geometry-1.0.jar、
% hipparchus-ode-1.0.jar、hipparchus-fitting-1.0.jar、hipparchus-optim-1.0.jar
% 和orekit-data.zip在当前的matlab目录中。

______
% 如果粘贴到提示符中,这些似乎可以工作。
javaaddpath 'C:\ ... 在此处输入您的路径 ...\MATLAB'
javaaddpath 'C:\.. 在此处输入您的路径 ...\MATLAB\orekit-8.0.jar'
javaaddpath 'C:\.. 在此处输入您的路径 ...\\MATLAB\hipparchus-core-1.0.jar
javaaddpath 'C:\.. 在此处输入您的路径 ...\\MATLAB\hipparchus-geometry-1.0.jar
javaaddpath 'C:\.. 在此处输入您的路径 ...\\MATLAB\hipparchus-ode-1.0.jar
javaaddpath 'C:\.. 在此处输入您的路径 ...\\MATLAB\hipparchus-fitting-1.0.jar
javaaddpath 'C:\.. 在此处输入您的路径 ...\\MATLAB\hipparchus-optim-1.0.jar


%% 执行导入
import org.orekit.errors.OrekitException
import org.orekit.frames.Frame
import org.orekit.frames.FramesFactory
import org.orekit.orbits.KeplerianOrbit
import org.orekit.orbits.Orbit
import org.orekit.orbits.PositionAngle
import org.orekit.propagation.SpacecraftState
import org.orekit.propagation.analytical.KeplerianPropagator
import org.orekit.data.DataProvidersManager
import org.orekit.data.ZipJarCrawler
import org.orekit.time.AbsoluteDate
import org.orekit.time.TimeScalesFactory

%% 配置Orekit。orekit-data.zip文件必须在当前目录中
DM=org.orekit.data.DataProvidersManager.getInstance()
crawler=org.orekit.data.ZipJarCrawler('orekit-data.zip')
DM.clearProviders()
DM.addProvider(crawler)

%% 初始轨道参数
a = 24396159;    % 半长轴,单位为米
e = 0.72831215;  % 偏心率
i = (7.0)/180*pi; % 倾角
omega = (180)/180*pi; % 近地点幅角
raan = (261)/180*pi; % 升交点赤经
lM = 0.0; % 平均近点角

%% 设置惯性坐标系
inertialFrame = FramesFactory.getEME2000()

%% 初始日期为UTC时间刻度
utc = TimeScalesFactory.getUTC();
initialDate = AbsoluteDate(2004, 01, 01, 23, 30, 00.000, utc)

%% 设置轨道推算器
% 引力系数
mu =  3.986004415e+14

% 以开普勒轨道构造
initialOrbit = KeplerianOrbit(a, e, i, omega, raan, lM, PositionAngle.MEAN, inertialFrame, initialDate, mu)

% 使用开普勒运动进行简单外推
kepler = KeplerianPropagator(initialOrbit);

%% 设置推算时间
% 外推的总持续时间(以秒为单位)
duration = 180*60.0

% 停止日期
finalDate =  AbsoluteDate(initialDate, duration, utc)

% 步长(以秒为单位)
stepT = 30.0

%% 执行推算
% 外推循环
cpt = 1;
extrapDate = initialDate
while extrapDate.compareTo(finalDate) <= 0
    currentState = kepler.propagate(extrapDate);
    fprintf('step %d: time %s %s\n', cpt, char(currentState.getDate()), char(currentState.getOrbit()))
    coord=currentState.getPVCoordinates.getPosition;
    P(:,cpt)=[coord.getX coord.getY coord.getZ]';
    extrapDate = AbsoluteDate(extrapDate, stepT, utc);
    cpt=cpt+1;
end
%%
figure;
plot3(P(1,:),P(2,:),P(3,:));

如果你在Matlab中遇到如下错误:

??? Error: File: orekit_test2.m Line: 12 Column: 8
Arguments to IMPORT must either end with ".*"
 or else specify a fully qualified class name: "org.orekit.frames.Frame" fails this test.

你可以将以下行代码进行修改:

import org.orekit.frames.Frame

改为:

import org.orekit.frames.*

Python

(前往Orekit forge的外部链接)

Jython

Jython是Python语言的基于Java的实现,可以很好地与Java库进行交互。可用于绘图的Jython模块数量有限,但可以使用Java库。

重要的是,orekit jar文件和Hipparchus jar文件在Java的CLASSPATH中。可以在命令提示符下手动设置,也可以使用诸如Eclipse与PyDev的IDE。文件orekit-data.zip应该与您的Jython文件位于同一个目录中。

Example KeplerianPropagation

这个例子是将KeplerianPropagation.java示例翻译为Jython的版本,展示了一个步进的开普勒轨道传播。

/* 版权所有 2002-2023 CS GROUP
 * 根据一个或多个贡献者许可协议,CS GROUP (CS) 授予您此文件的许可。有关版权所有权的其他信息,请参阅随附的NOTICE文件。
 * CS根据Apache许可证2.0(“许可证”)向您授予此文件的许可;除非符合许可证,否则您不得使用此文件。您可以在以下位置获取许可证的副本:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * 除非适用法律要求或书面同意,否则以“原样”方式分发本软件,不附带任何明示或暗示的保证或条件。有关特定语言的权限,请参阅许可证。
 */

# 通过eclipse项目将orekit.jar、orekit-data.zip和Hipparchus jars添加到CLASSPATH中
import java, os

from org.orekit.errors import OrekitException
from org.orekit.frames import Frame
from org.orekit.frames import FramesFactory
from org.orekit.orbits import KeplerianOrbit
from org.orekit.orbits import Orbit
from org.orekit.orbits import PositionAngle
from org.orekit.propagation import SpacecraftState
from org.orekit.propagation.analytical import KeplerianPropagator
from org.orekit.data import DataProvidersManager
from org.orekit.data import ZipJarCrawler
from org.orekit.time import AbsoluteDate
from org.orekit.time import TimeScalesFactory

from math import radians

# 配置Orekit。文件orekit-data.zip必须在当前目录中
DM = DataProvidersManager.getInstance()
crawler=ZipJarCrawler("orekit-data.zip")
DM.clearProviders()
DM.addProvider(crawler)

# 初始轨道参数
a = 24396159    # 半长轴,单位为米
e = 0.72831215  # 偏心率
i = radians(7.0)# 倾角
omega = radians(180) # 近地点幅角
raan = radians(261) # 升交点赤经
lM = 0.0 # 平近点角

# 惯性参考系
inertialFrame = FramesFactory.getEME2000()

# 初始日期,使用UTC时间刻度
utc = TimeScalesFactory.getUTC();
initialDate = AbsoluteDate(2004, 01, 01, 23, 30, 00.000, utc)

# 引力常数
mu =  3.986004415e+14

# 以开普勒轨道构建初始轨道
initialOrbit = KeplerianOrbit(a, e, i, omega, raan, lM,
                              PositionAngle.MEAN,
                              inertialFrame, initialDate, mu)

# 使用开普勒运动进行简单外推
kepler = KeplerianPropagator(initialOrbit)

# 外推的总持续时间,以秒为单位
duration = 90*60.0

# 停止日期
finalDate =  AbsoluteDate(initialDate, duration, utc)

# 步长,以秒为单位
stepT = 30.0

# 外推循环
cpt = 1
extrapDate = initialDate
while extrapDate.compareTo(finalDate) <= 0:
    currentState = kepler.propagate(extrapDate)
    print  "步骤 %d: 时间 %s %s" % (cpt, currentState.getDate(), currentState.getOrbit())
    extrapDate = AbsoluteDate(extrapDate, stepT, utc)
    cpt=cpt+1

示例:可见性检查

这个示例基于VisiblityCheck.java,已经翻译成了Jython。它包括了将一个Java对象子类化为Jython对象的示例。

/* 版权所有 2002-2023 CS GROUP * 根据一个或多个贡献者许可协议,CS GROUP (CS) 授权给您。有关版权所有权的其他信息,请参阅随附的 NOTICE 文件。 * CS 在 Apache 许可证 2.0 (the "License") 下授权您使用此文件;除非符合许可证的规定,否则您不得使用此文件。 * 您可以在以下网址获取许可证的副本: * * http://www.apache.org/licenses/LICENSE-2.0 * * 除非适用法律要求或书面同意,否则按原样分发的软件 * 在 "AS IS" 基础上分发,不附带任何明示或暗示的保证或条件。 * 请参阅许可证以了解特定语言的权限和限制。 */ # 通过eclipse项目将Orekit和Hipparchus导入CLASSPATH import java, os from org.orekit.data import DataProvidersManager from org.orekit.data import ZipJarCrawler from org.hipparchus.geometry import Vector3D from org.orekit.bodies import BodyShape from org.orekit.bodies import GeodeticPoint from org.orekit.bodies import OneAxisEllipsoid from org.orekit.errors import OrekitException; from org.orekit.frames import Frame from org.orekit.frames import FramesFactory from org.orekit.frames import TopocentricFrame from org.orekit.orbits import KeplerianOrbit from org.orekit.orbits import Orbit from org.orekit.propagation import Propagator from org.orekit.propagation import SpacecraftState from org.orekit.propagation.analytical import KeplerianPropagator from org.orekit.propagation.events import ElevationDetector from org.orekit.propagation.events import EventDetector from org.orekit.time import AbsoluteDate from org.orekit.time import TimeScalesFactory from org.orekit.utils import PVCoordinates from org.orekit.utils import IERSConventions from math import degrees, radians, pi # 配置Orekit DM = DataProvidersManager.getInstance() crawler=ZipJarCrawler("orekit-data.zip") DM.clearProviders() DM.addProvider(crawler) # 初始状态定义:日期、轨道 initialDate = AbsoluteDate(2004, 01, 01, 23, 30, 00.000, TimeScalesFactory.getUTC()) mu = 3.986004415e+14 inertialFrame = FramesFactory.getEME2000() # 轨道定义的惯性参考系 position = Vector3D(-6142438.668, 3492467.560, -25767.25680) velocity = Vector3D(505.8479685, 942.7809215, 7435.922231) pvCoordinates = PVCoordinates(position, velocity) initialOrbit = KeplerianOrbit(pvCoordinates, inertialFrame, initialDate, mu) # 传播器:考虑简单的开普勒运动(也可以更复杂) kepler = KeplerianPropagator(initialOrbit) # 地球和参考系 ae = 6378137.0 # 赤道半径(米) f = 1.0 / 298.257223563 # 扁率 itrf = FramesFactory.getITRF(IERSConventions.IERS_2010, True) # 任意日期的地球参考系 earth = OneAxisEllipsoid(ae, f, itrf) # 站点经度 = radians(45.0) latitude = radians(25.0) altitude = 0.0 station1 = GeodeticPoint(latitude, longitude, altitude) sta1Frame = TopocentricFrame(earth, station1, "station1") # 事件定义 maxcheck = 1.0 elevation = radians(5.0) class VisibilityDetector(ElevationDetector): # 处理事件发生的java类的子类示例(在jython中) def __init__(self, maxCheck, elevation, topo): ElevationDetector.__init__(self,maxCheck, elevation, topo) def eventOccurred(self, s, increasing): if (increasing): print "可见性在", self.topocentricFrame.getName(), "开始于" , s.getDate() else: print "可见性在", self.topocentricFrame.getName(), "结束于" , s.getDate() return self.CONTINUE sta1Visi = VisibilityDetector(maxcheck, elevation, sta1Frame) # 添加要检测的事件 kepler.addEventDetector(sta1Visi) # 从初始日期传播到第一次升高或固定持续时间 finalState = kepler.propagate(initialDate.shiftedBy(1500.0)) print "最终状态:" , finalState.getDate().durationFrom(initialDate)