From d4bf96b75a30fef44be251ac25b20a5903858313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petrus=20Hyv=C3=B6nen?= <petrus.hyvonen@gmail.com> Date: Sun, 5 Nov 2023 23:06:15 +0100 Subject: [PATCH] move to in dev - Abstract class not interface! --- tests-in-development/GroundPointingTest.py | 130 +++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 tests-in-development/GroundPointingTest.py diff --git a/tests-in-development/GroundPointingTest.py b/tests-in-development/GroundPointingTest.py new file mode 100644 index 0000000..f3ec787 --- /dev/null +++ b/tests-in-development/GroundPointingTest.py @@ -0,0 +1,130 @@ +# Python orekit specifics +import sys +import orekit_jpype +orekit_jpype.initVM() + +import unittest +from org.orekit.data import DataProvidersManager, ZipJarCrawler, DataContext, DirectoryCrawler +from java.io import File + +from orekit_jpype.pyhelpers import absolutedate_to_datetime +from org.hipparchus import CalculusFieldElement +from org.hipparchus.analysis.differentiation import GradientField, UnivariateDerivative1, UnivariateDerivative2 +from org.hipparchus.complex import ComplexField +from org.hipparchus.geometry.euclidean.threed import FieldRotation, FieldVector3D, Rotation, Vector3D +from org.hipparchus.util import Binary64Field +from org.orekit.attitudes import GroundPointing, PythonGroundPointing +from org.orekit.frames import FramesFactory, Frame +from org.orekit.orbits import EquinoctialOrbit, FieldEquinoctialOrbit, PositionAngleType +from org.orekit.time import AbsoluteDate, FieldAbsoluteDate +from org.orekit.utils import IERSConventions, Constants, PVCoordinatesProvider, TimeStampedPVCoordinates, FieldPVCoordinatesProvider, TimeStampedFieldPVCoordinates, PVCoordinates, FieldPVCoordinates +import unittest +from org.hipparchus.analysis.differentiation import GradientField, UnivariateDerivative2 +from jpype import JImplements, JOverride + +@JImplements(GroundPointing) +class TestGroundPointing(): + @JOverride() + def getTargetPV(self, pvProv, date, frame) -> TimeStampedPVCoordinates|TimeStampedFieldPVCoordinates: + if isinstance(pvProv, FieldPVCoordinatesProvider): + return TimeStampedFieldPVCoordinates(date, FieldPVCoordinates.getZero(date.getField())) + + elif isinstance(pvProv, PVCoordinatesProvider): + return TimeStampedPVCoordinates(date, PVCoordinates.ZERO) + + else: + raise RuntimeError(f'Not supported type of PVCoordinatesProvider: {type(pvProv).__name__}') + + +class GroundPointingTest(unittest.TestCase): + INERTIAL_FRAME = None + OTHER_INERTIAL_FRAME = None + EARTH_FIXED_FRAME = None + + def setUp(self): + + DM = DataContext.getDefault().getDataProvidersManager() + datafile = File('../test/resources') + if not datafile.exists(): + print('File :', datafile.absolutePath, ' not found') + + crawler = DirectoryCrawler(datafile) + DM.clearProviders() + DM.addProvider(crawler) + self.INERTIAL_FRAME = FramesFactory.getEME2000() + self.OTHER_INERTIAL_FRAME = FramesFactory.getGCRF() + self.EARTH_FIXED_FRAME = FramesFactory.getITRF(IERSConventions.IERS_2010, True) + + def createPVCoordinatesProvider(self): + epoch = AbsoluteDate.ARBITRARY_EPOCH + semiMajorAxis = 45000.0e3 + mu = Constants.EGM96_EARTH_MU + return EquinoctialOrbit(semiMajorAxis, 0., 0., 0., 0., 0., PositionAngleType.ECCENTRIC, self.INERTIAL_FRAME, epoch, mu) + + def templateTestGetRotation(self, frame): + # setup + groundPointing = TestGroundPointing(self.INERTIAL_FRAME, self.EARTH_FIXED_FRAME) + orbit = self.createPVCoordinatesProvider() + + actualRotation = groundPointing.getAttitudeRotation(orbit, orbit.getDate(), frame) + # verify + attitude = groundPointing.getAttitude(orbit, orbit.getDate(), frame) + expectedRotation = attitude.getRotation() + self.assertEquals(0., Rotation.distance(expectedRotation, actualRotation)) + + def testtemplateTestGetRotationRateSameFrame(self): + self.templateTestGetRotation(self.INERTIAL_FRAME) + + def testtemplateTestGetRotationRateDifferentFrame(self): + self.templateTestGetRotation(self.OTHER_INERTIAL_FRAME) + + def testGetAttitudeRotiationFieldSameFrame(self): + self.templateTestGetRotationField(ComplexField.getInstance(), self.INERTIAL_FRAME) + + def testGetAttitudeRotiationFieldDifferentFrame(self): + self.templateTestGetRotationField(UnivariateDerivative1(0., 0.).getField(), self.OTHER_INERTIAL_FRAME) + + def templateTestGetRotationField(self, field, frame): + # GIVEN + groundPointing = TestGroundPointing(self.INERTIAL_FRAME, self.EARTH_FIXED_FRAME) + orbit = self.createPVCoordinatesProvider() + fieldOrbit = self.convertToField(field, orbit) + # WHEN + actualRotation = groundPointing.getAttitudeRotation(fieldOrbit, fieldOrbit.getDate(), frame) + # THEN + attitude = groundPointing.getAttitude(fieldOrbit, fieldOrbit.getDate(), frame) + expectedRotation = attitude.getRotation() + assert 0. == Rotation.distance(expectedRotation.toRotation(), actualRotation.toRotation()) + + + def testGetAttitudeFieldGradient(self): + self.templateTestGetAttitudeField(GradientField.getField(1)) + + def testGetAttitudeFieldUnivariateDerivative2(self): + self.templateTestGetAttitudeField(UnivariateDerivative2(0., 0., 0.).getField()) + + + + def templateTestGetAttitudeField(self, field): + groundPointing = TestGroundPointing(self.INERTIAL_FRAME, self.EARTH_FIXED_FRAME) + orbit = self.createPVCoordinatesProvider() + fieldOrbit = self.convertToField(field, orbit) + actualAttitude = groundPointing.getAttitude(fieldOrbit, fieldOrbit.getDate(), self.OTHER_INERTIAL_FRAME).toAttitude() + expectedAttitude = groundPointing.getAttitude(orbit, orbit.getDate(), self.OTHER_INERTIAL_FRAME) + assert 0. == Rotation.distance(expectedAttitude.getRotation(), actualAttitude.getRotation()) + assert str(expectedAttitude.getSpin()) == str(actualAttitude.getSpin()) + assert str(expectedAttitude.getRotationAcceleration()) == str(actualAttitude.getRotationAcceleration()) + + def convertToField(self, field, orbit) -> FieldEquinoctialOrbit: + zero = field.getZero() + fieldSemiMajorAxis = zero.add(orbit.getA()) + fieldDate = FieldAbsoluteDate(field, orbit.getDate()) + positionAngleType = PositionAngleType.MEAN + fieldAngle = zero.add(orbit.getL(positionAngleType)) + return FieldEquinoctialOrbit(fieldSemiMajorAxis, zero, zero, zero, zero, fieldAngle, positionAngleType, orbit.getFrame(), fieldDate, zero.add(orbit.getMu())) + + +if __name__ == '__main__': + suite = unittest.TestLoader().loadTestsFromTestCase(GroundPointingTest) + ret = not unittest.TextTestRunner(verbosity=2).run(suite).wasSuccessful() + sys.exit(ret) -- GitLab