- The drag coefficient “2.1” I used is told by the satellite provider. It’s a fixed value，so I do not believe it come from an orbit determination.
- The solar activity coefficients were fixed value. I made static fixed input params for nls
both daily and average of F10.7 solar flux is set to 140,which I think is similar as STK force model configuration “manual input”
Although the atm model setting is not perfect, I think the result is out of my expect.
- I have no accurate model about the satellite, so I used IsotropicDrag model and set the SF to 9.6 m2 which was told by satellite provider. In Stk Scene, I used sphere model too.
The both result made by my code and stk use the similar drag model are not good compare to telemetry gps data(66 hours away from the elements epoch,the difference is 80km, which cannot be used in my app), when I removed the drag model.Both of the result are very good(the difference is about 1km ). This confused me very much.
The following is the code I used to define the propagator.
final double minStep_num = 0.001;
final double maxstep_num = 20.0;
final double positionTolerance = 1.0;
final OrbitType propagationType = OrbitType.KEPLERIAN;
final double tolerances = NumericalPropagator.tolerances(positionTolerance, orbit_loaded,
AdaptiveStepsizeIntegrator integrator_adpative = new DormandPrince853Integrator(minStep_num, maxstep_num,
NumericalPropagator propagator_num = new NumericalPropagator(integrator_adpative);
// Force Model (reduced to perturbing gravity field)
// 3rd body (SUN)
// 3rd body (MOON)
// ## Drag coefficient
double DRAG_CD = drag_cd
// Drag area (m^2)
double DRAG_SF = drag_sf
final double ae = normalized.getAe();
final OneAxisEllipsoid earth_atm = new OneAxisEllipsoid(ae, Constants.WGS84_EARTH_FLATTENING, earthFrame);
//here,I make a static fixed input params for nls
//both daily and average of F10.7 solar flux is set to 140,which I think is similar as STK forcemodel "manual input"
StaticInputParams_NLS staticInputParams_NLS = new StaticInputParams_NLS();
final Atmosphere atm =new NRLMSISE00(staticInputParams_NLS, CelestialBodyFactory.getSun(),
DragSensitive dragShap = new IsotropicDrag(DRAG_SF, DRAG_CD );
propagator_num.addForceModel(new DragForce(atm, dragShap));
// Solar Radiation Pressure
propagator_num.addForceModel(new SolarRadiationPressure(CelestialBodyFactory.getSun(), ae,
new IsotropicRadiationSingleCoefficient(SOLAR_RADIATION_PRESSURE_SF, SOLAR_RADIATION_PRESSURE_CR)));
// ocean tide
UT1Scale ut1 = TimeScalesFactory.getUT1(IERSConventions.IERS_2010, true);
OceanTides oceanTides = new OceanTides(earthFrame, normalized.getAe(), normalized.getMu(), true,
SolidTides.DEFAULT_STEP, SolidTides.DEFAULT_POINTS, 50, 50, IERSConventions.IERS_2010, ut1);//
// solid tide
SolidTides solidTides = new SolidTides(earthFrame, normalized.getAe(), normalized.getMu(),
normalized.getTideSystem(), IERSConventions.IERS_2010, ut1, CelestialBodyFactory.getSun(),
final Relativity forceModel = new Relativity(Constants.EIGEN5C_EARTH_MU);
ForceModel holmesFeatherstone = new HolmesFeatherstoneAttractionModel(earthFrame, normalized);
// Add force model to the propagator
propagator_num.setInitialState(new SpacecraftState(orbit_loaded, mass));