|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.orekit.utils.AngularCoordinates
public class AngularCoordinates
Simple container for rotation/rotation rate/rotation acceleration triplet.
When applied to frames, the rotation here describes the orientation of the frame of interest in the reference frame. This means that defining X_ref=(1,0,0) in the reference frame, the vector X_interest (X axis of the frame of interest, still expressed in the reference frame) is obtained by : rotation.applyTo(X_ref).
The rotation rate (respectively the rotation acceleration) is the vector describing the rotation velocity (rotation acceleration) of the frame of interest relatively to the reference frame. This rotation rate (rotation acceleration) vector is always expressed in the frame of interest.
The state can be slightly shifted to close dates. This shift is based on an approximate solution of the fixed acceleration motion. It is not intended as a replacement for proper attitude propagation but should be sufficient for either small time shifts or coarse accuracy.
This class is the angular counterpart to PVCoordinates
.
Instances of this class are guaranteed to be immutable.
Field Summary | |
---|---|
static AngularCoordinates |
IDENTITY
Fixed orientation parallel with reference frame (identity rotation, zero rotation rate, zero rotation acceleration). |
Constructor Summary | |
---|---|
AngularCoordinates()
Simple constructor. |
|
AngularCoordinates(PVCoordinates u1,
PVCoordinates u2,
PVCoordinates v1,
PVCoordinates v2,
double tolerance)
Build the rotation that transforms a pair of pv coordinates into another one. |
|
AngularCoordinates(PVCoordinates u1,
PVCoordinates u2,
PVCoordinates v1,
PVCoordinates v2,
double tolerance,
boolean spinDerivativesComputation)
Build the rotation that transforms a pair of pv coordinates into another one. |
|
AngularCoordinates(Rotation rotation,
Vector3D rotationRate)
Builds a rotation/rotation rate triplet (acceleration set to Vector3D.ZERO ). |
|
AngularCoordinates(Rotation rotation,
Vector3D rotationRate,
Vector3D rotationAcceleration)
Builds a rotation/rotation rate/rotation acceleration triplet. |
Method Summary | |
---|---|
AngularCoordinates |
addOffset(AngularCoordinates offset)
Add an offset from the instance. |
AngularCoordinates |
addOffset(AngularCoordinates offset,
boolean computeSpinDerivatives)
Add an offset from the instance. |
PVCoordinates |
applyTo(PVCoordinates pv)
Apply the rotation to a pv coordinates. |
TimeStampedPVCoordinates |
applyTo(TimeStampedPVCoordinates pv)
Apply the rotation to a pv coordinates. |
static AngularCoordinates |
createFromModifiedRodrigues(double[][] r)
Convert a modified Rodrigues vector and derivatives to angular coordinates. |
static AngularCoordinates |
createFromModifiedRodrigues(double[][] r,
boolean computeSpinDerivatives)
Convert a modified Rodrigues vector and derivatives to angular coordinates. |
static Vector3D |
estimateRate(Rotation start,
Rotation end,
double dt)
Estimate rotation rate between two orientations. |
double[][] |
getModifiedRodrigues(double sign)
Convert rotation, rate and acceleration to modified Rodrigues vector and derivatives. |
double[][] |
getModifiedRodrigues(double sign,
boolean computeSpinDerivative)
Convert rotation, rate and acceleration to modified Rodrigues vector and derivatives. |
Rotation |
getRotation()
Get the rotation. |
Vector3D |
getRotationAcceleration()
Get the rotation acceleration. |
Vector3D |
getRotationRate()
Get the rotation rate. |
static AngularCoordinates |
interpolate(AbsoluteDate date,
boolean useRotationRates,
Collection<Pair<AbsoluteDate,AngularCoordinates>> sample)
Deprecated. since 3.1 replaced with TimeStampedAngularCoordinates.interpolate(AbsoluteDate, AngularDerivativesFilter, Collection) |
static AngularCoordinates |
interpolate(AbsoluteDate date,
boolean useRotationRates,
Collection<Pair<AbsoluteDate,AngularCoordinates>> sample,
boolean computeSpinDerivative)
Deprecated. since 3.1 replaced with TimeStampedAngularCoordinates.interpolate(AbsoluteDate, AngularDerivativesFilter, Collection, boolean) |
AngularCoordinates |
revert()
Revert a rotation/rotation rate/rotation acceleration triplet. |
AngularCoordinates |
revert(boolean computeSpinDerivatives)
Revert a rotation/rotation rate/rotation acceleration triplet. |
AngularCoordinates |
shiftedBy(double dt)
Get a time-shifted state. |
AngularCoordinates |
shiftedBy(double dt,
boolean computeSpinDerivatives)
Get a time-shifted state. |
AngularCoordinates |
subtractOffset(AngularCoordinates offset)
Subtract an offset from the instance. |
AngularCoordinates |
subtractOffset(AngularCoordinates offset,
boolean computeSpinDerivatives)
Subtract an offset from the instance. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
public static final AngularCoordinates IDENTITY
Constructor Detail |
---|
public AngularCoordinates()
Sets the rotation/rotation rate and acceleration to default : Identity (0 0 0).
public AngularCoordinates(Rotation rotation, Vector3D rotationRate)
Vector3D.ZERO
).
The rotation here describes the orientation of a frame of interest in a reference frame.
The rotation rate (rotation acceleration) is the vector describing the rotation velocity (rotation acceleration) of the frame of interest relatively to the reference frame. This rotation rate (rotation acceleration) vector is expressed in the frame of interest.
rotation
- rotationrotationRate
- rotation rate (rad/s)public AngularCoordinates(Rotation rotation, Vector3D rotationRate, Vector3D rotationAcceleration)
rotation
- rotationrotationRate
- rotation rate Ω (rad/s)rotationAcceleration
- rotation acceleration dΩ/dt (rad²/s²)public AngularCoordinates(PVCoordinates u1, PVCoordinates u2, PVCoordinates v1, PVCoordinates v2, double tolerance, boolean spinDerivativesComputation) throws OrekitException
WARNING! This method requires much more stringent assumptions on
its parameters than the similar constructor
from the Rotation
class.
As a reminder, the rotation r describes the orientation of the frame of interest
in the reference frame
As far as the Rotation constructor is concerned, the v₂
vector from
the second pair can be slightly misaligned. The Rotation constructor will
compensate for this misalignment and create a rotation that ensure v₁ = r(u₁)
and v₂ ∈ plane (r(u₁), r(u₂))
. THIS IS NOT
TRUE ANYMORE IN THIS CLASS! As derivatives are involved and must be
preserved, this constructor works only if the two pairs are fully
consistent, i.e. if a rotation exists that fulfill all the requirements: v₁ = r(u₁)
, v₂ = r(u₂)
, dv₁/dt = dr(u₁)/dt
, dv₂/dt
= dr(u₂)/dt
, d²v₁/dt² = d²r(u₁)/dt²
, d²v₂/dt² = d²r(u₂)/dt²
.
u1
- first vector of the origin pairu2
- second vector of the origin pairv1
- desired image of u1 by the rotationv2
- desired image of u2 by the rotationtolerance
- relative tolerance factor used to check singularitiesspinDerivativesComputation
- true if the spin derivative has to be computed. If not, spin derivative is set to null
OrekitException
- if the vectors are inconsistent for the
rotation to be found (null, aligned, ...)public AngularCoordinates(PVCoordinates u1, PVCoordinates u2, PVCoordinates v1, PVCoordinates v2, double tolerance) throws OrekitException
WARNING! This method requires much more stringent assumptions on
its parameters than the similar constructor
from the Rotation
class.
As a reminder, the rotation r describes the orientation of the frame of interest
in the reference frame
As far as the Rotation constructor is concerned, the v₂
vector from
the second pair can be slightly misaligned. The Rotation constructor will
compensate for this misalignment and create a rotation that ensure v₁ = r(u₁)
and v₂ ∈ plane (r(u₁), r(u₂))
. THIS IS NOT
TRUE ANYMORE IN THIS CLASS! As derivatives are involved and must be
preserved, this constructor works only if the two pairs are fully
consistent, i.e. if a rotation exists that fulfill all the requirements: v₁ = r(u₁)
, v₂ = r(u₂)
, dv₁/dt = dr(u₁)/dt
, dv₂/dt
= dr(u₂)/dt
, d²v₁/dt² = d²r(u₁)/dt²
, d²v₂/dt² = d²r(u₂)/dt²
.
Warning: spin derivative is not computed.
u1
- first vector of the origin pairu2
- second vector of the origin pairv1
- desired image of u1 by the rotationv2
- desired image of u2 by the rotationtolerance
- relative tolerance factor used to check singularities
OrekitException
- if the vectors are inconsistent for the
rotation to be found (null, aligned, ...)Method Detail |
---|
public static Vector3D estimateRate(Rotation start, Rotation end, double dt)
Estimation is based on a simple fixed rate rotation during the time interval between the two orientations.
Those two orientation must be expressed in the same frame.
start
- start orientationend
- end orientationdt
- time elapsed between the dates of the two orientations
public AngularCoordinates revert(boolean computeSpinDerivatives)
computeSpinDerivatives
- true if spin derivatives must be computed. If not, spin derivative is set to null
public AngularCoordinates revert()
Warning: spin derivative is not computed.
public AngularCoordinates shiftedBy(double dt)
The state can be slightly shifted to close dates. This shift is based on an approximate solution of the fixed acceleration motion. It is not intended as a replacement for proper attitude propagation but should be sufficient for either small time shifts or coarse accuracy.
Warning: spin derivative is not computed.
shiftedBy
in interface TimeShiftable<AngularCoordinates>
dt
- time shift in seconds
public AngularCoordinates shiftedBy(double dt, boolean computeSpinDerivatives)
The state can be slightly shifted to close dates. This shift is based on an approximate solution of the fixed acceleration motion. It is not intended as a replacement for proper attitude propagation but should be sufficient for either small time shifts or coarse accuracy.
dt
- time shift in secondscomputeSpinDerivatives
- true if spin derivatives should be computed. If not, spin derivative is set to null
public Rotation getRotation()
public Vector3D getRotationRate()
public Vector3D getRotationAcceleration()
public AngularCoordinates addOffset(AngularCoordinates offset, boolean computeSpinDerivatives)
The instance rotation is applied first and the offset
is applied afterward. Note that angular coordinates do not
commute under this operation, i.e. a.addOffset(b)
and b.addOffset(a)
lead to different results in most cases.
The rotation of the angular coordinates returned here is a composition of R_instance first and then R_offset. But to compose them, we first have to express them in the same frame : R_offset has to be expressed in the reference frame of the instance. So it becomes : R_instance o R_offset o R_instance^-1. The total composed rotation is then : (R_instance o R_offset o R_instance^-1) o R_instance, wich can be simplified as R_instance o R_offset.
The two methods addOffset
and
subtractOffset
are designed
so that round trip applications are possible. This means that both ac1.subtractOffset(ac2).addOffset(ac2)
and ac1.addOffset(ac2).subtractOffset(ac2)
return angular coordinates equal to ac1.
offset
- offset to subtractcomputeSpinDerivatives
- true if spin derivatives must be computed. If not, spin derivative is set to null
subtractOffset(AngularCoordinates)
public AngularCoordinates addOffset(AngularCoordinates offset)
The instance rotation is applied first and the offset
is applied afterward. Note that angular coordinates do not
commute under this operation, i.e. a.addOffset(b)
and b.addOffset(a)
lead to different results in most cases.
The rotation of the angular coordinates returned here is a composition of R_instance first and then R_offset. But to compose them, we first have to express them in the same frame : R_offset has to be expressed in the reference frame of the instance. So it becomes : R_instance o R_offset o R_instance^-1. The total composed rotation is then : (R_instance o R_offset o R_instance^-1) o R_instance, wich can be simplified as R_instance o R_offset.
The two methods addOffset
and
subtractOffset
are designed
so that round trip applications are possible. This means that both ac1.subtractOffset(ac2).addOffset(ac2)
and ac1.addOffset(ac2).subtractOffset(ac2)
return angular coordinates equal to ac1.
Warning: spin derivative is not computed.
offset
- offset to subtract
subtractOffset(AngularCoordinates)
public AngularCoordinates subtractOffset(AngularCoordinates offset, boolean computeSpinDerivatives)
The instance rotation is applied first and the offset
is applied afterward. Note that angular coordinates do not
commute under this operation, i.e. a.subtractOffset(b)
and b.subtractOffset(a)
lead to different results in most cases.
The two methods addOffset
and
subtractOffset
are designed
so that round trip applications are possible. This means that both ac1.subtractOffset(ac2).addOffset(ac2)
and ac1.addOffset(ac2).subtractOffset(ac2)
return angular coordinates equal to ac1.
offset
- offset to subtractcomputeSpinDerivatives
- true if spin derivatives must be computed If not, spin derivative is set to null
addOffset(AngularCoordinates)
public AngularCoordinates subtractOffset(AngularCoordinates offset)
The instance rotation is applied first and the offset
is applied afterward. Note that angular coordinates do not
commute under this operation, i.e. a.subtractOffset(b)
and b.subtractOffset(a)
lead to different results in most cases.
The two methods addOffset
and
subtractOffset
are designed
so that round trip applications are possible. This means that both ac1.subtractOffset(ac2).addOffset(ac2)
and ac1.addOffset(ac2).subtractOffset(ac2)
return angular coordinates equal to ac1.
Warning: spin derivative is not computed.
offset
- offset to subtract
addOffset(AngularCoordinates)
public PVCoordinates applyTo(PVCoordinates pv)
pv
- vector to apply the rotation to
public TimeStampedPVCoordinates applyTo(TimeStampedPVCoordinates pv)
pv
- vector to apply the rotation to
@Deprecated public static AngularCoordinates interpolate(AbsoluteDate date, boolean useRotationRates, Collection<Pair<AbsoluteDate,AngularCoordinates>> sample) throws OrekitException
TimeStampedAngularCoordinates.interpolate(AbsoluteDate, AngularDerivativesFilter, Collection)
The interpolated instance is created by polynomial Hermite interpolation on Rodrigues vector ensuring rotation rate remains the exact derivative of rotation.
This method is based on Sergei Tanygin's paper Attitude Interpolation, changing the norm of the vector to match the modified Rodrigues vector as described in Malcolm D. Shuster's paper A Survey of Attitude Representations. This change avoids the singularity at π. There is still a singularity at 2π, which is handled by slightly offsetting all rotations when this singularity is detected.
Note that even if first time derivatives (rotation rates) from sample can be ignored, the interpolated instance always includes interpolated derivatives. This feature can be used explicitly to compute these derivatives when it would be too complex to compute them from an analytical formula: just compute a few sample points from the explicit formula and set the derivatives to zero in these sample points, then use interpolation to add derivatives consistent with the rotations.
Warning: spin derivative is not computed.
date
- interpolation dateuseRotationRates
- if true, use sample points rotation rates,
otherwise ignore them and use only rotationssample
- sample points on which interpolation should be done
OrekitException
- if the number of point is too small for interpolating@Deprecated public static AngularCoordinates interpolate(AbsoluteDate date, boolean useRotationRates, Collection<Pair<AbsoluteDate,AngularCoordinates>> sample, boolean computeSpinDerivative) throws OrekitException
TimeStampedAngularCoordinates.interpolate(AbsoluteDate, AngularDerivativesFilter, Collection, boolean)
The interpolated instance is created by polynomial Hermite interpolation on Rodrigues vector ensuring rotation rate remains the exact derivative of rotation.
This method is based on Sergei Tanygin's paper Attitude Interpolation, changing the norm of the vector to match the modified Rodrigues vector as described in Malcolm D. Shuster's paper A Survey of Attitude Representations. This change avoids the singularity at π. There is still a singularity at 2π, which is handled by slightly offsetting all rotations when this singularity is detected.
Note that even if first time derivatives (rotation rates) from sample can be ignored, the interpolated instance always includes interpolated derivatives. This feature can be used explicitly to compute these derivatives when it would be too complex to compute them from an analytical formula: just compute a few sample points from the explicit formula and set the derivatives to zero in these sample points, then use interpolation to add derivatives consistent with the rotations.
date
- interpolation dateuseRotationRates
- if true, use sample points rotation rates,
otherwise ignore them and use only rotationssample
- sample points on which interpolation should be donecomputeSpinDerivative
- true if spin derivatives should be computed. If not, spin derivative is set to null
OrekitException
- if the number of point is too small for interpolatingpublic double[][] getModifiedRodrigues(double sign)
The modified Rodrigues vector is tan(θ/4) u where θ and u are the rotation angle and axis respectively.
Warning: spin derivative is not computed.
sign
- multiplicative sign for quaternion components
createFromModifiedRodrigues(double[][])
public double[][] getModifiedRodrigues(double sign, boolean computeSpinDerivative)
The modified Rodrigues vector is tan(θ/4) u where θ and u are the rotation angle and axis respectively.
sign
- multiplicative sign for quaternion componentscomputeSpinDerivative
- true if spin derivatives should be computed. If not, spin derivative is set to null
createFromModifiedRodrigues(double[][])
public static AngularCoordinates createFromModifiedRodrigues(double[][] r, boolean computeSpinDerivatives)
r
- modified Rodrigues vector (with first and second times derivatives)computeSpinDerivatives
- true if spin derivatives should be computed. If not, spin derivative is set to null
getModifiedRodrigues(double)
public static AngularCoordinates createFromModifiedRodrigues(double[][] r)
Warning: spin derivative is not computed.
r
- modified Rodrigues vector (with first and second times derivatives)
getModifiedRodrigues(double)
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |