use of org.orekit.orbits.CircularOrbit in project Orekit by CS-SI.
the class DSSTPropagatorTest method testIssue363.
@Test
public void testIssue363() throws OrekitException {
Utils.setDataRoot("regular-data");
AbsoluteDate date = new AbsoluteDate("2003-06-18T00:00:00.000", TimeScalesFactory.getUTC());
CircularOrbit orbit = new CircularOrbit(7389068.5, 1.0e-15, 1.0e-15, 1.709573, 1.308398, 0, PositionAngle.MEAN, FramesFactory.getTOD(IERSConventions.IERS_2010, false), date, Constants.WGS84_EARTH_MU);
SpacecraftState osculatingState = new SpacecraftState(orbit, 1116.2829);
List<DSSTForceModel> dsstForceModels = new ArrayList<DSSTForceModel>();
dsstForceModels.add(new DSSTThirdBody(CelestialBodyFactory.getMoon()));
dsstForceModels.add(new DSSTThirdBody(CelestialBodyFactory.getSun()));
SpacecraftState meanState = DSSTPropagator.computeMeanState(osculatingState, null, dsstForceModels);
Assert.assertEquals(0.421, osculatingState.getA() - meanState.getA(), 1.0e-3);
Assert.assertEquals(-5.23e-8, osculatingState.getEquinoctialEx() - meanState.getEquinoctialEx(), 1.0e-10);
Assert.assertEquals(15.22e-8, osculatingState.getEquinoctialEy() - meanState.getEquinoctialEy(), 1.0e-10);
Assert.assertEquals(-3.15e-8, osculatingState.getHx() - meanState.getHx(), 1.0e-10);
Assert.assertEquals(2.83e-8, osculatingState.getHy() - meanState.getHy(), 1.0e-10);
Assert.assertEquals(15.96e-8, osculatingState.getLM() - meanState.getLM(), 1.0e-10);
}
use of org.orekit.orbits.CircularOrbit in project Orekit by CS-SI.
the class Phasing method improveEarthPhasing.
/**
* Improve orbit to better match Earth phasing parameters.
* @param previous previous orbit
* @param nbOrbits number of orbits in the phasing cycle
* @param nbDays number of days in the phasing cycle
* @param propagator propagator to use
* @return an improved Earth phased orbit
* @exception OrekitException if orbit cannot be propagated
*/
private CircularOrbit improveEarthPhasing(CircularOrbit previous, int nbOrbits, int nbDays, Propagator propagator) throws OrekitException {
propagator.resetInitialState(new SpacecraftState(previous));
// find first ascending node
double period = previous.getKeplerianPeriod();
SpacecraftState firstState = findFirstCrossing(0.0, true, previous.getDate(), previous.getDate().shiftedBy(2 * period), 0.01 * period, propagator);
// go to next cycle, one orbit at a time
SpacecraftState state = firstState;
for (int i = 0; i < nbOrbits; ++i) {
final AbsoluteDate previousDate = state.getDate();
state = findLatitudeCrossing(0.0, previousDate.shiftedBy(period), previousDate.shiftedBy(2 * period), 0.01 * period, period, propagator);
period = state.getDate().durationFrom(previousDate);
}
double cycleDuration = state.getDate().durationFrom(firstState.getDate());
double deltaT;
if (((int) FastMath.rint(cycleDuration / Constants.JULIAN_DAY)) != nbDays) {
// we are very far from expected duration
deltaT = nbDays * Constants.JULIAN_DAY - cycleDuration;
} else {
// we are close to expected duration
GeodeticPoint startPoint = earth.transform(firstState.getPVCoordinates().getPosition(), firstState.getFrame(), firstState.getDate());
GeodeticPoint endPoint = earth.transform(state.getPVCoordinates().getPosition(), state.getFrame(), state.getDate());
double deltaL = MathUtils.normalizeAngle(endPoint.getLongitude() - startPoint.getLongitude(), 0.0);
deltaT = deltaL * Constants.JULIAN_DAY / (2 * FastMath.PI);
}
double deltaA = 2 * previous.getA() * deltaT / (3 * nbOrbits * previous.getKeplerianPeriod());
return new CircularOrbit(previous.getA() + deltaA, previous.getCircularEx(), previous.getCircularEy(), previous.getI(), previous.getRightAscensionOfAscendingNode(), previous.getAlphaV(), PositionAngle.TRUE, previous.getFrame(), previous.getDate(), previous.getMu());
}
use of org.orekit.orbits.CircularOrbit in project Orekit by CS-SI.
the class Phasing method improveSunSynchronization.
/**
* Improve orbit to better match phasing parameters.
* @param previous previous orbit
* @param duration sampling duration
* @param latitude reference latitude for Sun synchronous orbit
* @param ascending if true, crossing latitude is from South to North
* @param mst desired mean solar time at reference latitude crossing
* @param propagator propagator to use
* @return an improved Earth phased, Sun synchronous orbit
* @exception OrekitException if orbit cannot be propagated
*/
private CircularOrbit improveSunSynchronization(CircularOrbit previous, double duration, double latitude, boolean ascending, double mst, Propagator propagator) throws OrekitException {
propagator.resetInitialState(new SpacecraftState(previous));
AbsoluteDate start = previous.getDate();
// find the first latitude crossing
double period = previous.getKeplerianPeriod();
double stepSize = period / 100;
SpacecraftState crossing = findFirstCrossing(latitude, ascending, start, start.shiftedBy(2 * period), stepSize, propagator);
// find all other latitude crossings from regular schedule
SecularAndHarmonic mstModel = new SecularAndHarmonic(2, 2.0 * FastMath.PI / Constants.JULIAN_YEAR, 4.0 * FastMath.PI / Constants.JULIAN_YEAR, 2.0 * FastMath.PI / Constants.JULIAN_DAY, 4.0 * FastMath.PI / Constants.JULIAN_DAY);
mstModel.resetFitting(start, new double[] { mst, -1.0e-10, -1.0e-17, 1.0e-3, 1.0e-3, 1.0e-5, 1.0e-5, 1.0e-5, 1.0e-5, 1.0e-5, 1.0e-5 });
while (crossing != null && crossing.getDate().durationFrom(start) < duration) {
final AbsoluteDate previousDate = crossing.getDate();
crossing = findLatitudeCrossing(latitude, previousDate.shiftedBy(period), previousDate.shiftedBy(2 * period), stepSize, period / 8, propagator);
if (crossing != null) {
// store current point
mstModel.addPoint(crossing.getDate(), meanSolarTime(crossing.getOrbit()));
// use the same time separation to pinpoint next crossing
period = crossing.getDate().durationFrom(previousDate);
}
}
// fit the mean solar time to a parabolic plus medium periods model
// we will only use the linear part for the correction
mstModel.fit();
final double[] fittedH = mstModel.approximateAsPolynomialOnly(1, start, 2, 2, start, start.shiftedBy(duration), stepSize);
// solar time bias must be compensated by shifting ascending node
double deltaRaan = FastMath.PI * (mst - fittedH[0]) / 12;
// solar time slope must be compensated by changing inclination
// linearized relationship between hDot and inclination:
// hDot = alphaDot - raanDot where alphaDot is the angular rate of Sun right ascension
// and raanDot is the angular rate of ascending node right ascension. So hDot evolution
// is the opposite of raan evolution, which itself is proportional to cos(i) due to J2
// effect. So hDot = alphaDot - k cos(i) and hence Delta hDot = -k sin(i) Delta i
// so Delta hDot / Delta i = (alphaDot - hDot) tan(i)
double dhDotDi = (24.0 / Constants.JULIAN_YEAR - fittedH[1]) * FastMath.tan(previous.getI());
// compute inclination offset needed to achieve station-keeping target
final double deltaI = fittedH[1] / dhDotDi;
return new CircularOrbit(previous.getA(), previous.getCircularEx(), previous.getCircularEy(), previous.getI() + deltaI, previous.getRightAscensionOfAscendingNode() + deltaRaan, previous.getAlphaV(), PositionAngle.TRUE, previous.getFrame(), previous.getDate(), previous.getMu());
}
use of org.orekit.orbits.CircularOrbit in project Orekit by CS-SI.
the class TrackCorridor method createPropagator.
/**
* Create an orbit propagator for a circular orbit
* @param a semi-major axis (m)
* @param ex e cos(ω), first component of circular eccentricity vector
* @param ey e sin(ω), second component of circular eccentricity vector
* @param i inclination (rad)
* @param raan right ascension of ascending node (Ω, rad)
* @param alpha an + ω, mean latitude argument (rad)
* @param date date of the orbital parameters
* @return an orbit propagator
* @exception OrekitException if propagator cannot be built
*/
private Propagator createPropagator(final AbsoluteDate date, final double a, final double ex, final double ey, final double i, final double raan, final double alpha) throws OrekitException {
// create orbit
Orbit initialOrbit = new CircularOrbit(a, ex, ey, i, raan, alpha, PositionAngle.MEAN, FramesFactory.getEME2000(), date, Constants.EIGEN5C_EARTH_MU);
// create propagator
Propagator propagator = new EcksteinHechlerPropagator(initialOrbit, new LofOffset(initialOrbit.getFrame(), LOFType.TNW), Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS, Constants.EIGEN5C_EARTH_MU, Constants.EIGEN5C_EARTH_C20, Constants.EIGEN5C_EARTH_C30, Constants.EIGEN5C_EARTH_C40, Constants.EIGEN5C_EARTH_C50, Constants.EIGEN5C_EARTH_C60);
return propagator;
}
use of org.orekit.orbits.CircularOrbit in project Orekit by CS-SI.
the class SmallManeuverAnalyticalModelTest method testLowEarthOrbit1.
@Test
public void testLowEarthOrbit1() throws OrekitException {
Orbit leo = new CircularOrbit(7200000.0, -1.0e-5, 2.0e-4, FastMath.toRadians(98.0), FastMath.toRadians(123.456), 0.0, PositionAngle.MEAN, FramesFactory.getEME2000(), new AbsoluteDate(new DateComponents(2004, 01, 01), new TimeComponents(23, 30, 00.000), TimeScalesFactory.getUTC()), Constants.EIGEN5C_EARTH_MU);
double mass = 5600.0;
AbsoluteDate t0 = leo.getDate().shiftedBy(1000.0);
Vector3D dV = new Vector3D(-0.01, 0.02, 0.03);
double f = 20.0;
double isp = 315.0;
BoundedPropagator withoutManeuver = getEphemeris(leo, mass, t0, Vector3D.ZERO, f, isp);
BoundedPropagator withManeuver = getEphemeris(leo, mass, t0, dV, f, isp);
SmallManeuverAnalyticalModel model = new SmallManeuverAnalyticalModel(withoutManeuver.propagate(t0), dV, isp);
Assert.assertEquals(t0, model.getDate());
for (AbsoluteDate t = withoutManeuver.getMinDate(); t.compareTo(withoutManeuver.getMaxDate()) < 0; t = t.shiftedBy(60.0)) {
PVCoordinates pvWithout = withoutManeuver.getPVCoordinates(t, leo.getFrame());
PVCoordinates pvWith = withManeuver.getPVCoordinates(t, leo.getFrame());
PVCoordinates pvModel = model.apply(withoutManeuver.propagate(t)).getPVCoordinates(leo.getFrame());
double nominalDeltaP = new PVCoordinates(pvWith, pvWithout).getPosition().getNorm();
double modelError = new PVCoordinates(pvWith, pvModel).getPosition().getNorm();
if (t.compareTo(t0) < 0) {
// before maneuver, all positions should be equal
Assert.assertEquals(0, nominalDeltaP, 1.0e-10);
Assert.assertEquals(0, modelError, 1.0e-10);
} else {
// despite nominal deltaP exceeds 1 kilometer after less than 3 orbits
if (t.durationFrom(t0) > 0.1 * leo.getKeplerianPeriod()) {
Assert.assertTrue(modelError < 0.009 * nominalDeltaP);
}
Assert.assertTrue(modelError < 0.8);
}
}
}
Aggregations