public class AngularCoordinates extends Object implements TimeShiftable<AngularCoordinates>, Serializable
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.
Modifier and Type | Field and Description |
---|---|
static AngularCoordinates |
IDENTITY
Fixed orientation parallel with reference frame (identity rotation, zero rotation rate, zero rotation
acceleration).
|
Constructor and Description |
---|
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 rotationIn,
Vector3D rotationRateIn)
Builds a rotation/rotation rate triplet (acceleration set to
Vector3D.ZERO ). |
AngularCoordinates(Rotation rotationIn,
Vector3D rotationRateIn,
Vector3D rotationAccelerationIn)
Builds a rotation/rotation rate/rotation acceleration triplet.
|
Modifier and Type | Method and Description |
---|---|
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.
|
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.
|
public static final AngularCoordinates IDENTITY
public AngularCoordinates()
Sets the rotation/rotation rate and acceleration to default : Identity (0 0 0).
public AngularCoordinates(Rotation rotationIn, Vector3D rotationRateIn)
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.
rotationIn
- rotationrotationRateIn
- rotation rate (rad/s)public AngularCoordinates(Rotation rotationIn, Vector3D rotationRateIn, Vector3D rotationAccelerationIn)
rotationIn
- rotationrotationRateIn
- rotation rate Ω (rad/s)rotationAccelerationIn
- rotation acceleration dΩ/dt (rad²/s²)public AngularCoordinates(PVCoordinates u1, PVCoordinates u2, PVCoordinates v1, PVCoordinates v2, double tolerance, boolean spinDerivativesComputation) throws PatriusException
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 nullPatriusException
- 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 PatriusException
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 singularitiesPatriusException
- if the vectors are inconsistent for the
rotation to be found (null, aligned, ...)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 orientationspublic AngularCoordinates revert(boolean computeSpinDerivatives)
computeSpinDerivatives
- true if spin derivatives must be computed. If not, spin derivative is set to nullpublic 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 secondspublic 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 nullpublic 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 nullsubtractOffset(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 subtractsubtractOffset(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 nulladdOffset(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 subtractaddOffset(AngularCoordinates)
public PVCoordinates applyTo(PVCoordinates pv)
pv
- vector to apply the rotation topublic TimeStampedPVCoordinates applyTo(TimeStampedPVCoordinates pv)
pv
- vector to apply the rotation topublic 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 componentscreateFromModifiedRodrigues(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 nullcreateFromModifiedRodrigues(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 nullgetModifiedRodrigues(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)
Copyright © 2020 CNES. All rights reserved.