5 #ifndef __pinocchio_joint_composite_hpp__ 6 #define __pinocchio_joint_composite_hpp__ 8 #include "pinocchio/multibody/joint/fwd.hpp" 9 #include "pinocchio/multibody/joint/joint-collection.hpp" 10 #include "pinocchio/multibody/joint/joint-basic-visitors.hpp" 11 #include "pinocchio/container/aligned-vector.hpp" 12 #include "pinocchio/spatial/act-on-set.hpp" 14 #include "pinocchio/serialization/fwd.hpp" 19 template<
typename Scalar,
int Options,
template<
typename S,
int O>
class JointCollectionTpl>
22 template<
typename _Scalar,
int _Options,
template<
typename S,
int O>
class JointCollectionTpl>
42 typedef Eigen::Matrix<Scalar,6,Eigen::Dynamic,Options>
U_t;
43 typedef Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic,Options>
D_t;
44 typedef Eigen::Matrix<Scalar,6,Eigen::Dynamic,Options>
UD_t;
52 template<
typename Scalar,
int Options,
template<
typename S,
int O>
class JointCollectionTpl>
56 template<
typename Scalar,
int Options,
template<
typename S,
int O>
class JointCollectionTpl>
60 template<
typename _Scalar,
int _Options,
template<
typename S,
int O>
class JointCollectionTpl>
62 :
public JointDataBase< JointDataCompositeTpl<_Scalar,_Options,JointCollectionTpl> >
64 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
83 , M(Transformation_t::Identity())
86 ,
U(6,0), Dinv(0,0), UDinv(6,0)
92 : joints(joint_data), iMlast(joint_data.
size()), pjMi(joint_data.
size())
93 , S(Constraint_t::Zero(nv))
94 ,
M(Transformation_t::Identity())
98 , Dinv(D_t::Zero(nv,nv))
99 , UDinv(UD_t::Zero(6,nv))
100 , StU(D_t::Zero(nv,nv))
124 static
std::
string classname() {
return std::string(
"JointDataComposite"); }
129 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollectionTpl>
130 inline std::ostream & operator <<(std::ostream & os, const JointDataCompositeTpl<Scalar,Options,JointCollectionTpl> & jdata)
134 os <<
"JointDataComposite containing following models:\n" ;
135 for (
typename JointDataVector::const_iterator it = jdata.joints.begin();
136 it != jdata.joints.end(); ++it)
137 os <<
" " <<
shortname(*it) << std::endl;
142 template<
typename NewScalar,
typename Scalar,
int Options,
template<
typename S,
int O>
class JointCollectionTpl>
148 template<
typename _Scalar,
int _Options,
template<
typename S,
int O>
class JointCollectionTpl>
150 :
public JointModelBase< JointModelCompositeTpl<_Scalar,_Options,JointCollectionTpl> >
152 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
192 joints.reserve(size); jointPlacements.reserve(size);
193 m_idx_q.reserve(size); m_idx_v.reserve(size);
194 m_nqs.reserve(size); m_nvs.reserve(size);
203 template<
typename Jo
intModel>
206 : joints(1,(JointModelVariant)jmodel.derived())
210 , m_idx_q(1,0), m_nqs(1,jmodel.
nq())
211 , m_idx_v(1,0), m_nvs(1,jmodel.
nv())
222 , joints(other.joints)
223 , jointPlacements(other.jointPlacements)
226 , m_idx_q(other.m_idx_q), m_nqs(other.m_nqs)
227 , m_idx_v(other.m_idx_v), m_nvs(other.m_nvs)
228 , njoints(other.njoints)
240 template<
typename Jo
intModel>
244 joints.push_back((JointModelVariant)jmodel.
derived());
247 m_nq += jmodel.
nq(); m_nv += jmodel.
nv();
249 updateJointIndexes();
257 typename JointDataDerived::JointDataVector jdata(joints.size());
258 for (
int i = 0;
i < (int)joints.size(); ++
i)
259 jdata[(
size_t)
i] = ::pinocchio::createData<Scalar,Options,JointCollectionTpl>(joints[(size_t)
i]);
260 return JointDataDerived(jdata,
nq(),
nv());
263 template<
typename,
int,
template<
typename S,
int O>
class,
typename>
264 friend struct JointCompositeCalcZeroOrderStep;
266 template<
typename ConfigVectorType>
267 void calc(JointDataDerived & data,
const Eigen::MatrixBase<ConfigVectorType> & qs)
const;
269 template<
typename,
int,
template<
typename S,
int O>
class,
typename,
typename>
270 friend struct JointCompositeCalcFirstOrderStep;
272 template<
typename ConfigVectorType,
typename TangentVectorType>
273 void calc(JointDataDerived & data,
274 const Eigen::MatrixBase<ConfigVectorType> & qs,
275 const Eigen::MatrixBase<TangentVectorType> & vs)
const;
277 template<
typename Matrix6Like>
279 const Eigen::MatrixBase<Matrix6Like> & I,
280 const bool update_I)
const 282 data.U.noalias() = I * data.S.matrix();
283 data.StU.noalias() = data.S.matrix().transpose() * data.U;
289 data.UDinv.noalias() = data.U * data.Dinv;
303 Base::setIndexes_impl(
id, q, v);
304 updateJointIndexes();
307 static std::string
classname() {
return std::string(
"JointModelComposite"); }
312 Base::operator=(other);
320 jointPlacements = other.jointPlacements;
329 std::cout <<
"JointModelCompositeTpl::isEqual" << std::endl;
331 &&
nq() == other.
nq()
332 &&
nv() == other.
nv()
335 && m_nqs == other.
m_nqs 336 && m_nvs == other.
m_nvs 338 && jointPlacements == other.jointPlacements
343 template<
typename NewScalar>
347 ReturnType
res((
size_t)njoints);
351 res.m_idx_q = m_idx_q;
352 res.m_idx_v = m_idx_v;
355 res.njoints = njoints;
357 res.joints.resize(joints.size());
358 res.jointPlacements.resize(jointPlacements.size());
359 for(
size_t k = 0; k < jointPlacements.size(); ++k)
361 res.joints[k] = joints[k].template cast<NewScalar>();
362 res.jointPlacements[k] = jointPlacements[k].template cast<NewScalar>();
374 typename
SizeDepType<
NQ>::template SegmentReturn<D>::ConstType
375 jointConfigSelector(const
Eigen::MatrixBase<D>& a)
const {
return a.segment(Base::i_q,
nq()); }
389 jointCols(
const Eigen::MatrixBase<D>& A)
const {
return A.middleCols(Base::i_v,
nv()); }
392 jointCols(Eigen::MatrixBase<D>& A)
const {
return A.middleCols(Base::i_v,
nv()); }
419 template<
typename,
int,
template<
typename,
int>
class>
429 m_idx_q.resize(joints.size());
430 m_idx_v.resize(joints.size());
431 m_nqs.resize(joints.size());
432 m_nvs.resize(joints.size());
434 for(
size_t i = 0;
i < joints.size(); ++
i)
436 JointModelVariant & joint = joints[
i];
442 idx_q += m_nqs[
i]; idx_v += m_nvs[
i];
467 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollectionTpl>
468 inline std::ostream & operator <<(std::ostream & os, const JointModelCompositeTpl<Scalar,Options,JointCollectionTpl> & jmodel)
472 os <<
"JointModelComposite containing following models:\n" ;
473 for (
typename JointModelVector::const_iterator it = jmodel.joints.begin();
474 it != jmodel.joints.end(); ++it)
475 os <<
" " <<
shortname(*it) << std::endl;
482 #include <boost/type_traits.hpp> 486 template<
typename Scalar,
int Options,
template<
typename S,
int O>
class JointCollectionTpl>
488 :
public integral_constant<bool,true> {};
490 template<
typename Scalar,
int Options,
template<
typename S,
int O>
class JointCollectionTpl>
492 :
public integral_constant<bool,true> {};
494 template<
typename Scalar,
int Options,
template<
typename S,
int O>
class JointCollectionTpl>
496 :
public integral_constant<bool,true> {};
498 template<
typename Scalar,
int Options,
template<
typename S,
int O>
class JointCollectionTpl>
500 :
public integral_constant<bool,true> {};
506 #include "pinocchio/multibody/joint/joint-composite.hxx" 508 #endif // ifndef __pinocchio_joint_composite_hpp__ JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > const Eigen::MatrixBase< TangentVectorType > & v
static std::string classname()
SizeDepType< NV >::template SegmentReturn< D >::ConstType jointVelocitySelector(const Eigen::MatrixBase< D > &a) const
std::vector< int > m_nvs
Dimension of the segment in the tangent vector.
int nv(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNvVisitor to get the dimension of the joint tangent space...
ConstraintTpl< Eigen::Dynamic, Scalar, Options > Constraint_t
JointCollectionTpl< Scalar, Options > JointCollection
int m_nq
Dimensions of the config and tangent space of the composite joint.
typedef PINOCCHIO_ALIGNED_STD_VECTOR(JointData) JointDataVector
SizeDepType< NV >::template SegmentReturn< D >::Type jointVelocitySelector(Eigen::MatrixBase< D > &a) const
PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE typedef Eigen::Matrix< Scalar, Eigen::Dynamic, 1, Options > ConfigVector_t
int idx_q(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointIdxQVisitor to get the index in the full model configuration space...
SizeDepType< Eigen::Dynamic >::template ColsReturn< D >::ConstType jointCols_impl(const Eigen::MatrixBase< D > &A) const
int idx_v(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointIdxVVisitor to get the index in the full model tangent space corre...
Eigen::Matrix< Scalar, Eigen::Dynamic, 1, Options > TangentVector_t
MotionTpl< Scalar, Options > Bias_t
JointCompositeTpl< Scalar, Options, JointCollectionTpl > JointDerived
JointDataDerived createData() const
JointModelDerived & addJoint(const JointModelBase< JointModel > &jmodel, const SE3 &placement=SE3::Identity())
Add a joint to the vector of joints.
Eigen::Matrix< Scalar, 6, Eigen::Dynamic, Options > UD_t
int nq(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNqVisitor to get the dimension of the joint configuration space...
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic, Options > D_t
SizeDepType< Eigen::Dynamic >::template SegmentReturn< D >::Type jointConfigSelector_impl(Eigen::MatrixBase< D > &a) const
std::vector< int > m_idx_q
Keep information of both the dimension and the position of the joints in the composition.
InertiaTpl< Scalar, Options > Inertia
SizeDepType< NV >::template ColsReturn< D >::Type jointCols(Eigen::MatrixBase< D > &A) const
#define PINOCCHIO_JOINT_DATA_BASE_DEFAULT_ACCESSOR
std::size_t size(custom_string const &s)
JointModelCompositeTpl & operator=(const JointModelCompositeTpl &other)
bool isEqual(const JointModelCompositeTpl &other) const
JointDataVector joints
Vector of joints.
static ColsReturn< D >::ConstType middleCols(const Eigen::MatrixBase< D > &mat, typename Eigen::DenseBase< D >::Index start, typename Eigen::DenseBase< D >::Index size)
void updateJointIndexes()
Update the indexes of the joints contained in the composition according to the position of the joint ...
std::string shortname() const
JointDataCompositeTpl< Scalar, Options, JointCollectionTpl > JointDataDerived
PINOCCHIO_JOINT_DATA_BASE_DEFAULT_ACCESSOR typedef JointCollectionTpl< Scalar, Options > JointCollection
SizeDepType< Eigen::Dynamic >::template SegmentReturn< D >::Type jointVelocitySelector_impl(Eigen::MatrixBase< D > &a) const
bool isEqual(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel_generic, const JointModelBase< JointModelDerived > &jmodel)
Visit a JointModelTpl<Scalar,...> to compare it to JointModelDerived.
JointDataCompositeTpl(const JointDataVector &joint_data, const int, const int nv)
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > & q
#define PINOCCHIO_EIGEN_CONST_CAST(TYPE, OBJ)
Macro for an automatic const_cast.
SizeDepType< Eigen::Dynamic >::template SegmentReturn< D >::ConstType jointVelocitySelector_impl(const Eigen::MatrixBase< D > &a) const
void calc_aba(JointDataDerived &data, const Eigen::MatrixBase< Matrix6Like > &I, const bool update_I) const
SizeDepType< Eigen::Dynamic >::template ColsReturn< D >::Type jointCols_impl(Eigen::MatrixBase< D > &A) const
JointModel JointModelVariant
#define PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
JointCompositeTpl< _Scalar, _Options, JointCollectionTpl > JointDerived
JointCollectionTpl< Scalar, Options > JointCollection
void setIndexes_impl(JointIndex id, int q, int v)
Update the indexes of subjoints in the stack.
std::string shortname(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointShortnameVisitor to get the shortname of the derived joint model...
JointDataTpl< Scalar, Options, JointCollectionTpl > JointDataVariant
static SegmentReturn< D >::ConstType segment(const Eigen::MatrixBase< D > &mat, typename Eigen::DenseBase< D >::Index start, typename Eigen::DenseBase< D >::Index size)
JointModelVector joints
Vector of joints contained in the joint composite.
#define PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(Joint)
JointCompositeTpl< Scalar, Options, JointCollectionTpl > JointDerived
MotionTpl< Scalar, Options > Motion_t
JointModelDerived & derived()
JointModelCompositeTpl(const JointModelBase< JointModel > &jmodel, const SE3 &placement=SE3::Identity())
Constructor with one joint.
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef JointDataBase< JointDataCompositeTpl > Base
std::string shortname() const
std::vector< int > m_nqs
Dimension of the segment in the config vector.
int njoints
Number of joints contained in the JointModelComposite.
Main pinocchio namespace.
JointCompositeTpl< _Scalar, _Options, JointCollectionTpl > JointDerived
MotionTpl< Scalar, Options > Motion
void setIndexes(JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel, JointIndex id, int q, int v)
Visit a JointModelTpl through JointSetIndexesVisitor to set the indexes of the joint in the kinematic...
JointModelTpl< Scalar, Options, JointCollectionTpl > JointModel
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef JointModelBase< JointModelCompositeTpl > Base
Common traits structure to fully define base classes for CRTP.
JointModelCompositeTpl(const size_t size)
Default contructor with a defined size.
SizeDepType< NV >::template ColsReturn< D >::ConstType jointCols(const Eigen::MatrixBase< D > &A) const
JointModelCompositeTpl< Scalar, Options, JointCollectionTpl > JointModelDerived
JointModelCompositeTpl(const JointModelCompositeTpl &other)
Copy constructor.
SizeDepType< NQ >::template SegmentReturn< D >::Type jointConfigSelector(Eigen::MatrixBase< D > &a) const
std::vector< int > m_idx_v
Index in the tangent vector.
SE3Tpl< Scalar, Options > Transformation_t
Type of the cast of a class C templated by Scalar and Options, to a new NewScalar type...
JointModelCompositeTpl< NewScalar, Options, JointCollectionTpl > type
SizeDepType< Eigen::Dynamic >::template SegmentReturn< D >::ConstType jointConfigSelector_impl(const Eigen::MatrixBase< D > &a) const
Eigen::Matrix< Scalar, 6, Eigen::Dynamic, Options > U_t
SE3Tpl< Scalar, Options > SE3
JointModelCompositeTpl< NewScalar, Options, JointCollectionTpl > cast() const
#define PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(Joint)