From 54243c18db50c6e2cb9aba2198ac1f4c8207ca2b Mon Sep 17 00:00:00 2001
From: Valenza Florian <fvalenza@laas.fr>
Date: Thu, 4 Aug 2016 16:30:55 +0200
Subject: [PATCH] [C++] The method forwardKinematics now selects by itself the
 section of the right DoFs over a full vector

---
 src/multibody/joint/joint-free-flyer.hpp | 13 +++++--------
 src/multibody/joint/joint-spherical.hpp  | 11 ++++-------
 2 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/src/multibody/joint/joint-free-flyer.hpp b/src/multibody/joint/joint-free-flyer.hpp
index 4d0472efa..2fc68d2ca 100644
--- a/src/multibody/joint/joint-free-flyer.hpp
+++ b/src/multibody/joint/joint-free-flyer.hpp
@@ -208,9 +208,9 @@ namespace se3
     inline void forwardKinematics(Transformation_t & M, const Eigen::MatrixBase<V> & q_joint) const
     {
       typedef Eigen::Map<const Motion_t::Quaternion_t> ConstQuaternionMap_t;
-      EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigVector_t,V);
-      
-      ConstQuaternionMap_t quat(q_joint.template tail<4>().data());
+      typename Eigen::MatrixBase<V>::template ConstFixedSegmentReturnType<NQ>::Type & q = q_joint.template segment<NQ> (idx_q ());
+
+      ConstQuaternionMap_t quat(q.template tail<4>().data());
       assert(std::fabs(quat.coeffs().norm() - 1.) <= 1e-14);
       
       M.rotation(quat.matrix());
@@ -343,11 +343,8 @@ namespace se3
       typedef Eigen::Map<const Motion_t::Quaternion_t> ConstQuaternionMap_t;
       using std::acos;
       
-      Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_0 = q0.segment<NQ> (idx_q ());
-      Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_1 = q1.segment<NQ> (idx_q ());
-
-      Transformation_t M0(Transformation_t::Identity()); forwardKinematics(M0, q_0);
-      Transformation_t M1(Transformation_t::Identity()); forwardKinematics(M1, q_1);
+      Transformation_t M0(Transformation_t::Identity()); forwardKinematics(M0, q0);
+      Transformation_t M1(Transformation_t::Identity()); forwardKinematics(M1, q1);
 
       return se3::log6(M0.inverse()*M1);
     } 
diff --git a/src/multibody/joint/joint-spherical.hpp b/src/multibody/joint/joint-spherical.hpp
index 8b6afdccf..b258d0d21 100644
--- a/src/multibody/joint/joint-spherical.hpp
+++ b/src/multibody/joint/joint-spherical.hpp
@@ -271,9 +271,9 @@ namespace se3
     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);
+      typename Eigen::MatrixBase<V>::template ConstFixedSegmentReturnType<NQ>::Type & q = q_joint.template segment<NQ> (idx_q ());
 
-      ConstQuaternionMap_t quat(q_joint.derived().data());
+      ConstQuaternionMap_t quat(q.data());
       assert(std::fabs(quat.coeffs().norm() - 1.) <= 1e-14);
       
       M.rotation(quat.matrix());
@@ -388,11 +388,8 @@ namespace se3
       typedef Eigen::Map<const Motion_t::Quaternion_t> ConstQuaternionMap_t;
       using std::acos;
       
-      Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_0 = q0.segment<NQ> (idx_q ());
-      Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_1 = q1.segment<NQ> (idx_q ());
-
-      Transformation_t M0; forwardKinematics(M0, q_0);
-      Transformation_t M1; forwardKinematics(M1, q_1);
+      Transformation_t M0; forwardKinematics(M0, q0);
+      Transformation_t M1; forwardKinematics(M1, q1);
 
       return se3::log3((M0.rotation().transpose()*M1.rotation()).eval());
       
-- 
GitLab