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)