1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.attitudes;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.Field;
21 import org.hipparchus.analysis.differentiation.UnivariateDerivative1;
22 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
23 import org.hipparchus.geometry.euclidean.threed.Rotation;
24 import org.hipparchus.geometry.euclidean.threed.Vector3D;
25 import org.hipparchus.util.Binary64;
26 import org.hipparchus.util.Binary64Field;
27 import org.junit.jupiter.api.Assertions;
28 import org.junit.jupiter.api.Test;
29 import org.mockito.Mockito;
30 import org.orekit.frames.Frame;
31 import org.orekit.frames.FramesFactory;
32 import org.orekit.orbits.CartesianOrbit;
33 import org.orekit.propagation.FieldSpacecraftState;
34 import org.orekit.propagation.SpacecraftState;
35 import org.orekit.propagation.events.EventDetector;
36 import org.orekit.time.AbsoluteDate;
37 import org.orekit.time.FieldAbsoluteDate;
38 import org.orekit.utils.*;
39
40 import java.util.ArrayList;
41 import java.util.List;
42 import java.util.stream.Stream;
43
44 class AttitudeProviderTest {
45
46 private static final Frame REFERENCE_FRAME = FramesFactory.getGCRF();
47
48 private static class TestAttitudeProvider implements AttitudeProvider {
49 private static final AngularCoordinates ANGULAR_COORDINATES = new AngularCoordinates(new Rotation(Vector3D.MINUS_I, Vector3D.MINUS_K));
50
51 @Override
52 public Attitude getAttitude(PVCoordinatesProvider pvProv, AbsoluteDate date, Frame frame) {
53 return new Attitude(date, frame, ANGULAR_COORDINATES);
54 }
55
56 @Override
57 public <T extends CalculusFieldElement<T>> FieldAttitude<T> getAttitude(FieldPVCoordinatesProvider<T> pvProv, FieldAbsoluteDate<T> date, Frame frame) {
58 return new FieldAttitude<>(date, frame, new FieldAngularCoordinates<>(date.getField(), ANGULAR_COORDINATES));
59 }
60 }
61
62 @Test
63 void testGetAttitudeRotationModelField() {
64
65 final TestAttitudeProvider attitudeProvider = new TestAttitudeProvider();
66 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
67 final SpacecraftState state = new SpacecraftState(new CartesianOrbit(new PVCoordinates(Vector3D.MINUS_J, Vector3D.MINUS_K),
68 FramesFactory.getEME2000(), date, 1.));
69 final Binary64Field field = Binary64Field.getInstance();
70 final FieldSpacecraftState<Binary64> fieldState = new FieldSpacecraftState<>(field, state);
71
72 final FieldRotation<Binary64> actualRotation = attitudeProvider.getAttitudeRotation(fieldState, null);
73
74 final FieldRotation<Binary64> expectedRotation = attitudeProvider.getAttitudeRotation(fieldState.getOrbit(), fieldState.getDate(),
75 state.getFrame());
76 Assertions.assertEquals(0., Rotation.distance(expectedRotation.toRotation(), actualRotation.toRotation()));
77 }
78
79 @Test
80 void testGetAttitudeRotationModelFieldAbsolutePV() {
81
82 final TestAttitudeProvider attitudeProvider = new TestAttitudeProvider();
83 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
84 final SpacecraftState state = new SpacecraftState(new AbsolutePVCoordinates(FramesFactory.getEME2000(), date,
85 new PVCoordinates(Vector3D.MINUS_J, Vector3D.MINUS_K)));
86 final Binary64Field field = Binary64Field.getInstance();
87 final FieldSpacecraftState<Binary64> fieldState = new FieldSpacecraftState<>(field, state);
88
89 final FieldRotation<Binary64> actualRotation = attitudeProvider.getAttitudeRotation(fieldState, null);
90
91 final FieldRotation<Binary64> expectedRotation = attitudeProvider.getAttitudeRotation(fieldState.getAbsPVA(), fieldState.getDate(),
92 state.getFrame());
93 Assertions.assertEquals(0., Rotation.distance(expectedRotation.toRotation(), actualRotation.toRotation()));
94 }
95
96 @Test
97 void testGetAttitudeRotationModel() {
98
99 final TestAttitudeProvider attitudeProvider = new TestAttitudeProvider();
100 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
101 final SpacecraftState state = new SpacecraftState(new CartesianOrbit(new PVCoordinates(Vector3D.MINUS_J, Vector3D.MINUS_K),
102 FramesFactory.getEME2000(), date, 1.));
103
104 final Rotation actualRotation = attitudeProvider.getAttitudeRotation(state, new double[0]);
105
106 final Rotation expectedRotation = attitudeProvider.getAttitudeRotation(state.getOrbit(), date, state.getFrame());
107 Assertions.assertEquals(0., Rotation.distance(expectedRotation, actualRotation));
108 }
109
110 @Test
111 void testGetAttitudeRotationModelAbsolutePV() {
112
113 final TestAttitudeProvider attitudeProvider = new TestAttitudeProvider();
114 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
115 final SpacecraftState state = new SpacecraftState(new AbsolutePVCoordinates(FramesFactory.getEME2000(), date,
116 new PVCoordinates(Vector3D.MINUS_J, Vector3D.MINUS_K)));
117
118 final Rotation actualRotation = attitudeProvider.getAttitudeRotation(state, new double[0]);
119
120 final Rotation expectedRotation = attitudeProvider.getAttitudeRotation(state.getAbsPVA(), date, state.getFrame());
121 Assertions.assertEquals(0., Rotation.distance(expectedRotation, actualRotation));
122 }
123
124 @Test
125 void testGetAttitudeRotation() {
126
127 final TestAttitudeProvider attitudeProvider = new TestAttitudeProvider();
128 final PVCoordinatesProvider mockPvCoordinatesProvider = Mockito.mock(PVCoordinatesProvider.class);
129 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
130
131 final Rotation actualRotation = attitudeProvider.getAttitudeRotation(mockPvCoordinatesProvider, date, REFERENCE_FRAME);
132
133 final Rotation expectedRotation = attitudeProvider.getAttitude(mockPvCoordinatesProvider, date, REFERENCE_FRAME)
134 .getRotation();
135 Assertions.assertEquals(0., Rotation.distance(expectedRotation, actualRotation));
136 }
137
138 @Test
139 void testGetEventDetectors() {
140
141 final AttitudeProvider mockedProvider = Mockito.mock(AttitudeProvider.class);
142 Mockito.when(mockedProvider.getParametersDrivers()).thenReturn(new ArrayList<>());
143
144 final Stream<EventDetector> detectorStream = mockedProvider.getEventDetectors();
145
146 Assertions.assertEquals(0, detectorStream.count());
147 }
148
149 @Test
150 void testGetParametersDrivers() {
151
152 final AttitudeProvider mockedProvider = new TestAttitudeProvider();
153
154 final List<ParameterDriver> driverList = mockedProvider.getParametersDrivers();
155
156 Assertions.assertTrue(driverList.isEmpty());
157 }
158
159 @Test
160 void testGetAttitudeRotationFieldBinary64() {
161 templateTestGetRotationField(Binary64Field.getInstance());
162 }
163
164 @Test
165 void testGetAttitudeRotationFieldUnivariateDerivative1() {
166 templateTestGetRotationField(new UnivariateDerivative1(0., 0.).getField());
167 }
168
169 <T extends CalculusFieldElement<T>> void templateTestGetRotationField(final Field<T> field) {
170
171 final TestAttitudeProvider attitudeProvider = new TestAttitudeProvider();
172 @SuppressWarnings("unchecked")
173 final FieldPVCoordinatesProvider<T> mockPvCoordinatesProvider = Mockito.mock(FieldPVCoordinatesProvider.class);
174 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
175 final FieldAbsoluteDate<T> fieldDate = new FieldAbsoluteDate<T>(field, date);
176
177 final FieldRotation<T> actualRotation = attitudeProvider.getAttitudeRotation(mockPvCoordinatesProvider, fieldDate, REFERENCE_FRAME);
178
179 final FieldRotation<T> expectedRotation = attitudeProvider.getAttitude(mockPvCoordinatesProvider, fieldDate, REFERENCE_FRAME)
180 .getRotation();
181 Assertions.assertEquals(0., Rotation.distance(expectedRotation.toRotation(), actualRotation.toRotation()));
182 }
183
184 }