From 2284cbb8199080a58d57edb89036d47664b7e448 Mon Sep 17 00:00:00 2001 From: Valenza Florian <fvalenza@laas.fr> Date: Thu, 14 Apr 2016 15:04:39 +0200 Subject: [PATCH] [C++][FixBug][Unittest] Reworked unittests for joint revolute unaligned + Fix bug in calc_aba (bug with boost:fusion preventing a proper acces to jmodel.axis) --- .../joint/joint-revolute-unaligned.hpp | 4 +- unittest/joints.cpp | 223 +++++++----------- 2 files changed, 84 insertions(+), 143 deletions(-) diff --git a/src/multibody/joint/joint-revolute-unaligned.hpp b/src/multibody/joint/joint-revolute-unaligned.hpp index 06d32b617..52c2355eb 100644 --- a/src/multibody/joint/joint-revolute-unaligned.hpp +++ b/src/multibody/joint/joint-revolute-unaligned.hpp @@ -354,8 +354,8 @@ namespace se3 void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const { - data.U = I.block<6,3> (0,Inertia::ANGULAR) * axis; - data.Dinv[0] = 1./axis.dot(data.U.segment <3> (Inertia::ANGULAR)); + data.U = I.block<6,3> (0,Inertia::ANGULAR) * data.angleaxis.axis(); + data.Dinv[0] = 1./data.angleaxis.axis().dot(data.U.segment <3> (Inertia::ANGULAR)); data.UDinv = data.U * data.Dinv; if (update_I) diff --git a/unittest/joints.cpp b/unittest/joints.cpp index 248f6c2f2..559222413 100644 --- a/unittest/joints.cpp +++ b/unittest/joints.cpp @@ -69,6 +69,88 @@ void printOutJointData ( } +BOOST_AUTO_TEST_SUITE (JointRevoluteUnaligned) + +BOOST_AUTO_TEST_CASE (vsRX) +{ + using namespace se3; + typedef Eigen::Matrix <double, 3, 1> Vector3; + typedef Eigen::Matrix <double, 6, 1> Vector6; + typedef Eigen::Matrix <double, 3, 3> Matrix3; + + Eigen::Vector3d axis; + axis << 1.0, 0.0, 0.0; + + Model modelRX, modelRevoluteUnaligned; + + Inertia inertia (1., Vector3 (0.5, 0., 0.0), Matrix3::Identity ()); + SE3 pos(1); pos.translation() = SE3::Linear_t(1.,0.,0.); + + JointModelRevoluteUnaligned joint_model_RU(axis); + modelRX.addBody (0, JointModelRX (), pos, inertia, "rx"); + modelRevoluteUnaligned.addBody(0, joint_model_RU ,pos, inertia, "revolute-unaligne"); + + Data dataRX(modelRX); + Data dataRevoluteUnaligned(modelRevoluteUnaligned); + + + Eigen::VectorXd q = Eigen::VectorXd::Ones (modelRX.nq); + Eigen::VectorXd v = Eigen::VectorXd::Ones (modelRX.nv); + Eigen::VectorXd tauRX = Eigen::VectorXd::Ones (modelRX.nv); Eigen::VectorXd tauRevoluteUnaligned = Eigen::VectorXd::Ones (modelRevoluteUnaligned.nv); + Eigen::VectorXd aRX = Eigen::VectorXd::Ones (modelRX.nv); Eigen::VectorXd aRevoluteUnaligned(aRX); + + + + forwardKinematics(modelRX, dataRX, q, v); + forwardKinematics(modelRevoluteUnaligned, dataRevoluteUnaligned, q, v); + + computeAllTerms(modelRX, dataRX, q, v); + computeAllTerms(modelRevoluteUnaligned, dataRevoluteUnaligned, q, v); + + BOOST_CHECK(dataRevoluteUnaligned.oMi[1].isApprox(dataRX.oMi[1])); + BOOST_CHECK(dataRevoluteUnaligned.liMi[1].isApprox(dataRX.liMi[1])); + BOOST_CHECK(dataRevoluteUnaligned.Ycrb[1].matrix().isApprox(dataRX.Ycrb[1].matrix())); + BOOST_CHECK(dataRevoluteUnaligned.f[1].toVector().isApprox(dataRX.f[1].toVector())); + + BOOST_CHECK(dataRevoluteUnaligned.nle.isApprox(dataRX.nle)); + BOOST_CHECK(dataRevoluteUnaligned.com[0].isApprox(dataRX.com[0])); + + + + // InverseDynamics == rnea + tauRX = rnea(modelRX, dataRX, q, v, aRX); + tauRevoluteUnaligned = rnea(modelRevoluteUnaligned, dataRevoluteUnaligned, q, v, aRevoluteUnaligned); + + BOOST_CHECK(tauRX.isApprox(tauRevoluteUnaligned)); + + // ForwardDynamics == aba + Eigen::VectorXd aAbaRX = aba(modelRX,dataRX, q, v, tauRX); + Eigen::VectorXd aAbaRevoluteUnaligned = aba(modelRevoluteUnaligned,dataRevoluteUnaligned, q, v, tauRevoluteUnaligned); + + + BOOST_CHECK(aAbaRX.isApprox(aAbaRevoluteUnaligned)); + + // crba + crba(modelRX, dataRX,q); + crba(modelRevoluteUnaligned, dataRevoluteUnaligned, q); + + BOOST_CHECK(dataRX.M.isApprox(dataRevoluteUnaligned.M)); + + // Jacobian + Eigen::Matrix<double, 6, Eigen::Dynamic> jacobianRX;jacobianRX.resize(6,1); jacobianRX.setZero(); + Eigen::Matrix<double, 6, Eigen::Dynamic> jacobianRevoluteUnaligned;jacobianRevoluteUnaligned.resize(6,1);jacobianRevoluteUnaligned.setZero(); + computeJacobians(modelRX, dataRX, q); + computeJacobians(modelRevoluteUnaligned, dataRevoluteUnaligned, q); + getJacobian<true>(modelRX, dataRX, 1, jacobianRX); + getJacobian<true>(modelRevoluteUnaligned, dataRevoluteUnaligned, 1, jacobianRevoluteUnaligned); + + + BOOST_CHECK(jacobianRX.isApprox(jacobianRevoluteUnaligned)); + + +} +BOOST_AUTO_TEST_SUITE_END () + BOOST_AUTO_TEST_SUITE ( JointSphericalZYX ) BOOST_AUTO_TEST_CASE ( test_kinematics ) @@ -845,148 +927,7 @@ BOOST_AUTO_TEST_CASE ( test_crba ) BOOST_AUTO_TEST_SUITE_END () -BOOST_AUTO_TEST_SUITE ( JointRevoluteUnaligned ) - -BOOST_AUTO_TEST_CASE ( test_kinematics ) -{ - using namespace se3; - - - Eigen::Vector3d axis; - axis << 1.0, 0.0, 0.0; - - JointModelRevoluteUnaligned joint_model_RU(axis); - JointDataRevoluteUnaligned joint_data_RU(axis); - - JointModelRX joint_model_RX; - JointDataRX joint_data_RX; - - joint_model_RU.setIndexes (0, 0, 0); - joint_model_RX.setIndexes (0, 0, 0); - - Eigen::VectorXd q (Eigen::VectorXd::Zero (1)); - Eigen::VectorXd q_dot (Eigen::VectorXd::Zero (1)); - - // ------- - q << 0.; - q_dot << 0.; - - joint_model_RU.calc (joint_data_RU, q, q_dot); - joint_model_RX.calc (joint_data_RX, q, q_dot); - - printOutJointData <JointDataRevoluteUnaligned> (q, q_dot, joint_data_RU); - BOOST_CHECK (joint_data_RU.M.rotation() - .isApprox(joint_data_RX.M.rotation(), 1e-12)); - BOOST_CHECK (joint_data_RU.M.translation () - .isApprox(joint_data_RX.M.translation (), 1e-12)); - BOOST_CHECK (((Motion) joint_data_RU.v).toVector() - .isApprox(((Motion) joint_data_RX.v).toVector(), 1e-12)); - BOOST_CHECK (((Motion) joint_data_RU.c).toVector() - .isApprox(((Motion) joint_data_RX.c).toVector(), 1e-12)); - -} - -BOOST_AUTO_TEST_CASE ( test_rnea ) -{ - using namespace se3; - typedef Eigen::Matrix <double, 3, 1> Vector3; - typedef Eigen::Matrix <double, 3, 3> Matrix3; - - Model modelRX; - Model modelRU; - Inertia inertia (1., Vector3 (0.5, 0., 0.0), Matrix3::Identity ()); - - Eigen::Vector3d axis; - axis << 1.0, 0.0, 0.0; - - modelRX.addBody (modelRX.getBodyId("universe"), JointModelRX (), SE3::Identity (), inertia, "root"); - modelRU.addBody (modelRU.getBodyId("universe"), JointModelRevoluteUnaligned (axis), SE3::Identity (), inertia, "root"); - - Data dataRX (modelRX); - Data dataRU (modelRU); - - BOOST_CHECK_EQUAL(modelRU.nq,modelRX.nq); - BOOST_CHECK_EQUAL(modelRU.nv,modelRX.nv); - - - Eigen::VectorXd q (Eigen::VectorXd::Zero (modelRU.nq)); - Eigen::VectorXd v (Eigen::VectorXd::Zero (modelRU.nv)); - Eigen::VectorXd a (Eigen::VectorXd::Zero (modelRU.nv)); - - rnea (modelRX, dataRX, q, v, a); - rnea (modelRU, dataRU, q, v, a); - - BOOST_CHECK (dataRX.tau.isApprox(dataRU.tau, 1e-14)); - - q = Eigen::VectorXd::Ones (modelRU.nq); //q.normalize (); - v = Eigen::VectorXd::Ones (modelRU.nv); - a = Eigen::VectorXd::Ones (modelRU.nv); - - rnea (modelRX, dataRX, q, v, a); - rnea (modelRU, dataRU, q, v, a); - - BOOST_CHECK (dataRX.tau.isApprox(dataRU.tau, 1e-12)); - - q << 3.; - v = Eigen::VectorXd::Ones (modelRU.nv); - a = Eigen::VectorXd::Ones (modelRU.nv); - - rnea (modelRX, dataRX, q, v, a); - rnea (modelRU, dataRU, q, v, a); - - BOOST_CHECK (dataRX.tau.isApprox(dataRU.tau, 1e-12)); -} - -BOOST_AUTO_TEST_CASE ( test_crba ) -{ - using namespace se3; - using namespace std; - typedef Eigen::Matrix <double, 3, 1> Vector3; - typedef Eigen::Matrix <double, 3, 3> Matrix3; - - Model modelRX; - Model modelRU; - Inertia inertia (1., Vector3 (0.5, 0., 0.0), Matrix3::Identity ()); - - Eigen::Vector3d axis; - axis << 1.0, 0.0, 0.0; - - modelRX.addBody (modelRX.getBodyId("universe"), JointModelRX (), SE3::Identity (), inertia, "root"); - modelRU.addBody (modelRU.getBodyId("universe"), JointModelRevoluteUnaligned (axis), SE3::Identity (), inertia, "root"); - - Data dataRX (modelRX); - Data dataRU (modelRU); - - BOOST_CHECK_EQUAL(modelRU.nq,modelRX.nq); - BOOST_CHECK_EQUAL(modelRU.nv,modelRX.nv); - - - Eigen::VectorXd q (Eigen::VectorXd::Zero (modelRU.nq)); - - crba (modelRX, dataRX, q); - crba (modelRU, dataRU, q); - - BOOST_CHECK (dataRX.M.isApprox(dataRU.M, 1e-14)); - - // ---- - q = Eigen::VectorXd::Ones (modelRU.nq); - - crba (modelRX, dataRX, q); - crba (modelRU, dataRU, q); - - BOOST_CHECK (dataRX.M.isApprox(dataRU.M, 1e-14)); - - // ---- - q << 3; - - crba (modelRX, dataRX, q); - crba (modelRU, dataRU, q); - - BOOST_CHECK (dataRX.M.isApprox(dataRU.M, 1e-14)); -} - -BOOST_AUTO_TEST_SUITE_END () BOOST_AUTO_TEST_SUITE ( JointPrismaticUnaligned ) -- GitLab