1   /* Copyright 2002-2024 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 org.hipparchus.Field;
20  import org.hipparchus.CalculusFieldElement;
21  import org.orekit.frames.Frame;
22  import org.orekit.time.AbsoluteDate;
23  import org.orekit.time.FieldAbsoluteDate;
24  import org.orekit.utils.FieldPVCoordinatesProvider;
25  import org.orekit.utils.PVCoordinatesProvider;
26  
27  
28  /**
29   * This class handles a simple attitude provider at constant rate around a fixed axis.
30   * <p>This attitude provider is a simple linear extrapolation from an initial
31   * orientation, a rotation axis and a rotation rate. All this elements can be
32   * specified as a simple {@link Attitude reference attitude}.</p>
33   * <p>Instances of this class are guaranteed to be immutable.</p>
34   * @author Luc Maisonobe
35   */
36  public class FixedRate implements AttitudeProvider {
37  
38      /** Reference attitude.  */
39      private final Attitude referenceAttitude;
40  
41      /** Creates a new instance.
42       * @param referenceAttitude attitude at reference date
43       */
44      public FixedRate(final Attitude referenceAttitude) {
45          this.referenceAttitude = referenceAttitude;
46      }
47  
48      /** {@inheritDoc} */
49      public Attitude getAttitude(final PVCoordinatesProvider pvProv,
50                                  final AbsoluteDate date, final Frame frame) {
51          final double timeShift = date.durationFrom(referenceAttitude.getDate());
52          final Attitude shifted = referenceAttitude.shiftedBy(timeShift);
53          return shifted.withReferenceFrame(frame);
54      }
55  
56      /** {@inheritDoc} */
57      public <T extends CalculusFieldElement<T>> FieldAttitude<T> getAttitude(final FieldPVCoordinatesProvider<T> pvProv,
58                                                                          final FieldAbsoluteDate<T> date,
59                                                                          final Frame frame) {
60          final Field<T> field = date.getField();
61          final T timeShift = date.durationFrom(referenceAttitude.getDate());
62          final FieldAttitude<T> shifted = new FieldAttitude<>(field, referenceAttitude).shiftedBy(timeShift);
63          return shifted.withReferenceFrame(frame);
64      }
65  
66      /** Get the reference attitude.
67       * @return reference attitude
68       */
69      public Attitude getReferenceAttitude() {
70          return referenceAttitude;
71      }
72  
73  }