Issue 1639 - Implement Kalman smoother

This addresses issue #1639 (closed). Note that there is a dependency on pull request 364 for hipparchus.

The smoother is implemented as an Kalman filter observer, for either a KalmanEstimator, or UnscentedKalmanEstimator. Once the measurements have been processed by the filter, the smoother can be called, which currently returns a list of PhysicalEstimatedState, corresponding to the smoothed estimates at each measurement time-step.

For example

        // Build the Kalman filter
        final KalmanEstimator kalmanEstimator = new KalmanEstimatorBuilder().
                addPropagationConfiguration(propagatorBuilder, new ConstantProcessNoise(initialP, Q)).
                build();

        // Add smoother observer to filter
        final RtsSmoother rtsSmoother = new RtsSmoother(kalmanEstimator);
        kalmanEstimator.setObserver(rtsSmoother);

        // Add the measurements to the Kalman filter
        Propagator[] estimated = kalmanEstimator.processMeasurements(measurements);

        // Test backwards smoothing
        List<PhysicalEstimatedState> smoothedStates = rtsSmoother.backwardsSmooth();

Things left to resolve:

  • An Ephemeris would be preferable to a list of a new class. Is it appropriate (possible?) to store estimated measurements parameters in a SpacecraftState?
  • The tests are currently incomplete: the smoother is called, but the results aren't tested.
  • I've added yet another layer of abstract classes: is this necessary?
Edited by Mark Rutten

Merge request reports

Loading