76                 inline T  
r()
const {
return (*
this)[0];} 
    77                 inline T  
x()
const {
return (*
this)[1];} 
    78                 inline T  
y()
const {
return (*
this)[2];} 
    79                 inline T  
z()
const {
return (*
this)[3];} 
    80                 inline void  r(
const T 
r) {(*this)[0]=
r;}       
    81                 inline void  x(
const T 
x) {(*this)[1]=
x;}       
    82                 inline void  y(
const T 
y) {(*this)[2]=
y;}       
    83                 inline void  z(
const T 
z) {(*this)[3]=
z;}       
    96                 template <
class ARRAYLIKE3>
   104                         const T angle = std::sqrt(
x*
x+
y*
y+
z*
z);
   108                                 (*this)[1] = 
static_cast<T
>(0.5)*
x;
   109                                 (*this)[2] = 
static_cast<T
>(0.5)*
y;
   110                                 (*this)[3] = 
static_cast<T
>(0.5)*
z;
   114                                 const T 
s = (::sin(angle/2))/angle;
   115                                 const T 
c = ::cos(angle/2);
   132                 template <
class ARRAYLIKE3>
   133                 inline void ln(ARRAYLIKE3 &out_ln)
 const   135                         if (out_ln.size()!=3) out_ln.resize(3);
   139                 template <
class ARRAYLIKE3>
   140                 inline ARRAYLIKE3 
ln()
 const   147                 template <
class ARRAYLIKE3>
   152                         const T K = (xyz_norm<1e-7) ?  2 : 2*::acos(
r())/xyz_norm;
   160                 template <
class ARRAYLIKE3>
   164                         q.fromRodriguesVector(
v);
   168                 template <
class ARRAYLIKE3>
   183                         const T new_r = q1.
r()*q2.
r() - q1.
x()*q2.
x() - q1.
y()*q2.
y() - q1.
z()*q2.
z();
   184                         const T new_x = q1.
r()*q2.
x() + q2.
r()*q1.
x() + q1.
y()*q2.
z() - q2.
y()*q1.
z();
   185                         const T new_y = q1.
r()*q2.
y() + q2.
r()*q1.
y() + q1.
z()*q2.
x() - q2.
z()*q1.
x();
   186                         const T new_z = q1.
r()*q2.
z() + q2.
r()*q1.
z() + q1.
x()*q2.
y() - q2.
x()*q1.
y();
   187                         this->
r(new_r); this->
x(new_x); this->
y(new_y); this->
z(new_z);
   193                 void rotatePoint(
const double lx,
const double ly,
const double lz, 
double &gx,
double &gy,
double &gz )
 const   195                         const double t2 = 
r()*
x(); 
const double t3 = 
r()*
y(); 
const double t4 = 
r()*
z(); 
const double t5 =-
x()*
x(); 
const double t6 = 
x()*
y();
   196                         const double t7 = 
x()*
z(); 
const double t8 =-
y()*
y(); 
const double t9 = 
y()*
z(); 
const double t10=-
z()*
z();
   197                         gx = 2*((t8+ t10)*lx+(t6 - t4)*ly+(t3+t7)*lz)+lx;
   198                         gy = 2*((t4+  t6)*lx+(t5 +t10)*ly+(t9-t2)*lz)+ly;
   199                         gz = 2*((t7-  t3)*lx+(t2 + t9)*ly+(t5+t8)*lz)+lz;
   204                 void inverseRotatePoint(
const double lx,
const double ly,
const double lz, 
double &gx,
double &gy,
double &gz )
 const   206                         const double t2 =-
r()*
x(); 
const double t3 =-
r()*
y(); 
const double t4 =-
r()*
z(); 
const double t5 =-
x()*
x(); 
const double t6 = 
x()*
y();
   207                         const double t7 = 
