Recently, I’ve been implementing the Unscented Kalman Filter (UKF) for attitude estimations using parameter drivers (quaternions) obtained from magnitude measurements. While working with the latest version of Orekit 12.0.1 and utilizing the UKF, I’ve encountered an issue where the model doesn’t allow estimating measurements without first estimating orbital parameters.
In the UnscentedKalmanModel.java class, the covarianceIndirection is created through a new int[covarianceMatrixProviders.size()][columns] as shown in the image. The problem arises because I’ve modified the code to skip the estimation of both orbital and propagation parameters, focusing solely on magnitude estimation, specifically the 4 quaternions. This causes the value of columns to be 4. The fact that columns is set to 4 makes covarianceIndirection[k][i++] in the first for (final ParameterDriver driver : orbitDrivers.getDrivers()) result in an error when i=4:
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 4
Given the current code structure, I’m unsure if I can perform measurements estimation without estimating orbital parameters. In the case of propagation parameters, the code detects that c = null, so it doesn’t add values to covarianceIndirection.
Is there a way to resolve this issue?
Thank you in advance, everyone!
Welcome to the Orekit forum!
Does it work with the extended Kalman filter?
If yes, we shall think about doing the same work in the unscented filter.
Before using the extended filter could you try using
builder.deselectDynamicParameters() before Initializing your filter.
This method is used to disable the estimation of the orbital and propagation parameter from the propagator point of view.
Hello! Thank you very much for your prompt response @bcazabonne!
I’ve tried using the Extended Kalman Filter; however, a similar issue arises since there are no orbital parameters to estimate in the
SemiAnalyticalKalmanModel.java. You can see that an error (matrix must have at least one row) will occur as there are no orbital parameters to estimate.
// Initialize inverse of the orbital part of the state transition matrix
this.phiS = MatrixUtils.createRealIdentityMatrix(getNumberSelectedOrbitalDriversValuesToEstimate());
The only estimator that seems to work correctly with magnitude measurements is the
KalmanEstimator. As soon as I use the
UnscentedKalmanEstimator, the problem described in the previous post occurs. Below, I show in the following image one of the key differences between the Unscented Kalman Model and the Kalman Model in this process.
On the left is the Unscented Kalman Model, while on the right is the Kalman Model. There is a clear difference between lines 227-230 of the UKM and lines 221-226 of the KM. It can be observed that in the case of the KM, it works because it first detects that c != null before adding the value to covarianceIndirection. In the case of the UKM, the value of i increases even if c == null, causing the model to stop working when the number of the four quaternions I want to measure is exceeded (which defines the size of columns = 4). This leads to the problem mentioned in the previous post.
On the other hand, it’s worth mentioning that I’ve tried using builder.deselectDynamicParameters(), but I’m using an EphemerisPropagatorBuilder instead of a NumericalPropagatorBuilder as in previous versions. However, I was already performing this treatment previously before the builder:
for (final ParameterDriver parameterDriver : propagatorBuilder.getOrbitalParametersDrivers().getDrivers())
for (final ParameterDriver parameterDriver : propagatorBuilder.getPropagationParametersDrivers().getDrivers())
I appreciate your time in advance for the offered assistance. Best regards, and I look forward to your response!
SemiAnalyticalKalmanModel is not the classical Extended Kalman Filter (EKF). It is an EKF adapted to semi analytical propagators.
It is the dark side of the black magic of the Kalman filters.
Great! This class is the classical EKF.
So, if the EKF is able to perform the estimation without orbital and propagation parameters, the UKF shall do it too.
Could you open an issue in our Gitlab repository?
Just note an important information. Even if the UKF code is adapted, I don’t think it will work with the current version of Orekit because of the current issue: Improve estimation of propagation and measurement parameters with Unscented Kalman Filter (#1036) · Issues · Orekit / Orekit · GitLab
These are two different issues that shall be fixed separately.