OrbitPhysicalProperties.java
/* Copyright 2002-2024 CS GROUP
* Licensed to CS GROUP (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.ndm.odm.ocm;
import java.util.ArrayList;
import java.util.List;
import org.hipparchus.linear.MatrixUtils;
import org.hipparchus.linear.RealMatrix;
import org.orekit.files.ccsds.ndm.CommonPhysicalProperties;
import org.orekit.time.AbsoluteDate;
import org.orekit.utils.Constants;
/** Spacecraft physical properties.
* @author Luc Maisonobe
* @since 11.0
*/
public class OrbitPhysicalProperties extends CommonPhysicalProperties {
/** Satellite manufacturer name. */
private String manufacturer;
/** Bus model name. */
private String busModel;
/** Other space objects this object is docked to. */
private List<String> dockedWith;
/** Attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB. */
private double dragConstantArea;
/** Nominal drag coefficient. */
private double dragCoefficient;
/** Drag coefficient 1σ uncertainty. */
private double dragUncertainty;
/** Total mass at beginning of life. */
private double initialWetMass;
/** Total mass at T₀. */
private double wetMass;
/** Mass without propellant. */
private double dryMass;
/** Minimum cross-sectional area for collision probability estimation purposes. */
private double minAreaForCollisionProbability;
/** Maximum cross-sectional area for collision probability estimation purposes. */
private double maxAreaForCollisionProbability;
/** Typical (50th percentile) cross-sectional area for collision probability estimation purposes. */
private double typAreaForCollisionProbability;
/** Attitude-independent SRP area, not already into attitude-dependent area along OEB. */
private double srpConstantArea;
/** Nominal SRP coefficient. */
private double srpCoefficient;
/** SRP coefficient 1σ uncertainty. */
private double srpUncertainty;
/** Attitude control mode. */
private String attitudeControlMode;
/** Type of actuator for attitude control. */
private String attitudeActuatorType;
/** Accuracy of attitude knowledge. */
private double attitudeKnowledgeAccuracy;
/** Accuracy of attitude control. */
private double attitudeControlAccuracy;
/** Overall accuracy of spacecraft to maintain attitude. */
private double attitudePointingAccuracy;
/** Average average frequency of orbit or attitude maneuvers (in SI units, hence per second). */
private double maneuversFrequency;
/** Maximum composite thrust the spacecraft can accomplish. */
private double maxThrust;
/** Total ΔV capability at beginning of life. */
private double bolDv;
/** Total ΔV remaining for spacecraft. */
private double remainingDv;
/** Inertia matrix. */
private RealMatrix inertiaMatrix;
/** Simple constructor.
* @param epochT0 T0 epoch from file metadata
*/
public OrbitPhysicalProperties(final AbsoluteDate epochT0) {
// Call to CommonPhysicalProperties constructor
super();
// we don't call the setXxx() methods in order to avoid
// calling refuseFurtherComments as a side effect
dockedWith = new ArrayList<>();
dragConstantArea = Double.NaN;
dragCoefficient = Double.NaN;
dragUncertainty = 0.0;
initialWetMass = Double.NaN;
wetMass = Double.NaN;
dryMass = Double.NaN;
minAreaForCollisionProbability = Double.NaN;
maxAreaForCollisionProbability = Double.NaN;
typAreaForCollisionProbability = Double.NaN;
attitudeKnowledgeAccuracy = Double.NaN;
attitudeControlAccuracy = Double.NaN;
attitudePointingAccuracy = Double.NaN;
maneuversFrequency = Double.NaN;
maxThrust = Double.NaN;
bolDv = Double.NaN;
remainingDv = Double.NaN;
inertiaMatrix = MatrixUtils.createRealMatrix(3, 3);
}
/** Get manufacturer name.
* @return manufacturer name
*/
public String getManufacturer() {
return manufacturer;
}
/** Set manufacturer name.
* @param manufacturer manufacturer name
*/
public void setManufacturer(final String manufacturer) {
refuseFurtherComments();
this.manufacturer = manufacturer;
}
/** Get the bus model name.
* @return bus model name
*/
public String getBusModel() {
return busModel;
}
/** Set the bus model name.
* @param busModel bus model name
*/
public void setBusModel(final String busModel) {
refuseFurtherComments();
this.busModel = busModel;
}
/** Get the other space objects this object is docked to.
* @return the oother space objects this object is docked to
*/
public List<String> getDockedWith() {
return dockedWith;
}
/** Set the other space objects this object is docked to.
* @param dockedWith the other space objects this object is docked to
*/
public void setDockedWith(final List<String> dockedWith) {
refuseFurtherComments();
this.dockedWith = dockedWith;
}
/** Get the attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB.
* @return attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB
*/
public double getDragConstantArea() {
return dragConstantArea;
}
/** Set the attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB.
* @param dragConstantArea attitude-independent drag cross-sectional area, not already into attitude-dependent area along OEB
*/
public void setDragConstantArea(final double dragConstantArea) {
refuseFurtherComments();
this.dragConstantArea = dragConstantArea;
}
/** Get the nominal drag coefficient.
* @return the nominal drag coefficient
*/
public double getDragCoefficient() {
return dragCoefficient;
}
/** Set the the nominal drag coefficient.
* @param dragCoefficient the nominal drag coefficient
*/
public void setDragCoefficient(final double dragCoefficient) {
refuseFurtherComments();
this.dragCoefficient = dragCoefficient;
}
/** Get the drag coefficient 1σ uncertainty.
* @return drag coefficient 1σ uncertainty (in %)
*/
public double getDragUncertainty() {
return dragUncertainty;
}
/** Set the drag coefficient 1σ uncertainty.
* @param dragUncertainty drag coefficient 1σ uncertainty (in %)
*/
public void setDragUncertainty(final double dragUncertainty) {
refuseFurtherComments();
this.dragUncertainty = dragUncertainty;
}
/** Get the total mass at beginning of life.
* @return total mass at beginning of life
*/
public double getInitialWetMass() {
return initialWetMass;
}
/** Set the total mass at beginning of life.
* @param initialWetMass total mass at beginning of life
*/
public void setInitialWetMass(final double initialWetMass) {
refuseFurtherComments();
this.initialWetMass = initialWetMass;
}
/** Get the total mass at T₀.
* @return total mass at T₀
*/
public double getWetMass() {
return wetMass;
}
/** Set the total mass at T₀.
* @param wetMass total mass at T₀
*/
public void setWetMass(final double wetMass) {
refuseFurtherComments();
this.wetMass = wetMass;
}
/** Get the mass without propellant.
* @return mass without propellant
*/
public double getDryMass() {
return dryMass;
}
/** Set the mass without propellant.
* @param dryMass mass without propellant
*/
public void setDryMass(final double dryMass) {
refuseFurtherComments();
this.dryMass = dryMass;
}
/** Get the minimum cross-sectional area for collision probability estimation purposes.
* @return minimum cross-sectional area for collision probability estimation purposes
*/
public double getMinAreaForCollisionProbability() {
return minAreaForCollisionProbability;
}
/** Set the minimum cross-sectional area for collision probability estimation purposes.
* @param minAreaForCollisionProbability minimum cross-sectional area for collision probability estimation purposes
*/
public void setMinAreaForCollisionProbability(final double minAreaForCollisionProbability) {
refuseFurtherComments();
this.minAreaForCollisionProbability = minAreaForCollisionProbability;
}
/** Get the maximum cross-sectional area for collision probability estimation purposes.
* @return maximum cross-sectional area for collision probability estimation purposes
*/
public double getMaxAreaForCollisionProbability() {
return maxAreaForCollisionProbability;
}
/** Set the maximum cross-sectional area for collision probability estimation purposes.
* @param maxAreaForCollisionProbability maximum cross-sectional area for collision probability estimation purposes
*/
public void setMaxAreaForCollisionProbability(final double maxAreaForCollisionProbability) {
refuseFurtherComments();
this.maxAreaForCollisionProbability = maxAreaForCollisionProbability;
}
/** Get the typical (50th percentile) cross-sectional area for collision probability estimation purposes.
* @return typical (50th percentile) cross-sectional area for collision probability estimation purposes
*/
public double getTypAreaForCollisionProbability() {
return typAreaForCollisionProbability;
}
/** Get the typical (50th percentile) cross-sectional area for collision probability estimation purposes.
* @param typAreaForCollisionProbability typical (50th percentile) cross-sectional area for collision probability estimation purposes
*/
public void setTypAreaForCollisionProbability(final double typAreaForCollisionProbability) {
refuseFurtherComments();
this.typAreaForCollisionProbability = typAreaForCollisionProbability;
}
/** Get the attitude-independent SRP area, not already into attitude-dependent area along OEB.
* @return attitude-independent SRP area, not already into attitude-dependent area along OEB
*/
public double getSrpConstantArea() {
return srpConstantArea;
}
/** Set the attitude-independent SRP area, not already into attitude-dependent area along OEB.
* @param srpConstantArea attitude-independent SRP area, not already into attitude-dependent area along OEB
*/
public void setSrpConstantArea(final double srpConstantArea) {
refuseFurtherComments();
this.srpConstantArea = srpConstantArea;
}
/** Get the nominal SRP coefficient.
* @return nominal SRP coefficient
*/
public double getSrpCoefficient() {
return srpCoefficient;
}
/** Set the nominal SRP coefficient.
* @param srpCoefficient nominal SRP coefficient
*/
public void setSrpCoefficient(final double srpCoefficient) {
refuseFurtherComments();
this.srpCoefficient = srpCoefficient;
}
/** Get the SRP coefficient 1σ uncertainty.
* @return SRP coefficient 1σ uncertainty
*/
public double getSrpUncertainty() {
return srpUncertainty;
}
/** Set the SRP coefficient 1σ uncertainty.
* @param srpUncertainty SRP coefficient 1σ uncertainty.
*/
public void setSrpUncertainty(final double srpUncertainty) {
refuseFurtherComments();
this.srpUncertainty = srpUncertainty;
}
/** Get the attitude control mode.
* @return attitude control mode
*/
public String getAttitudeControlMode() {
return attitudeControlMode;
}
/** Set the attitude control mode.
* @param attitudeControlMode attitude control mode
*/
public void setAttitudeControlMode(final String attitudeControlMode) {
refuseFurtherComments();
this.attitudeControlMode = attitudeControlMode;
}
/** Get the type of actuator for attitude control.
* @return type of actuator for attitude control
*/
public String getAttitudeActuatorType() {
return attitudeActuatorType;
}
/** Set the type of actuator for attitude control.
* @param attitudeActuatorType type of actuator for attitude control
*/
public void setAttitudeActuatorType(final String attitudeActuatorType) {
refuseFurtherComments();
this.attitudeActuatorType = attitudeActuatorType;
}
/** Get the accuracy of attitude knowledge.
* @return accuracy of attitude knowledge
*/
public double getAttitudeKnowledgeAccuracy() {
return attitudeKnowledgeAccuracy;
}
/** Set the accuracy of attitude knowledge.
* @param attitudeKnowledgeAccuracy accuracy of attitude knowledge
*/
public void setAttitudeKnowledgeAccuracy(final double attitudeKnowledgeAccuracy) {
refuseFurtherComments();
this.attitudeKnowledgeAccuracy = attitudeKnowledgeAccuracy;
}
/** Get the accuracy of attitude control.
* @return accuracy of attitude control
*/
public double getAttitudeControlAccuracy() {
return attitudeControlAccuracy;
}
/** Set the accuracy of attitude control.
* @param attitudeControlAccuracy accuracy of attitude control
*/
public void setAttitudeControlAccuracy(final double attitudeControlAccuracy) {
refuseFurtherComments();
this.attitudeControlAccuracy = attitudeControlAccuracy;
}
/** Get the overall accuracy of spacecraft to maintain attitude.
* @return overall accuracy of spacecraft to maintain attitude
*/
public double getAttitudePointingAccuracy() {
return attitudePointingAccuracy;
}
/** Set the overall accuracy of spacecraft to maintain attitude.
* @param attitudePointingAccuracy overall accuracy of spacecraft to maintain attitude
*/
public void setAttitudePointingAccuracy(final double attitudePointingAccuracy) {
refuseFurtherComments();
this.attitudePointingAccuracy = attitudePointingAccuracy;
}
/** Get the average number of orbit or attitude maneuvers per year.
* @return average number of orbit or attitude maneuvers per year.
*/
public double getManeuversPerYear() {
return maneuversFrequency * Constants.JULIAN_YEAR;
}
/** Get the average frequency of orbit or attitude maneuvers (in SI units, hence per second).
* @return average frequency of orbit or attitude maneuvers (in SI units, hence per second).
*/
public double getManeuversFrequency() {
return maneuversFrequency;
}
/** Set the average frequency of orbit or attitude maneuvers (in SI units, hence per second).
* @param maneuversFrequency average frequency of orbit or attitude (in SI units, hence per second).
*/
public void setManeuversFrequency(final double maneuversFrequency) {
refuseFurtherComments();
this.maneuversFrequency = maneuversFrequency;
}
/** Get the maximum composite thrust the spacecraft can accomplish.
* @return maximum composite thrust the spacecraft can accomplish
*/
public double getMaxThrust() {
return maxThrust;
}
/** Set the maximum composite thrust the spacecraft can accomplish.
* @param maxThrust maximum composite thrust the spacecraft can accomplish
*/
public void setMaxThrust(final double maxThrust) {
refuseFurtherComments();
this.maxThrust = maxThrust;
}
/** Get the total ΔV capability at beginning of life.
* @return total ΔV capability at beginning of life
*/
public double getBolDv() {
return bolDv;
}
/** Set the total ΔV capability at beginning of life.
* @param bolDv total ΔV capability at beginning of life
*/
public void setBolDv(final double bolDv) {
refuseFurtherComments();
this.bolDv = bolDv;
}
/** Get the total ΔV remaining for spacecraft.
* @return total ΔV remaining for spacecraft
*/
public double getRemainingDv() {
return remainingDv;
}
/** Set the total ΔV remaining for spacecraft.
* @param remainingDv total ΔV remaining for spacecraft
*/
public void setRemainingDv(final double remainingDv) {
refuseFurtherComments();
this.remainingDv = remainingDv;
}
/** Get the inertia matrix.
* @return the inertia matrix
*/
public RealMatrix getInertiaMatrix() {
return inertiaMatrix;
}
/** Set an entry in the inertia matrix.
* <p>
* Both I(j, k) and I(k, j) are set.
* </p>
* @param j row index (must be between 0 and 3 (inclusive)
* @param k column index (must be between 0 and 3 (inclusive)
* @param entry value of the matrix entry
*/
public void setInertiaMatrixEntry(final int j, final int k, final double entry) {
refuseFurtherComments();
inertiaMatrix.setEntry(j, k, entry);
inertiaMatrix.setEntry(k, j, entry);
}
}