diff --git a/src/rotations.h b/src/rotations.h index 9657ebeaf0281ca4fa5e79245cb4f7003b10ab35..c25e246d273e457b3b3d12433da776a220444aa4 100644 --- a/src/rotations.h +++ b/src/rotations.h @@ -193,6 +193,19 @@ inline Eigen::Matrix<typename Derived::Scalar, 3, 3> exp_R(const Eigen::MatrixBa return Eigen::Matrix<T, 3, 3>::Identity() + skew(_v); } +/** \brief rotation matrix to quaternion conversion + * + * @param _R a rotation matrix + * @return the equivalent right-handed unit quaternion + */ +template<typename Derived> +inline Eigen::Quaternion<typename Derived::Scalar> R2q(const Eigen::MatrixBase<Derived>& _R) +{ + MatrixSizeCheck<3,3>::check(_R); + + return Eigen::Quaternion<typename Derived::Scalar>(_R); +} + /** \brief Rotation matrix logarithmic map * * @param _R a 3D rotation matrix @@ -201,12 +214,7 @@ inline Eigen::Matrix<typename Derived::Scalar, 3, 3> exp_R(const Eigen::MatrixBa template<typename Derived> inline Eigen::Matrix<typename Derived::Scalar, 3, 1> log_R(const Eigen::MatrixBase<Derived>& _R) { - MatrixSizeCheck<3, 3>::check(_R); - - typedef typename Derived::Scalar T; - - Eigen::AngleAxis<T> aa = Eigen::AngleAxis<T>(_R); - return aa.axis() * aa.angle(); + return log_q(R2q(_R)); } /** \brief Rotation vector to quaternion conversion @@ -277,19 +285,6 @@ inline Eigen::Matrix<typename Derived::Scalar, 3, 3> q2R(const Eigen::MatrixBase return q2R( q ); } -/** \brief rotation matrix to quaternion conversion - * - * @param _R a rotation matrix - * @return the equivalent right-handed unit quaternion - */ -template<typename Derived> -inline Eigen::Quaternion<typename Derived::Scalar> R2q(const Eigen::MatrixBase<Derived>& _R) -{ - MatrixSizeCheck<3,3>::check(_R); - - return Eigen::Quaternion<typename Derived::Scalar>(_R); -} - ///////////////////////////////////////////////////////////////// // Jacobians of SO(3)