SpinFinder.java
- /* Copyright 2023 Luc Maisonobe
- * Licensed to CS GROUP (CS) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * CS licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package org.orekit.files.ccsds.ndm.adm;
- import org.hipparchus.geometry.euclidean.threed.Rotation;
- import org.hipparchus.geometry.euclidean.threed.RotationConvention;
- import org.hipparchus.geometry.euclidean.threed.RotationOrder;
- import org.hipparchus.geometry.euclidean.threed.Vector3D;
- import org.hipparchus.util.FastMath;
- import org.hipparchus.util.MathUtils;
- import org.orekit.attitudes.Attitude;
- import org.orekit.utils.TimeStampedAngularCoordinates;
- /** Utility to extract spin data.
- * <p>
- * In CCSDS ADM, spin axis is forced to Z. It is not the instantaneous rotation
- * rate as it also moves.
- * </p>
- * @author Luc Maisonobe
- * @since 12.0
- */
- class SpinFinder {
- /** Spin axis. */
- private final Vector3D spin;
- /** Right ascension of spin axis (rad). */
- private final double spinAlpha;
- /** declination of spin axis (rad). */
- private final double spinDelta;
- /** Spin angle. */
- private final double spinAngle;
- /** Build from attitude rotation.
- * @param attitude angular coordinates, using {@link Attitude Attitude} convention
- * (i.e. from inertial frame to spacecraft frame)
- */
- SpinFinder(final TimeStampedAngularCoordinates attitude) {
- // spin axis is forced to Z (but it is not the instantaneous rotation rate as it also moves)
- spin = attitude.getRotation().applyInverseTo(Vector3D.PLUS_K);
- spinAlpha = spin.getAlpha();
- spinDelta = spin.getDelta();
- final Rotation alignSpin = new Rotation(RotationOrder.ZXZ, RotationConvention.FRAME_TRANSFORM,
- MathUtils.SEMI_PI + spinAlpha,
- MathUtils.SEMI_PI - spinDelta,
- 0.0);
- final Rotation phasing = attitude.getRotation().applyTo(alignSpin.revert());
- spinAngle = FastMath.copySign(phasing.getAngle(),
- phasing.getAxis(RotationConvention.FRAME_TRANSFORM).getZ());
- }
- /** Get the spin axis in inertial frame.
- * @return spin axis in inertial frame
- */
- public Vector3D getSpin() {
- return spin;
- }
- /** Get the declination of spin axis.
- * @return declination of spin axis (rad)
- */
- public double getSpinDelta() {
- return spinDelta;
- }
- /** Get the right ascension of spin axis.
- * @return right ascension of spin axis (rad)
- */
- public double getSpinAlpha() {
- return spinAlpha;
- }
- /** Get the spin angle.
- * @return spin angle (rad)
- */
- public double getSpinAngle() {
- return spinAngle;
- }
- }