Is There an easy way for BatchLSEstimator to have satellite mass as a parameter to be fitted?

HI,

As I am new with Orekit, is there a simple way to have also satellite mass as a parameter to be estimated when using BatchLSEstimator?

I am using Python wrapper

Function I use for creating estimator:

def estimator_builder(estimate_orbit,gravityProvider,q_mass):
     estimator_convergence_thres = thres #1e-3    
     estimator_max_iterations = 500
     estimator_max_evaluations = 500  
     prop_min_step = 0.001 
     prop_max_step = 1000.0 
     prop_position_error = 0.01 

    integratorBuilder = DormandPrince853IntegratorBuilder(prop_min_step, prop_max_step, prop_position_error) 
    propagatorBuilder = NumericalPropagatorBuilder(estimate_orbit, integratorBuilder,  PositionAngle.MEAN, estimator_position_scale) 
    propagatorBuilder.setMass(q_mass)
    propagatorBuilder.addForceModel(HolmesFeatherstoneAttractionModel(earth.getBodyFrame(), gravityProvider))
    propagatorBuilder.addForceModel(ThirdBodyAttraction(sun))
    propagatorBuilder.addForceModel(ThirdBodyAttraction(moon))
    propagatorBuilder.addForceModel(s_paine) #radiation pressure
    propagatorBuilder.addForceModel(DragForce(atmos, satelliitti))

#sateliitti = BoxAndSolarArraySpacecraft, 
     #est_drag,est_ref,est_absorb boolean variables set earlier
     satelliitti.getDragParametersDrivers()[0].setSelected(est_drag) 
     satelliitti.getDragParametersDrivers()[0].setMaxValue(2.0)
     satelliitti.getDragParametersDrivers()[0].setMinValue(0.2)
     satelliitti.getRadiationParametersDrivers()[0].setSelected(est_ref)
     satelliitti.getRadiationParametersDrivers()[1].setSelected(est_absorb)    
 
     matrixDecomposer = QRDecomposer(1e-11)
     optimizer = LevenbergMarquardtOptimizer()

     estimator = BatchLSEstimator(optimizer, propagatorBuilder)
     estimator.setParametersConvergenceThreshold(estimator_convergence_thres)
     estimator.setMaxIterations(estimator_max_iterations)
     estimator.setMaxEvaluationZs(estimator_max_evaluations)
     return(estimator)

And here I create measurements out of my data and do the actual estimation of orbit

def measuremets_add_and_estimate(start,stop,step,estimate):
for j in range(start,stop,step): 
    if (DIR1==True):
        orekitAzEl = AngularAzEl(asema1,(t_list_1[j]),JArray_double([(az_1[j]+mygeneration.nextNormalizedDouble()*d_az), (el_1[j]+mygeneration.nextNormalizedDouble()*d_el)]),JArray_double([(d_az),
             (d_el)]), JArray_double([azBaseWeight,elBaseWeight]), ObservableSatellite(0))
        estimator.addMeasurement(orekitAzEl)
    if (R1==True):
        Range_obs=Range(asema1,True,t_list_1[j],(Range_obs_1[j]+mygeneration.nextNormalizedDouble()*d_r),d_r , rBaseWeight, ObservableSatellite(0))
        estimator.addMeasurement(Range_obs)
        
    if(RVEL1==True):
        RangeRate_obs=RangeRate(asema1,t_list_1[j],(RR_1[j]+mygeneration.nextNormalizedDouble()*d_v),d_v , vBaseWeight, True,ObservableSatellite(0))
        estimator.addMeasurement(RangeRate_obs)
estimatedPropagatorArray = estimator.estimate()
estimatedPropagator = estimatedPropagatorArray[0]
estimatedInitialState = estimatedPropagator.getInitialState()
estimatedOrbit_init = estimatedInitialState.getOrbit()

return (estimatedOrbit_init, estimator)

Hi @Ari_Leppala , welcome

There is no way to estimate mass because it is almost not observable.
The only relationship between mass and trajectory is due to surface forces like atmospheric drag and solar radiation pressure and to propulsion system. Other forces (Keplerian attraction, spherical harmonics, third body attraction, tides, …) are proportional to mass hence mass cancels out when computing acceleration which will be integrated twice to give position.

Atmospheric drag and solar radiation pressure cannot be used to estimate mass because they have vary large uncertainties (atmospheric density, surface to be considered, coefficients related to shape, specular or diffuse reflection, absorption…). In most cases, all these uncertainties end up in catch-all multiplicative coefficients, that will also contain the uncertainty about mass.

Thrust cannot be used to estimate mass because it also has calibration coefficients for thrusters that will also absorb uncertainties about mass.

In other words, we cannot weigh a satellite in orbit.

1 Like

Thanks for your quick response, I was thinking it would be like that.