Discrepancy between estimated and propagated Positions

Hi everyone,

I have an issue with the difference between estimated measurements and the estimated propagator for BatchLS Orbit Determination. This is my first time working with Orekit and I am unsure, whether my code does what I want it to.

I am using Orekit version 13.1 with the Python wrapper.
My code is based on the laser ranging orbit determination example
, but I have exchanged the range data for AngularAzEl data.
After successful orbit determination, the total angular difference between the observed and estimated measurements is in the image on the left.
When using either the estimated propagator, or the ephemeris generator to calculate the total angular difference between my tracking data and the estimated positions for the same timestamps, the residual is much higher (right).

I get the difference between estimated and observed measurements with:

lastEstimations = estimator.getLastEstimations()
valueSet = lastEstimations.values()
estimatedMeasurements = valueSet.toArray()
keySet = lastEstimations.keySet()
realMeasurements = keySet.toArray() 

for estMeas in estimatedMeasurements:
    estMeas = EstimatedMeasurement.cast_(estMeas)
    observedValue = estMeas.getObservedValue()
    estimatedValue = estMeas.getEstimatedValue()

    pyDateTime = absolutedate_to_datetime(estMeas.date)
    observedAzSeries[pyDateTime] = observedValue[0]
    estimatedAzSeries[pyDateTime] = estimatedValue[0]

    observedElSeries[pyDateTime] = observedValue[1]
    estimatedElSeries[pyDateTime] = estimatedValue[1] 

totalError = np.sqrt(pow((estimatedElSeries - observedElSeries),2)+pow((estimatedAzSeries - observedAzSeries)*np.cos(observedElSeries),2))

And the error using the estimated propagator with:

for row in groundObsData.itertuples(index=False, name=None): 

     … [get observed data (MJD epoch)] 

     secondsOfTime, fullTime = math.modf(receiveTime)
     secondsOfTime = secondsOfTime * 24 * 3600
     ad = AbsoluteDate.createMJDDate(int(fullTime), secondsOfTime, utc )

     scStatePropd = estimatedPropagator.propagate(ad)
     currentPosition = scStatePropd.getPosition()
     curFrame = scStatePropd.getFrame()
     currentElevation = stationFrame.getElevation(currentPosition,curFrame,ad)
     currentAzimuth = stationFrame.getAzimuth(currentPosition, curFrame, a d)

     ad_dt = absolutedate_to_datetime( ad)

     propErrorTotal[ad_dt] = math.sqrt(pow((currentElevation -     observedElevation),2)+pow((currentAzimuth - observedAzimuth)*math.cos(observedElevation),2))

What could the reason for this difference be? Why are the estimated measurement values and the propagator values so far apart?

Thank you for any input!
Konstantin

Hi @konstantin,

Welcome to the forum!

I haven’t tried to reproduce your issue but using:

currentElevation = stationFrame.getElevation(currentPosition,curFrame,ad)
currentAzimuth = stationFrame.getAzimuth(currentPosition, curFrame, a d)

Will provide only a geometric azimuth/elevation, while using the estimated value from EstimatedMeasurement provides an estimation of AZEL that takes into account satellite motion (light time delay) and station displacement.
That is probably the source of the error you’re observing.

Cheers,
Maxime

Hi @MaximeJ ,

thank you for your answer. I will look into incorporating that and see if the residuals improve.

Cheers,
Konstantin