From eb21e9fb8ccc17b46d5cef2543677bfbc600917b Mon Sep 17 00:00:00 2001 From: Valenza Florian <fvalenza@laas.fr> Date: Wed, 3 Aug 2016 18:44:33 +0200 Subject: [PATCH] [C++] joint-spherical::forwardKinematics works with MatrixBase --- src/multibody/joint/joint-spherical.hpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/multibody/joint/joint-spherical.hpp b/src/multibody/joint/joint-spherical.hpp index dd26de380..8b6afdccf 100644 --- a/src/multibody/joint/joint-spherical.hpp +++ b/src/multibody/joint/joint-spherical.hpp @@ -268,13 +268,16 @@ namespace se3 JointDataDerived createData() const { return JointDataDerived(); } - inline void forwardKinematics(Transformation_t & M, ConstQuaternionMap_t & q_joint) const + template<typename V> + inline void forwardKinematics(Transformation_t & M, const Eigen::MatrixBase<V> & q_joint) const { + EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigVector_t,V); + + ConstQuaternionMap_t quat(q_joint.derived().data()); + assert(std::fabs(quat.coeffs().norm() - 1.) <= 1e-14); - assert(std::fabs(q_joint.coeffs().norm() - 1.) <= 1e-14); - - M.rotation(q_joint.matrix()); - M.translation(Vector3::Zero()); + M.rotation(quat.matrix()); + M.translation().setZero(); } void calc (JointDataDerived & data, @@ -388,12 +391,10 @@ namespace se3 Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_0 = q0.segment<NQ> (idx_q ()); Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_1 = q1.segment<NQ> (idx_q ()); - ConstQuaternionMap_t quat0 (q_0.data()); - ConstQuaternionMap_t quat1 (q_1.data()); - Transformation_t M0; forwardKinematics(M0, quat0); - Transformation_t M1; forwardKinematics(M1, quat1); + Transformation_t M0; forwardKinematics(M0, q_0); + Transformation_t M1; forwardKinematics(M1, q_1); - return se3::log3((M0.inverse()*M1).rotation()); + return se3::log3((M0.rotation().transpose()*M1.rotation()).eval()); } -- GitLab