Kalman filter and updates of propagation parameters

Question for the experts. I am using Orekit for OD, which ideally would include a time-varying result for the solar radiation and drag coefficients. I get good initial estimates for both values from the least-squares, and in terms of the code mechanics I don’t have any issue putting those initial estimates into the kalman filter and getting some value out at each time step. However, based on the results I’m getting I’m not sure the kalman filter is actually doing anything intelligent to update the drag/radiation coefficients based on the difference between the observed measurement and the predicted value at each time step. Could someone give me a high-level explanation of what the kalman filter does to intelligently update the drag/radiation constants over time in such a situation, given that there’s no real way to have an “observed” drag/radiation coefficient to compare against the predicted value and update it?

I can’t speak for the OREKIT library. However, in general, for a Kalman Filter to update extended state, you will need the covariance matrix to include the extended state. Then the cross-terms from the observed dimension can have an impact.
I would anticipate this to be poorly conditioned for such weak forces, so I am not confident you would get the desired effect without incredibly good observations and dynamical models.

Hi @baubin

What are the initial covariance and process noise for these two parameters?

Hi,

Only the measurements have a theoretical value (from the measurement model and the estimated orbit) and a real one (from the input observations). The difference between the two is called residuals and for Kalman filters, there is two types: pre and post fit, which are respectively from pure propagation and after the correction. In a way, you can see the propagation model parameters like drag coefficients as dynamical ones with vanishing rates. Compared to batch estimators, dynamical ones also consider process noise, so a source of uncertainty in between observations, which is a way of considering unmodelled effects but can also lead to divergence if too big for example.

Now, the correction uses the prefit residuals but also the covariance matrix, whose computation depends on the algorithm (extended, unscented). If there are correlations between parameters, they might get updated even if they were not observable through a particular measurement. Let’s remember that for linear systems, kalman filters and least squares are basically equivalent.

On another note, in Orekit, Kalman filters don’t have any smoothing at the end, so the first points suffer from poorer estimation than the last ones. Adding some algorithms to the library would actually be great.

I’ll let @markrutten add/correct something if he likes

Cheers,
Romain.

@bcazabonne So back when I was adding drag/solar to the KF, I pulled the initial covariance from the least-squares fitting, and I was using a constant process noise (which I know isn’t great, but I was trying to get things started). Now I still pull the initial covariance from the LS (and remove the last two rows/columns) but have a dynamical process noise for the pos/vel (I’m using GPS data for my measurements). I’m currently leaving the drag/solar constant through the time period, which is usually “good enough” except lately we’ve had so much solar activity I’ve had a couple of our trickiest data sets fail their runs so I’ve been looking into adding drag/solar back into the kalman filter as active values.

@Serrof Thanks for the explanation. I actually wrote a fixed-interval smoother for our data which is working really well right now. The only issue is our code is in python so I can’t just hand it over. However I would like to contribute a smoother to Hipparchus/Orekit long term (if only to speed up our own code) but finding the time is hard.