diff --git a/CMakeLists.txt b/CMakeLists.txt index e037da21d811c70279d50830dd9ec5a9b813cb8c..e9eae80f9ab3301d9eafb44565e88e8d618cee94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -160,6 +160,7 @@ SET(${PROJECT_NAME}_SPATIAL_HEADERS ) SET(${PROJECT_NAME}_MULTIBODY_JOINT_HEADERS + multibody/joint/fwd.hpp multibody/joint/joint-base.hpp multibody/joint/joint-dense.hpp multibody/joint/joint-revolute.hpp diff --git a/bindings/python/joint.hpp b/bindings/python/joint.hpp index 094bb7f02102f11fa6268a549bd5a0c2e6b9e90d..9014d720fdbbb2e9609aa0db29bc280911f6ccf6 100644 --- a/bindings/python/joint.hpp +++ b/bindings/python/joint.hpp @@ -20,7 +20,7 @@ #include <eigenpy/exception.hpp> #include <eigenpy/eigenpy.hpp> -#include "pinocchio/multibody/joint/joint-composite.hpp" +#include "pinocchio/multibody/joint/joint.hpp" namespace se3 { diff --git a/src/multibody/fwd.hpp b/src/multibody/fwd.hpp index 29da7ab5e6aa2e8c5e64cc87d75ac58f4d37fef6..aacff9a09f5c6218e38b09e5860e08d3fd10fc6c 100644 --- a/src/multibody/fwd.hpp +++ b/src/multibody/fwd.hpp @@ -33,8 +33,7 @@ namespace se3 struct Data; struct GeometryModel; struct GeometryData; - struct JointModel; - struct JointData; + // Forward declaration needed for Model::check template<class D> struct AlgorithmCheckerBase; diff --git a/src/multibody/joint/fwd.hpp b/src/multibody/joint/fwd.hpp new file mode 100644 index 0000000000000000000000000000000000000000..a3debcafac0111bb0d68c96898d5b1f72d6bcd2b --- /dev/null +++ b/src/multibody/joint/fwd.hpp @@ -0,0 +1,33 @@ +// +// Copyright (c) 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/>. + +#ifndef __se3_joint_fwd_hpp__ +#define __se3_joint_fwd_hpp__ + +namespace se3 +{ + enum { MAX_JOINT_NV = 6 }; + + struct JointModelComposite; + struct JointDataComposite; + + struct JointModel; + struct JointData; + +} + +#endif // ifndef __se3_joint_fwd_hpp__ diff --git a/src/multibody/joint/joint-composite.hpp b/src/multibody/joint/joint-composite.hpp index 40228586ff5118b44efa822dc25a3f050f7b6c5b..4ce66486a99014cc6707be8d0fa0613c7127c59d 100644 --- a/src/multibody/joint/joint-composite.hpp +++ b/src/multibody/joint/joint-composite.hpp @@ -19,13 +19,11 @@ #define __se3_joint_composite_hpp__ #include "pinocchio/assert.hpp" -#include "pinocchio/multibody/joint/joint.hpp" +#include "pinocchio/multibody/joint/joint-variant.hpp" +#include "pinocchio/multibody/joint/joint-basic-visitors.hpp" #include <Eigen/StdVector> -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(se3::SE3) -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(se3::Motion) - namespace se3 { @@ -67,6 +65,7 @@ namespace se3 EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef JointComposite Joint; + typedef JointDataVariant JointData; typedef std::vector<JointData, Eigen::aligned_allocator<JointData> > JointDataVector; SE3_JOINT_TYPEDEF; @@ -74,7 +73,7 @@ namespace se3 int nq_composite,nv_composite; Constraint_t S; - std::vector<Transformation_t> ljMj; + std::vector<Transformation_t, Eigen::aligned_allocator<Transformation_t> > ljMj; Transformation_t M; Motion_t v; Bias_t c; @@ -110,8 +109,13 @@ namespace se3 typedef JointComposite Joint; SE3_JOINT_TYPEDEF; SE3_JOINT_USE_INDEXES; + + typedef JointModelVariant JointModel; typedef std::vector<JointModel, Eigen::aligned_allocator<JointModel> > JointModelVector; + typedef JointDataVariant JointData; + typedef std::vector<JointData, Eigen::aligned_allocator<JointData> > JointDataVector; + using JointModelBase<JointModelComposite>::id; using JointModelBase<JointModelComposite>::setIndexes; @@ -475,15 +479,16 @@ namespace se3 }; - inline std::ostream & operator << (std::ostream & os, const JointModelComposite & jmodel) + inline std::ostream & operator << (std::ostream & os, const JointModelComposite & jmodel) + { + typedef JointModelComposite::JointModelVector JointModelVector; + os << "JointModelComposite containing following models:\n" ; + for (JointModelVector::const_iterator i = jmodel.joints.begin(); i != jmodel.joints.end(); ++i) { - os << "JointModelComposite containing following models:\n" ; - for (JointModelVector::const_iterator i = jmodel.joints.begin(); i != jmodel.joints.end(); ++i) - { - os << shortname(*i) << std::endl; - } - return os; + os << shortname(*i) << std::endl; } + return os; + } } // namespace se3 diff --git a/src/multibody/joint/joint-variant.hpp b/src/multibody/joint/joint-variant.hpp index b1e2b43c278cd683229d7d33b618e4bdd9a67f26..6ea4354de4b190db3e7700f7e6152646d83f174d 100644 --- a/src/multibody/joint/joint-variant.hpp +++ b/src/multibody/joint/joint-variant.hpp @@ -18,7 +18,7 @@ #ifndef __se3_joint_variant_hpp__ #define __se3_joint_variant_hpp__ -#include "pinocchio/multibody/joint/joint-base.hpp" +#include "pinocchio/multibody/joint/fwd.hpp" #include "pinocchio/multibody/joint/joint-dense.hpp" #include "pinocchio/multibody/joint/joint-free-flyer.hpp" #include "pinocchio/multibody/joint/joint-planar.hpp" @@ -36,12 +36,7 @@ namespace se3 { - enum { MAX_JOINT_NV = 6 }; - - struct JointComposite; - struct JointModelComposite; - struct JointDataComposite; - + // The JointModelComposite contains several JointModel (which are JointModelVariant). Hence there is a circular // dependency between JointModelComposite and JointModelVariant that can be resolved with the use of boost::recursive_variant // For more details, see http://www.boost.org/doc/libs/1_58_0/doc/html/variant/tutorial.html#variant.tutorial.recursive diff --git a/src/multibody/joint/joint.hpp b/src/multibody/joint/joint.hpp index 34b8f2074ece0f9719556c9bec3234c805e89a94..f5f829301131c516cfcd5905920d0328f60389e2 100644 --- a/src/multibody/joint/joint.hpp +++ b/src/multibody/joint/joint.hpp @@ -150,12 +150,9 @@ namespace se3 void setIndexes(JointIndex id,int nq,int nv) { ::se3::setIndexes(*this,id, nq, nv); } }; - typedef std::vector<JointData> JointDataVector; - typedef std::vector<JointModel> JointModelVector; + typedef std::vector<JointData, Eigen::aligned_allocator<JointData> > JointDataVector; + typedef std::vector<JointModel, Eigen::aligned_allocator<JointModel> > JointModelVector; } // namespace se3 -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(se3::JointModel) -EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(se3::JointData) - #endif // ifndef __se3_joint_model_hpp__ diff --git a/src/multibody/model.hpp b/src/multibody/model.hpp index a11b2218cb91df1c205c8b7b4499d5b9213c7721..591d75d73b4ff8b8d5be1e357306396ceb24bb33 100644 --- a/src/multibody/model.hpp +++ b/src/multibody/model.hpp @@ -26,7 +26,7 @@ #include "pinocchio/spatial/inertia.hpp" #include "pinocchio/multibody/fwd.hpp" #include "pinocchio/multibody/frame.hpp" -#include "pinocchio/multibody/joint/joint-composite.hpp" +#include "pinocchio/multibody/joint/joint.hpp" #include "pinocchio/deprecated.hh" #include "pinocchio/tools/string-generator.hpp"