Position residuals and velocity residuals

Hello everyone!
Orbit estimated residuals (position and velocity) Is the smaller , the better? What is the normal value range?

Hi @hurricane313622

Yes! The smaller, the better :slightly_smiling_face:

In my opinion, the most important thing is to have a mean value of the residuals close to 0.0. Because having measurement residuals not centered around 0.0 means that they are indetermined biases or observability issues in the orbit determination process that must be investigated.

For the amplitude (i.e, min and max values), it completely depends on the accuracy of your data and how did you configured the dynamical model of your numerical orbit propagator. It also depends on the application. The requirements are not the same between routine operations and precise orbit determination applications.

Using a numerical model with the minimum set of force models (i.e., geopotential terms, luni-solar attraction, drag if LEO, solar radiation pressure), having an amplitude of about 10 meters is very interesting. It means that your orbit determination ran properly. If you have smaller values, the smaller, the better :slight_smile:

For precise orbit determination applications, which includes more perturbations in the dynamic model (e g., solide tides, ocean tides, albedo, relativity, and even empirical accelerations), the amplitude must be around 10/20 centimeters.

Something also important is to look at the estimated covariance matrix. It will give you an indication of the accuracy estimated parameters.

Best regards,


You are really fantastic. I’ll do my research on what you’re saying.Thanks!

Excuse me, can you tell me where to look at the estimated covariance matrix?

Let estimator be your estimation algorithm. For a BatchLSEstimator you can use estimator.getPhysicalCovariances(1.0e-10). For a KalmanEstimator , you can use estimator.getPhysicalEstimatedCovarianceMatrix().

1 Like

I really thank you so much

1 Like

I found that by culling out data that wasn’t good enough, the residuals would get smaller and smaller. However, using the estimated orbit to do orbital propagator is not getting smaller and smaller with the actual observation data, and it may become larger and larger! What is the reason for this?

Hello, I have extracted the covariance matrix (8*8) as you said.Can you teach me how to judge the accuracy problem through this covariance matrix? You’re in trouble! Thank you!

That’s expected. Because you remove the aberrant values, the estimator only use “the best” measurements to fit the trajectory.

That is also expected. The goal of the least squares algorithm is to estimate the orbit that best fits the entire measurement arc. In contrast, orbit propagation does not optimize the trajectory from the measurement information. So the error increases with time.

Based on a Gaussian assumption, the diagonal elements of the covariance represent the square of the uncertainty of the estimated parameters. If you take the square root of these elements, you can have a representation of the uncertainty. For instance, if you estimate cartesian orbital elements, the square root of the element (0,0) give you a representation of the uncertainty of the X parameters, elements (1,1) of Y, etc.

The estimated covariance is directly related to the accuracy of your measurements (i.e, the sigma parameter you provide when initializing measurements in Orekit). If you have very accurate measurements, your covariance must be small. At the opposite, if you have inaccurate measurements, you will have a lot of uncertainties on the estimated parameters and then big covariance elements.

For mission analysis purposes, it is interesting is to see the evolution of this uncertainty. For instance, this allows to know, from an uncertainty threshold set by the mission, when the uncertainty on the orbital data becomes too big and therefore when it will be necessary to acquire new measurements with a station to improve the knowledge of the orbit.
You can find interesting topics about covariance propagation on the Orekit forum:

  • topic 1
  • topic 2 (on this one I recommend you to have a look on the document shared by Romain on the last message)
  • topic 3



Thank you from the bottom of my heart for your kind help.I’ll take a good look at the information you provided.

1 Like

Hello. The covariance I obtained through the method(estimator.getPhysicalCovariances(1.0e-10)), does it represent the uncertainty of the initial orbital element, or the uncertainty of the last estimated orbital element? Thank you!

Hi @hurricane313622,

It contains the “uncertainty of the last estimated orbital element”.

1 Like

Okay, I get it. Thank you!

Hi @bcazabonne,

Thanks for your explanation of the covariance matrix.

I tried to output the covariance matrix of the tutorial LaserRangingOrbitDetermination, as the followings.

According to the doc, estimator.getPhysicalCovariances(1.0e-10) will return the covariances matrix in space flight dynamics physical units. That is meter and meter/s for position and velocity.

Does it means that:
(1) the uncertainty of X is sqrt(86.5) = 9.3m;
(2) the uncertainty of Y is sqrt(70.7) = 8.4m;
(3) the uncertainty of Z is sqrt(181.2) = 13.5m;
(4) the uncertainty of rang bias of 7090 is sqrt(19.7) = 4.4m;
(5) the uncertainty of rang bias of 7941 is sqrt(90.3) = 9.5m;

I feel it is quite large.


Hi @lirw1984

What is the standard deviation of your measurements?


Hi @bcazabonne,

The measurements are in the tutorial, ‘slr-od/lageos2_20160214.npt’.

The std is supposed to be less than 3cm, I think, especially for the station 7090.

The standard deviation is in the slr-orbit-determination.yaml file. It is the input file of the orbit determination.
I see the standard deviation for range measurements is 20 meters.

  measurementFiles: ["lageos2_20160214.npt"]
    stationPositions: "SLRF2014_POS+VEL_2030.0_200428.snx"
    stationEccentricities: "ecc_une.snx"
    sigma: 20.0
    weight: 1.0

