10 #ifndef CROCODDYL_MULTIBODY_IMPULSES_IMPULSE_3D_HPP_
11 #define CROCODDYL_MULTIBODY_IMPULSES_IMPULSE_3D_HPP_
13 #include <pinocchio/multibody/data.hpp>
14 #include <pinocchio/spatial/motion.hpp>
16 #include "crocoddyl/multibody/fwd.hpp"
17 #include "crocoddyl/multibody/impulse-base.hpp"
21 template <
typename _Scalar>
24 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
26 typedef _Scalar Scalar;
32 typedef typename MathBase::Vector2s Vector2s;
33 typedef typename MathBase::Vector3s Vector3s;
34 typedef typename MathBase::VectorXs VectorXs;
35 typedef typename MathBase::MatrixXs Matrix3s;
36 typedef typename MathBase::MatrixXs MatrixXs;
46 boost::shared_ptr<StateMultibody> state,
const pinocchio::FrameIndex
id,
47 const pinocchio::ReferenceFrame type = pinocchio::ReferenceFrame::LOCAL);
56 virtual void calc(
const boost::shared_ptr<ImpulseDataAbstract>& data,
57 const Eigen::Ref<const VectorXs>& x);
65 virtual void calcDiff(
const boost::shared_ptr<ImpulseDataAbstract>& data,
66 const Eigen::Ref<const VectorXs>& x);
74 virtual void updateForce(
const boost::shared_ptr<ImpulseDataAbstract>& data,
75 const VectorXs& force);
80 virtual boost::shared_ptr<ImpulseDataAbstract>
createData(
81 pinocchio::DataTpl<Scalar>*
const data);
88 virtual void print(std::ostream& os)
const;
96 template <
typename _Scalar>
98 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
100 typedef _Scalar Scalar;
103 typedef typename MathBase::Vector3s Vector3s;
104 typedef typename MathBase::Matrix3s Matrix3s;
105 typedef typename MathBase::Matrix3xs Matrix3xs;
106 typedef typename MathBase::Matrix6xs Matrix6xs;
107 typedef typename pinocchio::ForceTpl<Scalar> Force;
109 template <
template <
typename Scalar>
class Model>
111 pinocchio::DataTpl<Scalar>*
const data)
113 f_local(Force::Zero()),
114 dv0_local_dq(3, model->get_state()->get_nv()),
115 fJf(6, model->get_state()->get_nv()),
116 v_partial_dq(6, model->get_state()->get_nv()),
117 v_partial_dv(6, model->get_state()->get_nv()),
118 fJf_df(3, model->get_state()->get_nv()) {
119 frame = model->get_id();
121 model->get_state()->get_pinocchio()->frames[model->get_id()].placement;
122 fXj =
jMf.inverse().toActionMatrix();
124 dv0_local_dq.setZero();
126 v_partial_dq.setZero();
127 v_partial_dv.setZero();
129 v0_world_skew.setZero();
145 Matrix3xs dv0_local_dq;
147 Matrix6xs v_partial_dq;
148 Matrix6xs v_partial_dv;
150 Matrix3s v0_world_skew;
160 #include "crocoddyl/multibody/impulses/impulse-3d.hxx"
ImpulseModel3DTpl(boost::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const pinocchio::ReferenceFrame type=pinocchio::ReferenceFrame::LOCAL)
Initialize the 3d impulse model.
virtual void calcDiff(const boost::shared_ptr< ImpulseDataAbstract > &data, const Eigen::Ref< const VectorXs > &x)
Compute the derivatives of the 6d impulse holonomic constraint.
virtual void print(std::ostream &os) const
Print relevant information of the 3d impulse model.
virtual boost::shared_ptr< ImpulseDataAbstract > createData(pinocchio::DataTpl< Scalar > *const data)
Create the 6d impulse data.
virtual void calc(const boost::shared_ptr< ImpulseDataAbstract > &data, const Eigen::Ref< const VectorXs > &x)
Compute the 6d impulse Jacobian.
virtual void updateForce(const boost::shared_ptr< ImpulseDataAbstract > &data, const VectorXs &force)
Convert the force into a stack of spatial forces.
pinocchio::ReferenceFrame type_
Type of contact.
pinocchio::FrameIndex id_
Reference frame id of the contact.
State multibody representation.
pinocchio::FrameIndex frame
Frame index of the contact frame.
SE3 jMf
Local frame placement of the contact frame.
PinocchioData * pinocchio
Pinocchio data.
pinocchio::FrameIndex frame
Frame index of the contact frame.
SE3 jMf
Local frame placement of the contact frame.
MatrixXs Jc
Contact Jacobian.
Force f
Contact force expressed in the coordinate defined by type.