TLES velocity not derivative of position
For this TLES for a GEO satellite after an ascending node the z velocity has the wrong sign.
1 28626U 05008A 19222.84791105 -.00000224 +00000-0 +00000-0 0 9997
2 28626 000.0058 356.1159 0000414 097.2736 085.7607 01.00271612017542
Here is the output from a Orekit program to print the position z coordinate, velocity z coordinate, and velocity computed by finite difference of the position:
time past epoch (min): 5319.50809 z: -1.308712 vz: 2.276642e-04 finite diff vz: NaN
time past epoch (min): 5320.50809 z: -0.770904 vz: 1.357177e-04 finite diff vz: 8.963475e-03
time past epoch (min): 5321.50809 z: -0.243799 vz: 4.344089e-05 finite diff vz: 8.785075e-03
time past epoch (min): 5322.50809 z: 0.272573 vz: -4.916140e-05 finite diff vz: 8.606193e-03
time past epoch (min): 5323.50809 z: 0.778183 vz: -1.420842e-04 finite diff vz: 8.426837e-03
time past epoch (min): 5324.50809 z: 1.273003 vz: -2.353224e-04 finite diff vz: 8.247012e-03
time past epoch (min): 5325.50809 z: 1.757007 vz: -3.288711e-04 finite diff vz: 8.066724e-03
time past epoch (min): 5326.50809 z: 2.230166 vz: -4.227252e-04 finite diff vz: 7.885982e-03
Clearly vz
has the wrong sign after the node and the actual z velocity is relatively constant. Here is the code that produces the above output:
@Test
public void testTlesVz() {
TLE tle = new TLE(
"1 28626U 05008A 19222.84791105 -.00000224 +00000-0 +00000-0 0 9997",
"2 28626 000.0058 356.1159 0000414 097.2736 085.7607 01.00271612017542");
double step = 60;
AbsoluteDate start = new AbsoluteDate("2019-226", tle.getUtc())
.shiftedBy(0.5430555555555555 * 86400) // approx time of issue
.shiftedBy(-90); // back up a bit
AbsoluteDate end = start.shiftedBy(7 * 60);
System.out.println(start.toStringRfc3339(tle.getUtc()));
TLEPropagator propagator = TLEPropagator.selectExtrapolator(tle);
Frame teme = propagator.getFrame();
propagator.setStepHandler(step, new OrekitFixedStepHandler() {
TimeStampedPVCoordinates last = null;
@Override
public void handleStep(SpacecraftState s) {
TimeStampedPVCoordinates pv = s.getPVCoordinates(teme);
final double z = pv.getPosition().getZ();
final double vz = pv.getVelocity().getZ();
double vzd = Double.NaN;
if (last != null) {
vzd = (z - last.getPosition().getZ()) / pv.getDate().durationFrom(last.getDate());
}
final double minutesPastEpoch = s.getDate().durationFrom(tle.getDate()) / 60;
System.out.format(
"time past epoch (min): %11.5f z: %9.6f vz: %11.6e finite diff vz: %11.6e\n",
minutesPastEpoch, z, vz, vzd);
last = pv;
}
});
propagator.propagate(start, end);
}