BLSEstimator for GNSS orbit determination and time synchronisation

Hi Orekit community! I’m using Orekit library to develop an Orbit Determination and Time Synchronisation (ODTS) prototype for a GNSS constellation.
The algorithm process is as follows:

1- Configuration of the satellites is made using nav messages at AbsoluteDate 2011-03-07T01:00:00.000, corresponding with the first epoch of estimation.
2- Configuration of the ground stations is also made and all observables (from 2011-03-07T00:00:00.000 to 2011-03-07T23:59:59.000) from the stations are processed.
3- A BLSEstimator is built with the propagator builders configured at current epoch.
4- Observables are added to the estimator, from the start of data date (2011-03-07T00:00:00.000) to the current epoch date (in this case 2011-03-07T01:00:00.000).
5- Parameters are estimated using Gauss Newton optimizer, converging in 2 iterations.
6- Epoch date is updated shifting the latest one by 10 minutes. Steps from 3 to 5 are repeated using the new epoch date.

Once the process I am following has been explained, I would like to
ask you some questions:

First of all, regarding the arc of observations, I have set a maximal length of 3 hours, so that if we are placed in epoch date 2011-03-07T04:20:00.000, for example, all observations before 2011-03-07T01:20:00.000 must not be considered. And the question is, is there any way to erase old not interesting measurements already included in the estimator? I tried by searching these old measurements and calling the method ‘ObservedMeasurement.setEnabled(false)’, but then at the time of estimation there is a problem of matrix dimensions from the LMS.

By solving this problem, I would be able to create an estimator at first epoch and, then, I would only need to add current epoch date measurements instead of adding all measurements from the start to the end of the arc at each step. In conclusion, it would be really useful.

Then, I would like to know how the derivatives of the parameters to estimate are calculated. Since I created my own EstimationModifiers, I’m afraid that this might perturbate the parameter derivatives. Besides, regarding the fact that I create a new BLSEstimator at each epoch (for the moment, until the first question is solved), does it have any impact on the derivatives calculation?

Thanks in advance,

Nico Mendoza

Hi @MendozaN

No, it isn’t. If I good understand, what you would like to do is to clear the measurement history? In other words, what you would like is a method clearMeasurements in the BatchLSEstimator class? Something like:

/** Clears the list of measurements. */
public void clearMeasurements() {
	measurements.clear();
}

However, I’m not sure if it will work because of the list of estimated measurements parameters. Indeed, if you run an OD process with a set of measurements and a set of estimated measurement parameters. Then, you clear the list of measurements to add new measurements with new estimated measurement parameters using the same instance of BatchLSEstimator. I’m not sure that the estimator will appreciate this. I never tried, maybe it works. I am curious to know :slightly_smiling_face:
What I can recommend you is to create a new instance of BatchLSEstimator for each set of measurements.

BatchLSEstimator estimator = new BatchLSEstimator(...);
// finish the estimator configuration with convergence checker, ...
for (ObservedMeasurement<?> measurement : firstSetOfMeasurements) {
     estimator.addMeasurement(measurement);
}
estimator.estimate();

// New set of measurements
estimator = new BatchLSEstimator(...);
// finish the estimator configuration with convergence checker, ...
for (ObservedMeasurement<?> measurement : secondSetOfMeasurements) {
     estimator.addMeasurement(measurement);
}
estimator.estimate();

// ...

Parameters derivatives are calculated using automatic differentiation technique. If you want to learn more about automatic differentiation and its use in Orekit you can look at these references [1] [2] [3]. In terms of implementation, it is easy to do in Orekit. For instance, you can look at RangeTroposphericDelayModifier class. Because the tropospheric delay depends on the satellite’s position, partial derivatives of the delay with respect to the satellite’s position are not null. As a result, we must calculate it in the orbit determination process. Automatic differentiation is a very interesting tool for this calculation because it allows calculating the partials derivatives without having to find their equations. Only the equation of the delay is need. How is it possible? It is possible thanks to the FieldXxx classes with a Gradient type. Thank to that automatic differentiation can be used. You will find more details in the three previous references.

To my mind, the more measurements you have, the more your orbit determination will be accurate.

Finally, what you do looks like a compromise between a sequential estimation and a least squares estimation. For its next version, Orekit will add a SequentialtBatchLSEstimator. This estimator can be very interesting for your problem. It is currently available in the development version of Orekit.
SequentialtBatchLSEstimator can be used to perform the first estimation for the first set of measurements and also to perform the estimation for the new sets using the results of the previous estimations to improve the results. You can find a lot of information about SequentialtBatchLSEstimator in the class JavaDoc. An additional information to add is that you can access the results of the previous estimation (i.e. the Evaluation object) using estimator.getOptimum(); after the estimation.

Best regards,
Bryan