Big error on satellite position when the visibility of the stations comes back (ODTS algorithm)

Hello Orekit team,

I am currently doing an ODTS algorithm for GNSS satellites. For the estimation, I use a BatchLSEstimtor with a GaussNewton optimizer.
I estimate 7 parameters : Position(Px,Py,Pz), Velocity(Vx,Vy,Vz) and teh Satellite clock offset.

The algothim seems to work and produces good results at the begining. Then, when I loose visibility on the stations, it propagates. However, when the visibility on the rims comes back the error skyrockets. I checked the residuals and they are really high at this epoch. The error on the clock is ~10m and the error on the position is ~100m.

My current configuration is 11 stations and 1 satellite. I use an observable arc of 15 hours (enough to have data before and after the loss of visiblty). The modifiers applied on the mesurement are the sat Clock offset, the rims clock offset (read in a file) , the Tropospheric delay ( SaastamoinenModel) and a relativistic clock correction.

I tried to force more itteration on the epoch where the problem appears but it does not seems to converge to the good value.

Do you have an idea where it might come from ?

Thank you in advance,


Hi Luca,

A stupid question, are the station clock offsets initialized in second?

Also, the issue can be due to the estimation of the satellite clock offset. Indeed, the satellite clock offset is a stochastic parameter. It means that the value at a given epoch can be very different to the value at another epoch.
Using a batch least square estimator, you estimate a single value for the 15-hour span. Which is not physically correct.
One solution can be to have estimated parameters with a time validity. Like that you could estimate the value of the satellite clock offset each 5 minutes for instance. However that’s not currently possible with Orekit.

In order to confirm the assumption, did you try the orbit determination using the Orekit’s Kalman filter?

If you still have the issue, we will need a sample of code in order to reproduce your issue and understand what’s wrong.

Best regards,

Hello Bryan,

Yes, they are. However, I will still chek if there are no aberrant value in the file used.

This is a really good hint ! Indeed, the clock offset is the same for all the measurements in the observable arc. And the differences in 15 hours can be up to 100 meters…
There is really no way to use the previous values of clock offset estimated in order to adapt the modifier on the measurement according to the measurement date?

Ok, I will try to implement that.
Can I ask how the Kalman filter will allow to check that ?

Thank you very much for your answer ! It really helps.

Kind regards,


For the satellite clock offset I don’t think. It is possible for the station clock offsets by initializing a new station with a new estimated clock offset for each measurement. It is very time consuming, but possible. However, that’s not possible for the satellite since the propagator index (i.e., the one used when you do new ObservableSatellite(0)) is used internally by the estimator.

Because using a Kalman Filter the estimated parameters are predicted and corrected for each new observation. In other word, when the batch least square optimize an estimated value using the whole observation arc, the Kalman Filter change re-estimate the value for each new measurement. So, it’s better for estimating stochastic parameters.

Best regards,

Thank you Bryan for these explanations,

I think I can also try to implment a personal clock offset modifier that will took the previous values estimated at the right date for the sat clock offset.

I have another question on the estimation. How does the estimator works with the measurment in the arc of observable. It estimates a position at the current epoch date and then back propagate to the previous dates to compute the residuals ? Or it starts from the first date in the arc and estimate every position at every dates ? Or it is another thing ?

Thank you in advance,


Measurements are chronologically ordered. So for Kalman Filter it starts from the first date and estimate every position at every date.
Using batch least squares they are two cases:

  1. If the orbit determination epoch is closer to the last measurement epoch; the propagation is done backward from the last epoch and the estimation is done from the last epoch to the start epoch.

  2. If the orbit determination epoch is closer to the first measurement epoch; the propagation is done forward from the first epoch and the estimation is done from the first epoch to the last epoch.

Whatever the case, residuals are computed on the fly.

Best regards,

Ok thank you very much for this clear answer

Best regards,