5 #ifndef __math_quaternion_hpp__ 6 #define __math_quaternion_hpp__ 8 #include "pinocchio/math/fwd.hpp" 22 template<
typename D1,
typename D2>
25 const Eigen::QuaternionBase<D2> & q2)
27 typedef typename D1::Scalar Scalar;
28 const Scalar innerprod = q1.dot(q2);
29 Scalar theta = acos(innerprod);
30 static const Scalar PI_value = PI<Scalar>();
33 return PI_value - theta;
47 template<
typename D1,
typename D2>
49 const Eigen::QuaternionBase<D2> & q2,
50 const typename D1::RealScalar & prec = Eigen::NumTraits<typename D1::Scalar>::dummy_precision())
52 return (q1.coeffs().isApprox(q2.coeffs(), prec) || q1.coeffs().isApprox(-q2.coeffs(), prec) );
79 typedef typename D::Scalar Scalar;
80 const Scalar N2 = q.squaredNorm();
82 const Scalar epsilon = sqrt(sqrt(Eigen::NumTraits<Scalar>::epsilon()));
83 assert(math::fabs(N2-1.) <= epsilon);
85 const Scalar alpha = ((Scalar)3 - N2) / Scalar(2);
86 const_cast <Eigen::QuaternionBase<D> &> (q).coeffs() *= alpha;
88 const Scalar M = Scalar(3) * math::pow(Scalar(1)-epsilon, ((Scalar)-Scalar(5))/Scalar(2)) / Scalar(4);
89 assert(math::fabs(q.norm() - Scalar(1)) <=
90 std::max(M * sqrt(N2) * (N2 - Scalar(1))*(N2 - Scalar(1)) / Scalar(2), Eigen::NumTraits<Scalar>::dummy_precision()));
95 template<
typename Derived>
98 typedef typename Derived::Scalar Scalar;
101 const Scalar u1 = (Scalar)rand() / RAND_MAX;
102 const Scalar u2 = (Scalar)rand() / RAND_MAX;
103 const Scalar u3 = (Scalar)rand() / RAND_MAX;
105 const Scalar mult1 = sqrt(Scalar(1)-u1);
106 const Scalar mult2 = sqrt(u1);
108 const Scalar PI_value = PI<Scalar>();
109 Scalar s2,c2;
SINCOS(Scalar(2)*PI_value*u2,&s2,&c2);
110 Scalar s3,c3;
SINCOS(Scalar(2)*PI_value*u3,&s3,&c3);
112 PINOCCHIO_EIGEN_CONST_CAST(Derived,q).w() = mult1 * s2;
113 PINOCCHIO_EIGEN_CONST_CAST(Derived,q).x() = mult1 * c2;
114 PINOCCHIO_EIGEN_CONST_CAST(Derived,q).y() = mult2 * s3;
115 PINOCCHIO_EIGEN_CONST_CAST(Derived,q).z() = mult2 * c3;
123 template<
typename D1,
typename D2>
124 typename D1::Scalar PINOCCHIO_DEPRECATED
126 const Eigen::QuaternionBase<D2> & q2)
132 template<
typename D1,
typename D2>
133 bool PINOCCHIO_DEPRECATED
135 const Eigen::QuaternionBase<D2> & q2,
136 const typename D1::RealScalar & prec
137 = Eigen::NumTraits<typename D1::Scalar>::dummy_precision())
144 void PINOCCHIO_DEPRECATED
152 void PINOCCHIO_DEPRECATED
158 #endif //#ifndef __math_quaternion_hpp__ 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.
D1::Scalar angleBetweenQuaternions(const Eigen::QuaternionBase< D1 > &q1, const Eigen::QuaternionBase< D2 > &q2)
Compute the minimal angle between q1 and q2.
void firstOrderNormalize(const Eigen::QuaternionBase< D > &q)
void SINCOS(const Scalar &a, Scalar *sa, Scalar *ca)
Computes sin/cos values of a given input scalar.
void uniformRandom(const Eigen::QuaternionBase< Derived > &q)
Uniformly random quaternion sphere.
Main pinocchio namespace.