1 package org.orekit.propagation.events;
2
3 import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
4 import org.hipparchus.analysis.differentiation.UnivariateDerivative2Field;
5 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
6 import org.junit.jupiter.api.BeforeAll;
7 import org.junit.jupiter.api.Test;
8 import org.orekit.TestUtils;
9 import org.orekit.Utils;
10 import org.orekit.bodies.AnalyticalSolarPositionProvider;
11 import org.orekit.bodies.GeodeticPoint;
12 import org.orekit.frames.FramesFactory;
13 import org.orekit.frames.TopocentricFrame;
14 import org.orekit.models.earth.ReferenceEllipsoid;
15 import org.orekit.propagation.SpacecraftState;
16 import org.orekit.propagation.events.handlers.StopOnEvent;
17 import org.orekit.time.AbsoluteDate;
18 import org.orekit.time.FieldAbsoluteDate;
19 import org.orekit.utils.ExtendedPositionProvider;
20 import org.orekit.utils.FieldPVCoordinates;
21
22 import static org.junit.jupiter.api.Assertions.*;
23 import static org.mockito.Mockito.mock;
24
25 class ExtremumAngularSeparationDetectorTest {
26
27 @BeforeAll
28 static void setUpBeforeClass() {
29 Utils.setDataRoot("regular-data");
30 }
31
32 @Test
33 void testGetter() {
34
35 final ExtendedPositionProvider mockedBeacon = mock();
36 final ExtendedPositionProvider mockedObserver = mock();
37
38 final ExtremumAngularSeparationDetector detector = new ExtremumAngularSeparationDetector(EventDetectionSettings.getDefaultEventDetectionSettings(),
39 new StopOnEvent(), mockedBeacon, mockedObserver);
40
41 assertEquals(mockedBeacon, detector.getBeacon());
42 assertEquals(mockedObserver, detector.getObserver());
43 }
44
45 @Test
46 void testG() {
47
48 final SpacecraftState state = new SpacecraftState(TestUtils.getDefaultOrbit(AbsoluteDate.ARBITRARY_EPOCH));
49 final ExtendedPositionProvider beacon = new AnalyticalSolarPositionProvider();
50 final ExtendedPositionProvider observer = new TopocentricFrame(ReferenceEllipsoid.getWgs84(FramesFactory.getGTOD(true)),
51 new GeodeticPoint(0., 1., 2.), "");
52 final ExtremumAngularSeparationDetector detector = new ExtremumAngularSeparationDetector(EventDetectionSettings.getDefaultEventDetectionSettings(),
53 new StopOnEvent(), beacon, observer);
54
55 final double actualG = detector.g(state);
56
57 final FieldAbsoluteDate<UnivariateDerivative2> fieldDate = new FieldAbsoluteDate<>(UnivariateDerivative2Field.getInstance(),
58 state.getDate()).shiftedBy(new UnivariateDerivative2(0, 1, 0));
59 final FieldVector3D<UnivariateDerivative2> bP = beacon.getPosition(fieldDate, state.getFrame());
60 final FieldVector3D<UnivariateDerivative2> oP = observer.getPosition(fieldDate, state.getFrame());
61 final FieldPVCoordinates<UnivariateDerivative2> pv = state.getPVCoordinates().toUnivariateDerivative2PV();
62 final UnivariateDerivative2 separation = FieldVector3D.angle(pv.getPosition().subtract(oP), bP.subtract(oP));
63 final double expectedG = separation.getFirstDerivative();
64 assertEquals(expectedG, actualG, 1e-15);
65 }
66 }