diff --git a/core/src/main/java/org/orekit/rugged/api/Rugged.java b/core/src/main/java/org/orekit/rugged/api/Rugged.java index cf5043c83c7b9ba527228dce8c2f26fac652a327..d3ca2b350d7c282289475d07e7090cdca6ffe8dd 100644 --- a/core/src/main/java/org/orekit/rugged/api/Rugged.java +++ b/core/src/main/java/org/orekit/rugged/api/Rugged.java @@ -45,6 +45,8 @@ import org.orekit.rugged.raster.TileUpdater; import org.orekit.rugged.utils.ExtendedEllipsoid; import org.orekit.rugged.utils.SpacecraftToObservedBody; import org.orekit.time.AbsoluteDate; +import org.orekit.utils.AngularDerivativesFilter; +import org.orekit.utils.CartesianDerivativesFilter; import org.orekit.utils.Constants; import org.orekit.utils.IERSConventions; import org.orekit.utils.PVCoordinates; @@ -110,9 +112,11 @@ public class Rugged { * @param maxDate end of search time span * @param overshootTolerance tolerance in seconds allowed for {@code minDate} and {@code maxDate} overshooting * @param positionsVelocities satellite position and velocity - * @param pvInterpolationOrder order to use for position/velocity interpolation + * @param pvInterpolationNumber number of points to use for position/velocity interpolation + * @param pvFilter filter for derivatives from the sample to use in position/velocity interpolation * @param quaternions satellite quaternions - * @param aInterpolationOrder order to use for attitude interpolation + * @param aInterpolationNumber number of points to use for attitude interpolation + * @param aFilter filter for derivatives from the sample to use in attitude interpolation * @exception RuggedException if data needed for some frame cannot be loaded or if position * or attitude samples do not fully cover the [{@code minDate}, {@code maxDate}] search time span */ @@ -120,13 +124,16 @@ public class Rugged { final AlgorithmId algorithmID, final EllipsoidId ellipsoidID, final InertialFrameId inertialFrameID, final BodyRotatingFrameId bodyRotatingFrameID, final AbsoluteDate minDate, final AbsoluteDate maxDate, final double overshootTolerance, - final List<TimeStampedPVCoordinates> positionsVelocities, final int pvInterpolationOrder, - final List<TimeStampedAngularCoordinates> quaternions, final int aInterpolationOrder) + final List<TimeStampedPVCoordinates> positionsVelocities, final int pvInterpolationNumber, + final CartesianDerivativesFilter pvFilter, + final List<TimeStampedAngularCoordinates> quaternions, final int aInterpolationNumber, + final AngularDerivativesFilter aFilter) throws RuggedException { this(updater, maxCachedTiles, algorithmID, selectEllipsoid(ellipsoidID, selectBodyRotatingFrame(bodyRotatingFrameID)), selectInertialFrame(inertialFrameID), minDate, maxDate, overshootTolerance, - positionsVelocities, pvInterpolationOrder, quaternions, aInterpolationOrder); + positionsVelocities, pvInterpolationNumber, pvFilter, + quaternions, aInterpolationNumber, aFilter); } /** Build a configured instance. @@ -147,17 +154,21 @@ public class Rugged { * @param maxDate end of search time span * @param overshootTolerance tolerance in seconds allowed for {@code minDate} and {@code maxDate} overshooting * @param positionsVelocities satellite position and velocity - * @param pvInterpolationOrder order to use for position/velocity interpolation + * @param pvInterpolationNumber number of points to use for position/velocity interpolation + * @param pvFilter filter for derivatives from the sample to use in position/velocity interpolation * @param quaternions satellite quaternions - * @param aInterpolationOrder order to use for attitude interpolation + * @param aInterpolationNumber number of points to use for attitude interpolation + * @param aFilter filter for derivatives from the sample to use in attitude interpolation * @exception RuggedException if data needed for some frame cannot be loaded or if position * or attitude samples do not fully cover the [{@code minDate}, {@code maxDate}] search time span */ public Rugged(final TileUpdater updater, final int maxCachedTiles, final AlgorithmId algorithmID, final OneAxisEllipsoid ellipsoid, final Frame inertialFrame, final AbsoluteDate minDate, final AbsoluteDate maxDate, final double overshootTolerance, - final List<TimeStampedPVCoordinates> positionsVelocities, final int pvInterpolationOrder, - final List<TimeStampedAngularCoordinates> quaternions, final int aInterpolationOrder) + final List<TimeStampedPVCoordinates> positionsVelocities, final int pvInterpolationNumber, + final CartesianDerivativesFilter pvFilter, + final List<TimeStampedAngularCoordinates> quaternions, final int aInterpolationNumber, + final AngularDerivativesFilter aFilter) throws RuggedException { // space reference @@ -166,8 +177,8 @@ public class Rugged { // orbit/attitude to body converter this.scToBody = new SpacecraftToObservedBody(inertialFrame, ellipsoid.getBodyFrame(), minDate, maxDate, overshootTolerance, - positionsVelocities, pvInterpolationOrder, - quaternions, aInterpolationOrder, + positionsVelocities, pvInterpolationNumber, pvFilter, + quaternions, aInterpolationNumber, aFilter, FRAMES_TRANSFORMS_INTERPOLATION_STEP); // intersection algorithm @@ -200,7 +211,9 @@ public class Rugged { * @param maxDate end of search time span * @param overshootTolerance tolerance in seconds allowed for {@code minDate} and {@code maxDate} overshooting * @param interpolationStep step to use for inertial/Earth/spacraft transforms interpolations - * @param interpolationOrder order to use for inertial/Earth/spacraft transforms interpolations + * @param interpolationNumber number of points to use for inertial/Earth/spacraft transforms interpolations + * @param pvFilter filter for derivatives from the sample to use in position/velocity interpolation + * @param aFilter filter for derivatives from the sample to use in attitude interpolation * @param propagator global propagator * @exception RuggedException if data needed for some frame cannot be loaded */ @@ -208,12 +221,14 @@ public class Rugged { final AlgorithmId algorithmID, final EllipsoidId ellipsoidID, final InertialFrameId inertialFrameID, final BodyRotatingFrameId bodyRotatingFrameID, final AbsoluteDate minDate, final AbsoluteDate maxDate, final double overshootTolerance, - final double interpolationStep, final int interpolationOrder, final Propagator propagator) + final double interpolationStep, final int interpolationNumber, + final CartesianDerivativesFilter pvFilter, final AngularDerivativesFilter aFilter, + final Propagator propagator) throws RuggedException { this(updater, maxCachedTiles, algorithmID, selectEllipsoid(ellipsoidID, selectBodyRotatingFrame(bodyRotatingFrameID)), selectInertialFrame(inertialFrameID), minDate, maxDate, overshootTolerance, - interpolationStep, interpolationOrder, propagator); + interpolationStep, interpolationNumber, pvFilter, aFilter, propagator); } /** Build a configured instance. @@ -234,14 +249,18 @@ public class Rugged { * @param maxDate end of search time span * @param overshootTolerance tolerance in seconds allowed for {@code minDate} and {@code maxDate} overshooting * @param interpolationStep step to use for inertial/Earth/spacraft transforms interpolations - * @param interpolationOrder order to use for inertial/Earth/spacraft transforms interpolations + * @param interpolationNumber number of points of to use for inertial/Earth/spacraft transforms interpolations + * @param pvFilter filter for derivatives from the sample to use in position/velocity interpolation + * @param aFilter filter for derivatives from the sample to use in attitude interpolation * @param propagator global propagator * @exception RuggedException if data needed for some frame cannot be loaded */ public Rugged(final TileUpdater updater, final int maxCachedTiles, final AlgorithmId algorithmID, final OneAxisEllipsoid ellipsoid, final Frame inertialFrame, final AbsoluteDate minDate, final AbsoluteDate maxDate, final double overshootTolerance, - final double interpolationStep, final int interpolationOrder, final Propagator propagator) + final double interpolationStep, final int interpolationNumber, + final CartesianDerivativesFilter pvFilter, final AngularDerivativesFilter aFilter, + final Propagator propagator) throws RuggedException { try { @@ -281,8 +300,8 @@ public class Rugged { // orbit/attitude to body converter this.scToBody = new SpacecraftToObservedBody(inertialFrame, ellipsoid.getBodyFrame(), minDate, maxDate, overshootTolerance, - positionsVelocities, interpolationOrder, - quaternions, interpolationOrder, + positionsVelocities, interpolationNumber, pvFilter, + quaternions, interpolationNumber, aFilter, FRAMES_TRANSFORMS_INTERPOLATION_STEP); // intersection algorithm diff --git a/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java b/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java index 6a54ed7210d5d7271ee94045b2d344691cf17135..2d8b74d01269fe8d97fad1e708bb98fee5496720 100644 --- a/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java +++ b/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java @@ -67,9 +67,11 @@ public class SpacecraftToObservedBody { * @param overshootTolerance tolerance in seconds allowed for {@code minDate} and {@code maxDate} overshooting * slightly the position, velocity and quaternions ephemerides * @param positionsVelocities satellite position and velocity - * @param pvInterpolationOrder order to use for position/velocity interpolation + * @param pvInterpolationNumber number of points to use for position/velocity interpolation + * @param pvFilter filter for derivatives from the sample to use in position/velocity interpolation * @param quaternions satellite quaternions - * @param aInterpolationOrder order to use for attitude interpolation + * @param aInterpolationNumber number of points to use for attitude interpolation + * @param aFilter filter for derivatives from the sample to use in attitude interpolation * @param tStep step to use for inertial frame to body frame transforms cache computations * @exception RuggedException if [{@code minDate}, {@code maxDate}] search time span overshoots * position or attitude samples by more than {@code overshootTolerance} @@ -77,8 +79,10 @@ public class SpacecraftToObservedBody { */ public SpacecraftToObservedBody(final Frame inertialFrame, final Frame bodyFrame, final AbsoluteDate minDate, final AbsoluteDate maxDate, final double overshootTolerance, - final List<TimeStampedPVCoordinates> positionsVelocities, final int pvInterpolationOrder, - final List<TimeStampedAngularCoordinates> quaternions, final int aInterpolationOrder, + final List<TimeStampedPVCoordinates> positionsVelocities, final int pvInterpolationNumber, + final CartesianDerivativesFilter pvFilter, + final List<TimeStampedAngularCoordinates> quaternions, final int aInterpolationNumber, + final AngularDerivativesFilter aFilter, final double tStep) throws RuggedException { try { @@ -108,11 +112,11 @@ public class SpacecraftToObservedBody { // set up the cache for position-velocities final TimeStampedCache<TimeStampedPVCoordinates> pvCache = - new ImmutableTimeStampedCache<TimeStampedPVCoordinates>(pvInterpolationOrder, positionsVelocities); + new ImmutableTimeStampedCache<TimeStampedPVCoordinates>(pvInterpolationNumber, positionsVelocities); // set up the cache for attitudes final TimeStampedCache<TimeStampedAngularCoordinates> aCache = - new ImmutableTimeStampedCache<TimeStampedAngularCoordinates>(aInterpolationOrder, quaternions); + new ImmutableTimeStampedCache<TimeStampedAngularCoordinates>(aInterpolationNumber, quaternions); final int n = (int) FastMath.ceil(maxDate.durationFrom(minDate) / tStep); this.tStep = tStep; @@ -131,8 +135,7 @@ public class SpacecraftToObservedBody { pvInterpolationDate = date; } final TimeStampedPVCoordinates interpolatedPV = - TimeStampedPVCoordinates.interpolate(pvInterpolationDate, - CartesianDerivativesFilter.USE_PV, + TimeStampedPVCoordinates.interpolate(pvInterpolationDate, pvFilter, pvCache.getNeighbors(pvInterpolationDate)); final TimeStampedPVCoordinates pv = interpolatedPV.shiftedBy(date.durationFrom(pvInterpolationDate)); @@ -146,8 +149,7 @@ public class SpacecraftToObservedBody { aInterpolationDate = date; } final TimeStampedAngularCoordinates interpolatedQuaternion = - TimeStampedAngularCoordinates.interpolate(aInterpolationDate, - AngularDerivativesFilter.USE_R, + TimeStampedAngularCoordinates.interpolate(aInterpolationDate, aFilter, aCache.getNeighbors(aInterpolationDate)); final TimeStampedAngularCoordinates quaternion = interpolatedQuaternion.shiftedBy(date.durationFrom(aInterpolationDate)); diff --git a/core/src/test/java/org/orekit/rugged/api/RuggedTest.java b/core/src/test/java/org/orekit/rugged/api/RuggedTest.java index 48546ba8e5a5fee1404a61496cf532514d06b354..c5eaea235f9a26bc7ce72a547326e2ef9e1040e6 100644 --- a/core/src/test/java/org/orekit/rugged/api/RuggedTest.java +++ b/core/src/test/java/org/orekit/rugged/api/RuggedTest.java @@ -71,6 +71,8 @@ import org.orekit.rugged.raster.VolcanicConeElevationUpdater; import org.orekit.time.AbsoluteDate; import org.orekit.time.TimeScale; import org.orekit.time.TimeScalesFactory; +import org.orekit.utils.AngularDerivativesFilter; +import org.orekit.utils.CartesianDerivativesFilter; import org.orekit.utils.Constants; import org.orekit.utils.IERSConventions; import org.orekit.utils.PVCoordinates; @@ -144,7 +146,7 @@ public class RuggedTest { Rugged rugged = new Rugged(updater, 8, AlgorithmId.DUVENHAGE, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, pv.get(0).getDate(), pv.get(pv.size() - 1).getDate(), 5.0, - pv, 8, q, 8); + pv, 8, CartesianDerivativesFilter.USE_PV, q, 8, AngularDerivativesFilter.USE_R); Assert.assertTrue(rugged.isLightTimeCorrected()); rugged.setLightTimeCorrection(false); @@ -174,7 +176,7 @@ public class RuggedTest { Rugged rugged = new Rugged(updater, 8, AlgorithmId.DUVENHAGE, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, orbit.getDate().shiftedBy(-10.0), orbit.getDate().shiftedBy(+10.0), 5.0, - 1.0, 8, propagator); + 1.0, 8, CartesianDerivativesFilter.USE_PV, AngularDerivativesFilter.USE_R, propagator); Assert.assertTrue(rugged.isLightTimeCorrected()); rugged.setLightTimeCorrection(false); @@ -220,11 +222,13 @@ public class RuggedTest { Assert.assertNotNull(new Rugged(updater, 8, AlgorithmId.DUVENHAGE, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, - t0.shiftedBy(4), t0.shiftedBy(6), 5.0, pv, 2, q, 2)); + t0.shiftedBy(4), t0.shiftedBy(6), 5.0, + pv, 2,CartesianDerivativesFilter.USE_PV, q, 2, AngularDerivativesFilter.USE_R)); try { new Rugged(updater, 8, AlgorithmId.DUVENHAGE, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, - t0.shiftedBy(-1), t0.shiftedBy(6), 0.0001, pv, 2, q, 2); + t0.shiftedBy(-1), t0.shiftedBy(6), 0.0001, + pv, 2, CartesianDerivativesFilter.USE_PV, q, 2, AngularDerivativesFilter.USE_R); } catch (RuggedException re) { Assert.assertEquals(RuggedMessages.OUT_OF_TIME_RANGE, re.getSpecifier()); Assert.assertEquals(t0.shiftedBy(-1), re.getParts()[0]); @@ -233,7 +237,8 @@ public class RuggedTest { try { new Rugged(updater, 8, AlgorithmId.DUVENHAGE, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, - t0.shiftedBy(2), t0.shiftedBy(6), 0.0001, pv, 2, q, 2); + t0.shiftedBy(2), t0.shiftedBy(6), 0.0001, + pv, 2, CartesianDerivativesFilter.USE_PV, q, 2, AngularDerivativesFilter.USE_R); } catch (RuggedException re) { Assert.assertEquals(RuggedMessages.OUT_OF_TIME_RANGE, re.getSpecifier()); Assert.assertEquals(t0.shiftedBy(2), re.getParts()[0]); @@ -242,7 +247,8 @@ public class RuggedTest { try { new Rugged(updater, 8, AlgorithmId.DUVENHAGE, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, - t0.shiftedBy(4), t0.shiftedBy(9), 0.0001, pv, 2, q, 2); + t0.shiftedBy(4), t0.shiftedBy(9), 0.0001, + pv, 2, CartesianDerivativesFilter.USE_PV, q, 2, AngularDerivativesFilter.USE_R); } catch (RuggedException re) { Assert.assertEquals(RuggedMessages.OUT_OF_TIME_RANGE, re.getSpecifier()); Assert.assertEquals(t0.shiftedBy(9), re.getParts()[0]); @@ -251,7 +257,8 @@ public class RuggedTest { try { new Rugged(updater, 8, AlgorithmId.DUVENHAGE, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, - t0.shiftedBy(4), t0.shiftedBy(12), 0.0001, pv, 2, q, 2); + t0.shiftedBy(4), t0.shiftedBy(12), 0.0001, + pv, 2, CartesianDerivativesFilter.USE_PV, q, 2, AngularDerivativesFilter.USE_R); } catch (RuggedException re) { Assert.assertEquals(RuggedMessages.OUT_OF_TIME_RANGE, re.getSpecifier()); Assert.assertEquals(t0.shiftedBy(12), re.getParts()[0]); @@ -306,7 +313,9 @@ public class RuggedTest { Rugged rugged = new Rugged(updater, 8, AlgorithmId.DUVENHAGE, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, lineDatation.getDate(firstLine), lineDatation.getDate(lastLine), 5.0, - 1.0 / lineDatation.getRate(0.0), 8, ephemeris); + 1.0 / lineDatation.getRate(0.0), 8, + CartesianDerivativesFilter.USE_PV, AngularDerivativesFilter.USE_R, + ephemeris); rugged.setLightTimeCorrection(true); rugged.setAberrationOfLightCorrection(true); @@ -382,7 +391,9 @@ public class RuggedTest { EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, minDate, maxDate, 5.0, orbitToPV(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 8, - orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2); + CartesianDerivativesFilter.USE_PV, + orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2, + AngularDerivativesFilter.USE_R); rugged.addLineSensor(lineSensor); @@ -435,7 +446,9 @@ public class RuggedTest { EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, minDate, maxDate, 5.0, orbitToPV(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 8, - orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2); + CartesianDerivativesFilter.USE_PV, + orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2, + AngularDerivativesFilter.USE_R); rugged.addLineSensor(lineSensor); @@ -493,7 +506,9 @@ public class RuggedTest { EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, minDate, maxDate, 5.0, orbitToPV(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 8, - orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2); + CartesianDerivativesFilter.USE_PV, + orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2, + AngularDerivativesFilter.USE_R); ruggedFull.addLineSensor(lineSensor); GeodeticPoint[] gpWithFlatBodyCorrection = ruggedFull.directLocalization("line", 100); @@ -501,7 +516,9 @@ public class RuggedTest { EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, minDate, maxDate, 5.0, orbitToPV(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 8, - orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2); + CartesianDerivativesFilter.USE_PV, + orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2, + AngularDerivativesFilter.USE_R); ruggedFlat.addLineSensor(lineSensor); GeodeticPoint[] gpWithoutFlatBodyCorrection = ruggedFlat.directLocalization("line", 100); @@ -564,7 +581,9 @@ public class RuggedTest { EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, minDate, maxDate, 5.0, orbitToPV(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 8, - orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2); + CartesianDerivativesFilter.USE_PV, + orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2, + AngularDerivativesFilter.USE_R); rugged.setLightTimeCorrection(true); rugged.setAberrationOfLightCorrection(true); for (LineSensor lineSensor : sensors) { @@ -672,8 +691,8 @@ public class RuggedTest { Rugged rugged = new Rugged(updater, 8, AlgorithmId.DUVENHAGE, EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, satellitePVList.get(0).getDate(), satellitePVList.get(satellitePVList.size() - 1).getDate(), 5.0, - satellitePVList, 8, - satelliteQList, 8); + satellitePVList, 8, CartesianDerivativesFilter.USE_PV, + satelliteQList, 8, AngularDerivativesFilter.USE_R); List<Vector3D> lineOfSight = new ArrayList<Vector3D>(); lineOfSight.add(new Vector3D(-0.011204, 0.181530, 1d).normalize()); @@ -826,7 +845,9 @@ public class RuggedTest { EllipsoidId.WGS84, InertialFrameId.EME2000, BodyRotatingFrameId.ITRF, minDate, maxDate, 5.0, orbitToPV(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 8, - orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2); + CartesianDerivativesFilter.USE_PV, + orbitToQ(orbit, earth, minDate.shiftedBy(-1.0), maxDate.shiftedBy(+1.0), 0.25), 2, + AngularDerivativesFilter.USE_R); rugged.setLightTimeCorrection(lightTimeCorrection); rugged.setAberrationOfLightCorrection(aberrationOfLightCorrection); rugged.addLineSensor(lineSensor);