[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orekit Users] My EventDetector class can't correct detecting event?



locOrbFrm object is referenced to another object.

My main function code is:

            // configure Orekit
            Autoconfiguration.configureOrekit();

            // Initial orbit parameters
            double a = 7396159; // semi major axis in meters
            double e = 0.001; // eccentricity
            double i = Math.toRadians(7); // inclination
            double omega = Math.toRadians(180); // perigee argument
            double raan = Math.toRadians(261); // right ascension of
ascending node
            double lM = 0; // mean anomaly

            // Inertial frame
            Frame inertialFrame = FramesFactory.getEME2000();

            // Initial date in UTC time scale
            TimeScale utc = TimeScalesFactory.getUTC();
            AbsoluteDate initialDate = new AbsoluteDate(2004, 01, 01,
23, 30, 00.000, utc);

            // gravitation coefficient
            double mu =  3.986004415e+14;

            //////////////////////////////////////////////////////////////////////////////////
            // Orbit construction as Keplerian
            Orbit initialOrbit = new KeplerianOrbit(a, e, i, omega, raan, lM,
                                                    KeplerianOrbit.MEAN_ANOMALY,
                                                    inertialFrame,
initialDate, mu);

            // Simple extrapolation with Keplerian motion
            //KeplerianPropagator kepler = new
KeplerianPropagator(initialOrbit);
            double stepSize = 9;  // the step is ten seconds
            FirstOrderIntegrator integrator = new
ClassicalRungeKuttaIntegrator(stepSize);
            NumericalPropagator prop = new NumericalPropagator(integrator);
            SpacecraftState initialState = new SpacecraftState(initialOrbit);
            prop.setInitialState(initialState);

            // Set the propagator to slave mode (could be omitted as
it is the default mode)
            prop.setSlaveMode();

            // 生成目标当地轨道系
            LocalOrbitalFrame lof = new
LocalOrbitalFrame(inertialFrame, LOFType.QSW, prop, "LOF");

            //////////////////////////////////////////////////////////////////////////////////
            // 根据相对状态构造追踪星
            PVCoordinates relSt = new PVCoordinates(new Vector3D(0.0,0.0,0.0),
            										new Vector3D(0.0,1.0,0.0));
            PVCoordinates initPV = lof.getTransformTo(inertialFrame,
            										  initialDate).transformPVCoordinates(relSt);

            // Simple extrapolation with Keplerian motion
            //KeplerianPropagator kepler = new
KeplerianPropagator(initialOrbit);
            FirstOrderIntegrator integratorS = new
ClassicalRungeKuttaIntegrator(stepSize);
            NumericalPropagator propS = new NumericalPropagator(integratorS);
            SpacecraftState initialStateS = new SpacecraftState(new
CartesianOrbit(initPV,
            		inertialFrame, initialDate, mu));
            propS.setInitialState(initialStateS);

            // Set the propagator to slave mode (could be omitted as
it is the default mode)
            propS.setSlaveMode();
            propS.addEventDetector(new CWAxisYDetector(initialOrbit,
lof, initialDate));

            //////////////////////////////////////////////////////////////////////////////////
            // Overall duration in seconds for extrapolation
            double duration = initialOrbit.getKeplerianPeriod() * 2.0;

            PrintWriter relFile = null;
            try {
				relFile = new PrintWriter("relst.txt");
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			}

            // Stop date
            final AbsoluteDate finalDate =  new
AbsoluteDate(initialDate, duration, utc);

            // Extrapolation loop
            boolean first = true;
            AbsoluteDate extrapDate = initialDate;
            while (extrapDate.compareTo(finalDate) <= 0)  {

                SpacecraftState targ = prop.propagate(extrapDate);
                SpacecraftState inter = propS.propagate(extrapDate);
                PVCoordinates relst = inter.getPVCoordinates(lof);
                double tm = extrapDate.durationFrom(initialDate);
                relFile.printf("%f %f %f %f\n",
                		tm, relst.getPosition().getX(),
relst.getPosition().getY(), relst.getPosition().getZ());

                extrapDate = new AbsoluteDate(extrapDate, stepSize, utc);
            }

            relFile.close();
            System.out.println("The End");


2011/5/31, MAISONOBE Luc <luc.maisonobe@c-s.fr>:
> beowulf zhang <beowulf.zhang@gmail.com> a écrit :
>
>> I write a class CWAxisYDetector derived from AbstractDetector, the code
>> is:
>>
>> public class CWAxisYDetector extends AbstractDetector {
>>
>> 	private LocalOrbitalFrame locOrbFrm;
>>
>> 	private AbsoluteDate initDate;
>>
>> 	protected CWAxisYDetector(Orbit targOrb, LocalOrbitalFrame lof,
>> AbsoluteDate iDate) {
>> 		super(targOrb.getKeplerianPeriod() / 3, 1.0e-13 *
>> targOrb.getKeplerianPeriod());
>> 		this.locOrbFrm = lof;
>> 		this.initDate = iDate;
>> 	}
>>
>> 	public int eventOccurred(SpacecraftState s, boolean increasing)
>> 			throws OrekitException {
>> 		System.out.println(s.getDate().durationFrom(initDate));
>> 		return CONTINUE;
>> 	}
>>
>> 	public double g(SpacecraftState s) throws OrekitException {
>> 		return s.getPVCoordinates(locOrbFrm).getPosition().getX();
>> 	}
>
> If the local orbital frame here is linked to the same spacecraft whose
> orbit is propagated, then
> s.getPVCoordinates(locOrbFrm).getPosition().getX() should always be 0
> (as well as Y and Z since the spacecraft defines the origin of this
> frame).
> So the function is essentially an observation of numerical errors in
> interpolation polynomials, it is not a function that clearly crosses
> the zero axis at one precise time.
>
> Are you sure about the frame ? Shouldn't it be related to another
> spacecraft (for relative motion observation for example) ?
>
> Luc
>
>>
>> }
>>
>> but this class can't correct detecting event, and in some integrate
>> step getinig error information:
>>
>> Exception in thread "main"
>> org.apache.commons.math.MathRuntimeException$4: function values at
>> endpoints do not have different signs.  Endpoints: [0.539, 0.539],
>> Values: [0, 0]
>> 	at
>> org.apache.commons.math.MathRuntimeException.createIllegalArgumentException(MathRuntimeException.java:305)
>> 	at
>> org.apache.commons.math.analysis.solvers.BrentSolver.solve(BrentSolver.java:219)
>> 	at
>> org.apache.commons.math.ode.events.EventState.evaluateStep(EventState.java:229)
>> 	at
>> org.apache.commons.math.ode.events.CombinedEventsManager.evaluateStep(CombinedEventsManager.java:152)
>> 	at
>> org.apache.commons.math.ode.nonstiff.RungeKuttaIntegrator.integrate(RungeKuttaIntegrator.java:172)
>> 	at
>> org.orekit.propagation.numerical.NumericalPropagator.propagate(NumericalPropagator.java:419)
>> 	at fr.cs.examples.propagation.SlaveMode.main(SlaveMode.java:136)
>>
>> why?
>>
>>
>
>
>
> ----------------------------------------------------------------
> This message was sent using IMP, the Internet Messaging Program.
>
>
>