Skip to content
Snippets Groups Projects
OrbitModel.java 10.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • /* Copyright 2013-2016 CS Systèmes d'Information
     * Licensed to CS Systèmes d'Information (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 AffinagePleiades;
    
    
    import org.hipparchus.geometry.euclidean.threed.Rotation;
    import org.hipparchus.geometry.euclidean.threed.Vector3D;
    import org.hipparchus.ode.nonstiff.DormandPrince853Integrator;
    import org.hipparchus.util.FastMath;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.orekit.attitudes.AttitudeProvider;
    import org.orekit.attitudes.NadirPointing;
    import org.orekit.attitudes.YawCompensation;
    import org.orekit.bodies.BodyShape;
    import org.orekit.bodies.CelestialBodyFactory;
    import org.orekit.bodies.OneAxisEllipsoid;
    import org.orekit.errors.OrekitException;
    import org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel;
    import org.orekit.forces.gravity.ThirdBodyAttraction;
    import org.orekit.forces.gravity.potential.GravityFieldFactory;
    import org.orekit.forces.gravity.potential.NormalizedSphericalHarmonicsProvider;
    import org.orekit.frames.Frame;
    import org.orekit.frames.FramesFactory;
    import org.orekit.frames.Transform;
    import org.orekit.orbits.CircularOrbit;
    import org.orekit.orbits.Orbit;
    import org.orekit.orbits.OrbitType;
    import org.orekit.orbits.PositionAngle;
    import org.orekit.propagation.Propagator;
    import org.orekit.propagation.SpacecraftState;
    import org.orekit.propagation.analytical.KeplerianPropagator;
    import org.orekit.propagation.numerical.NumericalPropagator;
    import org.orekit.propagation.sampling.OrekitFixedStepHandler;
    import org.orekit.time.AbsoluteDate;
    import org.orekit.time.TimeScale;
    import org.orekit.utils.Constants;
    import org.orekit.utils.IERSConventions;
    import org.orekit.utils.PVCoordinates;
    import org.orekit.utils.TimeStampedAngularCoordinates;
    import org.orekit.utils.TimeStampedPVCoordinates;
    
    
    /**
     * Orbit Model class to generate PV and Q 
     * @author jguinet
     *
     */
    
    public class OrbitModel {
    
        public static void addSatellitePV(TimeScale gps, Frame eme2000, Frame itrf,
                                          ArrayList<TimeStampedPVCoordinates> satellitePVList,
                                          String absDate,
                                          double px, double py, double pz, double vx, double vy, double vz)
            throws OrekitException {
            AbsoluteDate ephemerisDate = new AbsoluteDate(absDate, gps);
            Vector3D position = new Vector3D(px, py, pz);
            Vector3D velocity = new Vector3D(vx, vy, vz);
            PVCoordinates pvITRF = new PVCoordinates(position, velocity);
            Transform transform = itrf.getTransformTo(eme2000, ephemerisDate);
            Vector3D pEME2000 = transform.transformPosition(pvITRF.getPosition());
            Vector3D vEME2000 = transform.transformVector(pvITRF.getVelocity());
            satellitePVList.add(new TimeStampedPVCoordinates(ephemerisDate, pEME2000, vEME2000, Vector3D.ZERO));
        }
    
        public void addSatelliteQ(TimeScale gps, ArrayList<TimeStampedAngularCoordinates> satelliteQList,
                                         String absDate, double q0, double q1, double q2, double q3) {
            AbsoluteDate attitudeDate = new AbsoluteDate(absDate, gps);
            Rotation rotation = new Rotation(q0, q1, q2, q3, true);
            TimeStampedAngularCoordinates pair =
                    new TimeStampedAngularCoordinates(attitudeDate, rotation, Vector3D.ZERO, Vector3D.ZERO);
            satelliteQList.add(pair);
        }
    
        public  BodyShape createEarth()
           throws OrekitException {
            return new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
                                        Constants.WGS84_EARTH_FLATTENING,
                                        FramesFactory.getITRF(IERSConventions.IERS_2010, true));
        }
    
        public NormalizedSphericalHarmonicsProvider createGravityField()
            throws OrekitException {
            return GravityFieldFactory.getNormalizedProvider(12, 12);
        }
    
        public Orbit createOrbit(double mu,AbsoluteDate date)
            throws OrekitException {
            // the following orbital parameters have been computed using
            // Orekit tutorial about phasing, using the following configuration:
            //
            //  orbit.date                          = 2012-01-01T00:00:00.000
            //  phasing.orbits.number               = 143
            //  phasing.days.number                 =  10
            //  sun.synchronous.reference.latitude  = 0
            //  sun.synchronous.reference.ascending = false
            //  sun.synchronous.mean.solar.time     = 10:30:00
            //  gravity.field.degree                = 12
            //  gravity.field.order                 = 12
            
            Frame eme2000 = FramesFactory.getEME2000();
            //return new CircularOrbit(7173352.811913891,
            return new CircularOrbit(694000.0 + Constants.WGS84_EARTH_EQUATORIAL_RADIUS,//ajouter Rayon 
                                     -4.029194321683225E-4, 0.0013530362644647786,
                                     FastMath.toRadians(98.2), //pleiades inclinaison 98.2
    
    Jonathan Guinet's avatar
    Jonathan Guinet committed
                                     //FastMath.toRadians(-86.47),
                                     FastMath.toRadians(-86.47+180),
                                     FastMath.toRadians(135.9+0.3), PositionAngle.TRUE,
    
                                     eme2000, date, mu);
        }
    
        public Propagator createPropagator(BodyShape earth,
                                                  NormalizedSphericalHarmonicsProvider gravityField,
                                                  Orbit orbit)
            throws OrekitException {
    
            AttitudeProvider yawCompensation = new YawCompensation(orbit.getFrame(), new NadirPointing(orbit.getFrame(), earth));
            SpacecraftState state = new SpacecraftState(orbit,
                                                        yawCompensation.getAttitude(orbit,
                                                                                    orbit.getDate(),
                                                                                    orbit.getFrame()),
                                                        1180.0);
    
            // numerical model for improving orbit
            OrbitType type = OrbitType.CIRCULAR;
            double[][] tolerances = NumericalPropagator.tolerances(0.1, orbit, type);
            DormandPrince853Integrator integrator =
                    new DormandPrince853Integrator(1.0e-4 * orbit.getKeplerianPeriod(),
                                                   1.0e-1 * orbit.getKeplerianPeriod(),
                                                   tolerances[0], tolerances[1]);
            integrator.setInitialStepSize(1.0e-2 * orbit.getKeplerianPeriod());
            NumericalPropagator numericalPropagator = new NumericalPropagator(integrator);
            numericalPropagator.addForceModel(new HolmesFeatherstoneAttractionModel(earth.getBodyFrame(), gravityField));
            numericalPropagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getSun()));
            numericalPropagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getMoon()));
            numericalPropagator.setOrbitType(type);
            numericalPropagator.setInitialState(state);
            numericalPropagator.setAttitudeProvider(yawCompensation);
            return numericalPropagator;
    
        }
    
    
        public List<TimeStampedPVCoordinates> orbitToPV(Orbit orbit, BodyShape earth,
                                                         AbsoluteDate minDate, AbsoluteDate maxDate,
                                                         double step)
            throws OrekitException {
            Propagator propagator = new KeplerianPropagator(orbit);
            propagator.setAttitudeProvider(new YawCompensation(orbit.getFrame(), new NadirPointing(orbit.getFrame(), earth)));
            propagator.propagate(minDate);
            final List<TimeStampedPVCoordinates> list = new ArrayList<TimeStampedPVCoordinates>();
            propagator.setMasterMode(step, new OrekitFixedStepHandler() {
                public void init(SpacecraftState s0, AbsoluteDate t) {
                }   
                public void handleStep(SpacecraftState currentState, boolean isLast) {
                    list.add(new TimeStampedPVCoordinates(currentState.getDate(),
                                                          currentState.getPVCoordinates().getPosition(),
                                                          currentState.getPVCoordinates().getVelocity(),
                                                          Vector3D.ZERO));
                }
            });
            propagator.propagate(maxDate);
            return list;
        }
    
        public List<TimeStampedAngularCoordinates> orbitToQ(Orbit orbit, BodyShape earth,
                                                             AbsoluteDate minDate, AbsoluteDate maxDate,
                                                             double step)
            throws OrekitException {
            Propagator propagator = new KeplerianPropagator(orbit);
            propagator.setAttitudeProvider(new YawCompensation(orbit.getFrame(), new NadirPointing(orbit.getFrame(), earth)));
            propagator.propagate(minDate);
            final List<TimeStampedAngularCoordinates> list = new ArrayList<TimeStampedAngularCoordinates>();
            propagator.setMasterMode(step, new OrekitFixedStepHandler() {
                public void init(SpacecraftState s0, AbsoluteDate t) {
                }   
                public void handleStep(SpacecraftState currentState, boolean isLast) {
                    list.add(new TimeStampedAngularCoordinates(currentState.getDate(),
                                                               currentState.getAttitude().getRotation(),
                                                               Vector3D.ZERO, Vector3D.ZERO));
                }
            });
            propagator.propagate(maxDate);
            return list;
        }
    
    }