From e934ae0ccfb2f871e1bf71e7d13f2941a0ed3665 Mon Sep 17 00:00:00 2001 From: Romaric Her Date: Wed, 15 May 2019 16:45:00 +0200 Subject: [PATCH 1/2] Fix an attitude transition bug in case of restart during transition --- src/changes/changes.xml | 4 ++++ .../orekit/attitudes/AttitudesSequence.java | 4 ++-- .../attitudes/AttitudesSequenceTest.java | 21 ++++++++++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 004e9ed9d..7f0c89dc8 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -21,6 +21,10 @@ + + Fix the bug of attitude transition if a reset occurs during the transition + by adding margins to the reset of TimeSpanMap to keep the one corresponding to the "after" attitude law. + Added ambiguity resolution for phase measurements. This feature is not complete yet and is considered experimental. diff --git a/src/main/java/org/orekit/attitudes/AttitudesSequence.java b/src/main/java/org/orekit/attitudes/AttitudesSequence.java index 850e59806..9b565954d 100644 --- a/src/main/java/org/orekit/attitudes/AttitudesSequence.java +++ b/src/main/java/org/orekit/attitudes/AttitudesSequence.java @@ -387,9 +387,9 @@ public class AttitudesSequence implements AttitudeProvider { if (activated.getTransitions().size() > 1) { // remove transitions that will be overridden during upcoming propagation if (forward) { - activated = activated.extractRange(AbsoluteDate.PAST_INFINITY, s0.getDate()); + activated = activated.extractRange(AbsoluteDate.PAST_INFINITY, s0.getDate().shiftedBy(transitionTime)); } else { - activated = activated.extractRange(s0.getDate(), AbsoluteDate.FUTURE_INFINITY); + activated = activated.extractRange(s0.getDate().shiftedBy(-transitionTime), AbsoluteDate.FUTURE_INFINITY); } } diff --git a/src/test/java/org/orekit/attitudes/AttitudesSequenceTest.java b/src/test/java/org/orekit/attitudes/AttitudesSequenceTest.java index b3a722812..03787758f 100644 --- a/src/test/java/org/orekit/attitudes/AttitudesSequenceTest.java +++ b/src/test/java/org/orekit/attitudes/AttitudesSequenceTest.java @@ -495,7 +495,25 @@ public class AttitudesSequenceTest { Assert.assertEquals(0.5 * reorientationAngle, Rotation.distance(state.getAttitude().getRotation(), nadirR), 0.03 * reorientationAngle); - + + // check that if we restart a forward propagation from an intermediate state + // we properly get the "after" attitude law despite we missed the event trigger + final AbsoluteDate afterTransition = midTransition.shiftedBy(transitionTime); + state = propagator.propagate(midTransition, afterTransition); + targetR = targetPointing.getAttitude(state.getOrbit(), state.getDate(), state.getFrame()).getRotation(); + + Assert.assertEquals(targetR.getQ0(), + state.getAttitude().getRotation().getQ0(), + 0.001); + Assert.assertEquals(targetR.getQ1(), + state.getAttitude().getRotation().getQ1(), + 0.001); + Assert.assertEquals(targetR.getQ2(), + state.getAttitude().getRotation().getQ2(), + 0.001); + Assert.assertEquals(targetR.getQ3(), + state.getAttitude().getRotation().getQ3(), + 0.001); } @Test @@ -551,6 +569,7 @@ public class AttitudesSequenceTest { Assert.assertEquals(0.5 * reorientationAngle, Rotation.distance(state.getAttitude().getRotation(), targetR), 0.03 * reorientationAngle); + } -- GitLab From 915b5f5c86b413c1a2f8a3e283baafcb925ae748 Mon Sep 17 00:00:00 2001 From: Romaric Her Date: Wed, 15 May 2019 18:34:08 +0200 Subject: [PATCH 2/2] comments, reference to issue#552 and better accuracy in the test --- .../orekit/attitudes/AttitudesSequenceTest.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/orekit/attitudes/AttitudesSequenceTest.java b/src/test/java/org/orekit/attitudes/AttitudesSequenceTest.java index 03787758f..a0154202c 100644 --- a/src/test/java/org/orekit/attitudes/AttitudesSequenceTest.java +++ b/src/test/java/org/orekit/attitudes/AttitudesSequenceTest.java @@ -442,6 +442,9 @@ public class AttitudesSequenceTest { } + /** + * this test have been completed to test the issue 552 fix + */ @Test public void testResetDuringTransitionForward() { // Initial state definition : date, orbit @@ -487,6 +490,7 @@ public class AttitudesSequenceTest { // check that if we restart a forward propagation from an intermediate state // we properly get an interpolated attitude despite we missed the event trigger + final AbsoluteDate midTransition = nadirToTarget.get(0).shiftedBy(0.5 * transitionTime); SpacecraftState state = propagator.propagate(midTransition.shiftedBy(-60), midTransition); Rotation nadirR = nadirPointing.getAttitude(state.getOrbit(), state.getDate(), state.getFrame()).getRotation(); @@ -498,22 +502,24 @@ public class AttitudesSequenceTest { // check that if we restart a forward propagation from an intermediate state // we properly get the "after" attitude law despite we missed the event trigger + // This check have been added to the test after the issue #552 fix + final AbsoluteDate afterTransition = midTransition.shiftedBy(transitionTime); state = propagator.propagate(midTransition, afterTransition); targetR = targetPointing.getAttitude(state.getOrbit(), state.getDate(), state.getFrame()).getRotation(); Assert.assertEquals(targetR.getQ0(), state.getAttitude().getRotation().getQ0(), - 0.001); + 1.0e-16); Assert.assertEquals(targetR.getQ1(), state.getAttitude().getRotation().getQ1(), - 0.001); + 1.0e-16); Assert.assertEquals(targetR.getQ2(), state.getAttitude().getRotation().getQ2(), - 0.001); + 1.0e-16); Assert.assertEquals(targetR.getQ3(), state.getAttitude().getRotation().getQ3(), - 0.001); + 1.0e-16); } @Test -- GitLab