TooN
Classes | Public Member Functions | Static Public Member Functions | Friends | Related Functions | List of all members
TooN::SO3< Precision > Class Template Reference

Class to represent a three-dimensional rotation matrix. More...

#include <so3.h>

Public Member Functions

 SO3 ()
 Default constructor. Initialises the matrix to the identity (no rotation)
 
template<int S, typename P , typename A >
 SO3 (const Vector< S, P, A > &v)
 Construct from the axis of rotation (and angle given by the magnitude).
 
template<int R, int C, typename P , typename A >
 SO3 (const Matrix< R, C, P, A > &rhs)
 Construct from a rotation matrix.
 
template<int S1, int S2, typename P1 , typename P2 , typename A1 , typename A2 >
 SO3 (const Vector< S1, P1, A1 > &a, const Vector< S2, P2, A2 > &b)
 creates an SO3 as a rotation that takes Vector a into the direction of Vector b with the rotation axis along a ^ b. More...
 
template<int R, int C, typename P , typename A >
SO3operator= (const Matrix< R, C, P, A > &rhs)
 Assignment operator from a general matrix. More...
 
void coerce ()
 Modifies the matrix to make sure it is a valid rotation matrix.
 
Vector< 3, Precision > ln () const
 Take the logarithm of the matrix, generating the corresponding vector in the Lie Algebra. More...
 
SO3 inverse () const
 Returns the inverse of this matrix (=the transpose, so this is a fast operation)
 
template<typename P >
SO3operator*= (const SO3< P > &rhs)
 Right-multiply by another rotation matrix.
 
template<typename P >
SO3< typename Internal::MultiplyType< Precision, P >::type > operator* (const SO3< P > &rhs) const
 Right-multiply by another rotation matrix.
 
const Matrix< 3, 3, Precision > & get_matrix () const
 Returns the SO3 as a Matrix<3>
 
template<int S, typename A >
Vector< 3, Precision > adjoint (const Vector< S, Precision, A > &vect) const
 Transfer a vector in the Lie Algebra from one co-ordinate frame to another such that for a matrix \( M \), the adjoint \(Adj()\) obeys \( e^{\text{Adj}(v)} = Me^{v}M^{-1} \).
 
template<typename PA , typename PB >
 SO3 (const SO3< PA > &a, const SO3< PB > &b)
 
template<int S, typename VP , typename VA >
SO3< Precision > exp (const Vector< S, VP, VA > &w)
 Perform the exponential of the matrix \( \sum_i w_iG_i\). More...
 

Static Public Member Functions

template<int S, typename VP , typename A >
static SO3 exp (const Vector< S, VP, A > &vect)
 Exponentiate a vector in the Lie algebra to generate a new SO3. More...
 
static Matrix< 3, 3, Precision > generator (int i)
 Returns the i-th generator. More...
 
template<typename Base >
static Vector< 3, Precision > generator_field (int i, const Vector< 3, Precision, Base > &pos)
 Returns the i-th generator times pos.
 

Friends

class SE3< Precision >
 
class SIM3< Precision >
 
std::istream & operator>> (std::istream &is, SO3< Precision > &rhs)
 
std::istream & operator>> (std::istream &is, SE3< Precision > &rhs)
 
std::istream & operator>> (std::istream &is, SIM3< Precision > &rhs)
 

Related Functions

(Note that these are not member functions.)

template<typename Precision >
std::ostream & operator<< (std::ostream &os, const SO3< Precision > &rhs)
 Write an SO3 to a stream. More...
 
template<typename Precision >
std::istream & operator>> (std::istream &is, SO3< Precision > &rhs)
 Read from SO3 to a stream. More...
 
template<typename Precision , int S, typename VP , typename VA , typename MA >
void rodrigues_so3_exp (const Vector< S, VP, VA > &w, const Precision A, const Precision B, Matrix< 3, 3, Precision, MA > &R)
 Compute a rotation exponential using the Rodrigues Formula. More...
 
template<int S, typename P , typename PV , typename A >
Vector< 3, typename Internal::MultiplyType< P, PV >::type > operator* (const SO3< P > &lhs, const Vector< S, PV, A > &rhs)
 Right-multiply by a Vector. More...
 
template<int S, typename P , typename PV , typename A >
Vector< 3, typename Internal::MultiplyType< PV, P >::type > operator* (const Vector< S, PV, A > &lhs, const SO3< P > &rhs)
 Left-multiply by a Vector. More...
 
template<int R, int C, typename P , typename PM , typename A >
Matrix< 3, C, typename Internal::MultiplyType< P, PM >::type > operator* (const SO3< P > &lhs, const Matrix< R, C, PM, A > &rhs)
 Right-multiply by a matrix. More...
 
template<int R, int C, typename P , typename PM , typename A >
Matrix< R, 3, typename Internal::MultiplyType< PM, P >::type > operator* (const Matrix< R, C, PM, A > &lhs, const SO3< P > &rhs)
 Left-multiply by a matrix. More...
 

Detailed Description

template<typename Precision = DefaultPrecision>
class TooN::SO3< Precision >

