use of org.orekit.attitudes.LofOffset in project Orekit by CS-SI.
the class ImpulseManeuverTest method testInertialManeuver.
@Test
public void testInertialManeuver() throws OrekitException {
final double mu = CelestialBodyFactory.getEarth().getGM();
final double initialX = 7100e3;
final double initialY = 0.0;
final double initialZ = 1300e3;
final double initialVx = 0;
final double initialVy = 8000;
final double initialVz = 1000;
final Vector3D position = new Vector3D(initialX, initialY, initialZ);
final Vector3D velocity = new Vector3D(initialVx, initialVy, initialVz);
final AbsoluteDate epoch = new AbsoluteDate(2010, 1, 1, 0, 0, 0, TimeScalesFactory.getUTC());
final TimeStampedPVCoordinates state = new TimeStampedPVCoordinates(epoch, position, velocity, Vector3D.ZERO);
final Orbit initialOrbit = new CartesianOrbit(state, FramesFactory.getEME2000(), mu);
final double totalPropagationTime = 0.00001;
final double driftTimeInSec = totalPropagationTime / 2.0;
final double deltaX = 0.01;
final double deltaY = 0.02;
final double deltaZ = 0.03;
final double isp = 300;
final Vector3D deltaV = new Vector3D(deltaX, deltaY, deltaZ);
KeplerianPropagator propagator = new KeplerianPropagator(initialOrbit, new LofOffset(initialOrbit.getFrame(), LOFType.VNC));
DateDetector dateDetector = new DateDetector(epoch.shiftedBy(driftTimeInSec));
InertialProvider attitudeOverride = new InertialProvider(new Rotation(RotationOrder.XYX, RotationConvention.VECTOR_OPERATOR, 0, 0, 0));
ImpulseManeuver<DateDetector> burnAtEpoch = new ImpulseManeuver<DateDetector>(dateDetector, attitudeOverride, deltaV, isp).withThreshold(driftTimeInSec / 4);
propagator.addEventDetector(burnAtEpoch);
SpacecraftState finalState = propagator.propagate(epoch.shiftedBy(totalPropagationTime));
final double finalVxExpected = initialVx + deltaX;
final double finalVyExpected = initialVy + deltaY;
final double finalVzExpected = initialVz + deltaZ;
final double maneuverTolerance = 1e-4;
final Vector3D finalVelocity = finalState.getPVCoordinates().getVelocity();
Assert.assertEquals(finalVxExpected, finalVelocity.getX(), maneuverTolerance);
Assert.assertEquals(finalVyExpected, finalVelocity.getY(), maneuverTolerance);
Assert.assertEquals(finalVzExpected, finalVelocity.getZ(), maneuverTolerance);
}
use of org.orekit.attitudes.LofOffset in project Orekit by CS-SI.
the class ImpulseManeuverTest method testBackAndForth.
@Test
public void testBackAndForth() throws OrekitException {
final AttitudeProvider lof = new LofOffset(FramesFactory.getEME2000(), LOFType.VNC);
final double mu = Constants.EIGEN5C_EARTH_MU;
final AbsoluteDate iniDate = new AbsoluteDate(2003, 5, 1, 17, 30, 0.0, TimeScalesFactory.getUTC());
final Orbit pastOrbit = new KeplerianOrbit(7e6, 1.0e-4, FastMath.toRadians(98.5), FastMath.toRadians(87.0), FastMath.toRadians(216.1807), FastMath.toRadians(319.779), PositionAngle.MEAN, FramesFactory.getEME2000(), iniDate, mu);
final double pastMass = 2500.0;
DateDetector dateDetector = new DateDetector(iniDate.shiftedBy(600));
Vector3D deltaV = new Vector3D(12.0, 1.0, -4.0);
final double isp = 300;
ImpulseManeuver<DateDetector> maneuver = new ImpulseManeuver<DateDetector>(dateDetector, new InertialProvider(Rotation.IDENTITY), deltaV, isp).withMaxCheck(3600.0).withThreshold(1.0e-6);
double span = 900.0;
KeplerianPropagator forwardPropagator = new KeplerianPropagator(pastOrbit, lof, mu, pastMass);
forwardPropagator.addEventDetector(maneuver);
SpacecraftState futureState = forwardPropagator.propagate(pastOrbit.getDate().shiftedBy(span));
KeplerianPropagator backwardPropagator = new KeplerianPropagator(futureState.getOrbit(), lof, mu, futureState.getMass());
backwardPropagator.addEventDetector(maneuver);
SpacecraftState rebuiltPast = backwardPropagator.propagate(pastOrbit.getDate());
Assert.assertEquals(0.0, Vector3D.distance(pastOrbit.getPVCoordinates().getPosition(), rebuiltPast.getPVCoordinates().getPosition()), 2.0e-8);
Assert.assertEquals(0.0, Vector3D.distance(pastOrbit.getPVCoordinates().getVelocity(), rebuiltPast.getPVCoordinates().getVelocity()), 2.0e-11);
Assert.assertEquals(pastMass, rebuiltPast.getMass(), 5.0e-13);
}
use of org.orekit.attitudes.LofOffset in project Orekit by CS-SI.
the class ImpulseManeuverTest method testAdditionalStateKeplerian.
@Test
public void testAdditionalStateKeplerian() throws OrekitException {
final double mu = CelestialBodyFactory.getEarth().getGM();
final double initialX = 7100e3;
final double initialY = 0.0;
final double initialZ = 1300e3;
final double initialVx = 0;
final double initialVy = 8000;
final double initialVz = 1000;
final Vector3D position = new Vector3D(initialX, initialY, initialZ);
final Vector3D velocity = new Vector3D(initialVx, initialVy, initialVz);
final AbsoluteDate epoch = new AbsoluteDate(2010, 1, 1, 0, 0, 0, TimeScalesFactory.getUTC());
final TimeStampedPVCoordinates pv = new TimeStampedPVCoordinates(epoch, position, velocity, Vector3D.ZERO);
final Orbit initialOrbit = new CartesianOrbit(pv, FramesFactory.getEME2000(), mu);
final double totalPropagationTime = 10;
final double deltaX = 0.01;
final double deltaY = 0.02;
final double deltaZ = 0.03;
final double isp = 300;
final Vector3D deltaV = new Vector3D(deltaX, deltaY, deltaZ);
final AttitudeProvider attitudeProvider = new LofOffset(initialOrbit.getFrame(), LOFType.VNC);
final Attitude initialAttitude = attitudeProvider.getAttitude(initialOrbit, initialOrbit.getDate(), initialOrbit.getFrame());
final SpacecraftState initialState = new SpacecraftState(initialOrbit, initialAttitude);
KeplerianPropagator propagator = new KeplerianPropagator(initialOrbit);
propagator.resetInitialState(initialState.addAdditionalState("testOnly", -1.0));
DateDetector dateDetector = new DateDetector(epoch.shiftedBy(0.5 * totalPropagationTime));
InertialProvider attitudeOverride = new InertialProvider(new Rotation(RotationOrder.XYX, RotationConvention.VECTOR_OPERATOR, 0, 0, 0));
ImpulseManeuver<DateDetector> burnAtEpoch = new ImpulseManeuver<DateDetector>(dateDetector, attitudeOverride, deltaV, isp).withThreshold(1.0e-3);
propagator.addEventDetector(burnAtEpoch);
SpacecraftState finalState = propagator.propagate(epoch.shiftedBy(totalPropagationTime));
Assert.assertEquals(1, finalState.getAdditionalStates().size());
Assert.assertEquals(-1.0, finalState.getAdditionalState("testOnly")[0], 1.0e-15);
}
use of org.orekit.attitudes.LofOffset in project Orekit by CS-SI.
the class HarmonicParametricAccelerationTest method testEquivalentTangentialOverriddenManeuverField.
@Test
public void testEquivalentTangentialOverriddenManeuverField() throws OrekitException {
final double mass = 2500;
final double isp = Double.POSITIVE_INFINITY;
final double duration = 4000;
final double f = 400;
final AttitudeProvider maneuverLaw = new LofOffset(initialOrbit.getFrame(), LOFType.VNC);
ConstantThrustManeuver maneuver = new ConstantThrustManeuver(initialOrbit.getDate().shiftedBy(-10.0), duration, f, isp, Vector3D.PLUS_I);
final AttitudeProvider accelerationLaw = new CelestialBodyPointed(initialOrbit.getFrame(), CelestialBodyFactory.getSun(), Vector3D.PLUS_K, Vector3D.PLUS_I, Vector3D.PLUS_K);
final HarmonicParametricAcceleration lofAcceleration = new HarmonicParametricAcceleration(Vector3D.PLUS_I, maneuverLaw, "prefix", null, Double.POSITIVE_INFINITY, 1);
lofAcceleration.getParametersDrivers()[0].setValue(f / mass);
lofAcceleration.getParametersDrivers()[1].setValue(0.5 * FastMath.PI);
doTestEquivalentManeuver(Decimal64Field.getInstance(), mass, maneuverLaw, maneuver, accelerationLaw, lofAcceleration, 1.0e-15);
}
use of org.orekit.attitudes.LofOffset in project Orekit by CS-SI.
the class HarmonicParametricAccelerationTest method testEquivalentTangentialManeuver.
@Test
public void testEquivalentTangentialManeuver() throws OrekitException {
final double mass = 2500;
final double isp = Double.POSITIVE_INFINITY;
final double duration = 4000;
final double f = 400;
final AttitudeProvider commonLaw = new LofOffset(initialOrbit.getFrame(), LOFType.VNC);
ConstantThrustManeuver maneuver = new ConstantThrustManeuver(initialOrbit.getDate().shiftedBy(-10.0), duration, f, isp, Vector3D.PLUS_I);
final HarmonicParametricAcceleration lofAcceleration = new HarmonicParametricAcceleration(Vector3D.PLUS_I, false, "", null, Double.POSITIVE_INFINITY, 1);
Assert.assertFalse(lofAcceleration.dependsOnPositionOnly());
lofAcceleration.getParametersDrivers()[0].setValue(f / mass);
lofAcceleration.getParametersDrivers()[1].setValue(0.5 * FastMath.PI);
doTestEquivalentManeuver(mass, commonLaw, maneuver, commonLaw, lofAcceleration, 1.0e-15);
}
Aggregations