Continuous low thrust for changing inclination

Hello everyone,

I have been working on integrating Orekit and MATLAB to use continuous low thrust for changing orbit inclination or right ascension of the ascending node. I implemented this in two versions(Orekit11.1 and Orekit12.0). Taking orbit inclination as an example, it is well-known that to change the inclination, i need to make the normal thrust change direction at latitude argument of +π/2 and -π/2.

1.Orekit11.1
I used EventBasedManeuverTriggers and PositionAngleDetector in my implementation. To make the effect more pronounced, I assumed a thrust of 100N. However, I am confused by the values returned by PositionAngleDetector, particularly why the period of PositionAngleDetector.g(SpacecraftState s) has doubled to twice the orbital period and exhibits some changes that are difficult for me to understand (I suspect this might be due to the superposition of multiple functions).


In the graph, the green line represents the result of startDetector.g(SpacecraftState), the red dashed line is the result of stopDetector.g(SpacecraftState), and the orange line shows the change in orbital inclination (corresponding to the right y-axis). It can be seen that both startDetector and stopDetector only trigger on the rising edge.

Furthermore, the detectors I set up (PositionAngleDetector, NodeDetector, LatitudeCrossingDetector) only seem to work on the rising edge. Even when I added a handler to try to make them respond on the falling edge, it didn’t work. This is my program code, and it’s possible that my choice of detector or the logic of my program is incorrect. This issue has been troubling me for quite some time.

%% addForceModel(low_thrust)
thrust = 100;
isp = 100000000;
direction = Vector3D(0,1,0);
thruster_axis = Vector3D(0,1,0);
thrust_direction_provider = ConstantThrustDirectionProvider(direction);
direction_and_attitude_provider = ThrustDirectionAndAttitudeProvider.buildFromDirectionInLOF(LOFType.VNC, thrust_direction_provider, thruster_axis);
startDetector = PositionAngleDetector(OrbitType.KEPLERIAN, PositionAngle.TRUE, 90pi/180).withHandler(ContinueOnEvent());
startDetector.init(CurrentState, CurrentDate);
stopDetector = PositionAngleDetector(OrbitType.KEPLERIAN, PositionAngle.TRUE, -90
pi/180).withHandler(StopOnEvent());
stopDetector.init(CurrentState, CurrentDate);
trigger1 = EventBasedManeuverTriggers(startDetector, stopDetector);
configurable_low_thrust_maneuver = ConfigurableLowThrustManeuver(direction_and_attitude_provider, trigger1, thrust, isp);
propagator.addForceModel(configurable_low_thrust_maneuver)

2.Orekit12.0
In Orekit 12.0, the EventBasedManeuverTriggers class has been removed, and I’m trying to use StartStopEventsTrigger instead to control the activation of maneuver detectors. However, this approach throws an error indicating that a prototype StartDetector is required. I’m unsure about what this “prototype” refers to—does it mean I need to define a custom StartDetector in Java?
I am currently using Orekit for some research and would appreciate any assistance. Thank you!

Hi @long welcome

Yes, this is explained in the class javadoc of EventBasedManeuverTriggers:

The thruster starts firing when the start detector becomes positive. The thruster stops
firing when the stop detector becomes positive. The 2 detectors should not be positive
at the same time

The StartStopEventsTrigger is an abstract class that cannot be used directly, you have to extend it. I know this is a daunting task mainly due to the field parts :fearful:
You can look at an example here: StartStopEventTriggerTest. StartStopDates. I don’t known how to do it from Matlab.

1 Like

Hi, luc
Thank you very much for your reply.
But I’m still wondering now how to realize the change of inclination by continuous low thrust with MATLAB. How do I modify my program or what code can I refer to?
Thank you very much!!! :smiley: