1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.files.ccsds.ndm.odm.omm;
19
20 import java.util.List;
21
22 import org.orekit.data.DataContext;
23 import org.orekit.errors.OrekitException;
24 import org.orekit.errors.OrekitMessages;
25 import org.orekit.files.ccsds.ndm.NdmConstituent;
26 import org.orekit.files.ccsds.ndm.odm.KeplerianElements;
27 import org.orekit.files.ccsds.ndm.odm.OdmCommonMetadata;
28 import org.orekit.files.ccsds.ndm.odm.OdmHeader;
29 import org.orekit.files.ccsds.section.Segment;
30 import org.orekit.orbits.CartesianOrbit;
31 import org.orekit.orbits.KeplerianOrbit;
32 import org.orekit.propagation.SpacecraftState;
33 import org.orekit.propagation.analytical.tle.TLE;
34 import org.orekit.time.AbsoluteDate;
35 import org.orekit.time.TimeStamped;
36 import org.orekit.utils.IERSConventions;
37
38
39
40
41
42
43 public class Omm extends NdmConstituent<OdmHeader, Segment<OmmMetadata, OmmData>> implements TimeStamped {
44
45
46 public static final String ROOT = "omm";
47
48
49 public static final String FORMAT_VERSION_KEY = "CCSDS_OMM_VERS";
50
51
52 private static final double DEFAULT_MISSING_OPTIONAL_VALUE = 0.0;
53
54
55 private final double mu;
56
57
58
59
60
61
62
63
64 public Omm(final OdmHeader header, final List<Segment<OmmMetadata, OmmData>> segments,
65 final IERSConventions conventions, final DataContext dataContext,
66 final double mu) {
67 super(header, segments, conventions, dataContext);
68 this.mu = mu;
69 }
70
71
72
73
74 public OmmMetadata getMetadata() {
75 return getSegments().getFirst().getMetadata();
76 }
77
78
79
80
81 public OmmData getData() {
82 return getSegments().getFirst().getData();
83 }
84
85
86 @Override
87 public AbsoluteDate getDate() {
88 return getData().getKeplerianElementsBlock().getEpoch();
89 }
90
91
92
93
94 public KeplerianOrbit generateKeplerianOrbit() {
95 return getData().getKeplerianElementsBlock().generateKeplerianOrbit(getMetadata().getFrame(), mu);
96 }
97
98
99
100
101
102 public SpacecraftState generateSpacecraftState() {
103 return new SpacecraftState(generateKeplerianOrbit()).withMass(getData().getMass());
104 }
105
106
107
108
109
110 public TLE generateTLE() {
111 final OdmCommonMetadata metadata = getMetadata();
112 final KeplerianElements kep = getData().getKeplerianElementsBlock();
113 final OmmTle tle = getData().getTLEBlock().orElseThrow(() -> new OrekitException(OrekitMessages.CCSDS_MISSING_OPTIONAL_VALUE));
114 return new TLE(tle.getNoradID(), tle.getClassificationType(),
115 metadata.getLaunchYear(), metadata.getLaunchNumber(), metadata.getLaunchPiece(),
116 tle.getEphemerisType(), tle.getElementSetNumber(), kep.getEpoch(),
117 kep.getMeanMotion().orElse(DEFAULT_MISSING_OPTIONAL_VALUE),
118 tle.getMeanMotionDot().orElse(DEFAULT_MISSING_OPTIONAL_VALUE) / 2,
119 tle.getMeanMotionDotDot().orElse(DEFAULT_MISSING_OPTIONAL_VALUE) / 6,
120 kep.getE(), kep.getI(), kep.getPa(), kep.getRaan(),
121 kep.getAnomaly(), tle.getRevAtEpoch(),
122 tle.getBStar().orElse(DEFAULT_MISSING_OPTIONAL_VALUE), getDataContext().getTimeScales().getUTC());
123 }
124
125 }