ConfigurableLowThrustManeuver.java
/* Copyright 2020 Exotrail
* 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.
* Exotrail 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.forces.maneuvers;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.orekit.forces.maneuvers.propulsion.AbstractConstantThrustPropulsionModel;
import org.orekit.forces.maneuvers.propulsion.BasicConstantThrustPropulsionModel;
import org.orekit.forces.maneuvers.propulsion.ThrustDirectionAndAttitudeProvider;
import org.orekit.forces.maneuvers.trigger.ManeuverTriggers;
import org.orekit.time.AbsoluteDate;
/**
* This class implements a configurable low thrust maneuver.
* <p>
* The maneuver is composed of succession of a burn interval. Burn intervals are
* defined by two detectors. See
* {@link org.orekit.forces.maneuvers.trigger.StartStopEventsTrigger
* StartStopEventsTrigger} for more details on the detectors. The attitude
* and the thrust direction are provided by an instance of
* ThrustDirectionProvider See
* {@link org.orekit.forces.maneuvers.propulsion.ThrustDirectionAndAttitudeProvider
* ThrustDirectionProvider} for more details on thrust direction and attitude.
* @author Mikael Fillastre
* @author Andrea Fiorentino
* @since 10.2
*/
public class ConfigurableLowThrustManeuver extends Maneuver {
/** To be used for ParameterDriver to make thrust non constant. */
private static String THRUST_MODEL_IDENTIFIER = "ConfigurableLowThrustManeuver";
/** Thrust direction and spacecraft attitude provided by an external object. */
private final ThrustDirectionAndAttitudeProvider thrustDirectionProvider;
/**
* Constructor.
* <p>
* See {@link org.orekit.forces.maneuvers.trigger.StartStopEventsTrigger
* StartStopEventsTrigger} for requirements on detectors
* </p>
* @param thrustDirectionProvider thrust direction and attitude provider
* @param trigger maneuver triggers
* @param thrust the thrust force (N)
* @param isp engine specific impulse (s)
* @since 11.1
*/
public ConfigurableLowThrustManeuver(final ThrustDirectionAndAttitudeProvider thrustDirectionProvider,
final ManeuverTriggers trigger,
final double thrust, final double isp) {
super(thrustDirectionProvider.getManeuverAttitudeProvider(),
trigger,
buildBasicConstantThrustPropulsionModel(thrust, isp,
thrustDirectionProvider.getThrusterAxisInSatelliteFrame()));
this.thrustDirectionProvider = thrustDirectionProvider;
}
/**
* Build a BasicConstantThrustPropulsionModel from thruster characteristics.
* @param thrust the thrust force (N)
* @param isp engine specific impulse (s)
* @param thrusterAxisInSatelliteFrame direction in spacecraft frame
* @return new instance of BasicConstantThrustPropulsionModel
*/
private static BasicConstantThrustPropulsionModel buildBasicConstantThrustPropulsionModel(final double thrust,
final double isp, final Vector3D thrusterAxisInSatelliteFrame) {
return new BasicConstantThrustPropulsionModel(thrust, isp, thrusterAxisInSatelliteFrame,
THRUST_MODEL_IDENTIFIER);
}
/**
* Getter on Thrust direction and spacecraft attitude provided by an external
* object.
* @return internal field
*/
public ThrustDirectionAndAttitudeProvider getThrustDirectionProvider() {
return thrustDirectionProvider;
}
/**
* Get the thrust magnitude.
* @param date at which the Thrust wants to be known
* @return thrust force (N).
*/
public double getThrustMagnitude(final AbsoluteDate date) {
return ((AbstractConstantThrustPropulsionModel) getPropulsionModel()).getThrustVector(date).getNorm();
}
/**
* Get the thrust magnitude.
* @return thrust force (N). Will throw
* an exception if the Thrust driver has several
* values driven
*/
public double getThrustMagnitude() {
return ((AbstractConstantThrustPropulsionModel) getPropulsionModel()).getThrustVector().getNorm();
}
/**
* Get the specific impulse.
* @param date at which the ISP wants to be known
* @return specific impulse (s).
*/
public double getIsp(final AbsoluteDate date) {
return ((AbstractConstantThrustPropulsionModel) getPropulsionModel()).getIsp(date);
}
/**
* Get the specific impulse.
* @return specific impulse (s). Will throw
* an exception if the Thrust driver has several
* values driven
*/
public double getIsp() {
return ((AbstractConstantThrustPropulsionModel) getPropulsionModel()).getIsp();
}
}