1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.adm.apm;
18
19 import java.util.List;
20
21 import org.hipparchus.complex.Quaternion;
22 import org.orekit.attitudes.Attitude;
23 import org.orekit.data.DataContext;
24 import org.orekit.errors.OrekitException;
25 import org.orekit.errors.OrekitMessages;
26 import org.orekit.files.ccsds.ndm.NdmConstituent;
27 import org.orekit.files.ccsds.ndm.adm.AdmMetadata;
28 import org.orekit.files.ccsds.ndm.adm.AttitudeType;
29 import org.orekit.files.ccsds.section.Header;
30 import org.orekit.files.ccsds.section.Segment;
31 import org.orekit.frames.Frame;
32 import org.orekit.utils.IERSConventions;
33 import org.orekit.utils.PVCoordinatesProvider;
34 import org.orekit.utils.TimeStampedAngularCoordinates;
35
36
37
38
39
40
41
42 public class Apm extends NdmConstituent<Header, Segment<AdmMetadata, ApmData>> {
43
44
45 public static final String ROOT = "apm";
46
47
48 public static final String FORMAT_VERSION_KEY = "CCSDS_APM_VERS";
49
50
51
52
53
54
55
56 public Apm(final Header header, final List<Segment<AdmMetadata, ApmData>> segments,
57 final IERSConventions conventions, final DataContext dataContext) {
58 super(header, segments, conventions, dataContext);
59 }
60
61
62
63
64 public AdmMetadata getMetadata() {
65 return getSegments().get(0).getMetadata();
66 }
67
68
69
70
71 public ApmData getData() {
72 return getSegments().get(0).getData();
73 }
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 public Attitude getAttitude(final Frame frame, final PVCoordinatesProvider pvProvider) {
91
92 final ApmData data = getSegments().get(0).getData();
93 final ApmQuaternion qBlock = data.getQuaternionBlock();
94 final Euler eBlock = data.getEulerBlock();
95
96 final TimeStampedAngularCoordinates tac;
97 if (qBlock.hasRates()) {
98
99 final Quaternion q = qBlock.getQuaternion();
100 final Quaternion qDot = qBlock.getQuaternionDot();
101 tac = AttitudeType.QUATERNION_DERIVATIVE.build(true, qBlock.getEndpoints().isExternal2SpacecraftBody(),
102 null, true, qBlock.getEpoch(),
103 q.getQ0(), q.getQ1(), q.getQ2(), q.getQ3(),
104 qDot.getQ0(), qDot.getQ1(), qDot.getQ2(), qDot.getQ3());
105 } else if (eBlock != null && eBlock.hasRates()) {
106
107
108 if (!qBlock.getEndpoints().isCompatibleWith(eBlock.getEndpoints())) {
109
110
111
112 throw new OrekitException(OrekitMessages.INCOMPATIBLE_FRAMES,
113 qBlock.getEndpoints().toString(),
114 eBlock.getEndpoints().toString());
115 }
116
117 final Quaternion q = qBlock.getQuaternion();
118 final double[] rates = eBlock.getRotationRates();
119 tac = AttitudeType.QUATERNION_RATE.build(true,
120 qBlock.getEndpoints().isExternal2SpacecraftBody(),
121 eBlock.getEulerRotSeq(), eBlock.isSpacecraftBodyRate(), qBlock.getEpoch(),
122 q.getQ0(), q.getQ1(), q.getQ2(), q.getQ3(),
123 rates[0], rates[1], rates[2]);
124
125 } else {
126
127 final Quaternion q = qBlock.getQuaternion();
128 tac = AttitudeType.QUATERNION.build(true, qBlock.getEndpoints().isExternal2SpacecraftBody(),
129 null, true, qBlock.getEpoch(),
130 q.getQ0(), q.getQ1(), q.getQ2(), q.getQ3());
131 }
132
133
134 return qBlock.getEndpoints().build(frame, pvProvider, tac);
135
136 }
137
138 }