/* Copyright 2002-2017 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.files.ccsds;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.hipparchus.linear.Array2DRowRealMatrix;
import org.hipparchus.util.FastMath;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.orekit.Utils;
import org.orekit.bodies.CelestialBodyFactory;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitIllegalArgumentException;
import org.orekit.errors.OrekitMessages;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.LOFType;
import org.orekit.orbits.PositionAngle;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.IERSConventions;
import org.orekit.utils.PVCoordinates;
public class OPMParserTest {
@Before
public void setUp() {
Utils.setDataRoot("regular-data");
}
@Test
public void testParseOPM1()
throws OrekitException {
// simple test for OPM file, contains p/v entries and other mandatory
// data.
final String ex = "/ccsds/OPMExample.txt";
final OPMParser parser = new OPMParser().withMu(398600e9).
withConventions(IERSConventions.IERS_2010).
withSimpleEOP(true);
final InputStream inEntry = getClass().getResourceAsStream(ex);
final OPMFile file = parser.parse(inEntry, "OPMExample.txt");
Assert.assertEquals(IERSConventions.IERS_2010, file.getConventions());
// Check Header Block;
Assert.assertEquals(2.0, file.getFormatVersion(), 1.0e-10);
Assert.assertEquals(new AbsoluteDate(1998, 11, 06, 9, 23, 57,
TimeScalesFactory.getUTC()), file
.getCreationDate());
Assert.assertEquals("JAXA", file.getOriginator());
// Check Metadata Block;
Assert.assertEquals("GODZILLA 5", file.getMetaData().getObjectName());
Assert.assertEquals("1998-057A", file.getMetaData().getObjectID());
Assert.assertEquals(1998, file.getMetaData().getLaunchYear());
Assert.assertEquals(57, file.getMetaData().getLaunchNumber());
Assert.assertEquals("A", file.getMetaData().getLaunchPiece());
Assert.assertEquals("EARTH", file.getMetaData().getCenterName());
Assert.assertTrue(file.getMetaData().getHasCreatableBody());
Assert.assertEquals(CelestialBodyFactory.getEarth(), file.getMetaData().getCenterBody());
Assert.assertEquals(CCSDSFrame.ITRF97.toString(), file.getMetaData().getFrame().getName());
Assert.assertEquals(CcsdsTimeScale.TAI, file.getMetaData().getTimeSystem());
Assert.assertFalse(file.hasCovarianceMatrix());
// Check State Vector data Block;
Assert.assertEquals(new AbsoluteDate(1998, 12, 18, 14, 28, 15.1172,
TimeScalesFactory.getTAI()), file.getEpoch());
checkPVEntry(new PVCoordinates(new Vector3D(6503514.000, 1239647.000,
-717490.000),
new Vector3D(-873.160, 8740.420,
-4191.076)),
file.getPVCoordinates());
try {
file.generateCartesianOrbit();
Assert.fail("an exception should have been thrown");
} catch(OrekitIllegalArgumentException oiae) {
Assert.assertEquals(OrekitMessages.NON_PSEUDO_INERTIAL_FRAME, oiae.getSpecifier());
Assert.assertEquals("ITRF97", oiae.getParts()[0]);
}
try {
file.generateKeplerianOrbit();
Assert.fail("an exception should have been thrown");
} catch(OrekitIllegalArgumentException oiae) {
Assert.assertEquals(OrekitMessages.NON_PSEUDO_INERTIAL_FRAME, oiae.getSpecifier());
Assert.assertEquals("ITRF97", oiae.getParts()[0]);
}
try {
file.generateSpacecraftState();
Assert.fail("an exception should have been thrown");
} catch(OrekitIllegalArgumentException oiae) {
Assert.assertEquals(OrekitMessages.NON_PSEUDO_INERTIAL_FRAME, oiae.getSpecifier());
Assert.assertEquals("ITRF97", oiae.getParts()[0]);
}
}
@Test
public void testParseOPM2()
throws OrekitException {
// simple test for OPM file, contains all mandatory information plus
// Keplerian elements, Spacecraft parameters and 2 maneuvers.
final String ex = "/ccsds/OPMExample2.txt";
final OPMParser parser = new OPMParser();
final InputStream inEntry = getClass().getResourceAsStream(ex);
final OPMFile file = parser.parse(inEntry, "OPMExample2.txt");
try {
file.getConventions();
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.CCSDS_UNKNOWN_CONVENTIONS, oe.getSpecifier());
}
// Check Header Block;
Assert.assertEquals(2.0, file.getFormatVersion(), 1.0e-10);
ArrayList<String> headerComment = new ArrayList<String>();
headerComment.add("Generated by GSOC, R. Kiehling");
headerComment.add("Current intermediate orbit IO2 and maneuver planning data");
Assert.assertEquals(headerComment, file.getHeaderComment());
Assert.assertEquals(new AbsoluteDate(2000, 06, 03, 05, 33, 00,
TimeScalesFactory.getUTC()),
file.getCreationDate());
Assert.assertEquals(file.getOriginator(), "GSOC");
// Check Metadata Block;
Assert.assertEquals("EUTELSAT W4", file.getMetaData().getObjectName());
Assert.assertEquals("2000-028A", file.getMetaData().getObjectID());
Assert.assertEquals("EARTH", file.getMetaData().getCenterName());
Assert.assertTrue(file.getMetaData().getHasCreatableBody());
Assert.assertEquals(CelestialBodyFactory.getEarth(), file.getMetaData().getCenterBody());
Assert.assertEquals(FramesFactory.getGCRF(), file.getMetaData().getFrame());
Assert.assertEquals(CcsdsTimeScale.GPS, file.getMetaData().getTimeSystem());
Assert.assertEquals(0, file.getMetaDataComment().size());
// Check Data State Vector block
ArrayList<String> epochComment = new ArrayList<String>();
epochComment.add("State Vector");
Assert.assertEquals(epochComment, file.getEpochComment());
Assert.assertEquals(new AbsoluteDate(2006, 06, 03, 00, 00, 00,
TimeScalesFactory.getGPS()),
file.getEpoch());
checkPVEntry(new PVCoordinates(new Vector3D(6655994.2, -40218575.1, -82917.7),
new Vector3D(3115.48208, 470.42605, -1.01495)),
file.getPVCoordinates());
// Check Data Keplerian Elements block
Assert.assertTrue(file.hasKeplerianElements());
ArrayList<String> keplerianElementsComment = new ArrayList<String>();
keplerianElementsComment.add("Keplerian elements");
Assert.assertEquals(keplerianElementsComment, file.getKeplerianElementsComment());
Assert.assertEquals(41399512.3, file.getA(), 1e-6);
Assert.assertEquals(0.020842611, file.getE(), 1e-10);
Assert.assertEquals(FastMath.toRadians(0.117746), file.getI(), 1e-10);
Assert.assertEquals(FastMath.toRadians(17.604721), file.getRaan(), 1e-10);
Assert.assertEquals(FastMath.toRadians(218.242943), file.getPa(), 1e-10);
Assert.assertEquals(PositionAngle.TRUE, file.getAnomalyType());
Assert.assertEquals(FastMath.toRadians(41.922339), file.getAnomaly(), 1e-10);
Assert.assertEquals(398600.4415 * 1e9, file.getMuParsed(), 1e-10);
// Check Data Spacecraft block
ArrayList<String> spacecraftComment = new ArrayList<String>();
spacecraftComment.add("Spacecraft parameters");
Assert.assertEquals(spacecraftComment, file.getSpacecraftComment());
Assert.assertEquals(1913.000, file.getMass(), 1e-10);
Assert.assertEquals(10.000, file.getSolarRadArea(), 1e-10);
Assert.assertEquals(1.300, file.getSolarRadCoeff(), 1e-10);
Assert.assertEquals(10.000, file.getDragArea(), 1e-10);
Assert.assertEquals(2.300, file.getDragCoeff(), 1e-10);
// Check Data Maneuvers block
Assert.assertTrue(file.getHasManeuver());
Assert.assertEquals(3, file.getNbManeuvers());
ArrayList<String> stateManeuverComment0 = new ArrayList<String>();
stateManeuverComment0.add("2 planned maneuvers");
stateManeuverComment0.add("First maneuver: AMF-3");
stateManeuverComment0.add("Non-impulsive, thrust direction fixed in inertial frame");
Assert.assertEquals(stateManeuverComment0, file.getManeuver(0).getComment());
Assert.assertEquals(new AbsoluteDate(2000, 06, 03, 9, 00, 34.1,
TimeScalesFactory.getGPS()),
file.getManeuvers().get(0).getEpochIgnition());
Assert.assertEquals(132.6, file.getManeuver(0).getDuration(),1e-10);
Assert.assertEquals(-18.418, file.getManeuver(0).getDeltaMass(), 1e-10);
Assert.assertNull(file.getManeuver(0).getRefLofType());
Assert.assertEquals(FramesFactory.getEME2000(), file.getManeuver(0).getRefFrame());
Assert.assertEquals(0.0,
new Vector3D(-23.25700, 16.83160, -8.93444).distance(file.getManeuver(0).getDV()),
1.0e-10);
ArrayList<String> stateManeuverComment1 = new ArrayList<String>();
stateManeuverComment1.add("Second maneuver: first station acquisition maneuver");
stateManeuverComment1.add("impulsive, thrust direction fixed in RTN frame");
Assert.assertEquals(stateManeuverComment1, file.getManeuver(1).getComment());
Assert.assertEquals(new AbsoluteDate(2000, 06, 05, 18, 59, 21,
TimeScalesFactory.getGPS()),
file.getManeuvers().get(1).getEpochIgnition());
Assert.assertEquals(0.0, file.getManeuver(1).getDuration(), 1e-10);
Assert.assertEquals(-1.469, file.getManeuver(1).getDeltaMass(), 1e-10);
Assert.assertEquals(LOFType.QSW, file.getManeuver(1).getRefLofType());
Assert.assertNull(file.getManeuver(1).getRefFrame());
Assert.assertEquals(0.0,
new Vector3D(1.015, -1.873, 0.0).distance(file.getManeuver(1).getDV()),
1.0e-10);
Assert.assertTrue(file.getManeuver(2).getComment().isEmpty());
Assert.assertEquals(new AbsoluteDate(2000, 06, 05, 18, 59, 51,
TimeScalesFactory.getGPS()),
file.getManeuvers().get(2).getEpochIgnition());
Assert.assertEquals(0.0, file.getManeuver(2).getDuration(), 1e-10);
Assert.assertEquals(-1.469, file.getManeuver(2).getDeltaMass(), 1e-10);
Assert.assertEquals(LOFType.QSW, file.getManeuver(2).getRefLofType());
Assert.assertNull(file.getManeuver(2).getRefFrame());
Assert.assertEquals(0.0,
new Vector3D(1.015, -1.873, 0.0).distance(file.getManeuver(2).getDV()),
1.0e-10);
file.generateCartesianOrbit();
file.generateKeplerianOrbit();
file.generateSpacecraftState();
}
@Test
public void testMissingIERSInitialization()
throws OrekitException, URISyntaxException {
final String name = getClass().getResource("/ccsds/OPMExample3.txt").toURI().getPath();
OPMParser parser = new OPMParser();
try {
// we explicitly forget to call parser.setConventions here
parser.parse(name);
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.CCSDS_UNKNOWN_CONVENTIONS, oe.getSpecifier());
}
}
@Test
public void testMissingMu()
throws OrekitException, URISyntaxException {
final String name = getClass().getResource("/ccsds/OPM-unknown-mu.txt").toURI().getPath();
OPMFile opm = new OPMParser().withConventions(IERSConventions.IERS_2010).parse(name);
try {
opm.generateCartesianOrbit();
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.CCSDS_UNKNOWN_GM, oe.getSpecifier());
}
}
@Test
public void testParseOPM3()
throws OrekitException, URISyntaxException {
// simple test for OPM file, contains all mandatory information plus
// Spacecraft parameters and the position/velocity Covariance Matrix.
final String name = getClass().getResource("/ccsds/OPMExample3.txt").toURI().getPath();
OPMParser parser = new OPMParser().withConventions(IERSConventions.IERS_2010);
final OPMFile file = parser.parse(name);
Assert.assertEquals(new AbsoluteDate(1998, 12, 18, 14, 28, 15.1172,
TimeScalesFactory.getGMST(IERSConventions.IERS_2010, false)),
file.getMetaData().getFrameEpoch());
Assert.assertEquals(2, file.getMetaDataComment().size());
Assert.assertEquals("GEOCENTRIC, CARTESIAN, EARTH FIXED", file.getMetaDataComment().get(0));
Assert.assertEquals("titi", file.getMetaDataComment().get(1));
Assert.assertEquals(15951238.3495, file.generateKeplerianOrbit().getA(), 0.001);
Assert.assertEquals(0.5914452565, file.generateKeplerianOrbit().getE(), 1.0e-10);
// Check Data Covariance matrix Block
ArrayList<String> dataCovMatrixComment = new ArrayList<String>();
dataCovMatrixComment.add("toto");
dataCovMatrixComment.add("tata");
Assert.assertEquals(dataCovMatrixComment, file.getCovarianceComment());
Assert.assertTrue(file.hasCovarianceMatrix());
Assert.assertEquals(file.getCovRefFrame(), FramesFactory.getTEME());
Array2DRowRealMatrix covMatrix = new Array2DRowRealMatrix(6, 6);
double[] column1 = {
333.1349476038534, 461.8927349220216,
-307.0007847730449, -0.3349365033922630,
-0.2211832501084875, -0.3041346050686871
};
double[] column2 = {
461.8927349220216, 678.2421679971363,
-422.1234189514228, -0.4686084221046758,
-0.2864186892102733, -0.4989496988610662
};
double[] column3 = {
-307.0007847730449, -422.1234189514228,
323.1931992380369, 0.2484949578400095,
0.1798098699846038, 0.3540310904497689
};
double[] column4 = {
-0.3349365033922630, -0.4686084221046758,
0.2484949578400095, 0.0004296022805587290,
0.0002608899201686016, 0.0001869263192954590
};
double[] column5 = {
-0.2211832501084875, -0.2864186892102733,
0.1798098699846038, 0.0002608899201686016,
0.0001767514756338532, 0.0001008862586240695
};
double[] column6 = {
-0.3041346050686871, -0.4989496988610662,
0.3540310904497689, 0.0001869263192954590,
0.0001008862586240695, 0.0006224444338635500
};
covMatrix.setColumn(0, column1);
covMatrix.setColumn(1, column2);
covMatrix.setColumn(2, column3);
covMatrix.setColumn(3, column4);
covMatrix.setColumn(4, column5);
covMatrix.setColumn(5, column6);
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
Assert.assertEquals(covMatrix.getEntry(i, j), file
.getCovarianceMatrix().getEntry(i, j), 1e-15);
}
}
// Check User defined Parameters Block
HashMap<String, String> userDefinedParameters = new HashMap<String, String>();
userDefinedParameters.put("USER_DEFINED_EARTH_MODEL", "WGS-84");
userDefinedParameters.put("USER_DEFINED_TOTO", "TITI");
Assert.assertEquals(userDefinedParameters,
file.getUserDefinedParameters());
}
@Test
public void testParseOPM3NoDesignator()
throws OrekitException, URISyntaxException {
final String name = getClass().getResource("/ccsds/OPM-no-designator.txt").toURI().getPath();
OPMParser parser =
new OPMParser().withConventions(IERSConventions.IERS_2010).withInternationalDesignator(2060, 666, "XYZ");
final OPMFile file = parser.parse(name);
Assert.assertEquals(new AbsoluteDate(1998, 12, 18, 14, 28, 15.1172,
TimeScalesFactory.getGMST(IERSConventions.IERS_2010, false)),
file.getMetaData().getFrameEpoch());
Assert.assertEquals(2060, file.getMetaData().getLaunchYear());
Assert.assertEquals(666, file.getMetaData().getLaunchNumber());
Assert.assertEquals("XYZ", file.getMetaData().getLaunchPiece());
}
@Test
public void testParseOPM4()
throws OrekitException {
//
final String ex = "/ccsds/OPMExample4.txt";
OPMParser parser =
new OPMParser().
withMissionReferenceDate(new AbsoluteDate()).
withConventions(IERSConventions.IERS_2010);
final InputStream inEntry = getClass().getResourceAsStream(ex);
final OPMFile file = parser.parse(inEntry, "OPMExample4.txt");
file.getMetaData().getFrame().toString();
file.getMetaData().getObjectID();
file.getEpoch();
file.getPVCoordinates();
file.getMetaData().getFrame();
}
@Test
public void testCentersAndTimeScales() throws OrekitException {
final OPMParser parser = new OPMParser().withMissionReferenceDate(new AbsoluteDate())
.withConventions(IERSConventions.IERS_2010);
OPMFile file =
parser.parse(getClass().getResourceAsStream("/ccsds/OPM-dummy-solar-system-barycenter.txt"));
Assert.assertEquals(CcsdsTimeScale.TDB, file.getMetaData().getTimeSystem());
Assert.assertEquals("solar system barycenter", file.getMetaData().getCenterBody().getName());
file = parser.parse(getClass().getResourceAsStream("/ccsds/OPM-dummy-ssb.txt"));
Assert.assertEquals(CcsdsTimeScale.TCB, file.getMetaData().getTimeSystem());
Assert.assertEquals("solar system barycenter", file.getMetaData().getCenterBody().getName());
file = parser.parse(getClass().getResourceAsStream("/ccsds/OPM-dummy-earth-barycenter.txt"));
Assert.assertEquals(CcsdsTimeScale.TDB, file.getMetaData().getTimeSystem());
Assert.assertEquals("Earth-Moon barycenter", file.getMetaData().getCenterBody().getName());
file = parser.parse(getClass().getResourceAsStream("/ccsds/OPM-dummy-earth-dash-moon-barycenter.txt"));
Assert.assertEquals(CcsdsTimeScale.TDB, file.getMetaData().getTimeSystem());
Assert.assertEquals("Earth-Moon barycenter", file.getMetaData().getCenterBody().getName());
file = parser.parse(getClass().getResourceAsStream("/ccsds/OPM-dummy-earth-moon-barycenter.txt"));
Assert.assertEquals(CcsdsTimeScale.UT1, file.getMetaData().getTimeSystem());
Assert.assertEquals("Earth-Moon barycenter", file.getMetaData().getCenterBody().getName());
file = parser.parse(getClass().getResourceAsStream("/ccsds/OPM-dummy-emb.txt"));
Assert.assertEquals(CcsdsTimeScale.TT, file.getMetaData().getTimeSystem());
Assert.assertEquals("Earth-Moon barycenter", file.getMetaData().getCenterBody().getName());
}
@Test
public void testOrbitFileInterface() throws OrekitException {
final String ex = "/ccsds/OPMExample4.txt";
final OPMParser parser = new OPMParser().withMissionReferenceDate(new AbsoluteDate())
.withConventions(IERSConventions.IERS_2010);
final InputStream inEntry = getClass().getResourceAsStream(ex);
final OPMFile file = parser.parse(inEntry, "OPMExample4.txt");
final String satId = "1998-057A";
Assert.assertEquals(satId, file.getMetaData().getObjectID());
checkPVEntry(file.getPVCoordinates(), file.getPVCoordinates());
Assert.assertEquals(file.getEpoch(), file.getEpoch());
}
private void checkPVEntry(final PVCoordinates expected,
final PVCoordinates actual) {
final Vector3D expectedPos = expected.getPosition();
final Vector3D expectedVel = expected.getVelocity();
final Vector3D actualPos = actual.getPosition();
final Vector3D actualVel = actual.getVelocity();
final double eps = 1e-12;
Assert.assertEquals(expectedPos.getX(), actualPos.getX(), eps);
Assert.assertEquals(expectedPos.getY(), actualPos.getY(), eps);
Assert.assertEquals(expectedPos.getZ(), actualPos.getZ(), eps);
Assert.assertEquals(expectedVel.getX(), actualVel.getX(), eps);
Assert.assertEquals(expectedVel.getY(), actualVel.getY(), eps);
Assert.assertEquals(expectedVel.getZ(), actualVel.getZ(), eps);
}
@Test
public void testWrongODMType() {
try {
new OPMParser().parse(getClass().getResourceAsStream("/ccsds/OMMExample.txt"), "OMMExample.txt");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.CCSDS_UNEXPECTED_KEYWORD, oe.getSpecifier());
Assert.assertEquals(1, oe.getParts()[0]);
Assert.assertEquals("OMMExample.txt", oe.getParts()[1]);
Assert.assertEquals("CCSDS_OMM_VERS = 2.0", oe.getParts()[2]);
}
}
@Test
public void testNumberFormatErrorType() {
try {
OPMParser parser = new OPMParser().withConventions(IERSConventions.IERS_2010);
parser.parse(getClass().getResourceAsStream("/ccsds/OPM-number-format-error.txt"),
"OPM-number-format-error.txt");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
Assert.assertEquals(17, oe.getParts()[0]);
Assert.assertEquals("OPM-number-format-error.txt", oe.getParts()[1]);
Assert.assertEquals("SEMI_MAJOR_AXIS = this-is-not-a-number [km]", oe.getParts()[2]);
}
}
@Test
public void testNonExistentFile() throws URISyntaxException {
final String realName = getClass().getResource("/ccsds/OPMExample.txt").toURI().getPath();
final String wrongName = realName + "xxxxx";
try {
new OPMParser().parse(wrongName);
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.UNABLE_TO_FIND_FILE, oe.getSpecifier());
Assert.assertEquals(wrongName, oe.getParts()[0]);
}
}
@Test
public void testWrongKeyword()
throws OrekitException, URISyntaxException {
// simple test for OMM file, contains p/v entries and other mandatory
// data.
final String name = getClass().getResource("/ccsds/OPM-wrong-keyword.txt").toURI().getPath();
try {
new OPMParser().withConventions(IERSConventions.IERS_2010).parse(name);
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(OrekitMessages.CCSDS_UNEXPECTED_KEYWORD, oe.getSpecifier());
Assert.assertEquals(11, ((Integer) oe.getParts()[0]).intValue());
Assert.assertTrue(((String) oe.getParts()[2]).startsWith("WRONG_KEYWORD"));
}
}
}