public class StationKeeping extends Object
The strategy aims to center a parabolic excursion in longitude around a given target during a control cycle.
The maneuvers are calculated to bring the end-of-cycle longitude to a value that will start a perfectly centered parabola with the first maneuver of the next cycle. This works regardless of the initial point, which may be either already in the longitude slot, west of the slot, or east of the slot.
If the starting point is too far from the station-keeping window, multiple maneuvers are performed to reach the slot more quickly, up to the maximum number of maneuvers allowed per cycle and within the dV size constraints.
Modifier and Type | Class and Description |
---|---|
static class |
StationKeeping.TutorialStationKeeping
Input data for this station-keeping tutorial.
|
Constructor and Description |
---|
StationKeeping(double westBound,
double eastBound,
double dVMax,
double isp,
int maxNbMan,
int orbitsNb)
Constructor.
|
Modifier and Type | Method and Description |
---|---|
double |
getMeanLongitude(org.orekit.orbits.Orbit orbit)
Get Earth based mean longitude.
|
static void |
main(String[] args)
Program entry point.
|
List<org.orekit.forces.maneuvers.ImpulseManeuver> |
run(org.orekit.propagation.SpacecraftState initialState,
double cycleDuration)
Run the SK simulation for a single cycle.
|
public StationKeeping(double westBound, double eastBound, double dVMax, double isp, int maxNbMan, int orbitsNb)
westBound
- the western boundary of the longitude windoweastBound
- the eastern boundary of the longitude windowdVMax
- the maximum deltaV for each maneuverisp
- the ISP of the propulsion systemmaxNbMan
- the maximum number of maneuvers per cycleorbitsNb
- the number of orbits between maneuverspublic List<org.orekit.forces.maneuvers.ImpulseManeuver> run(org.orekit.propagation.SpacecraftState initialState, double cycleDuration)
The longitude drift ζ (i.e. time derivative of the mean longitude) depends linearly on semi major axis, and is null at geosynchronous semi-major axis:
dl(t)/dt = ζ = ∂ζ/∂a × [a(t) - as]
where as is the synchronous semi-major axis and ∂ζ/∂a
is a negative coefficient depending only on the gravity field with a theoretical
value for Keplerian motion ∂ζ/∂a = -(3/2)√(μ/as).
The model for semi-major axis drift is limited to secular terms only here:
a(t) = a(t0) + å × (t - t0)
where å is the secular time derivative of the semi-major axis.
This implies the model for mean longitude is quadratic:
l(t) = l(t0) + ∂ζ/∂a × [a(t0) - as] × (t - t0) + ½ ∂ζ/∂a × å × (t - t0)2
The initial longitude l(t0) is inherited from the previous cycle motion. The curvature comes from å which depends on the station-keeping longitude slot. So the only control parameter left is the initial drift, which is adjusted by changing the offset [a(t0) - as] at initial time t0 thanks to tangential in-plane maneuvers. The aim of the control law is to achieve a parabolic motion that is centered in the station-keeping window during one cycle duration, i.e. with a peak (depending on acceleration direction, of course) longitude at cycle middle time.
The model parameters ∂ζ/∂a, as and å are computed with the FieldDSSTPropagator used to propagate the mean orbital elements and the partial derivatives.
initialState
- the initial state at cycle startcycleDuration
- the duration of the control cyclepublic double getMeanLongitude(org.orekit.orbits.Orbit orbit)
orbit
- current orbitpublic static void main(String[] args)
args
- program arguments (unused here)Copyright © 2002–2023 CS GROUP. All rights reserved.