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

Re: [Orekit Developers] Resetting Additional States in Event Handler




Frank Mason <frankmason1992@gmail.com> a écrit :

Hi,

Hi Frank,


I am trying to use an Event Handler to reset an additional state (called
"A"), changing its value from -1 to +1 when the event is detected. The new
state built inside the handler contains the proper value (+1), however,
when the propagator goes on, it seems to ignore it and keeps its original
value of "-1". Console output looks like this:

*2000-01-01T00:00:00.000 A -1.0*
*2000-01-01T00:00:01.000 A -1.0*
*Additional state A set to +1*
*2000-01-01T00:00:02.000 A -1.0*

The value -1 at 00:00:02.000 is normal. The state is really changed
at 00:00:03.000. the fact the print statement from event handler
and the print statement from step handler are out of order is a
know limitation of Orekit which we cannot fix.

*2000-01-01T00:00:03.000 A -1.0*
*2000-01-01T00:00:04.000 A -1.0*

The value -1 at 00:00:03.000 *could* be considered normal, as at that
time the value changes, so both -1 or +1 could be acceptable.

The value -1 at 00:00:04.000 is a bug! It is due to the fact this
additional state as no corresponding provider. I.E. it was set up
un the initial state, but theaddAdditionalStateProvider method from
the Propagator interface was never called. Therefore, the propagator
considers the additional state is fixed and that when creating
complete states throughout the propagation it simply copies the
value from initial state. This is done in the protected method
updateAdditionalStates in the AbstractPropagator class.

Could you file a bug on the forge so we do not forget to fix this?

You may try as a workaround to set up an AdditionalStateProvider and
in the eventOccurred event of your event handler, you could remember
the date of the last switch, and return either -1 or +1 depending on
the state date being before or after the switch date. Beware that
the AdditionalStateProvider.getAdditionalState method *could*
potentially be called out of order, so you really should store
the event date and use it.


* // Instantiate additional states*
* Map<String, double[]> additionalStates = new HashMap<String, double[]>();*
* additionalStates.put("A", new double[] { -1 });*

* // Create initial state and add it to the propagator*
* SpacecraftState initialState = new SpacecraftState(orbit,
additionalStates);*

Rather than dealing directly with Map, I would suggest that you use
the fluent API of Spacecraftstate and directly use:

SpacecraftState initialState = new SpacecraftState(orbit).addAdditionalState("A", -1);


* @Override*
* public SpacecraftState resetState(DateDetector detector, SpacecraftState
oldState) {*
* Map<String, double[]> newAdditionalStates = new HashMap<String,
double[]>();*
* newAdditionalStates.put("A", new double[] { +1 });*

* SpacecraftState newSpacecraftState = new
SpacecraftState(oldState.getOrbit(), oldState.getAttitude(),*
* oldState.getMass(), newAdditionalStates);*

* System.out.println("Additional state A set to +1");*
* return newSpacecraftState;*
* }*
* });*


Here, creating the Map by yourself is probably an error. It assumes there are
no other additional states. If for example another part of the code had added
another state (for example partial derivative equations in orbit determination
do add some additional state by themselves), then these would be lost and only
your "A" state would be present. You should really be

public SpacecraftState resetState(DateDetector detector, SpacecraftState oldState) { SpacecraftState newSpacecraftState = oldState.addAdditionalState("A", +1); System.out.println("Additional state A set to +1 at " + oldState.getDate());
      return newSpacecraftState;
  }

best regards,
Luc