1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.adm.aem;
18
19 import java.io.ByteArrayInputStream;
20 import java.nio.charset.StandardCharsets;
21 import java.util.Collections;
22 import java.util.List;
23
24 import org.hipparchus.geometry.euclidean.threed.Rotation;
25 import org.hipparchus.geometry.euclidean.threed.Vector3D;
26 import org.junit.jupiter.api.Assertions;
27 import org.junit.jupiter.api.BeforeEach;
28 import org.junit.jupiter.api.Test;
29 import org.orekit.Utils;
30 import org.orekit.attitudes.AttitudeProvider;
31 import org.orekit.attitudes.FrameAlignedProvider;
32 import org.orekit.data.DataSource;
33 import org.orekit.files.ccsds.definitions.FrameFacade;
34 import org.orekit.files.ccsds.definitions.TimeSystem;
35 import org.orekit.files.ccsds.ndm.ParserBuilder;
36 import org.orekit.files.ccsds.ndm.WriterBuilder;
37 import org.orekit.files.ccsds.ndm.adm.AdmHeader;
38 import org.orekit.files.ccsds.ndm.adm.AttitudeType;
39 import org.orekit.files.ccsds.utils.generation.KvnGenerator;
40 import org.orekit.frames.FramesFactory;
41 import org.orekit.orbits.CartesianOrbit;
42 import org.orekit.propagation.analytical.KeplerianPropagator;
43 import org.orekit.time.AbsoluteDate;
44 import org.orekit.utils.Constants;
45 import org.orekit.utils.PVCoordinates;
46 import org.orekit.utils.TimeStampedAngularCoordinates;
47
48
49 public class StreamingAemWriterTest {
50
51 private static final double QUATERNION_PRECISION = 1e-5;
52 private static final double DATE_PRECISION = 1e-3;
53
54
55 @BeforeEach
56 public void setUp() {
57 Utils.setDataRoot("regular-data");
58 }
59
60
61
62
63
64 @Test
65 public void testWriteAemStepHandler() throws Exception {
66
67
68 List<String> files = Collections.singletonList("/ccsds/adm/aem/AEMExample07.txt");
69 for (final String ex : files) {
70
71
72 final DataSource source0 = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
73 AemParser parser = new ParserBuilder().buildAemParser();
74 Aem aem = parser.parseMessage(source0);
75
76
77 AemSegment ephemerisBlock = aem.getSegments().get(0);
78
79
80 String originator = aem.getHeader().getOriginator();
81 String objectName = ephemerisBlock.getMetadata().getObjectName();
82 String objectID = ephemerisBlock.getMetadata().getObjectID();
83 String headerCmt = aem.getHeader().getComments().get(0);
84 FrameFacade frameA = ephemerisBlock.getMetadata().getEndpoints().getFrameA();
85 FrameFacade frameB = ephemerisBlock.getMetadata().getEndpoints().getFrameB();
86 boolean a2b = ephemerisBlock.getMetadata().getEndpoints().isA2b();
87 AttitudeType attitudeType = ephemerisBlock.getMetadata().getAttitudeType();
88 boolean isFirst = ephemerisBlock.getMetadata().isFirst();
89
90
91
92 AdmHeader header = new AdmHeader();
93 header.setOriginator(originator);
94 header.addComment(headerCmt);
95
96 AemMetadata metadata = new AemMetadata(1);
97 metadata.setTimeSystem(TimeSystem.UTC);
98 metadata.setObjectID(objectID);
99 metadata.setObjectName(objectName);
100 metadata.setAttitudeType(attitudeType);
101 metadata.setIsFirst(isFirst);
102 metadata.getEndpoints().setFrameA(frameA);
103 metadata.getEndpoints().setFrameB(frameB);
104 metadata.getEndpoints().setA2b(a2b);
105 metadata.setStartTime(AbsoluteDate.PAST_INFINITY);
106 metadata.setStopTime(AbsoluteDate.FUTURE_INFINITY);
107
108 StringBuilder buffer = new StringBuilder();
109 StreamingAemWriter writer =
110 new StreamingAemWriter(new KvnGenerator(buffer, AemWriter.KVN_PADDING_WIDTH, ex + "-new",
111 Constants.JULIAN_DAY, 60),
112 new WriterBuilder(). buildAemWriter(),
113 header, metadata);
114
115
116
117 StreamingAemWriter.SegmentWriter segment = writer.newSegment();
118 KeplerianPropagator propagator =
119 createPropagator(ephemerisBlock.getStart(),
120 new FrameAlignedProvider(ephemerisBlock.getAngularCoordinates().get(0).getRotation(),
121 FramesFactory.getEME2000()));
122
123
124
125 double step = 10.0;
126 propagator.setStepHandler(step, segment);
127 propagator.propagate(ephemerisBlock.getStart().shiftedBy(60.0));
128 writer.close();
129
130
131 final DataSource source1 = new DataSource("buffer",
132 () -> new ByteArrayInputStream(buffer.toString().getBytes(StandardCharsets.UTF_8)));
133 Aem generatedAem = parser.parseMessage(source1);
134
135
136 Assertions.assertEquals(1, generatedAem.getSegments().size());
137 AemSegment attitudeBlocks = generatedAem.getSegments().get(0);
138
139 List<? extends TimeStampedAngularCoordinates> ac = attitudeBlocks.getAngularCoordinates();
140 Assertions.assertEquals(7, ac.size());
141
142
143 for (int i = 0; i < 7; i++) {
144 Assertions.assertEquals(step * i, ac.get(i).getDate().durationFrom(ephemerisBlock.getStart()), DATE_PRECISION);
145 Rotation rot = ac.get(i).getRotation();
146 Assertions.assertEquals(0.68427, rot.getQ0(), QUATERNION_PRECISION);
147 Assertions.assertEquals(0.56748, rot.getQ1(), QUATERNION_PRECISION);
148 Assertions.assertEquals(0.03146, rot.getQ2(), QUATERNION_PRECISION);
149 Assertions.assertEquals(0.45689, rot.getQ3(), QUATERNION_PRECISION);
150 }
151
152 }
153
154 }
155
156
157
158
159
160
161
162 private KeplerianPropagator createPropagator(AbsoluteDate date,
163 AttitudeProvider attitudeProv) {
164 Vector3D position = new Vector3D(-29536113.0, 30329259.0, -100125.0);
165 Vector3D velocity = new Vector3D(-2194.0, -2141.0, -8.0);
166 PVCoordinates pvCoordinates = new PVCoordinates( position, velocity);
167 double mu = 3.9860047e14;
168
169 CartesianOrbit p = new CartesianOrbit(pvCoordinates, FramesFactory.getEME2000(), date, mu);
170
171 return new KeplerianPropagator(p, attitudeProv);
172 }
173
174 }