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)