use of org.orekit.propagation.sampling.OrekitFixedStepHandler in project Orekit by CS-SI.
the class Frames3 method main.
public static void main(String[] args) {
try {
// configure Orekit
File home = new File(System.getProperty("user.home"));
File orekitData = new File(home, "orekit-data");
if (!orekitData.exists()) {
System.err.format(Locale.US, "Failed to find %s folder%n", orekitData.getAbsolutePath());
System.err.format(Locale.US, "You need to download %s from the %s page and unzip it in %s for this tutorial to work%n", "orekit-data.zip", "https://www.orekit.org/forge/projects/orekit/files", home.getAbsolutePath());
System.exit(1);
}
DataProvidersManager manager = DataProvidersManager.getInstance();
manager.addProvider(new DirectoryCrawler(orekitData));
// Initial state definition :
// ==========================
// Date
// ****
AbsoluteDate initialDate = new AbsoluteDate(2003, 4, 7, 10, 55, 21.575, TimeScalesFactory.getUTC());
// Orbit
// *****
// The Sun is in the orbital plane for raan ~ 202
// gravitation coefficient
double mu = 3.986004415e+14;
// inertial frame
Frame eme2000 = FramesFactory.getEME2000();
Orbit orbit = new CircularOrbit(7178000.0, 0.5e-4, -0.5e-4, FastMath.toRadians(50.), FastMath.toRadians(220.), FastMath.toRadians(5.300), PositionAngle.MEAN, eme2000, initialDate, mu);
// Attitude laws
// *************
// Earth
Frame earthFrame = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
BodyShape earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS, Constants.WGS84_EARTH_FLATTENING, earthFrame);
// Target pointing attitude provider over satellite nadir at date, without yaw compensation
NadirPointing nadirLaw = new NadirPointing(eme2000, earth);
// Target pointing attitude provider with yaw compensation
final PVCoordinatesProvider sun = CelestialBodyFactory.getSun();
YawSteering yawSteeringLaw = new YawSteering(eme2000, nadirLaw, sun, Vector3D.MINUS_I);
// Propagator : Eckstein-Hechler analytic propagator
Propagator propagator = new EcksteinHechlerPropagator(orbit, yawSteeringLaw, 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);
// Let's write the results in a file in order to draw some plots.
propagator.setMasterMode(10, new OrekitFixedStepHandler() {
PrintStream out = null;
public void init(SpacecraftState s0, AbsoluteDate t, double step) throws OrekitException {
try {
File file = new File(System.getProperty("user.home"), "XYZ.dat");
System.out.println("Results written to file: " + file.getAbsolutePath());
out = new PrintStream(file, "UTF-8");
out.println("#time X Y Z Wx Wy Wz");
} catch (IOException ioe) {
throw new OrekitException(ioe, LocalizedCoreFormats.SIMPLE_MESSAGE, ioe.getLocalizedMessage());
}
}
public void handleStep(SpacecraftState currentState, boolean isLast) throws OrekitException {
// get the transform from orbit/attitude reference frame to spacecraft frame
Transform inertToSpacecraft = currentState.toTransform();
// get the position of the Sun in orbit/attitude reference frame
Vector3D sunInert = sun.getPVCoordinates(currentState.getDate(), currentState.getFrame()).getPosition();
// convert Sun position to spacecraft frame
Vector3D sunSat = inertToSpacecraft.transformPosition(sunInert);
// and the spacecraft rotational rate also
Vector3D spin = inertToSpacecraft.getRotationRate();
// Lets calculate the reduced coordinates
double sunX = sunSat.getX() / sunSat.getNorm();
double sunY = sunSat.getY() / sunSat.getNorm();
double sunZ = sunSat.getZ() / sunSat.getNorm();
out.format(Locale.US, "%s %12.3f %12.3f %12.3f %12.7f %12.7f %12.7f%n", currentState.getDate(), sunX, sunY, sunZ, spin.getX(), spin.getY(), spin.getZ());
if (isLast) {
out.close();
}
}
});
System.out.println("Running...");
propagator.propagate(initialDate.shiftedBy(6000));
} catch (OrekitException oe) {
System.err.println(oe.getMessage());
}
}
Aggregations