1   package org.orekit.estimation;
2   
3   import java.util.List;
4   import java.util.Map;
5   
6   import org.hipparchus.geometry.euclidean.threed.Vector3D;
7   import org.hipparchus.util.FastMath;
8   import org.orekit.bodies.CelestialBody;
9   import org.orekit.bodies.GeodeticPoint;
10  import org.orekit.bodies.OneAxisEllipsoid;
11  import org.orekit.estimation.measurements.GroundStation;
12  import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider;
13  import org.orekit.frames.TopocentricFrame;
14  import org.orekit.models.earth.displacement.StationDisplacement;
15  import org.orekit.orbits.CartesianOrbit;
16  import org.orekit.orbits.Orbit;
17  import org.orekit.orbits.PositionAngle;
18  import org.orekit.propagation.analytical.BrouwerLyddanePropagator;
19  import org.orekit.propagation.conversion.BrouwerLyddanePropagatorBuilder;
20  import org.orekit.time.TimeScale;
21  import org.orekit.time.UT1Scale;
22  import org.orekit.utils.IERSConventions;
23  import org.orekit.utils.PVCoordinates;
24  
25  public class BrouwerLyddaneContext implements StationDataProvider {
26  
27      public IERSConventions                        conventions;
28      public OneAxisEllipsoid                       earth;
29      public CelestialBody                          sun;
30      public CelestialBody                          moon;
31      public UnnormalizedSphericalHarmonicsProvider gravity;
32      public TimeScale                              utc;
33      public UT1Scale                               ut1;
34      public Orbit                                  initialOrbit;
35      public StationDisplacement[]                  displacements;
36      public List<GroundStation>                    stations;
37      // Stations for turn-around range
38      // Map entry = primary station
39      // Map value = secondary station associated
40      public Map<GroundStation, GroundStation>     TARstations;
41  
42      public BrouwerLyddanePropagatorBuilder createBuilder(final PositionAngle angleType, final boolean perfectStart, final double dP) {
43  
44          final Orbit startOrbit;
45          if (perfectStart) {
46              // orbit estimation will start from a perfect orbit
47              startOrbit = initialOrbit;
48          } else {
49              // orbit estimation will start from a wrong point
50              final Vector3D initialPosition = initialOrbit.getPVCoordinates().getPosition();
51              final Vector3D initialVelocity = initialOrbit.getPVCoordinates().getVelocity();
52              final Vector3D wrongPosition   = initialPosition.add(new Vector3D(1000.0, 0, 0));
53              final Vector3D wrongVelocity   = initialVelocity.add(new Vector3D(0, 0, 0.01));
54              startOrbit                     = new CartesianOrbit(new PVCoordinates(wrongPosition, wrongVelocity),
55                                                                  initialOrbit.getFrame(),
56                                                                  initialOrbit.getDate(),
57                                                                  initialOrbit.getMu());
58          }
59  
60          // Initialize builder
61          final BrouwerLyddanePropagatorBuilder propagatorBuilder =
62                          new BrouwerLyddanePropagatorBuilder(startOrbit, gravity, angleType, dP, BrouwerLyddanePropagator.M2);
63  
64          // Return
65          return propagatorBuilder;
66  
67      }
68  
69      GroundStation createStation(double latitudeInDegrees, double longitudeInDegrees,
70                                  double altitude, String name) {
71          final GeodeticPoint gp = new GeodeticPoint(FastMath.toRadians(latitudeInDegrees),
72                                                     FastMath.toRadians(longitudeInDegrees),
73                                                     altitude);
74          return new GroundStation(new TopocentricFrame(earth, gp, name),
75                                   ut1.getEOPHistory(), displacements);
76      }
77  
78      @Override
79      public List<GroundStation> getStations() {
80          return stations;
81      }
82  
83  }