use of org.orekit.utils.ParameterDriver in project Orekit by CS-SI.
the class GroundStationTest method testNoReferenceDate.
@Test
public void testNoReferenceDate() throws OrekitException {
Utils.setDataRoot("regular-data");
final Frame eme2000 = FramesFactory.getEME2000();
final AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
final OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS, Constants.WGS84_EARTH_FLATTENING, FramesFactory.getITRF(IERSConventions.IERS_2010, true));
final GroundStation station = new GroundStation(new TopocentricFrame(earth, new GeodeticPoint(0.1, 0.2, 100), "dummy"));
try {
station.getOffsetToInertial(eme2000, date);
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.NO_REFERENCE_DATE_FOR_PARAMETER, oe.getSpecifier());
Assert.assertEquals("prime-meridian-offset", (String) oe.getParts()[0]);
}
try {
DSFactory factory = new DSFactory(9, 1);
Map<String, Integer> indices = new HashMap<>();
for (final ParameterDriver driver : Arrays.asList(station.getPrimeMeridianOffsetDriver(), station.getPrimeMeridianDriftDriver(), station.getPolarOffsetXDriver(), station.getPolarDriftXDriver(), station.getPolarOffsetYDriver(), station.getPolarDriftYDriver(), station.getEastOffsetDriver(), station.getNorthOffsetDriver(), station.getZenithOffsetDriver())) {
indices.put(driver.getName(), indices.size());
}
station.getOffsetToInertial(eme2000, new FieldAbsoluteDate<>(factory.getDerivativeField(), date), factory, indices);
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.NO_REFERENCE_DATE_FOR_PARAMETER, oe.getSpecifier());
Assert.assertEquals("prime-meridian-offset", (String) oe.getParts()[0]);
}
}
use of org.orekit.utils.ParameterDriver in project Orekit by CS-SI.
the class GroundStationTest method doTestAngularDerivatives.
private void doTestAngularDerivatives(double latitude, double longitude, double altitude, double stepFactor, double toleranceRotationValue, double toleranceRotationDerivative, double toleranceRotationRateValue, double toleranceRotationRateDerivative, String... parameterPattern) throws OrekitException {
Utils.setDataRoot("regular-data");
final Frame eme2000 = FramesFactory.getEME2000();
final AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
final AbsoluteDate date0 = date.shiftedBy(50000);
final OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS, Constants.WGS84_EARTH_FLATTENING, FramesFactory.getITRF(IERSConventions.IERS_2010, true));
final GroundStation station = new GroundStation(new TopocentricFrame(earth, new GeodeticPoint(latitude, longitude, altitude), "dummy"));
final DSFactory factory = new DSFactory(parameterPattern.length, 1);
final FieldAbsoluteDate<DerivativeStructure> dateDS = new FieldAbsoluteDate<>(factory.getDerivativeField(), date);
ParameterDriver[] selectedDrivers = new ParameterDriver[parameterPattern.length];
UnivariateDifferentiableVectorFunction[] dFAngular = new UnivariateDifferentiableVectorFunction[parameterPattern.length];
final ParameterDriver[] allDrivers = selectAllDrivers(station);
for (ParameterDriver driver : allDrivers) {
driver.setReferenceDate(date0);
}
Map<String, Integer> indices = new HashMap<>();
for (int k = 0; k < dFAngular.length; ++k) {
for (int i = 0; i < allDrivers.length; ++i) {
if (allDrivers[i].getName().matches(parameterPattern[k])) {
selectedDrivers[k] = allDrivers[i];
dFAngular[k] = differentiatedTransformAngular(station, eme2000, date, selectedDrivers[k], stepFactor);
indices.put(selectedDrivers[k].getName(), k);
}
}
}
;
DSFactory factory11 = new DSFactory(1, 1);
RandomGenerator generator = new Well19937a(0xa01a1d8fe5d80af7l);
double maxRotationValueError = 0;
double maxRotationDerivativeError = 0;
double maxRotationRateValueError = 0;
double maxRotationRateDerivativeError = 0;
for (int i = 0; i < 1000; ++i) {
// randomly change one parameter
ParameterDriver changed = allDrivers[generator.nextInt(allDrivers.length)];
changed.setNormalizedValue(2 * generator.nextDouble() - 1);
// transform to check
FieldTransform<DerivativeStructure> t = station.getOffsetToInertial(eme2000, dateDS, factory, indices);
for (int k = 0; k < dFAngular.length; ++k) {
// reference values and derivatives computed using finite differences
DerivativeStructure[] refAngular = dFAngular[k].value(factory11.variable(0, selectedDrivers[k].getValue()));
// rotation
final Rotation refQ = new Rotation(refAngular[0].getValue(), refAngular[1].getValue(), refAngular[2].getValue(), refAngular[3].getValue(), true);
final Rotation resQ = t.getRotation().toRotation();
maxRotationValueError = FastMath.max(maxRotationValueError, Rotation.distance(refQ, resQ));
double sign = FastMath.copySign(1.0, refAngular[0].getValue() * t.getRotation().getQ0().getValue() + refAngular[1].getValue() * t.getRotation().getQ1().getValue() + refAngular[2].getValue() * t.getRotation().getQ2().getValue() + refAngular[3].getValue() * t.getRotation().getQ3().getValue());
maxRotationDerivativeError = FastMath.max(maxRotationDerivativeError, FastMath.abs(sign * refAngular[0].getPartialDerivative(1) - t.getRotation().getQ0().getAllDerivatives()[k + 1]));
maxRotationDerivativeError = FastMath.max(maxRotationDerivativeError, FastMath.abs(sign * refAngular[1].getPartialDerivative(1) - t.getRotation().getQ1().getAllDerivatives()[k + 1]));
maxRotationDerivativeError = FastMath.max(maxRotationDerivativeError, FastMath.abs(sign * refAngular[2].getPartialDerivative(1) - t.getRotation().getQ2().getAllDerivatives()[k + 1]));
maxRotationDerivativeError = FastMath.max(maxRotationDerivativeError, FastMath.abs(sign * refAngular[3].getPartialDerivative(1) - t.getRotation().getQ3().getAllDerivatives()[k + 1]));
// rotation rate
final Vector3D refRate = new Vector3D(refAngular[4].getValue(), refAngular[5].getValue(), refAngular[6].getValue());
final Vector3D resRate = t.getRotationRate().toVector3D();
final Vector3D refRateD = new Vector3D(refAngular[4].getPartialDerivative(1), refAngular[5].getPartialDerivative(1), refAngular[6].getPartialDerivative(1));
final Vector3D resRateD = new Vector3D(t.getRotationRate().getX().getAllDerivatives()[k + 1], t.getRotationRate().getY().getAllDerivatives()[k + 1], t.getRotationRate().getZ().getAllDerivatives()[k + 1]);
maxRotationRateValueError = FastMath.max(maxRotationRateValueError, Vector3D.distance(refRate, resRate));
maxRotationRateDerivativeError = FastMath.max(maxRotationRateDerivativeError, Vector3D.distance(refRateD, resRateD));
}
}
Assert.assertEquals(0.0, maxRotationValueError, toleranceRotationValue);
Assert.assertEquals(0.0, maxRotationDerivativeError, toleranceRotationDerivative);
Assert.assertEquals(0.0, maxRotationRateValueError, toleranceRotationRateValue);
Assert.assertEquals(0.0, maxRotationRateDerivativeError, toleranceRotationRateDerivative);
}
use of org.orekit.utils.ParameterDriver in project Orekit by CS-SI.
the class GroundStationTest method testEstimateEOP.
@Test
public void testEstimateEOP() throws OrekitException {
Context linearEOPContext = EstimationTestUtils.eccentricContext("linear-EOP:regular-data/de431-ephemerides:potential:tides");
final AbsoluteDate refDate = new AbsoluteDate(2000, 2, 24, linearEOPContext.utc);
final double dut10 = 0.3079738;
final double lod = 0.0011000;
final double xp0 = 68450.0e-6;
final double xpDot = -50.0e-6;
final double yp0 = 60.0e-6;
final double ypDot = 2.0e-6;
for (double dt = -2 * Constants.JULIAN_DAY; dt < 2 * Constants.JULIAN_DAY; dt += 300.0) {
AbsoluteDate date = refDate.shiftedBy(dt);
Assert.assertEquals(dut10 - dt * lod / Constants.JULIAN_DAY, linearEOPContext.ut1.getEOPHistory().getUT1MinusUTC(date), 1.0e-15);
Assert.assertEquals(lod, linearEOPContext.ut1.getEOPHistory().getLOD(date), 1.0e-15);
Assert.assertEquals((xp0 + xpDot * dt / Constants.JULIAN_DAY) * Constants.ARC_SECONDS_TO_RADIANS, linearEOPContext.ut1.getEOPHistory().getPoleCorrection(date).getXp(), 1.0e-15);
Assert.assertEquals((yp0 + ypDot * dt / Constants.JULIAN_DAY) * Constants.ARC_SECONDS_TO_RADIANS, linearEOPContext.ut1.getEOPHistory().getPoleCorrection(date).getYp(), 1.0e-15);
}
final NumericalPropagatorBuilder linearPropagatorBuilder = linearEOPContext.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true, 1.0e-6, 60.0, 0.001);
// create perfect range measurements
final Propagator propagator = EstimationTestUtils.createPropagator(linearEOPContext.initialOrbit, linearPropagatorBuilder);
final List<ObservedMeasurement<?>> linearMeasurements = EstimationTestUtils.createMeasurements(propagator, new RangeMeasurementCreator(linearEOPContext), 1.0, 5.0, 60.0);
Utils.clearFactories();
Context zeroEOPContext = EstimationTestUtils.eccentricContext("zero-EOP:regular-data/de431-ephemerides:potential:potential:tides");
for (double dt = -2 * Constants.JULIAN_DAY; dt < 2 * Constants.JULIAN_DAY; dt += 300.0) {
AbsoluteDate date = refDate.shiftedBy(dt);
Assert.assertEquals(0.0, zeroEOPContext.ut1.getEOPHistory().getUT1MinusUTC(date), 1.0e-15);
Assert.assertEquals(0.0, zeroEOPContext.ut1.getEOPHistory().getLOD(date), 1.0e-15);
Assert.assertEquals(0.0, zeroEOPContext.ut1.getEOPHistory().getPoleCorrection(date).getXp(), 1.0e-15);
Assert.assertEquals(0.0, zeroEOPContext.ut1.getEOPHistory().getPoleCorrection(date).getYp(), 1.0e-15);
}
// create orbit estimator
final NumericalPropagatorBuilder zeroPropagatorBuilder = linearEOPContext.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true, 1.0e-6, 60.0, 0.001);
final BatchLSEstimator estimator = new BatchLSEstimator(new LevenbergMarquardtOptimizer(), zeroPropagatorBuilder);
for (final ObservedMeasurement<?> linearMeasurement : linearMeasurements) {
Range linearRange = (Range) linearMeasurement;
for (final GroundStation station : zeroEOPContext.stations) {
if (station.getBaseFrame().getName().equals(linearRange.getStation().getBaseFrame().getName())) {
Range zeroRange = new Range(station, linearRange.getDate(), linearRange.getObservedValue()[0], linearRange.getTheoreticalStandardDeviation()[0], linearRange.getBaseWeight()[0]);
estimator.addMeasurement(zeroRange);
}
}
}
estimator.setParametersConvergenceThreshold(1.0e-3);
estimator.setMaxIterations(100);
estimator.setMaxEvaluations(200);
// we want to estimate pole and prime meridian
GroundStation station = zeroEOPContext.stations.get(0);
station.getPrimeMeridianOffsetDriver().setReferenceDate(refDate);
station.getPrimeMeridianOffsetDriver().setSelected(true);
station.getPrimeMeridianDriftDriver().setSelected(true);
station.getPolarOffsetXDriver().setReferenceDate(refDate);
station.getPolarOffsetXDriver().setSelected(true);
station.getPolarDriftXDriver().setSelected(true);
station.getPolarOffsetYDriver().setReferenceDate(refDate);
station.getPolarOffsetYDriver().setSelected(true);
station.getPolarDriftYDriver().setSelected(true);
// just for the fun and to speed up test, we will use orbit determination, *without* estimating orbit
for (final ParameterDriver driver : zeroPropagatorBuilder.getOrbitalParametersDrivers().getDrivers()) {
driver.setSelected(false);
}
estimator.estimate();
final double computedDut1 = station.getPrimeMeridianOffsetDriver().getValue() / EstimatedEarthFrameProvider.EARTH_ANGULAR_VELOCITY;
final double computedLOD = station.getPrimeMeridianDriftDriver().getValue() * (-Constants.JULIAN_DAY / EstimatedEarthFrameProvider.EARTH_ANGULAR_VELOCITY);
final double computedXp = station.getPolarOffsetXDriver().getValue() / Constants.ARC_SECONDS_TO_RADIANS;
final double computedXpDot = station.getPolarDriftXDriver().getValue() / Constants.ARC_SECONDS_TO_RADIANS * Constants.JULIAN_DAY;
final double computedYp = station.getPolarOffsetYDriver().getValue() / Constants.ARC_SECONDS_TO_RADIANS;
final double computedYpDot = station.getPolarDriftYDriver().getValue() / Constants.ARC_SECONDS_TO_RADIANS * Constants.JULIAN_DAY;
Assert.assertEquals(dut10, computedDut1, 4.3e-10);
Assert.assertEquals(lod, computedLOD, 4.9e-10);
Assert.assertEquals(xp0, computedXp, 5.6e-9);
Assert.assertEquals(xpDot, computedXpDot, 7.2e-9);
Assert.assertEquals(yp0, computedYp, 1.1e-9);
Assert.assertEquals(ypDot, computedYpDot, 2.8e-11);
// thresholds to use if orbit is estimated
// (i.e. when commenting out the loop above that sets orbital parameters drivers to "not selected")
// Assert.assertEquals(dut10, computedDut1, 6.6e-3);
// Assert.assertEquals(lod, computedLOD, 1.1e-9);
// Assert.assertEquals(xp0, computedXp, 3.3e-8);
// Assert.assertEquals(xpDot, computedXpDot, 2.2e-8);
// Assert.assertEquals(yp0, computedYp, 3.3e-8);
// Assert.assertEquals(ypDot, computedYpDot, 3.8e-8);
}
use of org.orekit.utils.ParameterDriver in project Orekit by CS-SI.
the class ConstantThrustManeuverTest method testNegativeDuration.
@Test
public void testNegativeDuration() throws OrekitException {
AbsoluteDate date = new AbsoluteDate(new DateComponents(2004, 01, 01), new TimeComponents(23, 30, 00.000), TimeScalesFactory.getUTC());
ConstantThrustManeuver maneuver = new ConstantThrustManeuver(date, -10.0, 400.0, 300.0, Vector3D.PLUS_K, "1A-");
ParameterDriver[] drivers = maneuver.getParametersDrivers();
Assert.assertEquals(2, drivers.length);
Assert.assertEquals("1A-thrust", drivers[0].getName());
Assert.assertEquals("1A-flow rate", drivers[1].getName());
EventDetector[] switches = maneuver.getEventsDetectors().toArray(EventDetector[]::new);
Orbit o1 = dummyOrbit(date.shiftedBy(-11.0));
Assert.assertTrue(switches[0].g(new SpacecraftState(o1)) < 0);
Orbit o2 = dummyOrbit(date.shiftedBy(-9.0));
Assert.assertTrue(switches[0].g(new SpacecraftState(o2)) > 0);
Orbit o3 = dummyOrbit(date.shiftedBy(-1.0));
Assert.assertTrue(switches[1].g(new SpacecraftState(o3)) < 0);
Orbit o4 = dummyOrbit(date.shiftedBy(1.0));
Assert.assertTrue(switches[1].g(new SpacecraftState(o4)) > 0);
}
use of org.orekit.utils.ParameterDriver in project Orekit by CS-SI.
the class ConstantThrustManeuverTest method testPositiveDuration.
@Test
public void testPositiveDuration() throws OrekitException {
AbsoluteDate date = new AbsoluteDate(new DateComponents(2004, 01, 01), new TimeComponents(23, 30, 00.000), TimeScalesFactory.getUTC());
ConstantThrustManeuver maneuver = new ConstantThrustManeuver(date, 10.0, 400.0, 300.0, Vector3D.PLUS_K);
Assert.assertFalse(maneuver.dependsOnPositionOnly());
ParameterDriver[] drivers = maneuver.getParametersDrivers();
Assert.assertEquals(2, drivers.length);
Assert.assertEquals("thrust", drivers[0].getName());
Assert.assertEquals("flow rate", drivers[1].getName());
EventDetector[] switches = maneuver.getEventsDetectors().toArray(EventDetector[]::new);
Orbit o1 = dummyOrbit(date.shiftedBy(-1.0));
Assert.assertTrue(switches[0].g(new SpacecraftState(o1)) < 0);
Orbit o2 = dummyOrbit(date.shiftedBy(1.0));
Assert.assertTrue(switches[0].g(new SpacecraftState(o2)) > 0);
Orbit o3 = dummyOrbit(date.shiftedBy(9.0));
Assert.assertTrue(switches[1].g(new SpacecraftState(o3)) < 0);
Orbit o4 = dummyOrbit(date.shiftedBy(11.0));
Assert.assertTrue(switches[1].g(new SpacecraftState(o4)) > 0);
}
Aggregations