org.orekit.forces.maneuvers
包及其子包提供了几种用于轨道控制的机动类型。
最简单的机动模型是ImpulseManeuver
。它模拟了瞬时速度变化。由于变化是离散事件,因此它被实现为一个EventDetector
,当事件发生时,事件处理程序返回Action.RESET_STATE
,以便可以调用resetState
方法并改变航天器的速度。
由于ImpulseManeuver
实际上是一个EventDetector
并依赖于resetState
,因此它可以与大多数传播器(解析传播器、半解析传播器或数值传播器)一起使用。它不能与TLE传播器或基于星历的传播器一起使用,因为它们禁止状态重置。
ImpulseManeuver
是由一个作为机动触发器的较低级别EventDetector
构建的。可以使用任何探测器。经典的探测器包括DateDetector
,用于已知日期的机动,但也可以使用例如NodeDetector
在节点处执行倾斜机动,或者使用PositionAngleDetector
在远地点处执行圆形化机动。
ImpulseManeuver
的其他构建参数是航天器坐标系中的ΔV向量(通常是根据此机动使用的推进器的规范航天器轴之一)和比冲(用于更新质量)。ΔV向量将从航天器坐标系转换为惯性坐标系,考虑到传播器中配置的当前姿态或覆盖姿态提供程序。覆盖姿态允许在传播器中配置名义姿态,同时仅为了ΔV向量计算而使用特定于机动的姿态。
最准确的机动模型是Maneuver
。它模拟了通过点火推进器引起的渐进速度变化。由于变化是连续的,因此它被实现为一个ForceModel
。
由于Maneuver
实际上是一个ForceModel
,因此它只能与基于积分的传播器(具有一些注意事项的半解析传播器和数值传播器)一起使用。尽管可以在半解析传播器中使用它,但受到限制。大型机动或延伸到轨道的相当一部分的长时间机动可能会破坏用于将平均运动与短周期项分离的假设。
下面的类图显示了Maneuver
类及其支持类和接口的设计。
Maneuver
包含一个PropulsionModel
、一个ManeuverTriggers
和一个可选的姿态覆盖。
PropulsionModel
定义了加速度的特性。它的主要实现是BasicConstantThrustPropulsionModel
。ScaledConstantThrustPropulsionModel
的实现旨在在估计过程中使用,通过评估缩放因子。ProfileThrustPropulsionModel
提供了一个具有恒定比冲的分段多项式推力,可以模拟基于轮廓的推力。
ManeuverTriggers
定义了加速度发生的时间。有两个主要的实现:IntervalEventTrigger
和StartStopEventsTrigger
。IntervalEventTrigger
基于单个事件探测器,触发间隔对应于具有正值的单个事件探测器g
函数的时间跨度。StartStopEventsTrigger
基于一对事件探测器,触发间隔从开始探测器g
函数变为正值时开始,到停止探测器g
函数变为正值时结束。忽略两个探测器的减小事件(即它们的g
函数变为负值时)。
为了允许基于字段的传播,IntervalEventTrigger
和StartStopEventsTrigger
类都是抽象类,具体的子类必须实现一个转换方法,以便根据在构造时提供的基于原始double的探测器自动生成基于字段的事件探测器。这可能有些棘手,而且Java语法有时对于参数化类和方法来说是晦涩的。下面的代码片段展示了如何为任意的XyzDetector
执行此操作,其中存在一个基于字段的实现FieldXyzDetector
。在此示例中,我们假设探测器是基于日期和数字参数构建的,并在IntervalEventTrigger
中使用它。对于StartStopEventsTrigger
,模式类似,只是必须实现两个方法:convertStartDetector
和convertStopDetector
。
public XyzTrigger extends IntervalEventTrigger<XysDetector> {
protected <D extends FieldEventDetector<S>, S extends CalculusFieldElement<S>>
FieldAbstractDetector<D, S> convertIntervalDetector(final Field<S> field, final XyzDetector detector) {
final FieldAbsoluteDate<S> date = new FieldAbsoluteDate<>(field, detector.getDate());
final S param = field.getZero().newInstance(detector.getParam());
@SuppressWarnings("unchecked")
final FieldAbstractDetector<D, S> converted = (FieldAbstractDetector<D, S>) new FieldXyzDetector<>(date, param);
return converted;
}
}
SmallManeuverAnalyticalModel
是另一种用于快速优化大量小型保持轨道的推进模型。
该模型的原理是首先运行一个完整的传播器,不进行推进,生成一个参考星历。然后,在优化循环的每次迭代中,创建一个AdapterPropagator
,并填充由应添加到参考星历的推进引起的微分效应。由于推进的参数在每次迭代中都会发生变化,所以创建的推进也会发生变化。然后运行AdapterPropagator
并检查保持轨道的目标。由于微分效应是解析的,并且一旦生成,参考星历也是解析的,因此在优化过程中,这个传播循环比使用完整的传播器本身要快得多。
当然,一旦推进参数被优化,就可以进行新的完整传播,以考虑推进的影响,以获得完全准确的结果。