OPMFile.java
/* Copyright 2002-2016 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.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
import org.orekit.errors.OrekitException;
import org.orekit.files.general.OrbitFile;
import org.orekit.files.general.SatelliteTimeCoordinate;
import org.orekit.frames.Frame;
import org.orekit.frames.LOFType;
import org.orekit.orbits.CartesianOrbit;
import org.orekit.orbits.KeplerianOrbit;
import org.orekit.propagation.SpacecraftState;
import org.orekit.time.AbsoluteDate;
import org.orekit.utils.PVCoordinates;
/** This class gathers the informations present in the Orbital Parameter Message (OPM), and contains
* methods to generate {@link CartesianOrbit}, {@link KeplerianOrbit} or {@link SpacecraftState}.
* @author sports
* @since 6.1
*/
public class OPMFile extends OGMFile {
/** Meta-data. */
private final ODMMetaData metaData;
/** Position vector (m). */
private Vector3D position;
/** Velocity vector (m/s. */
private Vector3D velocity;
/** Maneuvers. */
private List<Maneuver> maneuvers;
/** Create a new OPM file object. */
OPMFile() {
metaData = new ODMMetaData(this);
maneuvers = new ArrayList<Maneuver>();
};
/** Get the meta data.
* @return meta data
*/
@Override
public ODMMetaData getMetaData() {
return metaData;
}
/** Get position vector.
* @return the position vector
*/
public Vector3D getPosition() {
return position;
}
/** Set position vector.
* @param position the position vector to be set
*/
void setPosition(final Vector3D position) {
this.position = position;
}
/** Get velocity vector.
* @return the velocity vector
*/
public Vector3D getVelocity() {
return velocity;
}
/** Set velocity vector.
* @param velocity the velocity vector to be set
*/
void setVelocity(final Vector3D velocity) {
this.velocity = velocity;
}
/** Get the number of maneuvers present in the OPM.
* @return the number of maneuvers
*/
public int getNbManeuvers() {
return maneuvers.size();
}
/** Get a list of all maneuvers.
* @return unmodifiable list of all maneuvers.
*/
public List<Maneuver> getManeuvers() {
return Collections.unmodifiableList(maneuvers);
}
/** Get a maneuver.
* @param index maneuver index, counting from 0
* @return maneuver
*/
public Maneuver getManeuver(final int index) {
return maneuvers.get(index);
}
/** Add a maneuver.
* @param maneuver maneuver to be set
*/
void addManeuver(final Maneuver maneuver) {
maneuvers.add(maneuver);
}
/** Get boolean testing whether the OPM contains at least one maneuver.
* @return true if OPM contains at least one maneuver
* false otherwise */
public boolean getHasManeuver() {
return !maneuvers.isEmpty();
}
/** Get the comment for meta-data.
* @return comment for meta-data
*/
public List<String> getMetaDataComment() {
return metaData.getComment();
}
/** {@inheritDoc} */
@Override
public List<SatelliteTimeCoordinate> getSatelliteCoordinates(final String satId) {
if (getMetaData().getObjectID().equals(satId)) {
return Arrays.asList(new SatelliteTimeCoordinate(getEpoch(), getPVCoordinates()));
} else {
return Collections.emptyList();
}
}
/** Get the {@link SatelliteTimeCoordinate} of the OPM.
* @return the {@link SatelliteTimeCoordinate}
*/
public SatelliteTimeCoordinate getSatelliteCoordinatesOPM() {
return new SatelliteTimeCoordinate(getEpoch(), getPVCoordinates());
}
/** Get the position/velocity coordinates contained in the OPM.
* @return the position/velocity coordinates contained in the OPM
*/
public PVCoordinates getPVCoordinates() {
return new PVCoordinates(getPosition(), getVelocity());
}
/** {@inheritDoc} */
@Override
public String getCoordinateSystem() {
return metaData.getFrame().toString();
}
/** {@inheritDoc} */
@Override
public OrbitFile.TimeSystem getTimeSystem() {
return metaData.getTimeSystem();
}
/**
* Generate a {@link CartesianOrbit} from the OPM state vector data. If the reference frame is not
* pseudo-inertial, an exception is raised.
* @return the {@link CartesianOrbit} generated from the OPM information
* @exception OrekitException if the reference frame is not pseudo-inertial or if the central body
* gravitational coefficient cannot be retrieved from the OPM
*/
public CartesianOrbit generateCartesianOrbit()
throws OrekitException {
setMuUsed();
return new CartesianOrbit(getPVCoordinates(), metaData.getFrame(), getEpoch(), getMuUsed());
}
/** Generate a {@link KeplerianOrbit} from the OPM keplerian elements if hasKeplerianElements is true,
* or from the state vector data otherwise.
* If the reference frame is not pseudo-inertial, an exception is raised.
* @return the {@link KeplerianOrbit} generated from the OPM information
* @exception OrekitException if the reference frame is not pseudo-inertial or if the central body
* gravitational coefficient cannot be retrieved from the OPM
*/
public KeplerianOrbit generateKeplerianOrbit() throws OrekitException {
setMuUsed();
if (hasKeplerianElements()) {
return new KeplerianOrbit(getA(), getE(), getI(), getPa(), getRaan(), getAnomaly(),
getAnomalyType(), metaData.getFrame(), getEpoch(), getMuUsed());
} else {
return new KeplerianOrbit(getPVCoordinates(), metaData.getFrame(), getEpoch(), getMuUsed());
}
}
/** Generate spacecraft state from the {@link CartesianOrbit} generated by generateCartesianOrbit.
* Raises an exception if OPM doesn't contain spacecraft mass information.
* @return the spacecraft state of the OPM
* @exception OrekitException if there is no spacecraft mass associated with the OPM
*/
public SpacecraftState generateSpacecraftState()
throws OrekitException {
return new SpacecraftState(generateCartesianOrbit(), getMass());
}
/** Maneuver in an OPM file.
*/
public static class Maneuver {
/** Epoch ignition. */
private AbsoluteDate epochIgnition;
/** Coordinate system for velocity increment vector, for Local Orbital Frames. */
private LOFType refLofType;
/** Coordinate system for velocity increment vector, for absolute frames. */
private Frame refFrame;
/** Duration (value is 0 for impulsive maneuver). */
private double duration;
/** Mass change during maneuver (value is < 0). */
private double deltaMass;
/** Velocity increment. */
private Vector3D dV;
/** Maneuvers data comment, each string in the list corresponds to one line of comment. */
private List<String> comment;
/** Simple constructor.
*/
public Maneuver() {
this.dV = Vector3D.ZERO;
this.comment = Collections.emptyList();
}
/** Get epoch ignition.
* @return epoch ignition
*/
public AbsoluteDate getEpochIgnition() {
return epochIgnition;
}
/** Set epoch ignition.
* @param epochIgnition epoch ignition
*/
void setEpochIgnition(final AbsoluteDate epochIgnition) {
this.epochIgnition = epochIgnition;
}
/** Get coordinate system for velocity increment vector, for Local Orbital Frames.
* @return coordinate system for velocity increment vector, for Local Orbital Frames
*/
public LOFType getRefLofType() {
return refLofType;
}
/** Set coordinate system for velocity increment vector, for Local Orbital Frames.
* @param refLofType coordinate system for velocity increment vector, for Local Orbital Frames
*/
public void setRefLofType(final LOFType refLofType) {
this.refLofType = refLofType;
this.refFrame = null;
}
/** Get Coordinate system for velocity increment vector, for absolute frames.
* @return coordinate system for velocity increment vector, for absolute frames
*/
public Frame getRefFrame() {
return refFrame;
}
/** Set Coordinate system for velocity increment vector, for absolute frames.
* @param refFrame coordinate system for velocity increment vector, for absolute frames
*/
public void setRefFrame(final Frame refFrame) {
this.refLofType = null;
this.refFrame = refFrame;
}
/** Get duration (value is 0 for impulsive maneuver).
* @return duration (value is 0 for impulsive maneuver)
*/
public double getDuration() {
return duration;
}
/** Set duration (value is 0 for impulsive maneuver).
* @param duration duration (value is 0 for impulsive maneuver)
*/
public void setDuration(final double duration) {
this.duration = duration;
}
/** Get mass change during maneuver (value is < 0).
* @return mass change during maneuver (value is < 0)
*/
public double getDeltaMass() {
return deltaMass;
}
/** Set mass change during maneuver (value is < 0).
* @param deltaMass mass change during maneuver (value is < 0)
*/
public void setDeltaMass(final double deltaMass) {
this.deltaMass = deltaMass;
}
/** Get velocity increment.
* @return velocity increment
*/
public Vector3D getDV() {
return dV;
}
/** Set velocity increment.
* @param dV velocity increment
*/
public void setdV(final Vector3D dV) {
this.dV = dV;
}
/** Get the maneuvers data comment, each string in the list corresponds to one line of comment.
* @return maneuvers data comment, each string in the list corresponds to one line of comment
*/
public List<String> getComment() {
return Collections.unmodifiableList(comment);
}
/** Set the maneuvers data comment, each string in the list corresponds to one line of comment.
* @param comment maneuvers data comment, each string in the list corresponds to one line of comment
*/
public void setComment(final List<String> comment) {
this.comment = new ArrayList<String>(comment);
}
}
}