x()*
z(); 
const double t8 =-
y()*
y(); 
const double t9 = 
y()*
z(); 
const double t10=-
z()*
z();
   208                         gx = 2*((t8+ t10)*lx+(t6 - t4)*ly+(t3+t7)*lz)+lx;
   209                         gy = 2*((t4+  t6)*lx+(t5 +t10)*ly+(t9-t2)*lz)+ly;
   210                         gz = 2*((t7-  t3)*lx+(t2 + t9)*ly+(t5+t8)*lz)+lz;
   214                 inline double normSqr()
 const {
   223                         const T qq = 1.0/std::sqrt( 
normSqr() );
   224                         for (
unsigned int i=0;i<4;i++)
   231                 template <
class MATRIXLIKE>
   234                         const T 
n = 1.0/std::pow(
normSqr(),T(1.5));
   236                         J.get_unsafe(0,0)=
x()*
x()+
y()*
y()+
z()*
z();
   237                         J.get_unsafe(0,1)=-
r()*
x();
   238                         J.get_unsafe(0,2)=-
r()*
y();
   239                         J.get_unsafe(0,3)=-
r()*
z();
   241                         J.get_unsafe(1,0)=-
x()*
r();
   242                         J.get_unsafe(1,1)=
r()*
r()+
y()*
y()+
z()*
z();
   243                         J.get_unsafe(1,2)=-
x()*
y();
   244                         J.get_unsafe(1,3)=-
x()*
z();
   246                         J.get_unsafe(2,0)=-
y()*
r();
   247                         J.get_unsafe(2,1)=-
y()*
x();
   248                         J.get_unsafe(2,2)=
r()*
r()+
x()*
x()+
z()*
z();
   249                         J.get_unsafe(2,3)=-
y()*
z();
   251                         J.get_unsafe(3,0)=-
z()*
r();
   252                         J.get_unsafe(3,1)=-
z()*
x();
   253                         J.get_unsafe(3,2)=-
z()*
y();
   254                         J.get_unsafe(3,3)=
r()*
r()+
x()*
x()+
y()*
y();
   261                 template <
class MATRIXLIKE>
   265                         J.get_unsafe(0,0)=
r(); J.get_unsafe(0,1)=-
x(); J.get_unsafe(0,2)=-
y(); J.get_unsafe(0,3)=-
z();
   266                         J.get_unsafe(1,0)=
x(); J.get_unsafe(1,1)= 
r(); J.get_unsafe(1,2)=-
z(); J.get_unsafe(1,3)= 
y();
   267                         J.get_unsafe(2,0)=
y(); J.get_unsafe(2,1)= 
z(); J.get_unsafe(2,2)= 
r(); J.get_unsafe(2,3)=-
x();
   268                         J.get_unsafe(3,0)=
z(); J.get_unsafe(3,1)=-
y(); J.get_unsafe(3,2)= 
x(); J.get_unsafe(3,3)= 
r();
   280                 template <
class MATRIXLIKE>
   288                 template <
class MATRIXLIKE>
   291                         M.get_unsafe(0,0)=
r()*
r()+
x()*
x()-
y()*
y()-
z()*
z();              M.get_unsafe(0,1)=2*(
x()*
y() -
r()*
z());                 M.get_unsafe(0,2)=2*(
z()*
x()+
r()*
y());
   292                         M.get_unsafe(1,0)=2*(
x()*
y()+
r()*
z());                          M.get_unsafe(1,1)=
r()*
r()-
x()*
x()+
y()*
y()-
z()*
z();              M.get_unsafe(1,2)=2*(
y()*
z()-
r()*
x());
   293                         M.get_unsafe(2,0)=2*(
z()*
x()-
r()*
y());                          M.get_unsafe(2,1)=2*(
y()*
z()+
r()*
x());                          M.get_unsafe(2,2)=
r()*
r()-
x()*
x()-
y()*
y()+
z()*
z();
   328                 template <
class MATRIXLIKE>
   329                 void rpy_and_jacobian(T &
roll, T &
pitch, T &yaw, MATRIXLIKE *out_dr_dq = NULL, 
bool resize_out_dr_dq_to3x4 = 
true )
 const   334                         if (out_dr_dq && resize_out_dr_dq_to3x4)
   335                                 out_dr_dq->setSize(3,4);
   336                         const T discr = 
r()*
y()-
x()*
z();
   337                         if (fabs(discr)>0.49999)
   340                                 yaw   =-2*atan2(
x(),
r());
   344                                         out_dr_dq->get_unsafe(0,0) = +2/
x();
   345                                         out_dr_dq->get_unsafe(0,2) = -2*
r()/(
x()*
x());
   348                         else if (discr<-0.49999)
   351                                 yaw   = 2*atan2(
x(),
r());
   355                                         out_dr_dq->get_unsafe(0,0) = -2/
x();
   356                                         out_dr_dq->get_unsafe(0,2) = +2*
r()/(
x()*
x());
   361                                 yaw   = ::atan2( 2*(
r()*
z()+
x()*
y()), 1-2*(
y()*
y()+
z()*
z()) );
   362                                 pitch = ::asin ( 2*discr );
   363                                 roll  = ::atan2( 2*(
r()*
x()+
y()*
z()), 1-2*(
x()*
x()+
y()*
y()) );
   366                                         const double val1=(2*
x()*
x() + 2*
y()*
y() - 1);
   367                                         const double val12=
square(val1);
   368                                         const double val2=(2*
r()*
x() + 2*
y()*
z());
   369                                         const double val22=
square(val2);
   370                                         const double xy2 = 2*
x()*
y();
   371                                         const double rz2 = 2*
r()*
z();
   372                                         const double ry2 = 2*
r()*
y();
   373                                         const double val3 = (2*
y()*
y() + 2*
z()*
z() - 1);
   374                                         const double val4 = ((
square(rz2 + xy2)/
square(val3) + 1)*val3);
   375                                         const double val5 = (4*(rz2 + xy2))/
square(val3);
   376                                         const double val6 = 1.0/(
square(rz2 + xy2)/
square(val3) + 1);
   377                                         const double val7 = 2.0/ sqrt(1 - 
square(ry2 - 2*
x()*
z()));
   378                                         const double val8 = (val22/val12 + 1);
   379                                         const double val9 = -2.0/val8;
   381                                         out_dr_dq->get_unsafe(0,0) = -2*
z()/val4;
   382                                         out_dr_dq->get_unsafe(0,1) = -2*
y()/val4;
   383                                         out_dr_dq->get_unsafe(0,2) = -(2*
x()/val3 - 
y()*val5)*val6 ;
   384                                         out_dr_dq->get_unsafe(0,3) = -(2*
r()/val3 - 
z()*val5)*val6;
   386                                         out_dr_dq->get_unsafe(1,0) = 
y()*val7  ;
   387                                         out_dr_dq->get_unsafe(1,1) = -
z()*val7 ;
   388                                         out_dr_dq->get_unsafe(1,2) = 
r()*val7 ;
   389                                         out_dr_dq->get_unsafe(1,3) = -
x()*val7 ;
   391                                         out_dr_dq->get_unsafe(2,0) = val9*
x()/val1 ;
   392                                         out_dr_dq->get_unsafe(2,1) = val9*(
r()/val1 - (2*
x()*val2)/val12) ;
   393                                         out_dr_dq->get_unsafe(2,2) = val9*(
z()/val1 - (2*
y()*val2)/val12) ;
   394                                         out_dr_dq->get_unsafe(2,3) = val9*
y()/val1 ;
 void inverseRotatePoint(const double lx, const double ly, const double lz, double &gx, double &gy, double &gz) const
Rotate a 3D point (lx,ly,lz) -> (gx,gy,gz) as described by the inverse (conjugate) of this quaternion...
 
static CQuaternion< T > exp(const ARRAYLIKE3 &v)
Exponential map from the SO(3) Lie Algebra to unit quaternions. 
 
void rotationMatrix(MATRIXLIKE &M) const
Calculate the 3x3 rotation matrix associated to this quaternion: . 
 
void normalize()
Normalize this quaternion, so its norm becomes the unitity. 
 
TConstructorFlags_Quaternions
 
T y() const
Return y coordinate of the quaternion. 
 
#define THROW_EXCEPTION(msg)
 
GLdouble GLdouble GLdouble GLdouble q
 
void rotationMatrixNoResize(MATRIXLIKE &M) const
Fill out the top-left 3x3 block of the given matrix with the rotation matrix associated to this quate...
 
CArrayNumeric is an array for numeric types supporting several mathematical operations (actually...
 
CQuaternion< double > CQuaternionDouble
A quaternion of data type "double". 
 
T square(const T x)
Inline function for the square of a number. 
 
double normSqr() const
Return the squared norm of the quaternion. 
 
T r() const
Return r coordinate of the quaternion. 
 
CQuaternion operator*(const T &factor)
 
void crossProduct(const CQuaternion &q1, const CQuaternion &q2)
Calculate the "cross" product (or "composed rotation") of two quaternion: this = q1 x q2 After the op...
 
void rotationJacobian(MATRIXLIKE &J) const
Compute the Jacobian of the rotation composition operation , that is the 4x4 matrix ...
 
void rotatePoint(const double lx, const double ly, const double lz, double &gx, double &gy, double &gz) const
Rotate a 3D point (lx,ly,lz) -> (gx,gy,gz) as described by this quaternion. 
 
std::string BASE_IMPEXP format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf. 
 
void ln_noresize(ARRAYLIKE3 &out_ln) const
Like ln() but does not try to resize the output vector. 
 
CArrayNumeric< T, 4 > Base
 
ARRAYLIKE3 ln() const
overload that returns by value 
 
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
 
T x() const
Return x coordinate of the quaternion. 
 
GLdouble GLdouble GLdouble r
 
void normalizationJacobian(MATRIXLIKE &J) const
Calculate the 4x4 Jacobian of the normalization operation of this quaternion. 
 
T square(const T x)
Inline function for the square of a number. 
 
CQuaternion(const T r, const T x, const T y, const T z)
Construct a quaternion from its parameters 'r', 'x', 'y', 'z', with q = r + ix + jy + kz...
 
A quaternion, which can represent a 3D rotation as pair , with a real part "r" and a 3D vector ...
 
void rpy_and_jacobian(T &roll, T &pitch, T &yaw, MATRIXLIKE *out_dr_dq=NULL, bool resize_out_dr_dq_to3x4=true) const
Return the yaw, pitch & roll angles associated to quaternion, and (optionally) the 3x4 Jacobian of th...
 
T z() const
Return z coordinate of the quaternion. 
 
#define ASSERTMSG_(f, __ERROR_MSG)
 
void rpy(T &roll, T &pitch, T &yaw) const
Return the yaw, pitch & roll angles associated to quaternion. 
 
CQuaternion conj() const
Return the conjugate quaternion. 
 
CQuaternion()
Default constructor: construct a (1, (0,0,0) ) quaternion representing no rotation. 
 
CQuaternion(TConstructorFlags_Quaternions)
Can be used with UNINITIALIZED_QUATERNION as argument, does not initialize the 4 elements of the quat...
 
CQuaternion< float > CQuaternionFloat
A quaternion of data type "float". 
 
void fromRodriguesVector(const ARRAYLIKE3 &v)
Set this quaternion to the rotation described by a 3D (Rodrigues) rotation vector : If ...