Match Orekit's frames, and DE440 gravitational parameters

This commit is contained in:
connor committed 2026-10-02 21:11:03 -04:00
1 parent d1f2d2c4d1
commit 015ddcae35
7 files changed
+4375 -4352

No files matched your search

File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -6,10 +6,10 @@
"generated": "2026-10-02",
"forces": ["NewtonianAttraction(mu = 3.986004415e14)"],
"integrator": "DormandPrince853, tolerances from NumericalPropagator.tolerances(1e-06 m)",
"notes": ["Inertial frame throughout, so no Earth orientation is involved.", "No third body, no atmosphere, no radiation pressure.", "mu is EGM96's, matching this crate's Earth.", "orekit-data sha256 6565d2ec5d8645c309f4c4b5c1d975276024eaaa81fe07dac8f2c3b94d9d253c"]
"notes": ["GCRF, which is ICRF-aligned and so matches the inertial frame this crate gets from ANISE. Orekit's EME2000 is the FK5 mean equator and equinox instead, 23 mas away, which is the largest frame difference there is between the two tools.", "Inertial throughout, so no Earth orientation is involved.", "No third body, no atmosphere, no radiation pressure.", "mu is EGM96's, matching this crate's Earth.", "orekit-data sha256 6565d2ec5d8645c309f4c4b5c1d975276024eaaa81fe07dac8f2c3b94d9d253c"]
},
"epoch": "2026-01-01T00:00:00 UTC",
"frame": "EME2000",
"frame": "GCRF",
"states": [
{ "elapsed": 0.0, "position": [6.978000000e+06, 0.000000000e+00, 0.000000000e+00], "velocity": [0.000000000e+00, 7.560000000e+03, 0.000000000e+00] },
{ "elapsed": 60.0, "position": [6.963270254e+06, 4.532807896e+05, 0.000000000e+00], "velocity": [-4.908184317e+02, 7.544041738e+03, 0.000000000e+00] },
+7 -7
View File
@@ -87,10 +87,10 @@ fn test_a_point_mass_arc_agrees_with_orekit() {
/// EGM96, read by both sides from the same coefficient file.
///
/// The one knob matched by intent rather than by construction is the body-fixed frame:
/// Orekit turns the Earth with ITRF under IERS 2010 conventions and the Earth orientation
/// parameters in `orekit-data`, while this crate uses ITRF93 from a SPICE binary PCK. The
/// agreement below is what that difference costs, together with everything else.
/// The frames are matched as closely as the two tools allow: GCRF on the inertial side,
/// which is ICRF-aligned like the frame this crate gets from ANISE, and ITRF93 on the
/// body-fixed side, which is the realization its SPICE kernel carries. What is left is
/// about 4 mas between the two rotations, and the centimeter below is mostly that.
fn gravity(degree: usize, allowed_meters: f64) {
let Some(almanac) = almanac() else {
eprintln!("skipped: kernels not fetched, run scripts/fetch-kernels.sh");
@@ -118,15 +118,15 @@ fn gravity(degree: usize, allowed_meters: f64) {
#[test]
fn test_a_low_degree_field_agrees_with_orekit() {
// An order of magnitude inside the one meter a day this is aiming at.
gravity(8, 0.1);
// Measured at 1.1 cm, against the one meter a day this is aiming at.
gravity(8, 0.03);
}
#[test]
fn test_a_higher_degree_field_agrees_with_orekit() {
// Degree 20 rather than 70: the agreement is the same to within a couple of
// centimeters and the arc costs a fraction of the time in a debug build.
gravity(20, 0.2);
gravity(20, 0.03);
}
/// The Sun and the Moon over a point mass, from the same DE-440 ephemeris on both sides.