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
Ephemeriswould be preferable to a list of a new class. Is it appropriate (possible?) to store estimated measurements parameters in aSpacecraftState? - 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