1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation;
18
19 import org.hipparchus.geometry.euclidean.threed.Vector3D;
20 import org.hipparchus.util.FastMath;
21 import org.orekit.bodies.CelestialBody;
22 import org.orekit.bodies.GeodeticPoint;
23 import org.orekit.bodies.OneAxisEllipsoid;
24 import org.orekit.estimation.measurements.GroundStation;
25 import org.orekit.forces.drag.DragSensitive;
26 import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider;
27 import org.orekit.forces.radiation.RadiationSensitive;
28 import org.orekit.frames.TopocentricFrame;
29 import org.orekit.models.earth.displacement.StationDisplacement;
30 import org.orekit.orbits.EquinoctialOrbit;
31 import org.orekit.propagation.PropagationType;
32 import org.orekit.propagation.conversion.DSSTPropagatorBuilder;
33 import org.orekit.propagation.conversion.DormandPrince853IntegratorBuilder;
34 import org.orekit.time.TimeScale;
35 import org.orekit.time.UT1Scale;
36 import org.orekit.utils.IERSConventions;
37 import org.orekit.utils.PVCoordinates;
38
39 import java.util.List;
40 import java.util.Map;
41
42 public class DSSTContext implements StationDataProvider {
43
44 public IERSConventions conventions;
45 public OneAxisEllipsoid earth;
46 public CelestialBody sun;
47 public CelestialBody moon;
48 public RadiationSensitive radiationSensitive;
49 public DragSensitive dragSensitive;
50 public UnnormalizedSphericalHarmonicsProvider gravity;
51 public TimeScale utc;
52 public UT1Scale ut1;
53 public EquinoctialOrbit initialOrbit;
54 public StationDisplacement[] displacements;
55 public List<GroundStation> stations;
56
57
58
59 public Map<GroundStation, GroundStation> TARstations;
60
61
62
63
64
65 public DSSTPropagatorBuilder createBuilder(final boolean perfectStart,
66 final double minStep, final double maxStep, final double dP,
67 final DSSTForce... forces) {
68 return createBuilder(PropagationType.MEAN, PropagationType.MEAN, perfectStart, minStep, maxStep, dP, forces);
69 }
70
71 public DSSTPropagatorBuilder createBuilder(final PropagationType propagationType,
72 final PropagationType stateType, final boolean perfectStart,
73 final double minStep, final double maxStep, final double dP,
74 final DSSTForce... forces) {
75
76 final EquinoctialOrbit startOrbit;
77 if (perfectStart) {
78
79 startOrbit = initialOrbit;
80 } else {
81
82 final Vector3D initialPosition = initialOrbit.getPosition();
83 final Vector3D initialVelocity = initialOrbit.getPVCoordinates().getVelocity();
84 final Vector3D wrongPosition = initialPosition.add(new Vector3D(1000.0, 0, 0));
85 final Vector3D wrongVelocity = initialVelocity.add(new Vector3D(0, 0, 0.01));
86 startOrbit = new EquinoctialOrbit(new PVCoordinates(wrongPosition, wrongVelocity),
87 initialOrbit.getFrame(),
88 initialOrbit.getDate(),
89 initialOrbit.getMu());
90 }
91 final DSSTPropagatorBuilder propagatorBuilder =
92 new DSSTPropagatorBuilder(startOrbit,
93 new DormandPrince853IntegratorBuilder(minStep, maxStep, dP),
94 dP,
95 propagationType, stateType);
96 for (DSSTForce force : forces) {
97 propagatorBuilder.addForceModel(force.getForceModel(this));
98 }
99
100 return propagatorBuilder;
101
102 }
103
104 GroundStation createStation(double latitudeInDegrees, double longitudeInDegrees,
105 double altitude, String name) {
106 final GeodeticPoint gp = new GeodeticPoint(FastMath.toRadians(latitudeInDegrees),
107 FastMath.toRadians(longitudeInDegrees),
108 altitude);
109 return new GroundStation(new TopocentricFrame(earth, gp, name), ut1.getEOPHistory(), displacements);
110 }
111
112 @Override
113 public List<GroundStation> getStations() {
114 return stations;
115 }
116
117 }