5 #include "pinocchio/math/multiprecision-mpfr.hpp" 7 #include <boost/math/special_functions/gamma.hpp> 8 #include <boost/multiprecision/cpp_dec_float.hpp> 9 #include <boost/test/unit_test.hpp> 10 #include <boost/utility/binary.hpp> 13 #include "pinocchio/algorithm/aba.hpp" 14 #include "pinocchio/algorithm/center-of-mass.hpp" 15 #include "pinocchio/algorithm/centroidal.hpp" 16 #include "pinocchio/algorithm/crba.hpp" 17 #include "pinocchio/algorithm/jacobian.hpp" 18 #include "pinocchio/algorithm/joint-configuration.hpp" 19 #include "pinocchio/algorithm/rnea.hpp" 20 #include "pinocchio/math/multiprecision.hpp" 21 #include "pinocchio/parsers/sample-models.hpp" 23 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
27 using namespace boost::multiprecision;
31 std::cout << std::numeric_limits<mpfr_float_100>::digits << std::endl;
32 std::cout << std::numeric_limits<mpfr_float_100>::digits10 << std::endl;
34 std::cout << std::setprecision(
35 std::numeric_limits<mpfr_float_100>::max_digits10)
39 std::cout << boost::math::tgamma(b) << std::endl;
41 std::cout << boost::math::tgamma(b * b) << std::endl;
44 std::cout << boost::math::tgamma(mpfr_float_100(1000)) << std::endl;
49 using namespace boost::multiprecision;
50 typedef mpfr_float_100 heap_float_100;
51 typedef number<mpfr_float_backend<100, allocate_stack> > stack_float_100;
58 BOOST_CHECK(s == sin(x));
59 BOOST_CHECK(c == cos(x));
67 BOOST_CHECK(s == sin(x));
68 BOOST_CHECK(c == cos(x));
74 typedef boost::multiprecision::mpfr_float_100 float_100;
77 double initial_value = boost::math::constants::pi<double>();
78 float_100 value_100(initial_value);
79 double value_cast = value_100.convert_to<
double>();
80 BOOST_CHECK(initial_value == value_cast);
82 typedef Eigen::Matrix<float_100, Eigen::Dynamic, 1> VectorFloat100;
83 static const Eigen::DenseIndex
dim = 100;
85 VectorFloat100 vec_float_100 = initial_vec.cast<float_100>();
88 BOOST_CHECK(vec == initial_vec);
91 #define BOOST_CHECK_IS_APPROX(double_field, multires_field, Scalar) \ 92 BOOST_CHECK(double_field.isApprox(multires_field.cast<Scalar>())) 105 typedef boost::multiprecision::mpfr_float_100 float_100;
109 ModelMulti model_multi = model.
cast<float_100>();
110 DataMulti data_multi(model_multi);
113 ModelMulti::TangentVectorType v_multi =
114 ModelMulti::TangentVectorType::Random(model_multi.nv);
115 ModelMulti::TangentVectorType a_multi =
116 ModelMulti::TangentVectorType::Random(model_multi.nv);
117 ModelMulti::TangentVectorType tau_multi =
118 ModelMulti::TangentVectorType::Random(model_multi.nv);
148 rnea(model_multi, data_multi, q_multi, v_multi, a_multi);
149 rnea(model, data, q, v, a);
154 aba(model_multi, data_multi, q_multi, v_multi, tau_multi);
155 aba(model, data, q, v, tau);
160 crba(model_multi, data_multi, q_multi);
161 data_multi.M.triangularView<Eigen::StrictlyLower>() =
162 data_multi.M.transpose().triangularView<Eigen::StrictlyLower>();
164 crba(model, data, q);
165 data.
M.triangularView<Eigen::StrictlyLower>() =
166 data.
M.transpose().triangularView<Eigen::StrictlyLower>();
171 BOOST_AUTO_TEST_SUITE_END()
const DataTpl< Scalar, Options, JointCollectionTpl >::TangentVectorType & aba(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const Eigen::MatrixBase< TangentVectorType1 > &v, const Eigen::MatrixBase< TangentVectorType2 > &tau)
The Articulated-Body algorithm. It computes the forward dynamics, aka the joint accelerations given t...
TangentVectorType tau
Vector of joint torques (dim model.nv).
const DataTpl< Scalar, Options, JointCollectionTpl >::MatrixXs & crba(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q)
Computes the upper triangular part of the joint space inertia matrix M by using the Composite Rigid B...
Matrix6x J
Jacobian of joint placements.
void rnea(const int num_threads, ModelPoolTpl< Scalar, Options, JointCollectionTpl > &pool, const Eigen::MatrixBase< ConfigVectorPool > &q, const Eigen::MatrixBase< TangentVectorPool1 > &v, const Eigen::MatrixBase< TangentVectorPool2 > &a, const Eigen::MatrixBase< TangentVectorPool3 > &tau)
The Recursive Newton-Euler algorithm. It computes the inverse dynamics, aka the joint torques accordi...
ModelTpl< NewScalar, Options, JointCollectionTpl > cast() const
int njoints
Number of joints.
ConfigVectorType lowerPositionLimit
Lower joint configuration limit.
void randomConfiguration(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const Eigen::MatrixBase< ConfigVectorIn1 > &lowerLimits, const Eigen::MatrixBase< ConfigVectorIn2 > &upperLimits, const Eigen::MatrixBase< ReturnType > &qout)
Generate a configuration vector uniformly sampled among provided limits.
VectorXs TangentVectorType
Dense vectorized version of a joint tangent vector (e.g. velocity, acceleration, etc). It also handles the notion of co-tangent vector (e.g. torque, etc).
void forwardKinematics(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q)
Update the joint placements according to the current joint configuration.
MatrixXs M
The joint space inertia matrix (a square matrix of dim model.nv).
TangentVectorType ddq
The joint accelerations computed from ABA.
void SINCOS(const S1 &a, S2 *sa, S3 *ca)
Computes sin/cos values of a given input scalar.
Main pinocchio namespace.
const DataTpl< Scalar, Options, JointCollectionTpl >::Matrix6x & computeJointJacobians(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q)
Computes the full model Jacobian, i.e. the stack of all motion subspace expressed in the world frame...
BOOST_AUTO_TEST_CASE(test_basic)
VectorXs ConfigVectorType
Dense vectorized version of a joint configuration vector.
ConfigVectorType upperPositionLimit
Upper joint configuration limit.
#define BOOST_CHECK_IS_APPROX(double_field, multires_field, Scalar)
void humanoidRandom(ModelTpl< Scalar, Options, JointCollectionTpl > &model, bool usingFF=true)
Create a humanoid kinematic tree with 6-DOF limbs and random joint placements.
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > VectorXd