Class Quaternion
- java.lang.Object
-
- jahuwaldt.js.param.AbstractRotation<Quaternion>
-
- jahuwaldt.js.param.Quaternion
-
- All Implemented Interfaces:
Rotation<Quaternion>,java.io.Serializable,javolution.lang.Immutable,javolution.lang.Realtime,javolution.lang.ValueType,javolution.xml.XMLSerializable
public final class Quaternion extends AbstractRotation<Quaternion> implements javolution.xml.XMLSerializable
This class represents a 4 element quaternion made up of Float64 elements. Quaternions may be used to represents a relative attitude (attitude transformation) between two different reference frames; B wrt A or BA. It can be used to transform coordinates in reference frame A to reference frame B (A2B).
The following quaternion definition is used:
q.x = e.x * sin(phi/2); q.y = e.y * sin(phi/2); q.z = e.z * sin(phi/2); q.w = cos(phi/2);Reference: Glaese, John, "Quaternions -- A Brief Exposition", Rev. 2, NASA MSFC, 1974 and
Farrell, Jay A. and Matthew Barth, "The Global Positioning System & Inertial Navigation", pp. 39 - 42.Modified by: Joseph A. Huwaldt
- Version:
- February 22, 2025
- Author:
- Joseph A. Huwaldt Date: January 28, 2009
- See Also:
- Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description static intWThe index to the scalar W component of this quaternion.static intXThe index to the vector X component of this quaternion.static intYThe index to the vector Y component of this quaternion.static intZThe index to the vector Z component of this quaternion.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description Quaternionconjugate()Returns the conjugate or spatial inverse of this quaternion.Quaternioncopy()Returns a copy of this quaternionallocatedby the calling thread (possibly on the stack).Quaterniondivide(Rotation<?> that)Returns the quaternion division of this quaternion with the specified rotation transform.booleanequals(java.lang.Object obj)Compares this Quaternion against the specified object for strict equality (same rotation type and same values).Float64get(int i)Returns the value of an element from this quaternion (0=x, 1=y, 2=z, 3=w).Float64getScalar()Return the scalar part of this quaternion.doublegetScalarValue()Return the scalar part of this quaternion as a floating point number.doublegetValue(int i)Returns the value of a floating point number from this quaternion (0=x, 1=y, 2=z, 3=w).Vector3D<javax.measure.quantity.Dimensionless>getVector()Returns the vector part of this quaternion.inthashCode()Returns the hash code for this rotation.Quaternioninverse()Returns the quaternion inverse of this quaternion.booleanisApproxEqual(Rotation<?> obj)Compares this Rotation against the specified Rotation for approximate equality (a Rotation object with rotation is equal to this one to within the numerical roundoff tolerance).static voidmain(java.lang.String[] args)Tests the methods in this class.Quaternionminus(Quaternion that)Returns the difference between this quaternion and the one specified.Float64norm()Returns the Euclidian norm, magnitude, or length of this quaternion (square root of the dot product of this quaternion and it's conjugate).doublenormValue()Returns thenorm(), magnitude, or length value of this quaternion.static Float64Matrixomega(Vector3D<javax.measure.quantity.AngularVelocity> w)Compute the angular velocity quaternion matrix (Omega) from an angular velocity vector of three-space.Quaternionopposite()Returns the negation of this quaternion (all elements are multiplied by -1).Quaternionplus(Quaternion that)Returns the sum of this quaternion with the one specified.Quaterniontimes(double k)Returns the product of this quaternion with the specified coefficient.Quaterniontimes(Rotation<?> that)Returns the quaternion product of this quaternion with the specified rotation transform.Quaterniontimes(Float64 k)Returns the product of this quaternion with the specified coefficient.DCMatrixtoDCM()Returns a direction cosine transformation matrix from this quaternion.Float64VectortoFloat64Vector()Returns the values stored in this vector as a Float64Vector with the values ordered (x, y, z, w).Float64MatrixtoLeftMatrix()Returns a 4x4 matrix version of this quaternion used to multiply on the left (q*p = Lq*p) where "Lq" is the matrix returned by this method and "p" is treated as a 4-element column vector.QuaterniontoQuaternion()Returns a quaternion representing this attitude transformation.Float64MatrixtoRightMatrix()Returns a 4x4 matrix version of this quaternion used to multiply on the right (p*q = p*Rq) where "Rq" is the matrix returned by this method and "p" is treated as a 4-element column vector.javolution.text.TexttoText()Returns the text representation of this quaternion.QuaterniontoUnit()Returns this quaternion with unit length (a versor).<Q extends javax.measure.quantity.Quantity>
Vector3D<Q>transform(Coordinate3D<Q> v)Transforms a 3D vector from frame A to B using this quaternion.Quaterniontranspose()Returns the spatial inverse of this transformation: AB rather than BA.static QuaternionvalueOf(double[] values)Returns aQuaternioninstance holding the specifieddoublevalues for the quaternion elements in the order (x, y, z, w).static QuaternionvalueOf(double x, double y, double z, double w)Returns aQuaternioninstance holding the specifieddoublevalues for the quaternion elements.static QuaternionvalueOf(Rotation<?> transform)Returns a newQuaternioninstance constructed from the specified rotation transform.static QuaternionvalueOf(Vector3D<javax.measure.quantity.Dimensionless> vector, double scalar)Returns aQuaternioninstance containing the specified unit vector and scalar.static QuaternionvalueOf(Vector3D<javax.measure.quantity.Dimensionless> uv, Parameter<javax.measure.quantity.Angle> phi)Returns aQuaternionrepresenting a rotation about an arbitrary axis.static QuaternionvalueOf(Vector<Float64> vector)Returns aQuaternioninstance containing the specified vector of Float64 values.-
Methods inherited from class jahuwaldt.js.param.AbstractRotation
getEulerTM, getPsiThetaTM, getPsiThetaTM, toString
-
-
-
-
Field Detail
-
X
public static final int X
The index to the vector X component of this quaternion.- See Also:
- Constant Field Values
-
Y
public static final int Y
The index to the vector Y component of this quaternion.- See Also:
- Constant Field Values
-
Z
public static final int Z
The index to the vector Z component of this quaternion.- See Also:
- Constant Field Values
-
W
public static final int W
The index to the scalar W component of this quaternion.- See Also:
- Constant Field Values
-
-
Method Detail
-
valueOf
public static Quaternion valueOf(double x, double y, double z, double w)
Returns aQuaternioninstance holding the specifieddoublevalues for the quaternion elements.- Parameters:
x- the x value.y- the y value.z- the z value.w- the w value.- Returns:
- The quaternion having the specified values.
-
valueOf
public static Quaternion valueOf(double[] values)
Returns aQuaternioninstance holding the specifieddoublevalues for the quaternion elements in the order (x, y, z, w).- Parameters:
values- A 4 element array of quaternion elements (x, y, z, w).- Returns:
- The quaternion having the specified values.
- Throws:
DimensionException- if the input array does not have 4 elements.
-
valueOf
public static Quaternion valueOf(Vector3D<javax.measure.quantity.Dimensionless> vector, double scalar)
Returns aQuaternioninstance containing the specified unit vector and scalar.- Parameters:
vector- The unit vector part of the quaternion.scalar- The scalar part of the quaternion.- Returns:
- The quaternion having the specified values.
-
valueOf
public static Quaternion valueOf(Vector<Float64> vector)
Returns aQuaternioninstance containing the specified vector of Float64 values. The vector must have exactly 4 elements in the order (x, y, z, w).- Parameters:
vector- The vector of Float64 quaternion element values (must have dimension of 4).- Returns:
- The quaternion having the specified values.
- Throws:
DimensionException- if the input vector does not have 4 elements.
-
valueOf
public static Quaternion valueOf(Vector3D<javax.measure.quantity.Dimensionless> uv, Parameter<javax.measure.quantity.Angle> phi)
Returns aQuaternionrepresenting a rotation about an arbitrary axis.- Parameters:
uv- The unit vector axis of rotation expressed in a reference frame.phi- The rotation angle about the specified rotation axis.- Returns:
- The quaternion representing the specified rotation angle about the specified rotation axis.
-
valueOf
public static Quaternion valueOf(Rotation<?> transform)
Returns a newQuaternioninstance constructed from the specified rotation transform.- Parameters:
transform- The Rotation transform to convert to a new quaternion.- Returns:
- the quaternion representing the specified attitude transform.
-
getVector
public Vector3D<javax.measure.quantity.Dimensionless> getVector()
Returns the vector part of this quaternion.- Returns:
- The vector part of this quaternion.
-
getScalar
public Float64 getScalar()
Return the scalar part of this quaternion.- Returns:
- The scalar part of this quaternion.
-
getScalarValue
public double getScalarValue()
Return the scalar part of this quaternion as a floating point number.- Returns:
- The scalar part of this quaternion as a floating point number.
-
get
public Float64 get(int i)
Returns the value of an element from this quaternion (0=x, 1=y, 2=z, 3=w).- Parameters:
i- the dimension index (0=x, 1=y, 2=z, 3=w).- Returns:
- the value of the element at
i. - Throws:
java.lang.IndexOutOfBoundsException-(i < 0) || (i >= dimension())
-
getValue
public double getValue(int i)
Returns the value of a floating point number from this quaternion (0=x, 1=y, 2=z, 3=w).- Parameters:
i- the floating point number index (0=x, 1=y, 2=z, 3=w).- Returns:
- the value of the floating point number at
i. - Throws:
java.lang.IndexOutOfBoundsException-(i < 0) || (i >= dimension())
-
norm
public Float64 norm()
Returns the Euclidian norm, magnitude, or length of this quaternion (square root of the dot product of this quaternion and it's conjugate).- Returns:
sqrt(this · this^*).
-
normValue
public double normValue()
Returns thenorm(), magnitude, or length value of this quaternion.- Returns:
this.norm().doubleValue().
-
opposite
public Quaternion opposite()
Returns the negation of this quaternion (all elements are multiplied by -1).- Returns:
-this.- See Also:
conjugate()
-
conjugate
public Quaternion conjugate()
Returns the conjugate or spatial inverse of this quaternion.- Returns:
this^*.- See Also:
- Wikipedia: Quaternion Conjugation
-
transpose
public Quaternion transpose()
Returns the spatial inverse of this transformation: AB rather than BA. This implementation returns the conjugate of this quaternion.- Specified by:
transposein interfaceRotation<Quaternion>- Returns:
this' = this^*
-
plus
public Quaternion plus(Quaternion that)
Returns the sum of this quaternion with the one specified.- Parameters:
that- the quaternion to be added.- Returns:
this + that.
-
minus
public Quaternion minus(Quaternion that)
Returns the difference between this quaternion and the one specified.- Parameters:
that- the quaternion to be subtracted.- Returns:
this - that.
-
times
public Quaternion times(Float64 k)
Returns the product of this quaternion with the specified coefficient.- Parameters:
k- the coefficient multiplier.- Returns:
this · k
-
times
public Quaternion times(double k)
Returns the product of this quaternion with the specified coefficient.- Parameters:
k- the coefficient multiplier.- Returns:
this times k
-
times
public Quaternion times(Rotation<?> that)
Returns the quaternion product of this quaternion with the specified rotation transform. If this quaternion is BA and that is AC then the returned value is: BC = BA times AC (or C2B = A2B times C2A).- Specified by:
timesin interfaceRotation<Quaternion>- Parameters:
that- the rotation transform multiplier.- Returns:
this times that
-
divide
public Quaternion divide(Rotation<?> that)
Returns the quaternion division of this quaternion with the specified rotation transform.- Parameters:
that- the rotation transform divisor.- Returns:
this / that = this times that^-1
-
inverse
public Quaternion inverse()
Returns the quaternion inverse of this quaternion.- Returns:
this^-1 = this^* / norm(this)^2
-
transform
public <Q extends javax.measure.quantity.Quantity> Vector3D<Q> transform(Coordinate3D<Q> v)
Transforms a 3D vector from frame A to B using this quaternion.- Specified by:
transformin interfaceRotation<Quaternion>- Type Parameters:
Q- The Quantity or unit type for this parameter.- Parameters:
v- the vector expressed in frame A.- Returns:
- the vector expressed in frame B.
-
toUnit
public Quaternion toUnit()
Returns this quaternion with unit length (a versor).- Returns:
this.divide(norm(this))
-
toFloat64Vector
public Float64Vector toFloat64Vector()
Returns the values stored in this vector as a Float64Vector with the values ordered (x, y, z, w). The scalar is in the 4th element.- Returns:
- The values stored in this vector as a Float64Vector with the values ordered (x, y, z, w).
-
toDCM
public DCMatrix toDCM()
Returns a direction cosine transformation matrix from this quaternion.- Specified by:
toDCMin interfaceRotation<Quaternion>- Returns:
- a direction cosine matrix that converts from frame A to B.
- See Also:
- Wikipedia: Rotation Matrix-Quaternion
-
toQuaternion
public Quaternion toQuaternion()
Returns a quaternion representing this attitude transformation.- Specified by:
toQuaternionin interfaceRotation<Quaternion>- Returns:
- a quaternion that converts from frame A to B.
- See Also:
- > Wikipedia: Quaternion
-
omega
public static Float64Matrix omega(Vector3D<javax.measure.quantity.AngularVelocity> w)
Compute the angular velocity quaternion matrix (Omega) from an angular velocity vector of three-space. Used to propagate quaternions: qdot = Omega * q ==>
Float64Vector qdot = Quaternion.omega(w).times(q.toFloat64Vector());Values are ordered as follows:
M = 0.5* { 0 r -q p, = { [Omega]' | [w] } where [Omega] = skewsym([w]) -r 0 p q, {-----------------} and [w] = [p q r]' = ang. vel. vect. q -p 0 r, { -[w] | 0 } -p -q -r 0}- Parameters:
w- The angular velocity vector [p q r]'.- Returns:
- A 4x4 angular velocity quaternion matrix in units of radians/second.
-
toLeftMatrix
public Float64Matrix toLeftMatrix()
Returns a 4x4 matrix version of this quaternion used to multiply on the left (q*p = Lq*p) where "Lq" is the matrix returned by this method and "p" is treated as a 4-element column vector. Values are ordered as follows:M = { w -z y x, = { w*[E] + [Q] | [q] } where [Q] = skewsym([q]) and [q] = q.getVector() z w -x y, {----------------------} [E] = identity matrix -y x w z, { -[q] | w } -x -y -z w}- Returns:
- 4x4
Lqmatrix such thatLq.times(p.toFloat64Vector()) == q.times(p).toFloat64Vector()
-
toRightMatrix
public Float64Matrix toRightMatrix()
Returns a 4x4 matrix version of this quaternion used to multiply on the right (p*q = p*Rq) where "Rq" is the matrix returned by this method and "p" is treated as a 4-element column vector. Values are ordered as follows:M = { w z -y x, = { w*[E] + [Q]' | [q] } where [Q] = skewsym([q]) and [q] = q.getVector() -z w x y, {----------------------} [E] = identity matrix y -x w z, { -[q] | w } -x -y -z w}- Returns:
- 4x4
Rqmatrix such thatRq.times(p.toFloat64Vector()) == p.times(q.toFloat64Vector()).toFloat64Vector()
-
copy
public Quaternion copy()
Returns a copy of this quaternionallocatedby the calling thread (possibly on the stack).- Specified by:
copyin interfaceRotation<Quaternion>- Specified by:
copyin interfacejavolution.lang.ValueType- Returns:
- an identical and independent copy of this quaternion.
-
toText
public javolution.text.Text toText()
Returns the text representation of this quaternion.- Specified by:
toTextin interfacejavolution.lang.Realtime- Returns:
- the text representation of this quaternion.
-
isApproxEqual
public boolean isApproxEqual(Rotation<?> obj)
Compares this Rotation against the specified Rotation for approximate equality (a Rotation object with rotation is equal to this one to within the numerical roundoff tolerance).- Overrides:
isApproxEqualin classAbstractRotation<Quaternion>- Parameters:
obj- the Rotation object to compare with.- Returns:
trueif this Rotation is approximately identical to that Rotation;falseotherwise.
-
equals
public boolean equals(java.lang.Object obj)
Compares this Quaternion against the specified object for strict equality (same rotation type and same values).- Overrides:
equalsin classjava.lang.Object- Parameters:
obj- the object to compare with.- Returns:
trueif this rotation is identical to that rotation;falseotherwise.
-
hashCode
public int hashCode()
Returns the hash code for this rotation.- Overrides:
hashCodein classjava.lang.Object- Returns:
- the hash code value.
-
main
public static void main(java.lang.String[] args)
Tests the methods in this class.- Parameters:
args- the command-line arguments.
-
-