1   /* Copyright 2002-2022 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.attitudes;
18  
19  import java.util.Collections;
20  
21  import org.hipparchus.Field;
22  import org.hipparchus.CalculusFieldElement;
23  import org.hipparchus.geometry.euclidean.threed.FieldRotation;
24  import org.hipparchus.geometry.euclidean.threed.Rotation;
25  import org.hipparchus.util.Decimal64Field;
26  import org.junit.Assert;
27  import org.junit.Before;
28  import org.junit.Test;
29  import org.orekit.Utils;
30  import org.orekit.data.DataSource;
31  import org.orekit.errors.OrekitException;
32  import org.orekit.errors.OrekitMessages;
33  import org.orekit.files.ccsds.ndm.ParserBuilder;
34  import org.orekit.files.ccsds.ndm.adm.aem.Aem;
35  import org.orekit.files.ccsds.ndm.adm.aem.AemSatelliteEphemeris;
36  import org.orekit.time.AbsoluteDate;
37  import org.orekit.time.FieldAbsoluteDate;
38  import org.orekit.time.TimeScalesFactory;
39  
40  public class AggregateBoundedAttitudeProviderTest {
41  
42      @Before
43      public void setUp() {
44          Utils.setDataRoot("regular-data:ccsds");
45      }
46  
47      @Test
48      public void testEmptyList() {
49          try {
50              new AggregateBoundedAttitudeProvider(Collections.emptyList());
51          } catch (OrekitException oe) {
52              Assert.assertEquals(OrekitMessages.NOT_ENOUGH_ATTITUDE_PROVIDERS, oe.getSpecifier());
53          }
54      }
55  
56      @Test
57      public void testAEM() {
58  
59          final String ex = "/ccsds/adm/aem/AEMExample10.txt";
60          final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
61          final Aem file = new ParserBuilder().buildAemParser().parseMessage(source);
62  
63          final AemSatelliteEphemeris ephemeris = file.getSatellites().get("1996-062A");
64          final BoundedAttitudeProvider provider = ephemeris.getAttitudeProvider();
65  
66          // Verify dates
67          Assert.assertEquals(0.0, provider.getMinDate().durationFrom(ephemeris.getStart()), 1.0e-10);
68          Assert.assertEquals(0.0, provider.getMaxDate().durationFrom(ephemeris.getStop()),  1.0e-10);
69          Assert.assertEquals(0.0, provider.getMinDate().durationFrom(ephemeris.getSegments().get(0).getStart()), 1.0e-10);
70          Assert.assertEquals(0.0, provider.getMaxDate().durationFrom(ephemeris.getSegments().get(1).getStop()), 1.0e-10);
71  
72          // Verify computation with data in first segment
73          Attitude attitude = provider.getAttitude(null, new AbsoluteDate("1996-11-28T22:08:04.555", TimeScalesFactory.getUTC()), null);
74          Rotation rotation = attitude.getRotation();
75          Assert.assertEquals(0.45652, rotation.getQ0(), 0.00001);
76          Assert.assertEquals(-0.84532, rotation.getQ1(), 0.00001);
77          Assert.assertEquals(0.26974, rotation.getQ2(), 0.00001);
78          Assert.assertEquals(-0.06532, rotation.getQ3(), 0.00001);
79  
80      }
81  
82      @Test
83      public void testFieldAEM() {
84          doTestFieldAEM(Decimal64Field.getInstance());
85      }
86  
87      private <T extends CalculusFieldElement<T>> void doTestFieldAEM(final Field<T> field) {
88  
89          final String ex = "/ccsds/adm/aem/AEMExample10.txt";
90          final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
91          final Aem file = new ParserBuilder().buildAemParser().parseMessage(source);
92  
93          final AemSatelliteEphemeris ephemeris = file.getSatellites().get("1996-062A");
94          final BoundedAttitudeProvider provider = ephemeris.getAttitudeProvider();
95  
96          // Verify dates
97          Assert.assertEquals(0.0, provider.getMinDate().durationFrom(ephemeris.getStart()), 1.0e-10);
98          Assert.assertEquals(0.0, provider.getMaxDate().durationFrom(ephemeris.getStop()),  1.0e-10);
99          Assert.assertEquals(0.0, provider.getMinDate().durationFrom(ephemeris.getSegments().get(0).getStart()), 1.0e-10);
100         Assert.assertEquals(0.0, provider.getMaxDate().durationFrom(ephemeris.getSegments().get(1).getStop()), 1.0e-10);
101 
102         // Verify computation with data in first segment
103         FieldAttitude<T> attitude = provider.getAttitude(null, new FieldAbsoluteDate<>(new AbsoluteDate("1996-11-28T22:08:04.555", TimeScalesFactory.getUTC()), field.getZero()), null);
104         FieldRotation<T> rotation = attitude.getRotation();
105         Assert.assertEquals(0.45652, rotation.getQ0().getReal(), 0.00001);
106         Assert.assertEquals(-0.84532, rotation.getQ1().getReal(), 0.00001);
107         Assert.assertEquals(0.26974, rotation.getQ2().getReal(), 0.00001);
108         Assert.assertEquals(-0.06532, rotation.getQ3().getReal(), 0.00001);
109 
110     }
111 
112     @Test
113     public void testOutsideBounds() throws Exception {
114 
115         final String ex = "/ccsds/adm/aem/AEMExample10.txt";
116         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
117         final Aem file = new ParserBuilder().withSimpleEOP(true).buildAemParser().parseMessage(source);
118 
119         final AemSatelliteEphemeris ephemeris = file.getSatellites().get("1996-062A");
120         final BoundedAttitudeProvider provider = ephemeris.getAttitudeProvider();
121         
122         // before bound of first attitude provider
123         try {
124             provider.getAttitude(null, provider.getMinDate().shiftedBy(-60.0), null);
125         } catch (OrekitException oe) {
126             Assert.assertEquals(OrekitMessages.UNABLE_TO_GENERATE_NEW_DATA_BEFORE, oe.getSpecifier());
127         }
128 
129         // after bound of last attitude provider
130         try {
131             provider.getAttitude(null, provider.getMaxDate().shiftedBy(60.0), null);
132         } catch (OrekitException oe) {
133             Assert.assertEquals(OrekitMessages.UNABLE_TO_GENERATE_NEW_DATA_AFTER, oe.getSpecifier());
134         }
135 
136     }
137 
138     @Test
139     public void testFieldOutsideBounds() throws Exception {
140         doTestFieldOutsideBounds(Decimal64Field.getInstance());
141     }
142 
143     private <T extends CalculusFieldElement<T>> void doTestFieldOutsideBounds(final Field<T> field) throws Exception {
144 
145         final String ex = "/ccsds/adm/aem/AEMExample10.txt";
146         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
147         final Aem file = new ParserBuilder().withSimpleEOP(true).buildAemParser().parseMessage(source);
148 
149         final AemSatelliteEphemeris ephemeris = file.getSatellites().get("1996-062A");
150         final BoundedAttitudeProvider provider = ephemeris.getAttitudeProvider();
151         
152         // before bound of first attitude provider
153         try {
154             provider.getAttitude(null, new FieldAbsoluteDate<>(provider.getMinDate(), field.getZero().subtract(60.0)), null);
155         } catch (OrekitException oe) {
156             Assert.assertEquals(OrekitMessages.UNABLE_TO_GENERATE_NEW_DATA_BEFORE, oe.getSpecifier());
157         }
158 
159         // after bound of last attitude provider
160         try {
161             provider.getAttitude(null, new FieldAbsoluteDate<>(provider.getMinDate(), field.getZero().add(60.0)), null);
162         } catch (OrekitException oe) {
163             Assert.assertEquals(OrekitMessages.UNABLE_TO_GENERATE_NEW_DATA_AFTER, oe.getSpecifier());
164         }
165 
166     }
167 
168     
169 }