[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Orekit Users] My EventDetector class can't correct detecting event?
I see, Thank You!
2011/6/4, MAISONOBE Luc <luc.maisonobe@c-s.fr>:
> beowulf zhang <beowulf.zhang@gmail.com> a écrit :
>
>> I finded that the integrator called the class CombinedEventsManager
>> and EventState of the common-math, not those in the orekit5. why?
>
> The NumericalPropagator in Orekit delegates everything to Apache
> Commons Math, including events and step handling. It only add wrappers
> to convert between the low level double arrays Apache Commons Math
> uses and the higher level SpacecraftState and AbsoluteDate Orekit uses.
>
> The EventState class from Orekit is used by the non-numerical (i.e.
> analytical) propagtors, since they do not rely on any service provided
> by Apache Commons Math. The CombinedEventsDetectorsManager class is
> obsolete and is not used anymore, we should remove it.
>
> Luc
>
>>
>> 2011/5/31, beowulf zhang <beowulf.zhang@gmail.com>:
>>> I find recursive in debug, stack is:
>>>
>>> ClassicalRungeKuttaIntegrator(RungeKuttaIntegrator).integrate(FirstOrderDifferentialEquations,
>>> double, double[], double, double[]) line: 172
>>> NumericalPropagator.propagate(AbsoluteDate) line: 419
>>> NumericalPropagator.getPVCoordinates(AbsoluteDate, Frame) line: 462
>>> LocalOrbitalFrame.updateFrame(AbsoluteDate) line: 81
>>> EME2000Frame(Frame).getTransformTo(Frame, AbsoluteDate) line: 201
>>> EquinoctialOrbit(Orbit).getPVCoordinates(Frame) line: 240
>>> SpacecraftState.getPVCoordinates(Frame) line: 361
>>> CWAxisYDetector.g(SpacecraftState) line: 37
>>> AdaptedEventDetector.g(double, double[]) line: 74
>>> EventState.reinitializeBegin(double, double[]) line: 152
>>> CombinedEventsManager.evaluateStep(StepInterpolator) line: 142
>>> ClassicalRungeKuttaIntegrator(RungeKuttaIntegrator).integrate(FirstOrderDifferentialEquations,
>>> double, double[], double, double[]) line: 172
>>> NumericalPropagator.propagate(AbsoluteDate) line: 419
>>> SlaveMode.main(String[]) line: 138
>>>
>>> Maybe this is a debug!
>>>
>>> 2011/5/31, beowulf zhang <beowulf.zhang@gmail.com>:
>>>> 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.
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>>
>
>
>
> ----------------------------------------------------------------
> This message was sent using IMP, the Internet Messaging Program.
>
>
>