6 #ifndef __pinocchio_multibody_joint_model_base_hpp__
7 #define __pinocchio_multibody_joint_model_base_hpp__
9 #include "pinocchio/multibody/joint/joint-base.hpp"
10 #include "pinocchio/multibody/joint/joint-common-operations.hpp"
12 #include "pinocchio/math/matrix-block.hpp"
16 #define PINOCCHIO_JOINT_MODEL_TYPEDEF_GENERIC(Joint,TYPENAME) \
17 typedef Eigen::DenseIndex Index; \
18 typedef TYPENAME traits<Joint>::Scalar Scalar; \
19 typedef TYPENAME traits<Joint>::JointDataDerived JointDataDerived; \
20 typedef TYPENAME traits<Joint>::JointModelDerived JointModelDerived; \
21 typedef TYPENAME traits<Joint>::Constraint_t Constraint_t; \
22 typedef TYPENAME traits<Joint>::Transformation_t Transformation_t; \
23 typedef TYPENAME traits<Joint>::Motion_t Motion_t; \
24 typedef TYPENAME traits<Joint>::Bias_t Bias_t; \
25 typedef TYPENAME traits<Joint>::U_t U_t; \
26 typedef TYPENAME traits<Joint>::D_t D_t; \
27 typedef TYPENAME traits<Joint>::UD_t UD_t; \
29 Options = traits<Joint>::Options, \
30 NQ = traits<Joint>::NQ, \
31 NV = traits<Joint>::NV \
33 typedef TYPENAME traits<Joint>::ConfigVector_t ConfigVector_t; \
34 typedef TYPENAME traits<Joint>::TangentVector_t TangentVector_t
38 #define PINOCCHIO_JOINT_TYPEDEF(Joint) PINOCCHIO_JOINT_MODEL_TYPEDEF_GENERIC(Joint,PINOCCHIO_EMPTY_ARG)
39 #define PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(Joint) PINOCCHIO_JOINT_MODEL_TYPEDEF_GENERIC(Joint,typename)
41 #elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 4) && (__GNUC_PATCHLEVEL__ == 2)
43 #define PINOCCHIO_JOINT_TYPEDEF(Joint) PINOCCHIO_JOINT_MODEL_TYPEDEF_GENERIC(Joint,PINOCCHIO_EMPTY_ARG)
44 #define PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(Joint) PINOCCHIO_JOINT_MODEL_TYPEDEF_GENERIC(Joint,typename)
48 #define PINOCCHIO_JOINT_TYPEDEF(Joint) PINOCCHIO_JOINT_MODEL_TYPEDEF_GENERIC(Joint,typename)
49 #define PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(Joint) PINOCCHIO_JOINT_MODEL_TYPEDEF_GENERIC(Joint,typename)
53 #define PINOCCHIO_JOINT_USE_INDEXES(Joint) \
54 typedef JointModelBase<Joint> Base; \
58 #define PINOCCHIO_JOINT_CAST_TYPE_SPECIALIZATION(JointModelTpl) \
59 template<typename Scalar, int Options, typename NewScalar> \
60 struct CastType< NewScalar, JointModelTpl<Scalar,Options> > \
61 { typedef JointModelTpl<NewScalar,Options> type; }
66 template<
typename Derived>
69 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
72 PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
74 JointModelDerived & derived() {
return *
static_cast<Derived*
>(
this); }
75 const JointModelDerived & derived()
const {
return *
static_cast<const Derived*
>(
this); }
77 JointDataDerived createData()
const {
return derived().createData(); }
79 const std::vector<bool> hasConfigurationLimit()
const
81 return derived().hasConfigurationLimit();
84 const std::vector<bool> hasConfigurationLimitInTangent()
const
86 return derived().hasConfigurationLimitInTangent();
89 template<
typename ConfigVectorType>
90 void calc(JointDataDerived & data,
91 const Eigen::MatrixBase<ConfigVectorType> & qs)
const
93 derived().calc(data,qs.derived());
96 template<
typename ConfigVectorType,
typename TangentVectorType>
97 void calc(JointDataDerived & data,
98 const Eigen::MatrixBase<ConfigVectorType> & qs,
99 const Eigen::MatrixBase<TangentVectorType> & vs)
const
101 derived().calc(data,qs.derived(),vs.derived());
104 template<
typename Matrix6Type>
105 void calc_aba(JointDataDerived & data,
106 const Eigen::MatrixBase<Matrix6Type> & I,
107 const bool update_I =
false)
const
109 derived().calc_aba(data, PINOCCHIO_EIGEN_CONST_CAST(Matrix6Type,I), update_I);
112 int nv()
const {
return derived().nv_impl(); }
113 int nq()
const {
return derived().nq_impl(); }
116 int nv_impl()
const {
return NV; }
117 int nq_impl()
const {
return NQ; }
119 int idx_q()
const {
return derived().idx_q_impl(); }
120 int idx_v()
const {
return derived().idx_v_impl(); }
121 JointIndex id()
const {
return derived().id_impl(); }
123 int idx_q_impl()
const {
return i_q; }
124 int idx_v_impl()
const {
return i_v; }
125 JointIndex id_impl()
const {
return i_id; }
127 void setIndexes(JointIndex
id,
int q,
int v)
128 { derived().setIndexes_impl(
id, q, v); }
130 void setIndexes_impl(JointIndex
id,
int q,
int v)
131 { i_id =
id, i_q = q; i_v = v; }
133 void disp(std::ostream & os)
const
138 <<
" index: " <<
id() << endl
139 <<
" index q: " <<
idx_q() << endl
140 <<
" index v: " <<
idx_v() << endl
141 <<
" nq: " <<
nq() << endl
142 <<
" nv: " <<
nv() << endl
152 std::string shortname()
const {
return derived().shortname(); }
153 static std::string classname() {
return Derived::classname(); }
155 template<
typename NewScalar>
157 {
return derived().template cast<NewScalar>(); }
159 template <
class OtherDerived>
161 {
return derived().isEqual(other.derived()); }
163 template <
class OtherDerived>
165 {
return !(derived() == other.derived()); }
167 template <
class OtherDerived>
173 return derived().hasSameIndexes(other.derived());
176 template <
class OtherDerived>
179 return other.id() ==
id()
180 && other.idx_q() == idx_q()
181 && other.idx_v() == idx_v();
188 jointConfigSelector(
const Eigen::MatrixBase<D> & a)
const
189 {
return derived().jointConfigSelector_impl(a); }
193 jointConfigSelector_impl(
const Eigen::MatrixBase<D> & a)
const
199 jointConfigSelector(Eigen::MatrixBase<D> & a)
const
200 {
return derived().jointConfigSelector_impl(a); }
204 jointConfigSelector_impl(Eigen::MatrixBase<D> & a)
const
211 jointVelocitySelector(
const Eigen::MatrixBase<D> & a)
const
212 {
return derived().jointVelocitySelector_impl(a.derived()); }
216 jointVelocitySelector_impl(
const Eigen::MatrixBase<D> & a)
const
222 jointVelocitySelector(Eigen::MatrixBase<D> & a)
const
223 {
return derived().jointVelocitySelector_impl(a.derived()); }
227 jointVelocitySelector_impl(Eigen::MatrixBase<D> & a)
const
234 jointCols(
const Eigen::MatrixBase<D>& A)
const
235 {
return derived().jointCols_impl(A.derived()); }
239 jointCols_impl(
const Eigen::MatrixBase<D>& A)
const
245 jointCols(Eigen::MatrixBase<D>& A)
const
246 {
return derived().jointCols_impl(A.derived()); }
250 jointCols_impl(Eigen::MatrixBase<D> & A)
const
257 jointRows(
const Eigen::MatrixBase<D> & A)
const
258 {
return derived().jointRows_impl(A.derived()); }
262 jointRows_impl(
const Eigen::MatrixBase<D> & A)
const
268 jointRows(Eigen::MatrixBase<D> & A)
const
269 {
return derived().jointRows_impl(A.derived()); }
273 jointRows_impl(Eigen::MatrixBase<D> & A)
const
281 {
return derived().jointBlock_impl(Mat.derived()); }
285 jointBlock_impl(
const Eigen::MatrixBase<D> & Mat)
const
290 typename SizeDepType<NV>::template BlockReturn<D>::Type
292 {
return derived().jointBlock_impl(Mat.derived()); }
295 typename SizeDepType<NV>::template BlockReturn<D>::Type
296 jointBlock_impl(Eigen::MatrixBase<D> & Mat)
const
297 {
return SizeDepType<NV>::block(Mat.derived(),idx_v(),idx_v(),nv(),nv()); }
305 : i_id(std::numeric_limits<JointIndex>::max()), i_q(-1), i_v(-1) {}
335 #endif // ifndef __pinocchio_multibody_joint_model_base_hpp__