Hi all!
I got the gp data from space-track.com is below:
[
{
"CCSDS_OMM_VERS": "2.0",
"COMMENT": "GENERATED VIA SPACE-TRACK.ORG API",
"CREATION_DATE": "2023-03-15T03:17:22",
"ORIGINATOR": "18 SPCS",
"OBJECT_NAME": "TERRA",
"OBJECT_ID": "1999-068A",
"CENTER_NAME": "EARTH",
"REF_FRAME": "TEME",
"TIME_SYSTEM": "UTC",
"MEAN_ELEMENT_THEORY": "SGP4",
"EPOCH": "2023-03-14T22:01:50.020320",
"MEAN_MOTION": "14.59101772",
"ECCENTRICITY": "0.00020310",
"INCLINATION": "98.1038",
"RA_OF_ASC_NODE": "144.6045",
"ARG_OF_PERICENTER": "45.6311",
"MEAN_ANOMALY": "69.0145",
"EPHEMERIS_TYPE": "0",
"CLASSIFICATION_TYPE": "U",
"NORAD_CAT_ID": "25994",
"ELEMENT_SET_NO": "999",
"REV_AT_EPOCH": "23591",
"BSTAR": "0.00025206000000",
"MEAN_MOTION_DOT": "0.00001141",
"MEAN_MOTION_DDOT": "0.0000000000000",
"SEMIMAJOR_AXIS": "7074.213",
"PERIOD": "98.691",
"APOAPSIS": "697.515",
"PERIAPSIS": "694.641",
"OBJECT_TYPE": "PAYLOAD",
"RCS_SIZE": "LARGE",
"COUNTRY_CODE": "US",
"LAUNCH_DATE": "1999-12-18",
"SITE": "AFWTR",
"DECAY_DATE": null,
"FILE": "3860643",
"GP_ID": "228092687",
"TLE_LINE0": "0 TERRA",
"TLE_LINE1": "1 25994U 99068A 23073.91794005 .00001141 00000-0 25206-3 0 9996",
"TLE_LINE2": "2 25994 98.1038 144.6045 0002031 45.6311 69.0145 14.59101772235912"
}
]
When I use this gp data to compute access, by TLEPropagator and KeplerianPropagator or NumericalPropagator, the access result is different. The TLE result is the same as STK’s result, and using KeplerianPropagator or NumericalPropagator is NOT same. In my submission, the TLE result is correct. But why the result is different, they use same gp data.
This is my script by KeplerianPropagator:
public static void main(final String[] args) {
try {
// configure Orekit
final File home = new File(System.getProperty("user.home"));
final 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 %s, unzip it in %s and rename it 'orekit-data' for this tutorial to work%n",
"orekit-data-master.zip", "https://gitlab.orekit.org/orekit/orekit-data/-/archive/master/orekit-data-master.zip",
home.getAbsolutePath());
System.exit(1);
}
final DataProvidersManager manager = DataContext.getDefault().getDataProvidersManager();
manager.addProvider(new DirectoryCrawler(orekitData));
// Initial state definition : date, orbit
final double mu = 3.986004415e+14; // gravitation coefficient
final double a = 7074213.;
final double e = 0.00020310;
final double i = FastMath.toRadians(98.1038);
final double pa = FastMath.toRadians(45.6311);
final double raan = FastMath.toRadians(144.6045);
final double anomaly = FastMath.toRadians(69.0145);
// second = 50.020320
AbsoluteDate initialDate = new AbsoluteDate(2023, 3, 14, 22, 1, 50.020320, TimeScalesFactory.getUTC());
final Orbit initialOrbit = new KeplerianOrbit(a, e, i, pa, raan, anomaly, PositionAngle.MEAN, FramesFactory.getEME2000(), initialDate, mu);
// Propagator : consider a simple Keplerian motion (could be more elaborate)
final Propagator kepler = new KeplerianPropagator(initialOrbit);
// Earth and frame
final Frame earthFrame = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
final BodyShape earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
Constants.WGS84_EARTH_FLATTENING,
earthFrame);
// Station
final double longitude = FastMath.toRadians(108.8381);
final double latitude = FastMath.toRadians(34.1516);
final double altitude = 0.;
final GeodeticPoint station1 = new GeodeticPoint(latitude, longitude, altitude);
final TopocentricFrame sta1Frame = new TopocentricFrame(earth, station1, "station1");
// Event definition
final double maxcheck = 60.0;
final double threshold = 0.001;
final double elevation = FastMath.toRadians(5.0);
final EventDetector sta1Visi =
new ElevationDetector(maxcheck, threshold, sta1Frame).
withConstantElevation(elevation).
withHandler((s, detector, increasing) -> {
System.out.println(" Visibility on " +
detector.getTopocentricFrame().getName() +
(increasing ? " begins at " : " ends at ") +
s.getDate());
return increasing ? Action.CONTINUE : Action.STOP;
});
// Add event to be detected
kepler.addEventDetector(sta1Visi);
// Propagate from the initial date to the first raising or for the fixed duration
AbsoluteDate startAbsolute = new AbsoluteDate(2023, 3, 15, 6, 21, 0, TimeScalesFactory.getUTC());
AbsoluteDate endAbsolute = new AbsoluteDate(2023, 3, 16, 6, 21, 0, TimeScalesFactory.getUTC());
final SpacecraftState finalState = kepler.propagate(startAbsolute, endAbsolute);
System.out.println(" Final state : " + finalState.getDate().durationFrom(initialDate));
} catch (OrekitException oe) {
System.err.println(oe.getLocalizedMessage());
}
}
The result by using TLE and TLEPropagator is
Visibility on station1 begins at 2023-03-15T14:02:08.546282157851Z
Visibility on station1 ends at 2023-03-15T14:13:15.0753189324598Z
And the KeplerianPropagator’s result is:
Visibility on station1 begins at 2023-03-15T14:01:33.10323315769451Z
Visibility on station1 ends at 2023-03-15T14:12:43.04132566023242Z
They differ by more than 30 seconds, and as time goes on, the differ becomes larger.
In addition, I use this orbit data(a, e, i, pa, raan, anomaly) to create a satellite with STK, then compute access. The result is same as KeplerianPropagator. I don’t understand why did this happen.
Thank you.