25 #ifndef INCLUDED_EigenQuatExponentialMap_h_GUID_7E15BC44_BCFB_438B_902B_BA0787BEE405
26 #define INCLUDED_EigenQuatExponentialMap_h_GUID_7E15BC44_BCFB_438B_902B_BA0787BEE405
39 namespace ei_quat_exp_map {
41 template <
typename Scalar>
struct FourthRootMachineEps;
42 template <>
struct FourthRootMachineEps<double> {
44 static double get() {
return 1.e-13; }
46 template <>
struct FourthRootMachineEps<float> {
48 static float get() {
return 1.e-6f; }
53 template <
typename Scalar>
inline Scalar sinc(
Scalar theta) {
60 if (theta < FourthRootMachineEps<Scalar>::get()) {
66 ret = std::sin(theta) / theta;
71 template <
typename Derived>
72 inline Eigen::Quaternion<typename Derived::Scalar>
73 quat_exp(Eigen::MatrixBase<Derived>
const &vec) {
74 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived, 3);
87 Scalar vecscale = sinc(theta);
88 Eigen::Quaternion<Scalar> ret;
89 ret.vec() = vecscale * vec;
90 ret.w() = std::cos(theta);
91 return ret.normalized();
96 template <
typename Scalar>
100 (theta * theta) /
Scalar(6) +
102 (
Scalar(7) * theta * theta * theta * theta) /
Scalar(360) +
104 (
Scalar(31) * theta * theta * theta * theta * theta *
115 template <
typename Scalar>
116 inline Eigen::Matrix<Scalar, 3, 1>
117 quat_ln(Eigen::Quaternion<Scalar>
const &quat) {
122 Scalar vecnorm = quat.vec().norm();
125 Scalar phi = std::atan2(vecnorm, quat.w());
133 vecnorm < 1e-4 ? cscTaylorExpansion<Scalar>(phi)
134 : (phi / std::sin(phi));
135 return quat.vec() * phiOverSin;
138 template <
typename Derived>
struct ScalarTrait;
140 template <
typename Derived>
141 using ScalarType =
typename ScalarTrait<Derived>::type;
143 template <
typename Derived>
144 using QuatType = Eigen::Quaternion<ScalarType<Derived>>;
146 template <
typename Derived>
147 using VecType = Eigen::Matrix<ScalarType<Derived>, 3, 1>;
152 using Derived = Derived_;
153 QuatType<Derived> exp()
const {
return quat_exp(derived().vec()); }
155 Derived
const &derived()
const {
156 return *
static_cast<Derived
const *
>(
this);
161 VecType<Derived> myVec = derived().vec();
162 static const double eps = 1.e-2;
163 ScalarType<Derived> vecNorm = myVec.norm();
164 if (vecNorm > M_PI - eps) {
167 myVec *= ((1. - 2. * M_PI) / vecNorm);
173 template <
typename Scalar_>
class VecWrapper;
175 template <
typename Scalar_>
struct ScalarTrait<VecWrapper<Scalar_>> {
176 using type = Scalar_;
179 template <
typename Scalar_>
180 class VecWrapper :
public QuatExpMapBase<VecWrapper<Scalar_>> {
183 using VecType = Eigen::Matrix<Scalar, 3, 1>;
184 explicit VecWrapper(VecType
const &vec) : m_vec(vec) {}
186 VecType
const &vec()
const {
return m_vec; }
188 static const bool AlwaysPureVec =
true;
189 static bool pureVec() {
return true; }
192 VecType
const &m_vec;
197 template <
typename Scalar_>
struct ScalarTrait<
QuatWrapper<Scalar_>> {
198 using type = Scalar_;
203 template <
typename Scalar_>
206 using Scalar = Scalar_;
207 using QuatType = Eigen::Quaternion<Scalar>;
208 using LogVectorType = Eigen::Matrix<Scalar, 3, 1>;
209 using QuatCoefficients =
typename QuatType::Coefficients;
210 using VecBlock = Eigen::VectorBlock<const QuatCoefficients, 3>;
212 explicit QuatWrapper(QuatType
const &quat) : m_quat(quat) {}
216 LogVectorType
ln()
const {
return quat_ln<Scalar>(m_quat); }
220 VecBlock
vec()
const {
return m_quat.vec(); }
222 static const bool AlwaysPureVec =
false;
225 return m_quat.w() == 0;
229 QuatType
const &m_quat;
232 template <
typename Scalar>
233 inline QuatWrapper<Scalar>
234 quat_exp_map(Eigen::Quaternion<Scalar>
const &q) {
235 return QuatWrapper<Scalar>(q);
238 template <
typename Scalar>
239 inline VecWrapper<Scalar>
240 quat_exp_map(Eigen::Matrix<Scalar, 3, 1>
const &v) {
241 return VecWrapper<Scalar>(v);
244 using ei_quat_exp_map::quat_exp;
245 using ei_quat_exp_map::quat_ln;
246 using ei_quat_exp_map::quat_exp_map;
250 #endif // INCLUDED_EigenQuatExponentialMap_h_GUID_7E15BC44_BCFB_438B_902B_BA0787BEE405
The main namespace for all C++ elements of the framework, internal and external.
Header wrapping include of and for warning quieting.
VecType< Derived > avoidSingularities() const
CRTP base for quaternion exponential map.
double Scalar
Common scalar type.