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 java.io.Serializable; 20 21 import org.hipparchus.geometry.euclidean.threed.Rotation; 22 import org.hipparchus.geometry.euclidean.threed.RotationConvention; 23 import org.hipparchus.geometry.euclidean.threed.Vector3D; 24 import org.orekit.frames.Frame; 25 import org.orekit.frames.Transform; 26 import org.orekit.time.AbsoluteDate; 27 import org.orekit.time.TimeShiftable; 28 import org.orekit.time.TimeStamped; 29 import org.orekit.utils.AngularCoordinates; 30 import org.orekit.utils.TimeStampedAngularCoordinates; 31 32 33 /** This class handles attitude definition at a given date. 34 35 * <p>This class represents the rotation between a reference frame and 36 * the satellite frame, as well as the spin of the satellite (axis and 37 * rotation rate).</p> 38 * <p> 39 * The state can be slightly shifted to close dates. This shift is based on 40 * a linear extrapolation for attitude taking the spin rate into account. 41 * It is <em>not</em> intended as a replacement for proper attitude propagation 42 * but should be sufficient for either small time shifts or coarse accuracy. 43 * </p> 44 * <p>The instance <code>Attitude</code> is guaranteed to be immutable.</p> 45 * @see org.orekit.orbits.Orbit 46 * @see AttitudeProvider 47 * @author Véronique Pommier-Maurussane 48 */ 49 50 public class Attitude 51 implements TimeStamped, TimeShiftable<Attitude>, Serializable { 52 53 /** Serializable UID. */ 54 private static final long serialVersionUID = 20140611L; 55 56 /** Reference frame. */ 57 private final Frame referenceFrame; 58 59 /** Attitude and spin. */ 60 private final TimeStampedAngularCoordinates orientation; 61 62 /** Creates a new instance. 63 * @param referenceFrame reference frame from which attitude is defined 64 * @param orientation complete orientation between reference frame and satellite frame, 65 * including rotation rate 66 */ 67 public Attitude(final Frame referenceFrame, final TimeStampedAngularCoordinates orientation) { 68 this.referenceFrame = referenceFrame; 69 this.orientation = orientation; 70 } 71 72 /** Creates a new instance. 73 * @param date date at which attitude is defined 74 * @param referenceFrame reference frame from which attitude is defined 75 * @param orientation complete orientation between reference frame and satellite frame, 76 * including rotation rate 77 */ 78 public Attitude(final AbsoluteDate date, final Frame referenceFrame, 79 final AngularCoordinates orientation) { 80 this(referenceFrame, 81 new TimeStampedAngularCoordinates(date, 82 orientation.getRotation(), 83 orientation.getRotationRate(), 84 orientation.getRotationAcceleration())); 85 } 86 87 /** Creates a new instance. 88 * @param date date at which attitude is defined 89 * @param referenceFrame reference frame from which attitude is defined 90 * @param attitude rotation between reference frame and satellite frame 91 * @param spin satellite spin (axis and velocity, in <strong>satellite</strong> frame) 92 * @param acceleration satellite rotation acceleration (in <strong>satellite</strong> frame) 93 */ 94 public Attitude(final AbsoluteDate date, final Frame referenceFrame, 95 final Rotation attitude, final Vector3D spin, final Vector3D acceleration) { 96 this(referenceFrame, new TimeStampedAngularCoordinates(date, attitude, spin, acceleration)); 97 } 98 99 /** Get a time-shifted attitude. 100 * <p> 101 * The state can be slightly shifted to close dates. This shift is based on 102 * a linear extrapolation for attitude taking the spin rate into account. 103 * It is <em>not</em> intended as a replacement for proper attitude propagation 104 * but should be sufficient for either small time shifts or coarse accuracy. 105 * </p> 106 * @param dt time shift in seconds 107 * @return a new attitude, shifted with respect to the instance (which is immutable) 108 */ 109 public Attitude shiftedBy(final double dt) { 110 return new Attitude(referenceFrame, orientation.shiftedBy(dt)); 111 } 112 113 /** Get a similar attitude with a specific reference frame. 114 * <p> 115 * If the instance reference frame is already the specified one, the instance 116 * itself is returned without any object creation. Otherwise, a new instance 117 * will be created with the specified reference frame. In this case, the 118 * required intermediate rotation and spin between the specified and the 119 * original reference frame will be inserted. 120 * </p> 121 * @param newReferenceFrame desired reference frame for attitude 122 * @return an attitude that has the same orientation and motion as the instance, 123 * but guaranteed to have the specified reference frame 124 */ 125 public Attitude withReferenceFrame(final Frame newReferenceFrame) { 126 127 if (newReferenceFrame == referenceFrame) { 128 // simple case, the instance is already compliant 129 return this; 130 } 131 132 // we have to take an intermediate rotation into account 133 final Transform t = newReferenceFrame.getTransformTo(referenceFrame, orientation.getDate()); 134 return new Attitude(orientation.getDate(), newReferenceFrame, 135 orientation.getRotation().compose(t.getRotation(), RotationConvention.VECTOR_OPERATOR), 136 orientation.getRotationRate().add(orientation.getRotation().applyTo(t.getRotationRate())), 137 orientation.getRotationAcceleration().add(orientation.getRotation().applyTo(t.getRotationAcceleration()))); 138 139 } 140 141 /** Get the date of attitude parameters. 142 * @return date of the attitude parameters 143 */ 144 public AbsoluteDate getDate() { 145 return orientation.getDate(); 146 } 147 148 /** Get the reference frame. 149 * @return referenceFrame reference frame from which attitude is defined. 150 */ 151 public Frame getReferenceFrame() { 152 return referenceFrame; 153 } 154 155 /** Get the complete orientation including spin. 156 * @return complete orientation including spin 157 * @see #getRotation() 158 * @see #getSpin() 159 */ 160 public TimeStampedAngularCoordinates getOrientation() { 161 return orientation; 162 } 163 164 /** Get the attitude rotation. 165 * @return attitude satellite rotation from reference frame. 166 * @see #getOrientation() 167 * @see #getSpin() 168 */ 169 public Rotation getRotation() { 170 return orientation.getRotation(); 171 } 172 173 /** Get the satellite spin. 174 * <p>The spin vector is defined in <strong>satellite</strong> frame.</p> 175 * @return spin satellite spin (axis and velocity). 176 * @see #getOrientation() 177 * @see #getRotation() 178 */ 179 public Vector3D getSpin() { 180 return orientation.getRotationRate(); 181 } 182 183 /** Get the satellite rotation acceleration. 184 * <p>The rotation acceleration. vector is defined in <strong>satellite</strong> frame.</p> 185 * @return rotation acceleration 186 * @see #getOrientation() 187 * @see #getRotation() 188 */ 189 public Vector3D getRotationAcceleration() { 190 return orientation.getRotationAcceleration(); 191 } 192 193 }