22#include <Eigen/Geometry>
57template <
typename Scalar>
72 Scalar theta = sqrt(theta_sq);
81 ret = sin(theta) / theta;
96template <
typename Scalar>
108 return cos(sqrt(theta_sq));
117template <
typename Derived>
118inline Eigen::Quaternion<typename Derived::Scalar>
121 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived, 3);
122 using Scalar =
typename Derived::Scalar;
123 const Scalar theta_sq = vec.squaredNorm();
129 Eigen::Quaternion<Scalar> ret;
130 ret.vec() = vecscale * vec;
131 ret.w() =
cos_sq(sq_half_theta);
146template <
typename Scalar>
147inline Eigen::Matrix<Scalar, 3, 1>
156 const Scalar sqr_vecnorm = quat.vec().squaredNorm();
169 const Scalar x2 = sqr_vecnorm / (quat.w() * quat.w());
173 return Scalar(2) * (quat.vec() * phiOverSin);
181 if (sqr_vecnorm ==
Scalar(0)) {
182 return Eigen::Matrix<Scalar, 3, 1>::Zero();
185 const Scalar vecnorm = sqrt(sqr_vecnorm);
188 const Scalar phi = atan2(vecnorm, quat.w());
197 return Scalar(2) * (quat.vec() * (phi / vecnorm));
C interface to math library.
Interoperability helpers connecting internal math types and Eigen.
C++-only functionality in the Math helper library.
Definition m_documentation.hpp:15
Scalar cos_sq(Scalar theta_sq)
Computes cos(theta) given theta^2, staying differentiable at theta = 0.
Definition m_quatexpmap.hpp:98
Scalar sinc_sq(Scalar theta_sq)
Computes the "historical" (un-normalized) sinc(Theta), using theta^2 to allow us to handle sqrt(0) be...
Definition m_quatexpmap.hpp:59
Eigen::Quaternion< typename Derived::Scalar > quat_exp_so3(Eigen::MatrixBase< Derived > const &vec)
Fully-templated free function for quaternion exponentiation, SO(3) version as described by Grassia.
Definition m_quatexpmap.hpp:119
constexpr double quat_small_sqr_vecnorm
Squared vector norm below which the quat maps switch to a series expansion, i.e.
Definition m_quatexpmap.hpp:91
Eigen::Matrix< Scalar, 3, 1 > quat_ln_so3(Eigen::Quaternion< Scalar > const &quat)
Fully-templated free function for quaternion log map, SO(3) version.
Definition m_quatexpmap.hpp:148
static double get()
Machine epsilon is 1e-53, so double-precision fourth root is roughly 1e-13.
Definition m_quatexpmap.hpp:36
static float get()
Machine epsilon is 1e-24, so double-precision fourth root is roughly 1e-6.
Definition m_quatexpmap.hpp:45
Definition m_quatexpmap.hpp:30