18 #ifndef __se3_joint_composite_hpp__ 19 #define __se3_joint_composite_hpp__ 21 #include "pinocchio/multibody/joint/fwd.hpp" 22 #include "pinocchio/multibody/joint/joint-variant.hpp" 23 #include "pinocchio/multibody/joint/joint-basic-visitors.hpp" 24 #include "pinocchio/container/aligned-vector.hpp" 25 #include "pinocchio/spatial/act-on-set.hpp" 31 struct JointComposite;
42 typedef double Scalar;
50 typedef Eigen::Matrix<double,6,Eigen::Dynamic> F_t;
52 typedef Eigen::Matrix<double,6,Eigen::Dynamic> U_t;
53 typedef Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> D_t;
54 typedef Eigen::Matrix<double,6,Eigen::Dynamic> UD_t;
56 typedef Eigen::Matrix<double,Eigen::Dynamic,1> ConfigVector_t;
57 typedef Eigen::Matrix<double,Eigen::Dynamic,1> TangentVector_t;
65 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
68 typedef JointComposite Joint;
72 typedef Base::Transformation_t Transformation_t;
73 typedef Base::Motion_t Motion_t;
74 typedef Base::Bias_t Bias_t;
75 typedef Base::Constraint_t Constraint_t;
76 typedef Base::U_t U_t;
77 typedef Base::D_t D_t;
78 typedef Base::UD_t UD_t;
83 : joints(joint_data), iMlast(joint_data.size()), pjMi(joint_data.size())
86 , U(6,nv), Dinv(nv,nv), UDinv(6,nv)
112 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
133 using Base::setIndexes;
151 template<
typename Jo
intModel>
153 : joints(1,jmodel.derived())
154 , jointPlacements(1,placement)
157 , m_idx_q(1), m_nqs(1,jmodel.
nq())
158 , m_idx_v(1), m_nvs(1,jmodel.
nv())
168 , joints(other.joints)
169 , jointPlacements(other.jointPlacements)
172 , m_idx_q(other.m_idx_q), m_nqs(other.m_nqs)
173 , m_idx_v(other.m_idx_v), m_nvs(other.m_nvs)
183 template<
typename Jo
intModel>
186 joints.push_back(jmodel.derived());
187 jointPlacements.push_back(placement);
189 m_nq += jmodel.nq(); m_nv += jmodel.nv();
191 updateJointIndexes();
197 for (
int i = 0; i < (int)joints.size(); ++i)
198 jdata[(
size_t)i] = ::se3::createData(joints[(
size_t)i]);
199 return JointDataDerived(jdata,
nq(),
nv());
203 void calc(JointData & data,
const Eigen::VectorXd & qs)
const;
206 void calc(JointData & data,
const Eigen::VectorXd & qs,
const Eigen::VectorXd & vs)
const;
208 void calc_aba(JointData & data, Inertia::Matrix6 & I,
const bool update_I)
const 210 data.U.noalias() = I * data.S;
211 Eigen::MatrixXd tmp (data.S.matrix().transpose() * data.U);
212 data.Dinv = tmp.inverse();
213 data.UDinv.noalias() = data.U * data.Dinv;
216 I -= data.UDinv * data.U.transpose();
223 for(JointModelVector::const_iterator it = joints.begin();
224 it != joints.end(); ++it)
225 eps = max((Scalar)::se3::finiteDifferenceIncrement(*it),eps);
230 int nv_impl()
const {
return m_nv; }
231 int nq_impl()
const {
return m_nq; }
239 Base::setIndexes_impl(
id, q, v);
240 updateJointIndexes();
243 static std::string classname() {
return std::string(
"JointModelComposite"); }
244 std::string
shortname()
const {
return classname(); }
248 Base::operator=(other);
267 jointConfigSelector(
const Eigen::MatrixBase<D>& a)
const {
return a.segment(i_q,
nq()); }
270 jointConfigSelector( Eigen::MatrixBase<D>& a)
const {
return a.segment(i_q,
nq()); }
274 jointVelocitySelector(
const Eigen::MatrixBase<D>& a)
const {
return a.segment(i_v,
nv()); }
277 jointVelocitySelector( Eigen::MatrixBase<D>& a)
const {
return a.segment(i_v,
nv()); }
281 jointCols(
const Eigen::MatrixBase<D>& A)
const {
return A.middleCols(i_v,
nv()); }
284 jointCols(Eigen::MatrixBase<D>& A)
const {
return A.middleCols(i_v,
nv()); }
288 jointConfigSelector_impl(
const Eigen::MatrixBase<D>& a)
const {
return a.segment(i_q,
nq()); }
291 jointConfigSelector_impl(Eigen::MatrixBase<D>& a)
const {
return a.segment(i_q,
nq()); }
294 jointVelocitySelector_impl(
const Eigen::MatrixBase<D>& a)
const {
return a.segment(i_v,
nv()); }
297 jointVelocitySelector_impl(Eigen::MatrixBase<D>& a)
const {
return a.segment(i_v,
nv()); }
301 jointCols_impl(
const Eigen::MatrixBase<D>& A)
const {
return A.middleCols(i_v,
nv()); }
304 jointCols_impl(Eigen::MatrixBase<D>& A)
const {
return A.middleCols(i_v,
nv()); }
317 m_idx_q.resize(joints.size());
318 m_idx_v.resize(joints.size());
319 m_nqs.resize(joints.size());
320 m_nvs.resize(joints.size());
322 for(
size_t i = 0; i < joints.size(); ++i)
324 JointModelVariant & joint = joints[i];
327 ::se3::setIndexes(joint,i,idx_q,idx_v);
328 m_nqs[i] = ::se3::nq(joint);
329 m_nvs[i] = ::se3::nv(joint);
330 idx_q += m_nqs[i]; idx_v += m_nvs[i];
350 os <<
"JointModelComposite containing following models:\n" ;
351 for (JointModelVector::const_iterator it = jmodel.
joints.begin();
352 it != jmodel.
joints.end(); ++it)
353 os <<
" " <<
shortname(*it) << std::endl;
362 #include "pinocchio/multibody/joint/joint-composite.hxx" 364 #endif // ifndef __se3_joint_composite_hpp__ void addJoint(const JointModelBase< JointModel > &jmodel, const SE3 &placement=SE3::Identity())
Add a joint to the composition of joints.
JointDataVariant createData(const JointModelVariant &jmodel)
Visit a JointModelVariant through CreateData visitor to create a JointDataVariant.
container::aligned_vector< Transformation_t > iMlast
Transforms from previous joint to last joint.
JointModelComposite()
Empty contructor.
container::aligned_vector< SE3 > jointPlacements
Vector of joint placements. Those placements correspond to the origin of the joint relatively to thei...
void calc_aba(const JointModelVariant &jmodel, JointDataVariant &jdata, Inertia::Matrix6 &I, const bool update_I)
Visit a JointDataVariant and the corresponding JointModelVariant through JointCalcAbaVisitor to...
void updateJointIndexes()
Update the indexes of the joints contained in the composition according to the position of the joint ...
std::vector< int > m_nvs
Dimension of the segment in the tangent vector.
int nq(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointNqVisitor to get the dimension of the joint configuration spac...
std::vector< int > m_idx_q
Keep information of both the dimension and the position of the joints in the composition.
container::aligned_vector< Transformation_t > pjMi
Transforms from previous joint to joint i.
std::vector< int > m_idx_v
Index in the tangent vector.
std::vector< int > m_nqs
Dimension of the segment in the config vector.
JointModelComposite(const JointModelBase< JointModel > &jmodel, const SE3 &placement=SE3::Identity())
Default constructor with at least one joint.
std::string shortname(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointShortnameVisitor to get the shortname of the derived joint mod...
int nv(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointNvVisitor to get the dimension of the joint tangent space...
int idx_q(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointIdxQVisitor to get the index in the full model configuration s...
Eigen::VectorXd finiteDifferenceIncrement(const Model &model)
Computes the finite difference increments for each degree of freedom according to the current joint c...
JointModelVector joints
Vector of joints contained in the joint composite.
int idx_v(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointIdxVVisitor to get the index in the full model tangent space c...
JointModelComposite(const JointModelComposite &other)
Copy constructor.
int m_nq
Dimensions of the config and tangent space of the composite joint.
JointDataVector joints
Vector of joints.
void setIndexes_impl(JointIndex id, int q, int v)
Update the indexes of subjoints in the stack.