Covariance Matrix Interpolation from OEM

Hi everyone,

I need to interpolate the covariance matrix provided by an OEM. Since the boundedPropagator (returned by the OEM parser) doesn’t manage any additional state, I came up with the following “horrendous” workaround.

Unfortunately, it doesn’t work — I’m getting an Orekit exception: “reset state not allowed”. I’m wondering if I’ve done something wrong, or if there’s a simpler way to achieve what I’m trying to do.

Thanks in advance,
Davide

    private static void readOEM(String fileName){

        OemParser parser = new ParserBuilder().buildOemParser();
        Oem oem = parser.parse(new DataSource(fileName));
        String satOemName = new String(); 

        for (String key : oem.getSatellites().keySet()){
            satOemName = key; 
        }

        List<CartesianCovariance> cartesianCovariances = oem.getSatellites().get(satOemName).getSegments().get(0).getCovarianceMatrices();
        List<TimeStampedPVCoordinates> states = oem.getSatellites().get(satOemName).getSegments().get(0).getCoordinates();
        OrbitBlender orbitBlender = new OrbitBlender(SmoothStepFactory.getQuintic(), oem.getSatellites().get(satOemName).getPropagator(), oem.getSatellites().get(satOemName).getPropagator().getFrame());
        StateCovarianceBlender stateCovarianceBlender = new StateCovarianceBlender(SmoothStepFactory.getQuintic(), orbitBlender, oem.getSatellites().get(satOemName).getPropagator().getFrame(), OrbitType.CARTESIAN,   PositionAngleType.TRUE );
        
        List<SpacecraftState> spacecraftStates = new ArrayList<>(); 
        List<Orbit> orbits = new ArrayList<>(); 
        for(TimeStampedPVCoordinates state : states){
            spacecraftStates.add(new SpacecraftState(new CartesianOrbit(state, oem.getSatellites().get(satOemName).getPropagator().getFrame(), oem.getSatellites().get(satOemName).getMu())));
            orbits.add((new CartesianOrbit(state, oem.getSatellites().get(satOemName).getPropagator().getFrame(), oem.getSatellites().get(satOemName).getMu()))); 
        }
        TimeInterpolator<SpacecraftState> stateInterpolator = new SpacecraftStateInterpolator(5,oem.getSatellites().get(satOemName).getPropagator().getFrame() );
        List<StateCovariance> covariances = new ArrayList<>(); 
        for(CartesianCovariance cov : cartesianCovariances){
            covariances.add(new StateCovariance(cov.getCovarianceMatrix(), cov.getEpoch(),null));
        }

        // Generate Collection time stamped pair
        List<TimeStampedPair<Orbit,StateCovariance>> listPair = new ArrayList<>(); 
        for(int i = 0; i < covariances.size(); i++){
            listPair.add(new TimeStampedPair<Orbit,StateCovariance>(orbits.get(i), covariances.get(i)));
        }
        
Ephemeris prop = new Ephemeris(spacecraftStates,stateInterpolator,covariances,stateCovarianceBlender);
        
        prop.getCovariance(new AbsoluteDate(2025,01,01,00,0,0.0,TimeScalesFactory.getUTC()).shiftedBy(60));
     

        }

here is the complete stack trace of the error:

org.orekit.errors.OrekitException: reset state not allowed
        at org.orekit.propagation.analytical.AggregateBoundedPropagator.resetInitialState(AggregateBoundedPropagator.java:202)
        at org.orekit.orbits.OrbitBlender.propagateOrbit(OrbitBlender.java:131)
        at org.orekit.orbits.OrbitBlender.interpolate(OrbitBlender.java:104)
        at org.orekit.orbits.OrbitBlender.interpolate(OrbitBlender.java:59)
        at org.orekit.time.AbstractTimeInterpolator.interpolate(AbstractTimeInterpolator.java:94)
        at org.orekit.orbits.AbstractOrbitInterpolator.interpolate(AbstractOrbitInterpolator.java:81)
        at org.orekit.orbits.AbstractOrbitInterpolator.interpolate(AbstractOrbitInterpolator.java:34)
        at org.orekit.propagation.AbstractStateCovarianceInterpolator.interpolateOrbit(AbstractStateCovarianceInterpolator.java:189)
        at org.orekit.propagation.AbstractStateCovarianceInterpolator.interpolate(AbstractStateCovarianceInterpolator.java:129)
        at org.orekit.propagation.AbstractStateCovarianceInterpolator.interpolate(AbstractStateCovarianceInterpolator.java:41)
        at org.orekit.time.AbstractTimeInterpolator.interpolate(AbstractTimeInterpolator.java:94)
        at org.orekit.propagation.analytical.Ephemeris.getCovariance(Ephemeris.java:340)

Hello @DDega,

The issue comes from your OrbitBlender :

        OrbitBlender orbitBlender = new OrbitBlender(SmoothStepFactory.getQuintic(),
                                                     oem.getSatellites()
                                                        .get(satOemName)
                                                        .getPropagator(),
                                                     oem.getSatellites()
                                                        .get(satOemName)
                                                        .getPropagator()
                                                        .getFrame());

Indeed, you are using your ephemeris as a propagator for the blender. However this class is designed to blend orbits using specific propagation “model” (analytical/numerical) and not using an ephemeris.

To get a “blended” orbit at time T, it takes the closest previous orbit, propagate it to T using provided propagation model (i.e the propagator to inpput) and do the same for the next closest orbit. Hence it needs to reset its initial state which is not possible with an Ephemeris (and would not make much sense as we would get exactly the same interpolated orbit).

You can refer to the following technical note for more information :

Cheers,
Vincent