18 #ifndef __math_quaternion_hpp__    19 #define __math_quaternion_hpp__    21 #include "pinocchio/math/fwd.hpp"    33   template<
typename D1, 
typename D2>
    36                           const Eigen::QuaternionBase<D2> & q2)
    38     typedef typename D1::Scalar Scalar;
    39     const Scalar innerprod = q1.dot(q2);
    40     Scalar theta = acos(innerprod);
    41     const Scalar PI_value = PI<Scalar>();
    44       return PI_value - theta;
    58   template<
typename D1, 
typename D2>
    60                           const Eigen::QuaternionBase<D2> & q2,
    61                           const typename D1::RealScalar & prec = Eigen::NumTraits<typename D1::Scalar>::dummy_precision())
    63     return (q1.coeffs().isApprox(q2.coeffs(), prec) || q1.coeffs().isApprox(-q2.coeffs(), prec) );
    90     typedef typename D::Scalar Scalar;
    91     const Scalar N2 = q.squaredNorm();
    93     const Scalar epsilon = sqrt(sqrt(Eigen::NumTraits<Scalar>::epsilon()));
    94     assert(std::fabs(N2-1.) <= epsilon);
    96     const Scalar alpha = ((Scalar)3 - N2) / Scalar(2);
    97     const_cast <Eigen::QuaternionBase<D> &> (q).coeffs() *= alpha;
    99     const Scalar M = Scalar(3) * std::pow(Scalar(1)-epsilon, ((Scalar)-Scalar(5))/Scalar(2)) / Scalar(4);
   100     assert(std::fabs(q.norm() - Scalar(1)) <=
   101         std::max(M * sqrt(N2) * (N2 - Scalar(1))*(N2 - Scalar(1)) / Scalar(2), Eigen::NumTraits<Scalar>::dummy_precision()));
   109     typedef typename D::Scalar Scalar;
   110     typedef Eigen::QuaternionBase<D> Base;
   113     const Scalar u1 = (Scalar)rand() / RAND_MAX;
   114     const Scalar u2 = (Scalar)rand() / RAND_MAX;
   115     const Scalar u3 = (Scalar)rand() / RAND_MAX;
   117     const Scalar mult1 = sqrt(Scalar(1)-u1);
   118     const Scalar mult2 = sqrt(u1);
   120     const Scalar PI_value = PI<Scalar>();
   121     Scalar s2,c2; SINCOS(Scalar(2)*PI_value*u2,&s2,&c2);
   122     Scalar s3,c3; SINCOS(Scalar(2)*PI_value*u3,&s3,&c3);
   124     const_cast <Base &> (q).w() = mult1 * s2;
   125     const_cast <Base &> (q).x() = mult1 * c2;
   126     const_cast <Base &> (q).y() = mult2 * s3;
   127     const_cast <Base &> (q).z() = mult2 * c3;
   130 #endif //#ifndef __math_quaternion_hpp__ 
D1::Scalar angleBetweenQuaternions(const Eigen::QuaternionBase< D1 > &q1, const Eigen::QuaternionBase< D2 > &q2)
Compute the minimal angle between q1 and q2. 
 
void uniformRandom(const Eigen::QuaternionBase< D > &q)
Uniformly random quaternion sphere. 
 
void firstOrderNormalize(const Eigen::QuaternionBase< D > &q)
 
bool defineSameRotation(const Eigen::QuaternionBase< D1 > &q1, const Eigen::QuaternionBase< D2 > &q2, const typename D1::RealScalar &prec=Eigen::NumTraits< typename D1::Scalar >::dummy_precision())
Check if two quaternions define the same rotations.