Newer
Older
// Copyright (c) 2015-2016 CNRS
//
// This file is part of Pinocchio
// Pinocchio is free software: you can redistribute it
// and/or modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation, either version
// 3 of the License, or (at your option) any later version.
//
// Pinocchio is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Lesser Public License for more details. You should have
// received a copy of the GNU Lesser General Public License along with
// Pinocchio If not, see
// <http://www.gnu.org/licenses/>.
#include <iostream>
#include "pinocchio/spatial/force.hpp"
#include "pinocchio/spatial/motion.hpp"
#include "pinocchio/spatial/se3.hpp"
#include "pinocchio/spatial/inertia.hpp"
#include "pinocchio/multibody/force-set.hpp"
#include "pinocchio/multibody/joint/joint-revolute.hpp"
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE ConstraintTest
#include <boost/test/unit_test.hpp>
#include <boost/utility/binary.hpp>
BOOST_AUTO_TEST_SUITE ( Constraint )
BOOST_AUTO_TEST_CASE ( test_ForceSet )
using namespace se3;
typedef Eigen::Matrix<double,4,4> Matrix4;
typedef SE3::Matrix6 Matrix6;
typedef SE3::Vector3 Vector3;
typedef Force::Vector6 Vector6;
SE3 amb = SE3::Random();
SE3 bmc = SE3::Random();
SE3 amc = amb*bmc;
ForceSet F(12);
ForceSet F2(Eigen::Matrix<double,3,2>::Zero(),Eigen::Matrix<double,3,2>::Zero());
F.block(10,2) = F2;
BOOST_CHECK_EQUAL(F.matrix().col(10).norm() , 0.0 );
ForceSet F3(Eigen::Matrix<double,3,12>::Random(),Eigen::Matrix<double,3,12>::Random());
ForceSet F4 = amb.act(F3);
SE3::Matrix6 aXb= amb;
Valenza Florian
committed
BOOST_CHECK((aXb.transpose().inverse()*F3.matrix()).isApprox(F4.matrix(), 1e-12));
ForceSet bF = bmc.act(F3);
ForceSet aF = amb.act(bF);
ForceSet aF2 = amc.act(F3);
Valenza Florian
committed
BOOST_CHECK(aF.matrix().isApprox(aF2.matrix(), 1e-12));
ForceSet F36 = amb.act(F3.block(3,6));
Valenza Florian
committed
BOOST_CHECK((aXb.transpose().inverse()*F3.matrix().block(0,3,6,6)).isApprox(F36.matrix(), 1e-12));
ForceSet F36full(12); F36full.block(3,6) = amb.act(F3.block(3,6));
Valenza Florian
committed
BOOST_CHECK((aXb.transpose().inverse()*F3.matrix().block(0,3,6,6)).isApprox(F36full.matrix().block(0,3,6,6),
1e-12));
BOOST_AUTO_TEST_CASE ( test_ConstraintRX )
{
using namespace se3;
Inertia Y = Inertia::Random();
Valenza Florian
committed
JointDataRX::Constraint_t S;
ForceSet F1(1); F1.block(0,1) = Y*S;
BOOST_CHECK(F1.matrix().isApprox(Y.matrix().col(3), 1e-12));
ForceSet F2( Eigen::Matrix<double,3,9>::Random(),Eigen::Matrix<double,3,9>::Random() );
Valenza Florian
committed
Eigen::MatrixXd StF2 = S.transpose()*F2.block(5,3).matrix();
Valenza Florian
committed
BOOST_CHECK(StF2.isApprox(ConstraintXd(S).matrix().transpose()*F2.matrix().block(0,5,6,3)
, 1e-12));
BOOST_AUTO_TEST_SUITE_END ()