From 254b0be86591ff6a406a7c12cb14497e5d190b50 Mon Sep 17 00:00:00 2001 From: Valenza Florian <fvalenza@laas.fr> Date: Tue, 19 Jul 2016 15:08:41 +0200 Subject: [PATCH] [C++][unittest] Fixed distance computations in joints --- src/multibody/joint/joint-planar.hpp | 5 +--- .../joint/joint-prismatic-unaligned.hpp | 7 ++---- src/multibody/joint/joint-prismatic.hpp | 5 +--- .../joint/joint-revolute-unaligned.hpp | 7 ++---- src/multibody/joint/joint-revolute.hpp | 7 ++---- src/multibody/joint/joint-spherical-ZYX.hpp | 5 +--- src/multibody/joint/joint-translation.hpp | 5 +--- unittest/joint-configurations.cpp | 24 +++++++------------ 8 files changed, 18 insertions(+), 47 deletions(-) diff --git a/src/multibody/joint/joint-planar.hpp b/src/multibody/joint/joint-planar.hpp index b0508ba39..4a8e7f35b 100644 --- a/src/multibody/joint/joint-planar.hpp +++ b/src/multibody/joint/joint-planar.hpp @@ -422,10 +422,7 @@ namespace se3 double distance_impl(const Eigen::VectorXd & q0,const Eigen::VectorXd & q1) const { - Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_0 = q0.segment<NQ> (idx_q ()); - Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_1 = q1.segment<NQ> (idx_q ()); - - return (q_1-q_0).norm(); + return difference_impl(q0, q1).norm(); } ConfigVector_t neutralConfiguration_impl() const diff --git a/src/multibody/joint/joint-prismatic-unaligned.hpp b/src/multibody/joint/joint-prismatic-unaligned.hpp index 89ddc5311..c314b546b 100644 --- a/src/multibody/joint/joint-prismatic-unaligned.hpp +++ b/src/multibody/joint/joint-prismatic-unaligned.hpp @@ -421,17 +421,14 @@ namespace se3 const Scalar & q_0 = q0[idx_q()]; const Scalar & q_1 = q1[idx_q()]; - ConfigVector_t result; + TangentVector_t result; result << (q_1 - q_0); return result; } double distance_impl(const Eigen::VectorXd & q0,const Eigen::VectorXd & q1) const { - const Scalar & q_0 = q0[idx_q()]; - const Scalar & q_1 = q1[idx_q()]; - - return (q_1-q_0); + return difference_impl(q0,q1).norm(); } ConfigVector_t neutralConfiguration_impl() const diff --git a/src/multibody/joint/joint-prismatic.hpp b/src/multibody/joint/joint-prismatic.hpp index 6d58aac4a..18217b60b 100644 --- a/src/multibody/joint/joint-prismatic.hpp +++ b/src/multibody/joint/joint-prismatic.hpp @@ -483,10 +483,7 @@ namespace se3 double distance_impl(const Eigen::VectorXd & q0,const Eigen::VectorXd & q1) const { - const Scalar & q_0 = q0[idx_q()]; - const Scalar & q_1 = q1[idx_q()]; - - return (q_1-q_0); + return difference_impl(q0,q1).norm(); } ConfigVector_t neutralConfiguration_impl() const diff --git a/src/multibody/joint/joint-revolute-unaligned.hpp b/src/multibody/joint/joint-revolute-unaligned.hpp index 3416bd2da..323b2c68d 100644 --- a/src/multibody/joint/joint-revolute-unaligned.hpp +++ b/src/multibody/joint/joint-revolute-unaligned.hpp @@ -425,17 +425,14 @@ namespace se3 const Scalar & q_0 = q0[idx_q()]; const Scalar & q_1 = q1[idx_q()]; - ConfigVector_t result; + TangentVector_t result; result << (q_1 - q_0); return result; } double distance_impl(const Eigen::VectorXd & q0,const Eigen::VectorXd & q1) const { - const Scalar & q_0 = q0[idx_q()]; - const Scalar & q_1 = q1[idx_q()]; - - return (q_1-q_0); + return difference_impl(q0,q1).norm(); } ConfigVector_t neutralConfiguration_impl() const diff --git a/src/multibody/joint/joint-revolute.hpp b/src/multibody/joint/joint-revolute.hpp index 3a463d8f5..864de2a5d 100644 --- a/src/multibody/joint/joint-revolute.hpp +++ b/src/multibody/joint/joint-revolute.hpp @@ -510,17 +510,14 @@ namespace se3 const Scalar & q_0 = q0[idx_q()]; const Scalar & q_1 = q1[idx_q()]; - ConfigVector_t result; + TangentVector_t result; result << (q_1 - q_0); return result; } double distance_impl(const Eigen::VectorXd & q0,const Eigen::VectorXd & q1) const { - const Scalar & q_0 = q0[idx_q()]; - const Scalar & q_1 = q1[idx_q()]; - - return (q_1-q_0); + return difference_impl(q0,q1).norm(); } ConfigVector_t neutralConfiguration_impl() const diff --git a/src/multibody/joint/joint-spherical-ZYX.hpp b/src/multibody/joint/joint-spherical-ZYX.hpp index 0f88052c5..07eed8ee3 100644 --- a/src/multibody/joint/joint-spherical-ZYX.hpp +++ b/src/multibody/joint/joint-spherical-ZYX.hpp @@ -449,10 +449,7 @@ namespace se3 double distance_impl(const Eigen::VectorXd & q0,const Eigen::VectorXd & q1) const { - Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_0 = q0.segment<NQ> (idx_q ()); - Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_1 = q1.segment<NQ> (idx_q ()); - - return (q_1 - q_0).norm(); + return difference_impl(q0, q1).norm(); } ConfigVector_t neutralConfiguration_impl() const diff --git a/src/multibody/joint/joint-translation.hpp b/src/multibody/joint/joint-translation.hpp index 41e796008..7bfc7e3af 100644 --- a/src/multibody/joint/joint-translation.hpp +++ b/src/multibody/joint/joint-translation.hpp @@ -361,10 +361,7 @@ namespace se3 double distance_impl(const Eigen::VectorXd & q0,const Eigen::VectorXd & q1) const { - Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_0 = q0.segment<NQ> (idx_q ()); - Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q_1 = q1.segment<NQ> (idx_q ()); - - return (q_1 - q_0).norm(); + return difference_impl(q0, q1).norm(); } ConfigVector_t neutralConfiguration_impl() const diff --git a/unittest/joint-configurations.cpp b/unittest/joint-configurations.cpp index bf2ff08d2..da3bee61b 100644 --- a/unittest/joint-configurations.cpp +++ b/unittest/joint-configurations.cpp @@ -15,18 +15,6 @@ // Pinocchio If not, see // <http://www.gnu.org/licenses/>. -/* - * Compare the value obtained with the RNEA with the values obtained from - * RBDL. The test is not complete. It only validates the RNEA for the revolute - * joints. The free-flyer is not tested. It should be extended to account for - * the free flyer and for the other algorithms. - * - * Additionnal notes: the RNEA is an algorithm that can be used to validate - * many others (in particular, the mass matrix (CRBA) can be numerically - * validated from the RNEA, then the center-of-mass jacobian can be validated - * from the mass matrix, etc. - * - */ #include <iostream> #include <iomanip> @@ -40,6 +28,10 @@ #include <vector> +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE JointConfigurationsTest +#include <boost/test/unit_test.hpp> +#include <boost/utility/binary.hpp> bool configurations_are_equals(const Eigen::VectorXd & conf1, const Eigen::VectorXd & conf2) { @@ -131,10 +123,6 @@ se3::Model createBoundedModelWithAllJoints() return model; } -#define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE JointConfigurationsTest -#include <boost/test/unit_test.hpp> -#include <boost/utility/binary.hpp> BOOST_AUTO_TEST_SUITE ( JointConfigurationsTest ) @@ -469,6 +457,10 @@ BOOST_AUTO_TEST_CASE ( distance_computation_test ) result = distance(model,q1,q1); BOOST_CHECK_MESSAGE(result.isApprox(expected, 1e-12), "Distance between two same configs of full model - wrong results"); + // + // Test Case 3 : distance between q1 and q2 == distance between q2 and q1 + // + BOOST_CHECK_MESSAGE(distance(model, q1, q2) == distance(model, q2, q1), "Distance q1 -> q2 != Distance q2 -> q1"); } BOOST_AUTO_TEST_CASE ( neutral_configuration_test ) -- GitLab