Class to represent a three-dimensional rotation matrix.

Three-dimensional rotation matrices are members of the Special Orthogonal Lie group SO3. This group can be parameterised three numbers (a vector in the space of the Lie Algebra). In this class, the three parameters are the finite rotation vector, i.e. a three-dimensional vector whose direction is the axis of rotation and whose length is the angle of rotation in radians. Exponentiating this vector gives the matrix, and the logarithm of the matrix gives this vector.

Constructor & Destructor Documentation

◆ SO3()

template<typename Precision = DefaultPrecision>
template<int S1, int S2, typename P1 , typename P2 , typename A1 , typename A2 >
TooN::SO3< Precision >::SO3 ( const Vector< S1, P1, A1 > &  a,
const Vector< S2, P2, A2 > &  b 
)
inline

creates an SO3 as a rotation that takes Vector a into the direction of Vector b with the rotation axis along a ^ b.

If |a ^ b| == 0, it creates the identity rotation. An assertion will fail if Vector a and Vector b are in exactly opposite directions.

Parameters
asource Vector
btarget Vector

Member Function Documentation

◆ exp() [1/2]

template<typename Precision = DefaultPrecision>
template<int S, typename VP , typename A >
static SO3 TooN::SO3< Precision >::exp ( const Vector< S, VP, A > &  vect)
inlinestatic

Exponentiate a vector in the Lie algebra to generate a new SO3.

See the Detailed Description for details of this vector.

◆ exp() [2/2]

template<typename Precision = DefaultPrecision>
template<int S, typename VP , typename VA >
SO3<Precision> TooN::SO3< Precision >::exp ( const Vector< S, VP, VA > &  w)
inline

Perform the exponential of the matrix \( \sum_i w_iG_i\).

Parameters
wWeightings of the generator matrices.

◆ generator()

template<typename Precision = DefaultPrecision>
static Matrix<3,3, Precision> TooN::SO3< Precision >::generator ( int  i)
inlinestatic

Returns the i-th generator.

The generators of a Lie group are the basis for the space of the Lie algebra. For SO3, the generators are three \(3\times3\) matrices representing the three possible (linearised) rotations.

◆ ln()

template<typename Precision >
Vector< 3, Precision > TooN::SO3< Precision >::ln ( ) const
inline

Take the logarithm of the matrix, generating the corresponding vector in the Lie Algebra.

See the Detailed Description for details of this vector.

◆ operator=()

template<typename Precision = DefaultPrecision>
template<int R, int C, typename P , typename A >
SO3& TooN::SO3< Precision >::operator= ( const Matrix< R, C, P, A > &  rhs)
inline

Assignment operator from a general matrix.

This also calls coerce() to make sure that the matrix is a valid rotation matrix.

Friends And Related Function Documentation

◆ operator*() [1/4]

template<int S, typename P , typename PV , typename A >
Vector< 3, typename Internal::MultiplyType< P, PV >::type > operator* ( const SO3< P > &  lhs,
const Vector< S, PV, A > &  rhs 
)
related

Right-multiply by a Vector.

◆ operator*() [2/4]

template<int S, typename P , typename PV , typename A >
Vector< 3, typename Internal::MultiplyType< PV, P >::type > operator* ( const Vector< S, PV, A > &  lhs,
const SO3< P > &  rhs 
)
related

Left-multiply by a Vector.

◆ operator*() [3/4]

template<int R, int C, typename P , typename PM , typename A >
Matrix< 3, C, typename Internal::MultiplyType< P, PM >::type > operator* ( const SO3< P > &  lhs,
const Matrix< R, C, PM, A > &  rhs 
)
related

Right-multiply by a matrix.

◆ operator*() [4/4]

template<int R, int C, typename P , typename PM , typename A >
Matrix< R, 3, typename Internal::MultiplyType< PM, P >::type > operator* ( const Matrix< R, C, PM, A > &  lhs,
const SO3< P > &  rhs 
)
related

Left-multiply by a matrix.

◆ operator<<()

template<typename Precision >
std::ostream & operator<< ( std::ostream &  os,
const SO3< Precision > &  rhs 
)
related

Write an SO3 to a stream.

◆ operator>>()

template<typename Precision >
std::istream & operator>> ( std::istream &  is,
SO3< Precision > &  rhs 
)
related

Read from SO3 to a stream.

◆ rodrigues_so3_exp()

template<typename Precision , int S, typename VP , typename VA , typename MA >
void rodrigues_so3_exp ( const Vector< S, VP, VA > &  w,
const Precision  A,
const Precision  B,
Matrix< 3, 3, Precision, MA > &  R 
)
related

Compute a rotation exponential using the Rodrigues Formula.

The rotation axis is given by \(\vec{w}\), and the rotation angle must be computed using \( \theta = |\vec{w}|\). This is provided as a separate function primarily to allow fast and rough matrix exponentials using fast and rough approximations to A and B.

Parameters
wVector about which to rotate.
A\(\frac{\sin \theta}{\theta}\)
B\(\frac{1 - \cos \theta}{\theta^2}\)
RMatrix to hold the return value.

The documentation for this class was generated from the following file: