DSST orbit determination with osculating propagation fails depending on initial epoch

Dear Orekit team,

I have been trying out orbit determination with DSST and ran into some “sample for interpolation is empty” errors when using the osculating propagation type.
I saw this type of error has already been addressed before:


However, I found that the error pops up depending on the epoch of the initial state that I provide for the orbit determination. That is, I can run two test cases where only the epoch of the initial state is different, and one will succeed and one will fail with the “sample for interpolation is empty” error.

The “sample” error can be reproduced by running the DSSTOrbitDeterminationTest.testLageos2 using the following initial state in the “dsst_od_test_Lageos2.in” input file:

Orbit definition

## date of the orbital parameters (UTC)
orbit.date = 2016-02-18T02:08:29.462

## Position & velocity along X, y, z in inertial frame (m) 
orbit.cartesian.px =  -9568635.49920044
orbit.cartesian.py = 3867192.0159636163
orbit.cartesian.pz = 6277752.981336486
orbit.cartesian.vx =  373.70548163632344
orbit.cartesian.vy = -4558.370517911978
orbit.cartesian.vz = 3507.5434795087112

Here as initial epoch I used the epoch of the last Lageos2 measurement. (Using an epoch that matches a measurement epoch tends to give me an error.) I took the PV state from TLE.
Running using this input gives an error in orekit-develop and Orekit-10.2. For the Orekit-10.2 version, one first needs put PropagationType.OSCULATING on line 92 of DSSTOrbitDeterminationTest.java.

Thank you for your help in advance!

Best wishes,
David

======================================================

org.orekit.errors.OrekitException: sample for interpolation is empty
	at org.orekit.errors.OrekitException.unwrap(OrekitException.java:154)
	at org.orekit.propagation.integration.AbstractIntegratedPropagator.propagate(AbstractIntegratedPropagator.java:495)
	at org.orekit.propagation.integration.AbstractIntegratedPropagator.propagate(AbstractIntegratedPropagator.java:414)
	at org.orekit.propagation.PropagatorsParallelizer.propagate(PropagatorsParallelizer.java:141)
	at org.orekit.estimation.leastsquares.DSSTBatchLSModel.value(DSSTBatchLSModel.java:272)
	at org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresFactory$LocalLeastSquaresProblem.evaluate(LeastSquaresFactory.java:440)
	at org.orekit.estimation.leastsquares.BatchLSEstimator$TappedLSProblem.evaluate(BatchLSEstimator.java:616)
	at org.hipparchus.optim.nonlinear.vector.leastsquares.GaussNewtonOptimizer.optimize(GaussNewtonOptimizer.java:399)
	at org.orekit.estimation.leastsquares.BatchLSEstimator.estimate(BatchLSEstimator.java:436)
	at org.orekit.estimation.common.AbstractOrbitDetermination.runBLS(AbstractOrbitDetermination.java:420)
	at org.orekit.estimation.leastsquares.DSSTOrbitDeterminationTest.testLageos2(DSSTOrbitDeterminationTest.java:233)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:119)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: org.hipparchus.exception.MathIllegalArgumentException: sample for interpolation is empty
	at org.hipparchus.analysis.interpolation.HermiteInterpolator.checkInterpolation(HermiteInterpolator.java:304)
	at org.hipparchus.analysis.interpolation.HermiteInterpolator.value(HermiteInterpolator.java:178)
	at org.orekit.propagation.semianalytical.dsst.utilities.ShortPeriodicsInterpolatedCoefficient.value(ShortPeriodicsInterpolatedCoefficient.java:76)
	at org.orekit.propagation.semianalytical.dsst.forces.DSSTTesseral$Slot.getCijm(DSSTTesseral.java:2166)
	at org.orekit.propagation.semianalytical.dsst.forces.DSSTTesseral$TesseralShortPeriodicCoefficients.value(DSSTTesseral.java:1766)
	at org.orekit.propagation.semianalytical.dsst.DSSTPropagator$MeanPlusShortPeriodicMapper.mapArrayToState(DSSTPropagator.java:845)
	at org.orekit.propagation.integration.StateMapper.mapArrayToState(StateMapper.java:167)
	at org.orekit.propagation.integration.AbstractIntegratedPropagator$AdaptedStepInterpolator.convert(AbstractIntegratedPropagator.java:919)
	at org.orekit.propagation.integration.AbstractIntegratedPropagator$AdaptedStepInterpolator.getCurrentState(AbstractIntegratedPropagator.java:897)
	at org.orekit.estimation.leastsquares.MeasurementHandler.handleStep(MeasurementHandler.java:75)
	at org.orekit.propagation.PropagatorsParallelizer$SinglePropagatorHandler.handleStep(PropagatorsParallelizer.java:322)
	at org.orekit.propagation.integration.AbstractIntegratedPropagator$AdaptedStepHandler.handleStep(AbstractIntegratedPropagator.java:860)
	at org.hipparchus.ode.AbstractIntegrator.acceptStep(AbstractIntegrator.java:429)
	at org.hipparchus.ode.nonstiff.EmbeddedRungeKuttaIntegrator.integrate(EmbeddedRungeKuttaIntegrator.java:290)
	at org.orekit.propagation.integration.AbstractIntegratedPropagator.propagate(AbstractIntegratedPropagator.java:469)
	... 56 more

Hi @dgondelach,

Welcome to the Orekit forum!

I found the same error 3 days ago. An issue has been opened on the Orekit Gitlab repository to fix it.

The error appends in DSST orbit determination (PropagationType.OSCULATING) with a backward propagation mode. In other words, if the epoch of your initial state is closer to the epoch of the last measurement (in chronological order) the error occurs. In forward propagation mode, everything work.

I had not yet found the solution to fix the error.
After a quick investigation, I found that it is not just related to DSST orbit determination. Indeed, the error can be reproduced without using the DSST under orbit determination conditions. Furthermore, this bug is an old one because it can be reproduced using Orekit 9.2.
In the link above, I attached two tests (one using Orekit 10.2 and one using Orekit 9.2) to reproduce the error and try to fix it.

Best regards,
Bryan

Hi @bcazabonne,

Thank you for your quick response!

Good to hear that you found the source of the error. I’m a Orekit beginner, so not sure if I can help you find a solution, but I’ll have a look and I’d be happy to perform some tests.

Best wishes,
David

Thank you David.
Any help, even the small one, can help a lot to find a solution.

Bryan