Therefore, the uncertainty you obtain are consistent.
However, I agree that 20 meters is big for laser ranging measurements (probably a fast copy and past of existing orbit determination inputs). Could you try to update the sigma value with 0.03?


Hi @bcazabonne,

I tried to set sigma with 0.03, the POD is failed due to ‘matrix is singular’.

If the sigma is set with 0.1, the POD is successful. And YES, the values of covariance matrix are markedly smaller.


But the difference of the determined pos and vel are not remarkable. The estimated range bias are quite different.

Estimated orbital parameters changes (sigma=0.1): 
   1 Px               +3.697105094790  (final value:   7526993.697105095000)
   2 Py               -0.058985097334  (final value:  -9646310.058985097000)
   3 Pz               +0.343389705522  (final value:   1464110.343389705500)
   4 Vx               +0.794574955370  (final value:   3033.794574955370)
   5 Vy               +0.265181889373  (final value:   1715.265181889373)
   6 Vz               -0.658685607933  (final value:  -4447.658685607933)
Estimated propagation parameters changes: 
   1 Z-bias[0]        +0.000000001573  (final value:   0.000000001573)
Estimated measurements parameters changes: 
   1 7090/range bias  -0.098312886169  (final value:  -0.098312886169)
   2 7119/range bias  +0.092512133787  (final value:   0.092512133787)
   3 7825/range bias  +1.048151978633  (final value:   1.048151978633)
   4 7941/range bias  -0.175284194098  (final value:  -0.175284194098)
Estimated orbital parameters changes (sigma=20): 
   1 Px               +3.581894537434  (final value:   7526993.581894537000)
   2 Py               -0.100269053131  (final value:  -9646310.100269053000)
   3 Pz               +0.492808922427  (final value:   1464110.492808922400)
   4 Vx               +0.794561009069  (final value:   3033.794561009069)
   5 Vy               +0.265069110667  (final value:   1715.265069110667)
   6 Vz               -0.658745910279  (final value:  -4447.658745910279)
Estimated propagation parameters changes: 
   1 Z-bias[0]        +0.000000002209  (final value:   0.000000002209)
Estimated measurements parameters changes: 
   1 7090/range bias  -0.094140779710  (final value:  -0.094140779710)
   2 7119/range bias  +0.071996038720  (final value:   0.071996038720)
   3 7825/range bias  +0.787309196090  (final value:   0.787309196090)
   4 7941/range bias  -0.086135185197  (final value:  -0.086135185197)

And now how can I know the std of measurements? The std only could be determined from measurements?


That’s a strange behaviour. Could you try to increase the threshold used for estimator.getPhysicalCovariances(threshold)?

I’m not surprised of that observation. If I remember well, in this tutorial range station biases are estimated to absorb uncertainties in the measurement model. In fact, International Laser Ranging Service (ILRS) provides the known station biases and specifies when station biases must be estimated. In this tutorial, because the measurement model is not perfect, we estimate the biases to absorb the unmodelled effects.

It depends on the station. For that you can refer to ILRS website. Maybe CRD files provide the standard deviation. However, I’m not sure about this information.

Best regards,

Hi @bcazabonne,

Thank you very much.
I will try to find out the std of station and use more accurate model.

It is failed in the pod process if the sigma is 0.03, that is all mesurements are rejected in the third iteration. So as the covariance matrix is singular.

iteration evaluations      ΔP(m)        ΔV(m/s)           RMS          nb Range    nb Range-rate  nb Angular     nb PV                        Px                      Py                      Pz                      Vx                      Vy                      Vz               Z-bias[0]         7090/range bias         7119/range bias         7825/range bias         7941/range bias
     0          1                                 1564434.511517319600      95/95           0/0          0/0          0/0          7526990.000000000      -9646310.000000000       1464110.000000000          3033.000000000          1715.000000000         -4447.000000000             0.000000000             0.000000000             0.000000000             0.000000000             0.000000000
     1          2         404.102161  0.097469199 1314557.204332471000      95/95           0/0          0/0          0/0          7527080.921300317      -9646379.192080291       1464497.613634650          3033.048652956          1715.078145623         -4447.032037419             0.000002187           -27.616314113            60.185102131         -1000.000000000           366.878600767
     2          3         807.831752  0.195601489 841403.525025109100      95/95           0/0          0/0          0/0          7527263.689240832      -9646518.150928510       1465272.131844492          3033.146577317          1715.234745683         -4447.096436046             0.000006873           -64.927692379           123.827922386         -1000.000000000          1000.000000000
     3          4         577.655781  0.401314987   0.000000000000       0/95           0/0          0/0          0/0          7527700.900655132      -9646812.073082061       1465035.188500583          3033.444472635          1715.446858903         -4447.261723917             0.000005535           225.783815064          -976.903416354          1000.000000000           900.092997887
Comparison with reference orbit: 
ΔP(m) = 1267.8266564691787
ΔV(m/s) = 0.5595268765658629
matrix is singular