Skip to content
Snippets Groups Projects
Commit 7473af82 authored by Jesse Mapel's avatar Jesse Mapel
Browse files

Fixes for C++ docs (#420)

* Docs fixes

* Whole bunch of docs updates
parent 06b32d4c
No related branches found
No related tags found
No related merge requests found
...@@ -7,18 +7,21 @@ ...@@ -7,18 +7,21 @@
namespace ale { namespace ale {
// Interpolation enum for defining different methods of interpolating rotations
enum RotationInterpolation { enum RotationInterpolation {
SLERP, // Spherical interpolation // Spherical linear interpolation
NLERP // Normalized linear interpolation SLERP,
// Normalized linear interpolation
NLERP
}; };
/// Interpolation enum for defining different methods of interpolation // Interpolation enum for defining different methods of interpolating in R
enum PositionInterpolation { enum PositionInterpolation {
/// Interpolate using linear interpolation // Interpolate using linear interpolation
LINEAR = 0, LINEAR = 0,
/// Interpolate using a cubic spline // Interpolate using a cubic spline
SPLINE = 1, SPLINE = 1,
/// Interpolate using Lagrange polynomials up to 8th order // Interpolate using Lagrange polynomials up to 8th order
LAGRANGE = 2, LAGRANGE = 2,
}; };
...@@ -28,6 +31,8 @@ namespace ale { ...@@ -28,6 +31,8 @@ namespace ale {
* @param x The first value. * @param x The first value.
* @param y The second value. * @param y The second value.
* @param t The distance to interpolate. 0 is x and 1 is y. * @param t The distance to interpolate. 0 is x and 1 is y.
*
* @return The interpolated value
*/ */
double linearInterpolate(double x, double y, double t); double linearInterpolate(double x, double y, double t);
...@@ -37,9 +42,20 @@ namespace ale { ...@@ -37,9 +42,20 @@ namespace ale {
* @param x The first vectors. * @param x The first vectors.
* @param y The second vectors. * @param y The second vectors.
* @param t The distance to interpolate. 0 is x and 1 is y. * @param t The distance to interpolate. 0 is x and 1 is y.
*
* @return The interpolated vector
*/ */
std::vector<double> linearInterpolate(const std::vector<double> &x, const std::vector<double> &y, double t); std::vector<double> linearInterpolate(const std::vector<double> &x, const std::vector<double> &y, double t);
/**
* Linearly interpolate between two 3D vectors.
*
* @param x The first vectors.
* @param y The second vectors.
* @param t The distance to interpolate. 0 is x and 1 is y.
*
* @return The interpolated vector
*/
Vec3d linearInterpolate(const Vec3d &x, const Vec3d &y, double t); Vec3d linearInterpolate(const Vec3d &x, const Vec3d &y, double t);
/** /**
...@@ -47,6 +63,7 @@ namespace ale { ...@@ -47,6 +63,7 @@ namespace ale {
* *
* @param times The ordered vector of times to search. Must have at least 2 times. * @param times The ordered vector of times to search. Must have at least 2 times.
* @param interpTime The time to search for the interpolation index of. * @param interpTime The time to search for the interpolation index of.
*
* @return int The index of the time that comes before interpTime. If there is * @return int The index of the time that comes before interpTime. If there is
* no time that comes before interpTime, then returns 0. If all * no time that comes before interpTime, then returns 0. If all
* times come before interpTime, then returns the second to last * times come before interpTime, then returns the second to last
...@@ -56,37 +73,79 @@ namespace ale { ...@@ -56,37 +73,79 @@ namespace ale {
/** /**
* Merge, sort, and remove duplicates from two vectors * Merge, sort, and remove duplicates from two vectors
*
* @param x The first vector to merge
* @param y The second vector to merge
*
* @return A new vector containing unique, sorted values from the two input vectors
*/ */
std::vector<double> orderedVecMerge(const std::vector<double> &x, const std::vector<double> &y); std::vector<double> orderedVecMerge(const std::vector<double> &x, const std::vector<double> &y);
/**
/** The following helper functions are used to calculate the reduced states cache and cubic hermite * Evaluates a cubic hermite spline at an input time.
to interpolate over it. They were migrated, with minor modifications, from *
Isis::NumericalApproximation **/ * migrated from Isis::NumericalApproximation
*
/** Evaluates a cubic hermite at time, interpTime, between the appropriate two points in x. **/ * @param interpTime The time to interpolate at, should be in the same units as x
* @param x The times of the spline nodes
* @param derivs The derivatives of the spline at the nodes
* @param y The values of the spline at the nodes
*
* @return The value of the spline at the input time
*/
double evaluateCubicHermite(const double interpTime, const std::vector<double>& derivs, double evaluateCubicHermite(const double interpTime, const std::vector<double>& derivs,
const std::vector<double>& x, const std::vector<double>& y); const std::vector<double>& x, const std::vector<double>& y);
/** Evaluate velocities using a Cubic Hermite Spline at a time a, within some interval in x, **/ /**
* Evaluate the first derivative of a cubic hermite spline at an input time.
*
* @param interpTime The time to interpolate at, should be in the same units as x
* @param x The times of the spline nodes
* @param derivs The derivatives of the spline at the nodes
* @param y The values of the spline at the nodes
*
* @return The first derivative of the spline at the input time
*/
double evaluateCubicHermiteFirstDeriv(const double interpTime, const std::vector<double>& deriv, double evaluateCubicHermiteFirstDeriv(const double interpTime, const std::vector<double>& deriv,
const std::vector<double>& times, const std::vector<double>& y); const std::vector<double>& times, const std::vector<double>& y);
/**
* Interpolate a set of values using lagrange polynomials.
*
* @param times The vector of times to interpolate over
* @param values The vector of values to interpolate between
* @param time The time to interpolate at
* @param order The order of the lagrange polynomials to use
*
* @return The interpolated value
*/
double lagrangeInterpolate(const std::vector<double>& times, const std::vector<double>& values, double lagrangeInterpolate(const std::vector<double>& times, const std::vector<double>& values,
double time, int order=8); double time, int order=8);
/**
* Interpolate the first derivative of a set of values using lagrange polynomials.
*
* @param times The vector of times to interpolate over
* @param values The vector of values to interpolate between
* @param time The time to interpolate at
* @param order The order of the lagrange polynomials to use
*
* @return The interpolated first derivative
*/
double lagrangeInterpolateDerivative(const std::vector<double>& times, const std::vector<double>& values, double lagrangeInterpolateDerivative(const std::vector<double>& times, const std::vector<double>& values,
double time, int order=8); double time, int order=8);
/** /**
*@brief Interpolates the spacecraft's position along a path generated from a set of points, * @brief Interpolates a value from a set of points and times
times, and a time of observation *
*@param points A double vector of points * @param points A vector of points
*@param times A double vector of times * @param times A vector of times
*@param time A double to use as the time of observation * @param time The time to interpolate at
* @param interp An interpolation enum dictating what type of interpolation to use * @param interp An interpolation enum dictating what type of interpolation to use
* @param d The order of the derivative to generate when interpolating * @param d The order of the derivative to generate when interpolating
(Currently supports 0, 1, and 2) * (Currently supports 0, 1, and 2)
*@return *
* @return The interpolated value
*/ */
double interpolate(std::vector<double> points, std::vector<double> times, double time, PositionInterpolation interp, int d); double interpolate(std::vector<double> points, std::vector<double> times, double time, PositionInterpolation interp, int d);
......
...@@ -16,6 +16,14 @@ namespace ale { ...@@ -16,6 +16,14 @@ namespace ale {
/** /**
* Construct an orientation object give a set of rotations * Construct an orientation object give a set of rotations
* and optionally angular velocities at specific times. * and optionally angular velocities at specific times.
*
* @param rotations The rotations defining the Orientations
* @param times The times for the rotations and angular velocities
* @param avs The angular velocity at each time
* @param constRot An additional constant rotation that is applied after
* the time dependent rotations
* @param const_frames The frame ids that constRot rotates through
* @param time_dependent_frames The frame ids that rotations rotate through
*/ */
Orientations( Orientations(
const std::vector<Rotation> &rotations, const std::vector<Rotation> &rotations,
...@@ -32,17 +40,37 @@ namespace ale { ...@@ -32,17 +40,37 @@ namespace ale {
~Orientations() {}; ~Orientations() {};
/** /**
* Const accessor methods * Get the vector of time dependent rotations
*/ */
std::vector<Rotation> getRotations() const; std::vector<Rotation> getRotations() const;
/**
* Get the vector of angular velocities
*/
std::vector<ale::Vec3d> getAngularVelocities() const; std::vector<ale::Vec3d> getAngularVelocities() const;
/**
* Get the vector of times
*/
std::vector<double> getTimes() const; std::vector<double> getTimes() const;
/**
* Get the frames that the constant rotation rotates through
*/
std::vector<int> getConstantFrames() const; std::vector<int> getConstantFrames() const;
/**
* Get the frames that the time dependent rotations rotate through
*/
std::vector<int> getTimeDependentFrames() const; std::vector<int> getTimeDependentFrames() const;
/**
* Get the constant rotation
*/
Rotation getConstantRotation() const; Rotation getConstantRotation() const;
/** /**
* Get the time dependent component of the interpolated rotation at a specific time. * Get the time dependent component of the interpolated rotation at a specific time.
*
* @param time The time to interpolate at
* @param interpType The type of interpolation to use
*
* @return The time dependent rotation at the input time
*/ */
Rotation interpolateTimeDep( Rotation interpolateTimeDep(
double time, double time,
...@@ -51,6 +79,11 @@ namespace ale { ...@@ -51,6 +79,11 @@ namespace ale {
/** /**
* Get the interpolated rotation at a specific time. * Get the interpolated rotation at a specific time.
*
* @param time The time to interpolate at
* @param interpType The type of interpolation to use
*
* @return The full rotation at the input time
*/ */
Rotation interpolate( Rotation interpolate(
double time, double time,
...@@ -58,10 +91,26 @@ namespace ale { ...@@ -58,10 +91,26 @@ namespace ale {
) const; ) const;
/** /**
* Get the interpolated angular velocity at a specific time * Get the interpolated angular velocity at a specific time.
* Angular velocities are interpolated linearly to match up with the assumptions
* of SLERP.
*
* @param time The time to interpolate the angular velocity at
*
* @return The angular velocity at the input time
*/ */
ale::Vec3d interpolateAV(double time) const; ale::Vec3d interpolateAV(double time) const;
/**
* Rotate a 3d vector at a specific time
*
* @param time The time to rotate the vector at
* @param vector The input vector to rotate
* @param interpType The interpolation type to use
* @param invert If the rotation should be inverted
*
* @return The rotated 3d vector
*/
ale::Vec3d rotateVectorAt( ale::Vec3d rotateVectorAt(
double time, double time,
const ale::Vec3d &vector, const ale::Vec3d &vector,
...@@ -70,7 +119,14 @@ namespace ale { ...@@ -70,7 +119,14 @@ namespace ale {
) const; ) const;
/** /**
* Rotate a position or state vector at a specific time * Rotate a state vector at a specific time
*
* @param time The time to rotate the vector at
* @param state The input state to rotate
* @param interpType The interpolation type to use
* @param invert If the rotation should be inverted
*
* @return The rotated state
*/ */
ale::State rotateStateAt( ale::State rotateStateAt(
double time, double time,
...@@ -80,23 +136,37 @@ namespace ale { ...@@ -80,23 +136,37 @@ namespace ale {
) const; ) const;
/** /**
* Add an additional constant multiplication. * Add an additional constant rotation after this.
* This is equivalent to left multiplication by a constant rotation * This is equivalent to left multiplication by a constant rotation.
*
* @param addedConst The additional constant rotation to apply after this
*
* @return A refernce to this after the update
*/ */
Orientations &addConstantRotation(const Rotation &addedConst); Orientations &addConstantRotation(const Rotation &addedConst);
/** /**
* Multiply this orientation by another orientation * Multiply this set of orientations by another set of orientations
*
* @param rhs The set of orientations to apply before this set
*
* @return A refernce to this after the update
*/ */
Orientations &operator*=(const Orientations &rhs); Orientations &operator*=(const Orientations &rhs);
/** /**
* Multiply this orientation by a constant rotation * Add an additional constant rotation before this.
* This is equivalent to right multiplication by a constant rotation.
*
* @param rhs The additional constant rotation to apply before this
*
* @return A refernce to this after the update
*/ */
Orientations &operator*=(const Rotation &rhs); Orientations &operator*=(const Rotation &rhs);
/** /**
* Invert the orientations. * Invert the set orientations.
*
* Note that inverting a set of orientations twice does not result in * Note that inverting a set of orientations twice does not result in
* the original orientations. the constant rotation is applied after the * the original orientations. the constant rotation is applied after the
* time dependent rotation. This means in the inverse, the constant * time dependent rotation. This means in the inverse, the constant
...@@ -105,20 +175,51 @@ namespace ale { ...@@ -105,20 +175,51 @@ namespace ale {
* Then, the original constant rotations cannot be recovered when inverting * Then, the original constant rotations cannot be recovered when inverting
* again. The set of orientations will still operate the same way, but its * again. The set of orientations will still operate the same way, but its
* internal state will not be the same. * internal state will not be the same.
*
* Similarly, the angular velocities will not be the same as we do not assume
* the angular acceleration to be continuous.
*
* @return A new set of orientations that are inverted.
*/ */
Orientations inverse() const; Orientations inverse() const;
private: private:
std::vector<Rotation> m_rotations; std::vector<Rotation> m_rotations; //!< The set of time dependent rotations.
std::vector<ale::Vec3d> m_avs; std::vector<ale::Vec3d> m_avs; //!< The set of angular velocities. Empty if there are no angular velocities.
std::vector<double> m_times; std::vector<double> m_times; //!< The set of times
std::vector<int> m_timeDepFrames; std::vector<int> m_timeDepFrames; //!< The frame IDs that the time dependent rotations rotate through.
std::vector<int> m_constFrames; std::vector<int> m_constFrames; //!< The frame IDs that the constant rotation rotates through.
Rotation m_constRotation; Rotation m_constRotation; //!< The constant rotation applied after the time dependent rotations.
}; };
/**
* Apply a constant rotation before a set of Orientations
*
* @param lhs The set of Orientations
* @param rhs The constant rotation
*
* @return A new set of orientations combining the constant rotation and old orientations
*/
Orientations operator*(Orientations lhs, const Rotation &rhs); Orientations operator*(Orientations lhs, const Rotation &rhs);
/**
* Apply a constant rotation after a set of Orientations
*
* @param lhs The constant rotation
* @param rhs The set of Orientations
*
* @return A new set of orientations combining the constant rotation and old orientations
*/
Orientations operator*(const Rotation &lhs, Orientations rhs); Orientations operator*(const Rotation &lhs, Orientations rhs);
/**
* Apply two Orientations in a row
*
* @param lhs The second orientation to apply
* @param rhs The first orientation to apply
*
* @return A new set of orientations combining both orientations
*/
Orientations operator*(Orientations lhs, const Orientations &rhs); Orientations operator*(Orientations lhs, const Orientations &rhs);
} }
......
...@@ -16,7 +16,7 @@ namespace ale { ...@@ -16,7 +16,7 @@ namespace ale {
Vec3d position; Vec3d position;
Vec3d velocity; Vec3d velocity;
// Accepts a {x, y, z, vx, vy, vz} vector // Creates a state from a {x, y, z, vx, vy, vz} vector
State(const std::vector<double>& vec) { State(const std::vector<double>& vec) {
if (vec.size() != 6) { if (vec.size() != 6) {
throw std::invalid_argument("Input vector must have 6 entries."); throw std::invalid_argument("Input vector must have 6 entries.");
...@@ -25,14 +25,20 @@ namespace ale { ...@@ -25,14 +25,20 @@ namespace ale {
velocity = {vec[3], vec[4], vec[5]}; velocity = {vec[3], vec[4], vec[5]};
}; };
// Creates a state with only a position
State(Vec3d position) : position(position) { State(Vec3d position) : position(position) {
velocity = {std::numeric_limits<double>::quiet_NaN(), velocity = {std::numeric_limits<double>::quiet_NaN(),
std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN(),
std::numeric_limits<double>::quiet_NaN()}; std::numeric_limits<double>::quiet_NaN()};
}; };
// Creates a state with a position and velocity
State(Vec3d position, Vec3d velocity) : position(position), velocity(velocity) {}; State(Vec3d position, Vec3d velocity) : position(position), velocity(velocity) {};
// Creates an un-initialized state
State() {}; State() {};
// If the velocity for the state has been initialized
bool hasVelocity() const { bool hasVelocity() const {
return !(std::isnan(velocity.x) || std::isnan(velocity.y) || std::isnan(velocity.z)); return !(std::isnan(velocity.x) || std::isnan(velocity.y) || std::isnan(velocity.z));
} }
...@@ -41,28 +47,44 @@ namespace ale { ...@@ -41,28 +47,44 @@ namespace ale {
class States { class States {
public: public:
// Constructors // Constructors
/**
* Creates an empty States object
*/
States(); States();
/**
* Creates a States object from a set of times and positions
*/
States(const std::vector<double>& ephemTimes, const std::vector<Vec3d>& positions, States(const std::vector<double>& ephemTimes, const std::vector<Vec3d>& positions,
int refFrame=1); int refFrame=1);
/**
* Creates a States object from a set of times and positions
*/
States(const std::vector<double>& ephemTimes, const std::vector<std::vector<double>>& positions, States(const std::vector<double>& ephemTimes, const std::vector<std::vector<double>>& positions,
int refFrame=1); int refFrame=1);
/**
* Creates a States object from a set of times, positions, and velocities
*/
States(const std::vector<double>& ephemTimes, const std::vector<Vec3d>& positions, States(const std::vector<double>& ephemTimes, const std::vector<Vec3d>& positions,
const std::vector<Vec3d>& velocities, int refFrame=1); const std::vector<Vec3d>& velocities, int refFrame=1);
/**
* Creates a States object from a set of times, states
*/
States(const std::vector<double>& ephemTimes, const std::vector<State>& states, States(const std::vector<double>& ephemTimes, const std::vector<State>& states,
int refFrame=1); int refFrame=1);
~States(); ~States();
// Getters // Getters
std::vector<State> getStates() const; //! Returns state vectors (6-element positions&velocities) std::vector<State> getStates() const; //!< Returns state vectors (6-element positions&velocities)
std::vector<Vec3d> getPositions() const; //! Returns the current positions std::vector<Vec3d> getPositions() const; //!< Returns the current positions
std::vector<Vec3d> getVelocities() const; //! Returns the current velocities std::vector<Vec3d> getVelocities() const; //!< Returns the current velocities
std::vector<double> getTimes() const; //! Returns the current times std::vector<double> getTimes() const; //!< Returns the current times
int getReferenceFrame() const; //! Returns reference frame as NAIF ID int getReferenceFrame() const; //!< Returns reference frame as NAIF ID
bool hasVelocity() const; //! Returns true if any velocities have been provided bool hasVelocity() const; //!< Returns true if any velocities have been provided
/** /**
* Returns a single state by interpolating state. * Returns a single state by interpolating state.
...@@ -73,7 +95,7 @@ namespace ale { ...@@ -73,7 +95,7 @@ namespace ale {
* @param time Time to get a value at * @param time Time to get a value at
* @param interp Interpolation type to use. Will be ignored if cache is minimized. * @param interp Interpolation type to use. Will be ignored if cache is minimized.
* *
* @return State * @return The interpolated state
*/ */
State getState(double time, PositionInterpolation interp=LINEAR) const; State getState(double time, PositionInterpolation interp=LINEAR) const;
...@@ -98,6 +120,8 @@ namespace ale { ...@@ -98,6 +120,8 @@ namespace ale {
* Adapted from Isis::SpicePosition::reduceCache(). * Adapted from Isis::SpicePosition::reduceCache().
* *
* @param tolerance Maximum error between hermite approximation and original value. * @param tolerance Maximum error between hermite approximation and original value.
*
* @return A new set of states that has been downsized.
*/ */
States minimizeCache(double tolerance=0.01); States minimizeCache(double tolerance=0.01);
...@@ -114,13 +138,13 @@ namespace ale { ...@@ -114,13 +138,13 @@ namespace ale {
* @param baseTime Scaled base time for fit * @param baseTime Scaled base time for fit
* @param timeScale Time scale for fit. * @param timeScale Time scale for fit.
* *
* @return std::vector<int> * @return The indices that should be kept to downsize the set of States
*/ */
std::vector<int> hermiteIndices(double tolerance, std::vector <int> indexList, std::vector<int> hermiteIndices(double tolerance, std::vector <int> indexList,
double baseTime, double timeScale); double baseTime, double timeScale);
std::vector<State> m_states; //! Represent as states internally to keep pos, vel together std::vector<State> m_states; //!< The internal states cache
std::vector<double> m_ephemTimes; //! Time in seconds std::vector<double> m_ephemTimes; //!< The times for the states cache
int m_refFrame; //! Naif IDs for reference frames int m_refFrame; //!< Naif ID for the reference frame the states are in
}; };
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment